Skip to main content
Pour que votre agent de programmation rédige l’intégration, installez le Dodo Agent Plugin. Il ajoute les compétences et les serveurs MCP de Dodo Payments à Claude Code, Codex CLI, Cursor, VS Code / GitHub Copilot, Kiro et OpenCode.
Vous allez créer MailKit, un service d’e-mails transactionnels dans lequel les clients préachètent des crédits d’e-mails. Un forfait mensuel accorde 5 000 e-mails par cycle de facturation. Lorsqu’un client arrive à court de crédits, il achète un pack de recharge au lieu d’attendre le cycle suivant. Chaque envoi débite un crédit.
Ce tutoriel utilise Resend comme fournisseur d’e-mails. Son offre gratuite (3 000 e-mails par mois) suffit pour créer et tester l’ensemble du flux. Le modèle de facturation fonctionne avec n’importe quel fournisseur : remplacez resend.emails.send par un appel à SendGrid, Postmark, Amazon SES ou votre propre relais SMTP.
À la fin de ce tutoriel, vous saurez :
  • Créer un droit de crédit personnalisé pour les e-mails dans le dashboard.
  • Associer des crédits à un plan d’abonnement et à un produit de recharge ponctuel.
  • Envoyer des e-mails via Resend et débiter un crédit par envoi avec une entrée de ledger.
  • Lire le solde de crédits en temps réel d’un client depuis votre frontend.
  • Vérifier les webhooks de Dodo Payments et gérer credit.balance_low pour avertir les clients avant que leur solde n’atteigne zéro.

What We’re Building

MailKit vend deux produits : L’unité est un e-mail = un crédit. Les clients n’ont pas besoin de réfléchir en termes de tokens, de lots ou d’unités pondérées. Ils voient « 4 231 e-mails restants ce mois-ci ». Avant de commencer, vous avez besoin de :
  • Un compte Dodo Payments. Effectuez tout le développement en mode test.
  • Un compte Resend gratuit et une clé API.
  • Node.js 22 ou version ultérieure, ainsi qu’une bonne connaissance de TypeScript.

Étape 1 : créer votre droit de crédit pour les e-mails

Le droit de crédit définit l’unité vendue par MailKit : un envoi d’e-mail.
Onglet Credits sous Products, listant les droits de crédit de l’entreprise

The Credits tab under Products lists all your credit entitlements.

1

Open the Credits Section

  1. Connectez-vous au dashboard de Dodo Payments.
  2. Cliquez sur Products dans la barre latérale.
  3. Sélectionnez l’onglet Credits.
  4. Cliquez sur Create Credit.
2

Configure the Credit Unit

Saisissez les valeurs suivantes :Credit Name : Email CreditsCredit Type : Custom UnitUnit Name : emailDefine Precision : 0. Un e-mail est une unité entière, le solde n’a donc jamais besoin de décimales.Credit Expiry : 30 days. Les crédits inutilisés expirent 30 jours après leur émission.
La précision ne peut pas être modifiée après la création du crédit. Pour les unités discrètes telles que les e-mails, les messages ou les sessions, utilisez 0.
3

Leave the Other Defaults

Ce tutoriel désactive le report et le dépassement afin de conserver un flux de crédits minimal. Vous pourrez les activer ultérieurement, soit sur le crédit, soit sur la pièce jointe de crédit de chaque produit.
4

Save and Copy the Credit ID

Cliquez sur Create Credit. Ouvrez le crédit et copiez son ID, qui commence par cde_. Le backend l’utilise pour lire les soldes et créer les entrées de ledger.
Le droit Email Credits est prêt. Créez maintenant les produits qui l’accordent aux clients.

Étape 2 : créer le forfait et le pack de recharge

Créez deux produits qui associent le même droit Email Credits : un forfait Subscription qui accorde 5 000 e-mails à chaque cycle de facturation, et une recharge One Time qui en ajoute 5 000 à la demande.
Ce tutoriel débite les crédits avec des entrées de ledger plutôt qu’avec des compteurs d’utilisation. Un débit de ledger est appliqué lorsque l’appel API renvoie une réponse, ne nécessite aucune configuration de compteur et convient aux cas où une action utilisateur coûte exactement un crédit. Pour déduire automatiquement les crédits des événements d’utilisation ingérés, ce qui convient aux unités pondérées comme les tokens ou les mégaoctets traités, consultez Usage Billing with Credits dans le guide Credit-Based Billing.

Forfait MailKit ($19/mois, 5 000 e-mails)

1

Create the Subscription

  1. Accédez à Products et cliquez sur Add Product.
  2. Saisissez les informations du produit :
Product Name : MailKit PlanDescription : 5,000 transactional emails per month.
  1. Sous Pricing Type, sélectionnez Subscription.
  2. Définissez le prix récurrent :
