Skip to main content
Per fare in modo che il tuo agente di coding scriva l’integrazione, installa il Dodo Agent Plugin. Aggiunge le competenze e i server MCP di Dodo Payments a Claude Code, Codex CLI, Cursor, VS Code / GitHub Copilot, Kiro e OpenCode.
Creerai MailKit, un servizio di email transazionali in cui i clienti acquistano in anticipo i crediti email. Un piano mensile concede 5.000 email per ciclo di fatturazione. Un cliente con pochi crediti acquista un pacchetto di ricarica invece di aspettare il ciclo successivo. Ogni invio addebita un credito.
Questo tutorial usa Resend come provider email. Il suo piano gratuito (3.000 email al mese) è sufficiente per creare e testare l’intero flusso. Il modello di fatturazione funziona con qualsiasi provider: sostituisci resend.emails.send con una chiamata a SendGrid, Postmark, Amazon SES o al tuo relay SMTP.
Al termine saprai come:
  • Creare nel dashboard un’entitlement di crediti personalizzata per le email.
  • Collegare i crediti a un piano di abbonamento e a un prodotto di ricarica una tantum.
  • Inviare email tramite Resend e addebitare un credito per ogni invio con una voce nel ledger.
  • Leggere il saldo crediti aggiornato di un cliente dal frontend.
  • Verificare i webhook di Dodo Payments e gestire credit.balance_low per avvisare i clienti prima che il saldo raggiunga lo zero.

What We’re Building

MailKit vende due prodotti: L’unità è un’email = un credito. I clienti non devono ragionare in termini di token, batch o unità ponderate. Vedono “4.231 email rimanenti questo mese”. Prima di iniziare, ti servono:
  • Un account Dodo Payments. Crea tutto in modalità test.
  • Un account Resend gratuito e una API key.
  • Node.js 22 o versioni successive e una conoscenza operativa di TypeScript.

Passaggio 1: crea l’entitlement di crediti email

L’entitlement di crediti definisce l’unità venduta da MailKit: un invio email.
Scheda Credits sotto Products, con gli entitlement di crediti dell'attività

The Credits tab under Products lists all your credit entitlements.

1

Open the Credits Section

  1. Accedi al dashboard di Dodo Payments.
  2. Fai clic su Products nella barra laterale.
  3. Seleziona la scheda Credits.
  4. Fai clic su Create Credit.
2

Configure the Credit Unit

Inserisci questi valori:Credit Name: Email CreditsCredit Type: Custom UnitUnit Name: emailDefine Precision: 0. Un’email è un’unità intera, quindi il saldo non avrà mai valori decimali.Credit Expiry: 30 days. I crediti inutilizzati scadono 30 giorni dopo l’emissione.
La precisione non può essere modificata dopo la creazione del credito. Per unità discrete come email, messaggi o sessioni, usa 0.
3

Leave the Other Defaults

Questo tutorial lascia disattivati rollover ed eccedenze per mantenere semplice il flusso dei crediti. Potrai attivarli in seguito, sul credito o sull’associazione dei crediti di ciascun prodotto.
4

Save and Copy the Credit ID

Fai clic su Create Credit. Apri il credito e copia il suo ID, che inizia con cde_. Il backend lo usa per leggere i saldi e creare le voci nel ledger.
L’entitlement Email Credits è pronto. Ora crea i prodotti che lo concederanno ai clienti.

Passaggio 2: crea il piano e il pacchetto di ricarica

Crea due prodotti che associano lo stesso entitlement Email Credits: un piano Subscription che concede 5.000 email per ogni ciclo di fatturazione e una ricarica One Time che ne aggiunge altre 5.000 su richiesta.
Questo tutorial addebita i crediti con voci nel ledger invece di usare usage meter. Un addebito nel ledger viene applicato quando la chiamata API restituisce il risultato, non richiede la configurazione di un meter ed è adatto ai casi in cui un’azione dell’utente costa esattamente un credito. Per dedurre automaticamente i crediti dagli eventi di utilizzo acquisiti, soluzione adatta a unità ponderate come token o megabyte elaborati, consulta Usage Billing with Credits nella guida Credit-Based Billing.

Piano MailKit ($19/mese, 5.000 email)

1

Create the Subscription

  1. Vai a Products e fai clic su Add Product.
  2. Inserisci i dettagli del prodotto:
Product Name: MailKit PlanDescription: 5,000 transactional emails per month.
  1. In Pricing Type, seleziona Subscription.
  2. Imposta il prezzo ricorrente:
