Skip to main content
Fai scrivere il tuo codice d’integrazione a Sentra.
Usa il nostro assistente AI in VS Code, Cursor, o Windsurf per generare codice SDK/API, gestori di webhook e molto altro, semplicemente descrivendo ciò di cui hai bisogno.
Prova Sentra: Integrazione Potenziata da AI →
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.
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.
Alla fine di questo tutorial, saprai come:
  • 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_low per avvisare i clienti prima che finiscano i crediti

Cosa Stiamo Costruendo

Ecco il modello di prezzo per MailKit: L’unità è una email = un credito. I clienti non devono pensare a token, lotti, o unità ponderate. Vedono semplicemente “ti restano 4,231 email questo mese.”
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.
Pagina di elenco dei crediti

The Credits tab under Products lists all your credit entitlements.

  1. Accedi al tuo dashboard Dodo Payments
  2. Clicca su Prodotti nella barra laterale sinistra
  3. Seleziona la scheda Crediti
  4. Clicca su Crea Credito
Compila i dettagli del credito: Nome 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 stesso Email 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)

  1. Vai su Prodotti → Crea Prodotto
  2. Compila i dettagli del prodotto:
Nome Prodotto: MailKit Plan Descrizione: 5,000 transactional emails per month.
  1. Seleziona Abbonamento come tipo di prodotto
  2. Imposta il prezzo ricorrente:
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)

  1. Vai su Prodotti → Crea Prodotto
  2. Compila i dettagli del prodotto:
Nome Prodotto: Email Top-Up Pack Descrizione: Add 5,000 emails to your MailKit balance instantly.
  1. Seleziona Pagamento Singolo come tipo di prodotto
  2. Imposta il prezzo:
Prezzo: 9.00 Valuta: USD In Indennità → Crediti → Allegare:
  • Indennità di Credito: Email Credits
  • Crediti emessi: 5000
I prodotti una tantum concedono crediti con una propria scadenza (30 giorni dall’acquisto, per il Passo 1). Le ricariche si sommano ai crediti di abbonamento; non li sostituiscono. Salva e copia l’ID del prodotto. Pacchetto Ricarica: $9 → +5,000 email, disponibile immediatamente.

Passo 3: Configura il Backend

Ora costruisci il server Express che gestisce il checkout, l’invio, le query di saldo e i webhook.
Aggiungi uno script di sviluppo a 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
Compila 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
Il corpo del webhook deve essere grezzo. 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’evento credit.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:
Copia l’URL di inoltro HTTPS (ad es. https://1234abcd.ngrok-free.app).
  1. Vai su Sviluppatori → Webhook → Aggiungi Endpoint
  2. URL: https://1234abcd.ngrok-free.app/webhooks/dodo
  3. Eventi: iscriviti a credit.added, credit.balance_low e credit.rolled_over
  4. Salva, poi copia la chiave di firma nel tuo .env come DODO_WEBHOOK_KEY
  5. Riavvia il tuo server

Passo 5: Testa il Flusso Completo

Dovresti vedere MailKit running on http://localhost:3000. Aprilo nel tuo browser.
  1. Nella sezione 1, inserisci un’email e un nome di prova, clicca Ottieni link per il checkout
  2. Apri il link, completa il checkout con una carta di prova
  3. Dopo il pagamento, trova l’customer_id nel tuo dashboard sotto Clienti
Il cliente dovrebbe ora avere 5,000 email nel suo saldo. Controlla Clienti → [Cliente] → Crediti.
  1. Incolla l’customer_id nella sezione 3
  2. Lascia to impostato su delivered@resend.dev (la casella sandbox di Resend che accetta tutto)
  3. Clicca Invia
Riceverai un id messaggio di Resend indietro. Aggiorna il saldo nella sezione 2 e il conteggio scende immediatamente a 4,999. Ogni addebito nel registro si riflette nel saldo live nel momento in cui è scritto. La soglia è il 20% (1,000 delle 5,000 email di indennità). Per attivarla senza inviare 4,000 email reali, addebitare manualmente il saldo dal dashboard:
  1. Vai su Clienti → [Cliente] → Crediti → Crediti Email
  2. Clicca Regola Saldo e addebita 4000
  3. Invia un’altra email attraverso la demo
Il tuo server dovrebbe registrare entro pochi secondi: Il tuo server ha ricevuto e verificato il webhook. In produzione, è qui che invieresti un’email al cliente o mostreresti un banner in-app.
  1. Incolla l’customer_id nella sezione 4
  2. Clicca Compra 5,000 email, completa il checkout di prova
  3. Aggiorna il saldo, e aumenta di 5,000
Un evento 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:
Quel 402 è la tua applicazione di livello esecutivo. L’API del saldo Dodo è la fonte di verità; non memorizzarla mai sul client.

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:
  1. Il cliente ha completato il checkout (i crediti vengono emessi al pagamento riuscito, non alla creazione della sessione)
  2. Il CREDIT_ENTITLEMENT_ID nel tuo .env corrisponde al credito allegato al prodotto (ID non corrispondenti scrivono silenziosamente al credito sbagliato)
  3. L’customer_id che stai passando proviene da Dodo (la tabella customers nel dashboard), non dal tuo database
Il mittente sandbox 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.
Need help?
Ultima modifica il 13 maggio 2026