Price : 19.00Repeat payment every : 1 moisCurrency : USD
2

Attach the Email Credit Entitlement

Dans la section Entitlements, cliquez sur Attach à côté de Credits et configurez les éléments suivants :Select credits : Email CreditsCredits issued per billing cycle : 5000Low Balance Threshold (%) : 20. Dodo Payments envoie credit.balance_low lorsque le solde passe sous 20 % des crédits émis par cycle, soit 1 000 e-mails.Import Default Credit Settings : activé, afin que le produit utilise l’expiration de 30 jours définie à l’étape 1.Ajoutez le crédit au produit, puis enregistrez le produit. Copiez l’ID du produit, qui commence par pdt_.
Forfait : $19/mois, avec 5 000 e-mails émis à chaque cycle de facturation.

Pack de recharge ($9 en paiement unique, 5 000 e-mails)

1

Create a One-Time Product

  1. Accédez à Products et cliquez sur Add Product.
  2. Saisissez les informations du produit :
Product Name : Email Top-Up PackDescription : Add 5,000 emails to your MailKit balance.
  1. Sous Pricing Type, sélectionnez One Time.
  2. Définissez le prix :
Price : 9.00Currency : USD
2

Attach the Credit Grant

Dans la section Entitlements, cliquez sur Attach à côté de Credits et configurez les éléments suivants :
  • Select credits : Email Credits
  • No of credits issued : 5000
Un produit ponctuel accorde des crédits avec leur propre expiration : 30 jours à compter de l’achat, selon la valeur par défaut définie à l’étape 1. Les crédits de recharge s’ajoutent aux crédits de l’abonnement. Ils ne les remplacent pas.
Enregistrez le produit et copiez son ID.
Pack de recharge : $9 pour 5 000 e-mails, ajoutés au solde une fois le paiement réussi.

Étape 3 : configurer le backend

Créez le serveur Express qui crée les checkouts, envoie les e-mails, lit les soldes et reçoit les webhooks.
1

Initialize the Project

Ajoutez un script de développement à package.json :
tsx exécute TypeScript directement, sans étape de build ni tsconfig.json. En production, ajoutez un tsconfig.json et un script build.
2

Configure Environment Variables

Créez .env avec une clé API de mode test obtenue dans Developer → API Keys, ainsi qu’avec les ID des étapes 1 et 2 :
.env
Vous renseignerez DODO_PAYMENTS_WEBHOOK_KEY à l’étape 4, après avoir créé le endpoint webhook. Créez la clé API Resend sur resend.com/api-keys.
Ajoutez .env à .gitignore avant votre premier commit. Ne commitez jamais de clés API.
3

Build the Server

Créez server.ts à la racine du projet. Le serveur expose cinq routes : checkout d’abonnement, checkout de recharge, lecture du solde, envoi et réception du webhook.
La route webhook doit recevoir le corps brut de la requête. express.json() remplace le corps par un objet analysé, alors que la vérification de signature nécessite les octets exacts signés par Dodo Payments. Conservez la route /webhooks/dodo, avec express.raw(), au-dessus de la ligne app.use(express.json()).
Le backend est prêt : abonnement, recharge, solde, envoi et gestionnaire de webhook.
4

Add a Demo UI

Créez public/index.html. Il appelle chaque route depuis un formulaire simple afin que vous puissiez tester le flux dans un navigateur :

Étape 4 : connecter le endpoint webhook

L’événement credit.balance_low vous permet d’avertir les clients avant qu’ils ne soient à court de crédits. Sans lui, un client ne remarque le problème qu’au moment où un e-mail ne peut plus être envoyé.
1

Expose Your Local Server

Les webhooks nécessitent une URL publique. Pendant le développement, utilisez ngrok ou un autre tunnel :
Copiez l’URL de transfert HTTPS, par exemple https://1234abcd.ngrok-free.app.
2

Register the Endpoint in Dodo Payments

  1. Accédez à Developer → Webhooks et cliquez sur Add endpoint.
  2. Saisissez l’URL https://1234abcd.ngrok-free.app/webhooks/dodo en utilisant l’hôte de votre propre tunnel.
  3. Sélectionnez les événements credit.added, credit.balance_low et credit.rolled_over.
  4. Cliquez sur Create endpoint.
  5. Copiez le secret de signature depuis l’onglet Overview du endpoint dans .env en tant que DODO_PAYMENTS_WEBHOOK_KEY.
  6. Redémarrez le serveur.

Étape 5 : tester le flux complet

1

Start the Server

Le serveur consigne MailKit running on http://localhost:3000. Ouvrez cette URL dans votre navigateur.
2