Price: 19.00Repeat payment every: 1 monthCurrency: USD
2

Attach the Email Credit Entitlement

Nella sezione Entitlements, fai clic su Attach accanto a Credits e configura:Select credits: Email CreditsCredits issued per billing cycle: 5000Low Balance Threshold (%): 20. Dodo Payments invia credit.balance_low quando il saldo scende sotto il 20% dei crediti emessi per ciclo, cioè 1.000 email.Import Default Credit Settings: attivato, così il prodotto usa la scadenza di 30 giorni del Passaggio 1.Aggiungi il credito al prodotto, quindi salva il prodotto. Copia l’ID del prodotto, che inizia con pdt_.
Piano: $19/mese, con 5.000 email emesse per ogni ciclo di fatturazione.

Pacchetto di ricarica ($9 una tantum, 5.000 email)

1

Create a One-Time Product

  1. Vai a Products e fai clic su Add Product.
  2. Inserisci i dettagli del prodotto:
Product Name: Email Top-Up PackDescription: Add 5,000 emails to your MailKit balance.
  1. In Pricing Type, seleziona One Time.
  2. Imposta il prezzo:
Price: 9.00Currency: USD
2

Attach the Credit Grant

Nella sezione Entitlements, fai clic su Attach accanto a Credits e configura:
  • Select credits: Email Credits
  • No of credits issued: 5000
Un prodotto una tantum concede crediti con una propria scadenza: 30 giorni dall’acquisto, secondo il valore predefinito impostato nel Passaggio 1. I crediti della ricarica si aggiungono a quelli dell’abbonamento, non li sostituiscono.
Salva il prodotto e copia il suo ID.
Pacchetto di ricarica: $9 per 5.000 email, aggiunte al saldo dopo il completamento del pagamento.

Passaggio 3: configura il backend

Crea il server Express che genera i checkout, invia le email, legge i saldi e riceve i webhook.
1

Initialize the Project

Aggiungi uno script dev a package.json:
tsx esegue TypeScript direttamente, senza una fase di build o un tsconfig.json. Per la produzione, aggiungi un tsconfig.json e uno script build.
2

Configure Environment Variables

Crea .env con una API key in modalità test da Developer → API Keys e gli ID dei Passaggi 1 e 2:
.env
Compilerai DODO_PAYMENTS_WEBHOOK_KEY nel Passaggio 4, dopo aver creato l’endpoint webhook. Crea la API key di Resend su resend.com/api-keys.
Aggiungi .env a .gitignore prima del primo commit. Non eseguire mai il commit delle API key.
3

Build the Server

Crea server.ts nella root del progetto. Il server espone cinque route: checkout dell’abbonamento, checkout della ricarica, lettura del saldo, invio e ricezione del webhook.
La route webhook deve ricevere il raw request body. express.json() sostituisce il body con un oggetto analizzato, mentre la verifica della firma richiede gli stessi byte esatti firmati da Dodo Payments. Mantieni la route /webhooks/dodo, con express.raw(), sopra la riga app.use(express.json()).
Il backend è pronto: abbonamento, ricarica, saldo, invio e gestore dei webhook.
4

Add a Demo UI

Crea public/index.html. Chiama ogni route da un semplice form, così puoi testare il flusso nel browser:

Passaggio 4: collega l’endpoint webhook

L’evento credit.balance_low ti consente di avvisare i clienti prima che esauriscano i crediti. Senza di esso, un cliente si accorge del problema solo quando un’email non viene inviata.
1

Expose Your Local Server

I webhook richiedono un URL pubblico. Durante lo sviluppo, usa ngrok o un altro tunnel:
Copia l’URL HTTPS di inoltro, ad esempio https://1234abcd.ngrok-free.app.
2

Register the Endpoint in Dodo Payments

  1. Vai a Developer → Webhooks e fai clic su Add endpoint.
  2. Inserisci l’URL https://1234abcd.ngrok-free.app/webhooks/dodo, usando l’host del tuo tunnel.
  3. Seleziona gli eventi credit.added, credit.balance_low e credit.rolled_over.
  4. Fai clic su Create endpoint.
  5. Copia il signing secret dalla scheda Overview dell’endpoint in .env come DODO_PAYMENTS_WEBHOOK_KEY.
  6. Riavvia il server.

Passaggio 5: testa il flusso completo

1

Start the Server

Il server registra MailKit running on http://localhost:3000. Apri quell’URL nel browser.
2

