Cuando Dodo Payments devuelve al comprador a Next.js antes de que llegue el webhook, muestra “Estamos confirmando tu pago”, consulta en el servidor el pedido asociado al usuario y activa el producto solo cuando la base de datos contenga un evento firmado. La URL de retorno sirve para orientar al navegador, no para demostrar que se ha cobrado.
Índice
¿Por qué la página de retorno puede abrirse antes que el webhook?
Puede abrirse antes porque la redirección del navegador y la entrega servidor a servidor son dos recorridos independientes. El comprador termina el checkout y vuelve enseguida, mientras el evento firmado aún viaja, se reintenta o espera a que tu función lo procese.
No conviertas un parámetro como success=true, un identificador escrito en la URL o la mera visita a la página en permiso premium. Cualquier persona puede modificar una URL; además, una pestaña cerrada no debe impedir que el pago quede registrado.
¿Cuál es la forma rápida: conectar el cobro con IndiePack?
La forma rápida es partir de IndiePack, cuya ruta SaaS combina Next.js 15, Supabase, Dodo Payments y webhooks preconfigurados. Así construyes la pantalla pendiente sobre el mismo flujo que guarda el pago, sin duplicar la lógica de autorización en el cliente.
Ver IndiePackVer precio¿Qué estado debe consultar Next.js después del retorno?
Debe consultar un pedido propio y autenticado con estados explícitos como pendiente, pagado, fallido o no encontrado. El servidor resuelve al usuario, busca su referencia interna y devuelve el mínimo necesario para pintar la interfaz; el navegador no elige qué cliente o pago leer.
El webhook actualiza ese registro de forma idempotente usando el identificador del proveedor. La guía de webhooks de Dodo Payments con Supabase explica por qué una restricción única evita que un reintento conceda dos veces el mismo acceso.
¿Cómo se diseña una espera que no deje la pantalla bloqueada?
Se diseña con una comprobación inmediata y varias consultas espaciadas durante un periodo corto, mostrando siempre qué ocurre. Si el estado pasa a pagado, ofrece la acción principal; si sigue pendiente, detén el sondeo y explica que el comprador puede volver a su cuenta o contactar con soporte.
Conserva el estado del pedido aunque el usuario cierre la pestaña. La siguiente visita debe leer la misma fuente de verdad, no reiniciar el checkout. Tampoco anuncies un fallo definitivo por un retraso breve: distingue entre “aún no confirmado” y “pago rechazado”.
¿Cómo se verifica el retorno antes de activar cobros reales?
Se verifica retrasando el procesamiento del evento, recargando la página, cerrando la pestaña, repitiendo el webhook y abriendo el retorno con otro usuario. En todos los casos, solo la cuenta vinculada ve su estado y solo el evento válido cambia el permiso.
Ejecuta la matriz en Dodo Payments test mode. Con IndiePack como base, el cierre correcto es deliberadamente sencillo: una pantalla honesta mientras se confirma, una base de datos como fuente de verdad y ningún acceso concedido por la URL.