En este tutorial, construirás MailKit, una plataforma de correo electrónico transaccional donde los clientes pagan por adelantado por un grupo de créditos de correo electrónico. El plan otorga una asignación mensual de correos electrónicos; cuando los clientes tienen poco saldo, pueden comprar un paquete de recarga en lugar de esperar al próximo ciclo. Cada envío deduce automáticamente un crédito.Documentation Index
Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
Use this file to discover all available pages before exploring further.
Este tutorial usa Resend como proveedor de correo electrónico. Su nivel gratuito (3,000 correos/mes) es suficiente para construir y probar todo el flujo sin una cuenta de pago. El patrón funciona con cualquier proveedor; intercambia
resend.emails.send por SendGrid, Postmark, SES o tu propio relé SMTP.- Crear un derecho de crédito personalizado (correos electrónicos) en tu panel
- Adjuntar créditos a un plan de suscripción y a un producto de recarga única
- Enviar correos reales a través de Resend y debitar un crédito por envío mediante una entrada de libro mayor
- Consultar un saldo de créditos en vivo desde tu frontend
- Verificar correctamente los webhooks de Dodo y manejar
credit.balance_lowpara alertar a los clientes antes de que lleguen a cero
Qué Estamos Construyendo
Aquí está el modelo de precios para MailKit:| Producto | Precio | Correos |
|---|---|---|
| Plan MailKit | $19/mes | 5,000 correos/ciclo |
| Paquete de Recarga | $9 única vez | +5,000 correos |
Antes de comenzar, asegúrate de tener:
- Una cuenta de Dodo Payments (modo de prueba es suficiente)
- Una cuenta gratuita de Resend y clave API
- Node.js 18+ y conocimientos básicos de TypeScript
Paso 1: Crear Tu Derecho de Crédito de Correo Electrónico
El derecho de crédito define la unidad que tu plataforma vende: en este caso, un envío de correo.
- Inicia sesión en tu panel de Dodo Payments
- Haz clic en Productos en la barra lateral izquierda
- Selecciona la pestaña Créditos
- Haz clic en Crear Crédito
Email Credits
Tipo de Crédito: Selecciona Unidad Personalizada
Nombre de la Unidad: email
Precisión: 0 (un correo electrónico siempre es una unidad completa; no puedes enviar medio correo)
Expiración del Crédito: 30 days (la asignación de cada ciclo se reinicia)
La precisión no se puede cambiar después de la creación. Para unidades discretas como correos electrónicos, mensajes o sesiones, 0 es correcto.
No habilitaremos rollover ni exceso en este recetario; el objetivo es el flujo CBB más simple posible. Puedes revisarlo en la asignación de créditos más tarde.
Haz clic en Crear Crédito. Abre el crédito y copia su ID. Lo necesitarás para consultas de saldo en el backend. Se ve como cent_xxxxxxxxxxxx.
Tu derecho Email Credits está listo. A continuación: los productos que otorgan créditos a los clientes.
Paso 2: Crear el Plan y el Paquete de Recarga
Crearás dos productos: un plan de Suscripción recurrente y una recarga de Pago Único. El plan otorga 5,000 correos cada ciclo; la recarga añade otros 5,000 a demanda. Ambos adjuntan el mismo derechoEmail Credits.
Este recetario deduce créditos con entradas de libro mayor directas en lugar de medidores basados en uso. Las entradas de libro mayor son inmediatas (el saldo se actualiza en milisegundos), no necesitan configuración adicional y son adecuadas cuando una acción del usuario equivale exactamente a un crédito. Si prefieres la deducción automática de eventos de uso ingresados (útil para unidades ponderadas como “tokens” o “MB procesados”), consulta Facturación Basada en Créditos → Facturación por Uso con Créditos para el patrón basado en medidores.
Plan MailKit ($19/mes, 5,000 correos)
- Ve a Productos → Crear Producto
- Rellena los detalles del producto:
MailKit Plan
Descripción: 5,000 transactional emails per month.
- Selecciona Suscripción como tipo de producto
- Establece el precio recurrente:
19.00
Ciclo de Facturación: Monthly
Moneda: USD
Desplázate hasta Derechos → Créditos → Adjuntar y configura:
Derecho de Crédito: Email Credits
Créditos emitidos por ciclo de facturación: 5000
Umbral de Bajo Saldo: 20 (porcentaje; se dispara credit.balance_low cuando el saldo cae por debajo del 20% de la asignación del ciclo, es decir, 1,000 correos)
Importar Configuración de Crédito por Defecto: habilitado (usa la expiración de 30 días del Paso 1)
Haz clic en Agregar al Producto, luego Guarda el producto. Copia el ID del producto (pdt_xxxxxxxxxxxx).
Plan: $19/mes → 5,000 correos actualizados cada ciclo.
Paquete de Recarga ($9 única vez, 5,000 correos)
- Ve a Productos → Crear Producto
- Rellena los detalles del producto:
Email Top-Up Pack
Descripción: Add 5,000 emails to your MailKit balance instantly.
- Selecciona Pago Único como tipo de producto
- Establece el precio:
9.00
Moneda: USD
En Derechos → Créditos → Adjuntar:
- Derecho de Crédito:
Email Credits - Créditos emitidos:
5000
Paso 3: Configurar el Backend
Ahora construye el servidor Express que gestiona el pago, envío, consultas de saldo y webhooks.package.json:
tsx ejecuta TypeScript directamente sin un paso de construcción o tsconfig.json, lo cual es perfecto para un tutorial. Para producción, añade un tsconfig.json y un script build.
Crea .env:
.env
DODO_WEBHOOK_KEY en el Paso 4 después de crear el endpoint. La clave API de Resend proviene de resend.com/api-keys.
Agrega .env a .gitignore inmediatamente. Nunca comprometas las claves API.
Crea server.ts en el raíz del proyecto:
server.ts
express.json() analiza y re-serializa el cuerpo, lo que rompe la verificación de la firma. Define /webhooks/dodo con express.raw() antes de la línea app.use(express.json()).
Backend listo: suscripciones, recargas, saldo, envío, y manejador de webhooks todo conectado.
Crea public/index.html:
public/index.html
Paso 4: Conectar el Endpoint del Webhook
El eventocredit.balance_low es lo que te permite alertar a los clientes antes de que se queden sin saldo. Sin él, la primera vez que notan el problema es cuando un correo falla al enviar.
Los webhooks necesitan una URL pública. Utiliza ngrok (o cualquier túnel) mientras desarrollas:
https://1234abcd.ngrok-free.app).
- Ve a Desarrolladores → Webhooks → Agregar Endpoint
- URL:
https://1234abcd.ngrok-free.app/webhooks/dodo - Eventos: suscríbete a
credit.added,credit.balance_low, ecredit.rolled_over - Guarda, luego copia la clave de firma en tu
.envcomoDODO_WEBHOOK_KEY - Reinicia tu servidor
Paso 5: Probar el Flujo Completo
MailKit running on http://localhost:3000. Ábrelo en tu navegador.
- En la sección 1, ingresa un correo de prueba y nombre, haz clic en Obtener enlace de pago
- Abre el enlace, completa el pago con una tarjeta de prueba
- Después del pago, encuentra el
customer_iden tu panel bajo Clientes
- Pega el
customer_iden la sección 3 - Deja
toconfigurado adelivered@resend.dev(el buzón sandbox de Resend que acepta todo) - Haz clic en Enviar
- Ve a Clientes → [Cliente] → Créditos → Créditos de Correo
- Haz clic en Ajustar Saldo y debitte
4000 - Envía un correo más a través de la demo
- Pega el
customer_iden la sección 4 - Haz clic en Comprar 5,000 correos, completa el pago de prueba
- Actualiza el saldo, y aumenta en 5,000
credit.added se activa con grant_source: one_time. La recarga se apila sobre los créditos de suscripción; ambos grupos se consumen FIFO (primero se consume la concesión no vencida más antigua).
Debita manualmente el saldo a cero, luego intenta enviar un correo más. Recibirás:
Solución de Problemas
La firma se calcula sobre el cuerpo HTTP crudo.express.json() analiza y re-serializa el payload, lo que rompe el HMAC. Asegúrate de que /webhooks/dodo esté registrado con express.raw({ type: 'application/json' }) encima de la línea app.use(express.json()), y que DODO_WEBHOOK_KEY coincida con la clave de firma mostrada en la página de detalles del endpoint.
Tres cosas para verificar, en este orden:
- El cliente completó el pago (los créditos se emiten con el pago exitoso, no con la creación de la sesión)
CREDIT_ENTITLEMENT_IDen tu.envcoincide con el crédito adjunto al producto (los IDs desajustados escriben silenciosamente al crédito incorrecto)- El
customer_idque estás pasando proviene de Dodo (la tablacustomersen el panel), no de tu propia base de datos
onboarding@resend.dev solo entrega al correo en tu cuenta de Resend o a delivered@resend.dev. Para enviar a cualquier otro, verifica un dominio y usa una dirección from en él.
Qué Construiste
Email Credits, definido una vez y adjunto tanto al plan de suscripción como al paquete de recarga.
$19/mes otorga 5,000 correos por ciclo. Los clientes saben por lo que están pagando, tú conoces tu costo máximo.
Un producto único que otorga 5,000 correos. Se acumula sobre los créditos de suscripción sin requerir un cambio de plan.
Una única llamada createLedgerEntry después de cada envío. Sin medidor, sin retraso de agregación, idempotente al reintentar vía el id de mensaje de Resend.
Lee la documentación completa de CBB para rollover, modos de exceso, gestión de libro mayor y el API completo.
¿Necesitas ayuda?