Subscribe a Test Customer

  1. Nella sezione 1, inserisci un indirizzo email e un nome di test, quindi fai clic su Get checkout link.
  2. Apri il link e completa il checkout con una carta di test.
  3. Nel dashboard, vai a Customers e copia l’ID del nuovo cliente, che inizia con cus_.
Il cliente ha 5.000 email nel saldo. Per confermarlo, apri il cliente in Customers e seleziona la scheda Credits.
3

Send an Email

  1. Incolla l’ID del cliente nella sezione 3.
  2. Lascia To impostato su delivered@resend.dev, un indirizzo di test di Resend che accetta ogni messaggio.
  3. Fai clic su Send.
La pagina mostra l’ID del messaggio Resend. Aggiorna il saldo nella sezione 2: ora è 4.999. Un addebito nel ledger fa parte del saldo non appena la chiamata API restituisce il risultato.
4

Trigger the Low-Balance Webhook

La soglia è del 20%, cioè 1.000 dei 5.000 messaggi email emessi per ciclo. Per raggiungerla senza inviare 4.000 email, addebita manualmente il saldo nel dashboard:
  1. Apri il cliente in Customers, seleziona la scheda Credits e scegli Email Credits.
  2. Fai clic su Apply Credit/Debit, seleziona Debit e inserisci 4000. Il saldo è ora esattamente 1.000, quindi non è ancora sotto la soglia.
  3. Invia un’altra email dalla demo. Il saldo scende a 999.
Quando arriva il webhook, il server registra:
Il server ha ricevuto e verificato il webhook. In produzione, qui puoi inviare un’email al cliente o mostrare un banner in-app.
5

Buy a Top-Up Pack

  1. Incolla l’ID del cliente nella sezione 4.
  2. Fai clic su Buy 5,000 emails e completa il checkout di test.
  3. Aggiorna il saldo. Aumenta di 5.000.
Dodo Payments invia un evento credit.added con transaction_type: "credit_added". Il grant associato ha source_type: one_time, che puoi leggere nuovamente con l’API List Customer Grants. I crediti della ricarica si aggiungono a quelli dell’abbonamento. Gli addebiti vengono scalati dal grant con la scadenza più vicina e, quando due grant scadono contemporaneamente, da quello più vecchio.
6

Test the Hard Stop

Porta il saldo a zero nel dashboard, quindi prova a inviare un’altra email. Il server risponde con 402:
402 è l’applicazione della regola nella tua app. Considera l’API del saldo di Dodo Payments come fonte autorevole e non memorizzare il saldo nella cache del client.

Risoluzione dei problemi

La firma copre il raw HTTP body. express.json() sostituisce il body con un oggetto analizzato, quindi la verifica fallisce. Registra /webhooks/dodo con express.raw({ type: 'application/json' }) sopra la riga app.use(express.json()). Controlla quindi che DODO_PAYMENTS_WEBHOOK_KEY corrisponda al signing secret nella scheda Overview dell’endpoint.
Controlla questi tre aspetti, nell’ordine:
  1. Il cliente ha completato il checkout. I crediti vengono emessi quando il pagamento va a buon fine, non quando viene creata la sessione di checkout.
  2. CREDIT_ENTITLEMENT_ID in .env corrisponde al credito associato al prodotto. Le chiamate per il saldo e il ledger usano questo ID, quindi una discrepanza legge o addebita un credito diverso.
  3. customer_id passato è l’ID cliente di Dodo Payments (inizia con cus_), non un ID del tuo database.
Il mittente di test onboarding@resend.dev consegna solo all’indirizzo email del tuo account Resend o a delivered@resend.dev. Per inviare a chiunque altro, verifica un dominio e usa un indirizzo from su quel dominio.

Cosa hai creato

One Reusable Credit Unit

Email Credits, definito una sola volta e associato sia al piano di abbonamento sia al pacchetto di ricarica.

Subscription with Prepaid Allowance

$19/mese concede 5.000 email per ogni ciclo di fatturazione. I clienti sanno per cosa pagano e tu conosci il costo massimo.

Top-Up Pack

Un prodotto una tantum che concede 5.000 email oltre ai crediti dell’abbonamento, senza modificare il piano.

Direct Ledger Debits

Una chiamata createLedgerEntry dopo ogni invio, senza meter né ritardo di aggregazione. L’ID del messaggio Resend come chiave di idempotenza impedisce un secondo addebito per lo stesso invio.

Credit-Based Billing Reference

Rollover, modalità di eccedenza, gestione del ledger e API completa dei crediti.
Per ricevere assistenza, chiedi nella Discord Community o scrivi a support@dodopayments.com.
Ultima modifica il 26 settembre 2026