Subscribe a Test Customer

  1. Dans la section 1, saisissez une adresse e-mail et un nom de test, puis cliquez sur Get checkout link.
  2. Ouvrez le lien et terminez le checkout avec une carte de test.
  3. Dans le dashboard, accédez à Customers et copiez l’ID du nouveau client, qui commence par cus_.
Le client dispose de 5 000 e-mails dans son solde. Pour le confirmer, ouvrez le client dans Customers et sélectionnez l’onglet Credits.
3

Send an Email

  1. Collez l’ID du client dans la section 3.
  2. Laissez To défini sur delivered@resend.dev, une adresse de test Resend qui accepte tous les messages.
  3. Cliquez sur Send.
La page affiche l’ID du message Resend. Actualisez le solde dans la section 2 : il est de 4 999. Un débit de ledger est pris en compte dans le solde dès que l’appel API renvoie une réponse.
4

Trigger the Low-Balance Webhook

Le seuil est de 20 %, soit 1 000 des 5 000 e-mails émis par cycle. Pour l’atteindre sans envoyer 4 000 e-mails, débitez manuellement le solde dans le dashboard :
  1. Ouvrez le client dans Customers, sélectionnez l’onglet Credits, puis choisissez Email Credits.
  2. Cliquez sur Apply Credit/Debit, sélectionnez Debit et saisissez 4000. Le solde est désormais exactement de 1 000, ce qui n’est pas encore inférieur au seuil.
  3. Envoyez un e-mail supplémentaire depuis la démo. Le solde passe à 999.
Lorsque le webhook arrive, le serveur consigne :
Le serveur a reçu et vérifié le webhook. En production, c’est ici que vous envoyez un e-mail au client ou affichez une bannière dans l’application.
5

Buy a Top-Up Pack

  1. Collez l’ID du client dans la section 4.
  2. Cliquez sur Buy 5,000 emails et terminez le checkout de test.
  3. Actualisez le solde. Il augmente de 5 000.
Dodo Payments envoie un événement credit.added avec transaction_type: "credit_added". Le grant associé possède source_type: one_time, que vous pouvez relire avec l’API List Customer Grants. Les crédits de recharge s’ajoutent aux crédits de l’abonnement. Les débits utilisent d’abord le grant qui expire en premier, puis le grant le plus ancien lorsque deux grants expirent au même moment.
6

Test the Hard Stop

Débitez le solde jusqu’à zéro dans le dashboard, puis essayez d’envoyer un e-mail supplémentaire. Le serveur répond avec 402 :
Ce 402 constitue le mécanisme de contrôle de votre application. Considérez l’API de solde de Dodo Payments comme la source de vérité et ne mettez pas le solde en cache côté client.

Résolution des problèmes

La signature couvre le corps HTTP brut. express.json() remplace le corps par un objet analysé, ce qui fait échouer la vérification. Enregistrez /webhooks/dodo avec express.raw({ type: 'application/json' }) au-dessus de la ligne app.use(express.json()). Vérifiez ensuite que DODO_PAYMENTS_WEBHOOK_KEY correspond au secret de signature affiché dans l’onglet Overview du endpoint.
Vérifiez ces trois éléments, dans l’ordre :
  1. Le client a terminé le checkout. Les crédits sont émis lorsque le paiement réussit, et non lors de la création de la session de checkout.
  2. CREDIT_ENTITLEMENT_ID dans .env correspond au crédit associé au produit. Les appels de solde et de ledger utilisent cet ID ; une incohérence permet donc de lire ou de débiter un autre crédit.
  3. Le customer_id transmis est l’ID client Dodo Payments (il commence par cus_), et non un ID provenant de votre propre base de données.
L’expéditeur de test onboarding@resend.dev n’envoie des e-mails qu’à l’adresse associée à votre compte Resend ou à delivered@resend.dev. Pour envoyer des e-mails à d’autres destinataires, vérifiez un domaine et utilisez une adresse from sur ce domaine.

Ce que vous avez créé

One Reusable Credit Unit

Email Credits, défini une seule fois et associé à la fois au forfait d’abonnement et au pack de recharge.

Subscription with Prepaid Allowance

$19/mois accordent 5 000 e-mails par cycle de facturation. Les clients savent ce qu’ils paient et vous connaissez votre coût maximal.

Top-Up Pack

Un produit ponctuel qui accorde 5 000 e-mails en plus des crédits d’abonnement, sans modifier le forfait.

Direct Ledger Debits

Un appel createLedgerEntry après chaque envoi, sans compteur ni délai d’agrégation. L’ID du message Resend utilisé comme clé d’idempotence empêche un second débit pour le même envoi.

Credit-Based Billing Reference

Le report, les modes de dépassement, la gestion du ledger et l’API complète des crédits.
Pour obtenir de l’aide, posez votre question dans la Discord Community ou envoyez un e-mail à support@dodopayments.com.
Dernière modification le 26 septembre 2026