In questo tutorial, costruirai MailKit, una piattaforma di email transazionali dove i clienti pagano in anticipo per un pool di crediti email. Il piano concede un’indennità mensile di email; quando i clienti sono a corto, possono acquistare un pacchetto di ricarica invece di aspettare il prossimo ciclo. Ogni invio detrae automaticamente un credito.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.
Questo tutorial utilizza Resend come fornitore di email. Il suo livello gratuito (3,000 email/mese) è sufficiente per costruire e testare l’intero flusso senza un account a pagamento. Il modello funziona con qualsiasi fornitore; sostituisci
resend.emails.send con SendGrid, Postmark, SES o il tuo relay SMTP.- Creare un’indennità di credito personalizzata (email) nel tuo dashboard
- Allegare crediti a un piano di abbonamento e a un prodotto di ricarica una tantum
- Inviare email reali tramite Resend e addebitare un credito per ogni invio tramite un’entrata nel registro
- Effettuare una query di saldo credito live dal tuo frontend
- Verificare correttamente i webhook di Dodo e gestire
credit.balance_lowper avvisare i clienti prima che finiscano i crediti
Cosa Stiamo Costruendo
Ecco il modello di prezzo per MailKit:| Prodotto | Prezzo | |
|---|---|---|
| Piano MailKit | $19/mese | 5,000 email/ciclo |
| Pacchetto Ricarica | $9 una tantum | +5,000 email |
Prima di iniziare, assicurati di avere:
- Un account Dodo Payments (va bene anche la modalità test)
- Un account gratuito Resend e una chiave API
- Node.js 18+ e familiarità di base con TypeScript
Passo 1: Crea la Tua Indennità di Credito Email
L’indennità di credito definisce l’unità che la tua piattaforma vende: in questo caso, un invio di email.
- Accedi al tuo dashboard Dodo Payments
- Clicca su Prodotti nella barra laterale sinistra
- Seleziona la scheda Crediti
- Clicca su Crea Credito
Email Credits
Tipo di Credito: Seleziona Unità Personalizzata
Nome Unità: email
Precisione: 0 (un’email è sempre un’unità intera; non puoi inviare mezza email)
Scadenza Credito: 30 days (il credito si reimposta ogni ciclo)
La precisione non può essere modificata dopo la creazione. Per unità discrete come email, messaggi o sessioni, 0 è corretto.
Non abiliteremo rollover o sovraccarico in questo tutorial; l’obiettivo è il flusso CBB più semplice possibile. Puoi rivedere questi aspetti sull’attacco del credito in seguito.
Clicca su Crea Credito. Apri il credito e copia il suo ID. Ti servirà per le query di saldo backend. Sembrerà con cent_xxxxxxxxxxxx.
Il tuo Email Credits è pronto. Successivo: i prodotti che concedono crediti ai clienti.
Passo 2: Crea il Piano e il Pacchetto Ricarica
Creerai due prodotti: un piano di Abbonamento ricorrente e una ricarica Pagamento Singolo. Il piano concede 5,000 email per ciclo; la ricarica aggiunge altre 5,000 a richiesta. Entrambi allegano lo stessoEmail Credits.
Questo tutorial detrae crediti con entrate dirette nel registro anziché contatori basati sull’uso. Le entrate nel registro sono immediate (il saldo si aggiorna in millisecondi), non richiedono configurazioni aggiuntive e sono adatte quando un’azione utente equivale esattamente a un credito. Se preferisci la detrazione automatica da eventi di uso trattati (utile per unità ponderate come “token” o “MB processati”), vedi Fatturazione a Credito → Fatturazione dell’Uso con Crediti per il modello basato su contatore.
Piano MailKit ($19/mese, 5,000 email)
- Vai su Prodotti → Crea Prodotto
- Compila i dettagli del prodotto:
MailKit Plan
Descrizione: 5,000 transactional emails per month.
- Seleziona Abbonamento come tipo di prodotto
- Imposta il prezzo ricorrente:
19.00
Ciclo di Fatturazione: Monthly
Valuta: USD
Scorri fino a Indennità → Crediti → Allegare e configura:
Indennità di Credito: Email Credits
Crediti emessi per ciclo di fatturazione: 5000
Soglia di Saldo Basso: 20 (percentuale; attiva credit.balance_low quando il saldo scende sotto il 20% dell’indennità del ciclo, cioè 1,000 email)
Importa Impostazioni di Credito Predefinite: abilitato (usa la scadenza di 30 giorni dal Passo 1)
Clicca su Aggiungi al Prodotto, quindi Salva il prodotto. Copia l’ID del prodotto (pdt_xxxxxxxxxxxx).
Piano: $19/mese → 5,000 email rinnovate ogni ciclo.
Pacchetto Ricarica ($9 una tantum, 5,000 email)
- Vai su Prodotti → Crea Prodotto
- Compila i dettagli del prodotto:
Email Top-Up Pack
Descrizione: Add 5,000 emails to your MailKit balance instantly.
- Seleziona Pagamento Singolo come tipo di prodotto
- Imposta il prezzo:
9.00
Valuta: USD
In Indennità → Crediti → Allegare:
- Indennità di Credito:
Email Credits - Crediti emessi:
5000
Passo 3: Configura il Backend
Ora costruisci il server Express che gestisce il checkout, l’invio, le query di saldo e i webhook.package.json:
tsx esegue TypeScript direttamente senza un passaggio di build o tsconfig.json, perfetto per un tutorial. Per la produzione, aggiungi un tsconfig.json e uno script build.
Crea .env:
.env
DODO_WEBHOOK_KEY nel Passo 4 dopo aver creato l’endpoint. La chiave API di Resend proviene da resend.com/api-keys.
Aggiungi .env a .gitignore immediatamente. Non commettere mai chiavi API.
Crea server.ts nella root del progetto:
server.ts
express.json() analizza e riserializza il corpo, il che interrompe la verifica della firma. Definisci /webhooks/dodo con express.raw() prima della riga app.use(express.json()).
Backend pronto: abbonamento, ricarica, saldo, invio e gestore di webhook tutto collegato.
Crea public/index.html:
public/index.html
Passo 4: Collega l’Endpoint Webhook
L’eventocredit.balance_low ti consente di avvisare i clienti prima che finiscano i crediti. Senza di esso, la prima volta che notano il problema è quando un’email fallisce l’invio.
I webhook necessitano un URL pubblico. Usa ngrok (o qualsiasi tunnel) durante lo sviluppo:
https://1234abcd.ngrok-free.app).
- Vai su Sviluppatori → Webhook → Aggiungi Endpoint
- URL:
https://1234abcd.ngrok-free.app/webhooks/dodo - Eventi: iscriviti a
credit.added,credit.balance_lowecredit.rolled_over - Salva, poi copia la chiave di firma nel tuo
.envcomeDODO_WEBHOOK_KEY - Riavvia il tuo server
Passo 5: Testa il Flusso Completo
MailKit running on http://localhost:3000. Aprilo nel tuo browser.
- Nella sezione 1, inserisci un’email e un nome di prova, clicca Ottieni link per il checkout
- Apri il link, completa il checkout con una carta di prova
- Dopo il pagamento, trova l’
customer_idnel tuo dashboard sotto Clienti
- Incolla l’
customer_idnella sezione 3 - Lascia
toimpostato sudelivered@resend.dev(la casella sandbox di Resend che accetta tutto) - Clicca Invia
- Vai su Clienti → [Cliente] → Crediti → Crediti Email
- Clicca Regola Saldo e addebita
4000 - Invia un’altra email attraverso la demo
- Incolla l’
customer_idnella sezione 4 - Clicca Compra 5,000 email, completa il checkout di prova
- Aggiorna il saldo, e aumenta di 5,000
credit.added si attiva con grant_source: one_time. La ricarica si somma ai crediti di abbonamento; entrambi i pool vengono consumati FIFO (il più vecchio non scaduto per primo).
Addebita manualmente il saldo a zero, quindi prova a inviare un’altra email. Riceverai:
Risoluzione dei Problemi
La firma è calcolata sul corpo HTTP grezzo.express.json() analizza e riserializza il payload, interrompendo l’HMAC. Assicurati che /webhooks/dodo sia registrato con express.raw({ type: 'application/json' }) sopra la riga app.use(express.json()), e che DODO_WEBHOOK_KEY corrisponda alla chiave di firma mostrata sulla pagina del dettaglio dell’endpoint.
Tre cose da verificare, in questo ordine:
- Il cliente ha completato il checkout (i crediti vengono emessi al pagamento riuscito, non alla creazione della sessione)
- Il
CREDIT_ENTITLEMENT_IDnel tuo.envcorrisponde al credito allegato al prodotto (ID non corrispondenti scrivono silenziosamente al credito sbagliato) - L’
customer_idche stai passando proviene da Dodo (la tabellacustomersnel dashboard), non dal tuo database
onboarding@resend.dev consegna solo all’email sul tuo account Resend o a delivered@resend.dev. Per inviare a qualcun altro, verifica un dominio e utilizza un indirizzo from su di esso.
Cosa Hai Costruito
Email Credits, definito una volta e allegato sia al piano di abbonamento che al pacchetto ricarica.
$19/mese concede 5,000 email per ciclo. I clienti sanno per cosa stanno pagando, tu conosci il tuo costo peggiore.
Un prodotto una tantum che concede 5,000 email. Si somma ai crediti di abbonamento senza bisogno di modificare il piano.
Una singola chiamata createLedgerEntry dopo ogni invio. Nessun contatore, nessun ritardo di aggregazione, idempotente al retry tramite l’id messaggio di Resend.
Leggi la documentazione completa di CBB per rollover, modalità di sovraccarico, gestione del registro e l’intera superficie API.
Hai bisogno di aiuto?
What You Built
One reusable credit unit
Email Credits, defined once and attached to both the subscription plan and the top-up pack.Subscription with prepaid allowance
$19/month grants 5,000 emails per cycle. Customers know what they’re paying for, you know your worst-case cost.
Top-up pack
A one-time product that grants 5,000 emails. Stacks on subscription credits with no plan change required.
Instant ledger debits
A single
createLedgerEntry call after each send. No meter, no aggregation lag, idempotent on retry via Resend’s message id.Credit-Based Billing Reference
Read the full CBB documentation for rollover, overage modes, ledger management, and the complete API surface.