Skip to main content
To have your coding agent write the integration, install the Dodo Agent Plugin. It adds the Dodo Payments skills and MCP servers to Claude Code, Codex CLI, Cursor, VS Code / GitHub Copilot, Kiro, and OpenCode.
You’ll build NeuralAPI, a tiered AI API where each subscription plan includes a monthly allowance of token credits. Customers who run low buy a top-up pack, and your backend reports the tokens each OpenAI request uses so Dodo Payments deducts them from the customer’s balance.
This tutorial uses Node.js, Express, and the OpenAI SDK. The Dodo Payments concepts (credits, meters, and webhooks) work the same with any framework or AI provider.
When you finish, you’ll know how to:
  • Create a custom credit entitlement for tokens, and a meter that deducts from it.
  • Attach credits to subscription plans, with and without overage, and to a one-time top-up product.
  • Call OpenAI from an endpoint that bills tokens through Dodo Payments.
  • Read a customer’s live credit balance with the SDK.
  • Verify webhook signatures and route Dodo Payments credit events.

What We’re Building

NeuralAPI sells three products: Before you start, you need:
  • A Dodo Payments account. Build everything in test mode.
  • An OpenAI API key.
  • Node.js 22 or later, and working knowledge of TypeScript and Node.js.

Step 1: Create Your Token Credit Entitlement

Create the credit entitlement that both plans and the top-up pack share. It defines the token unit NeuralAPI sells.
Credits listing page showing created credit entitlements

The Credits tab under Products shows all your credit entitlements.

1

Navigate to Credits

  1. Log in to the Dodo Payments dashboard.
  2. Click Products in the sidebar.
  3. Select the Credits tab.
  4. Click Create Credit.
2

Configure the Credit Unit

Enter these values:Credit Name: API TokensCredit Type: Custom UnitUnit Name: tokenDefine Precision: 0. Token counts are whole numbers.Credit Expiry: 30 days. Credits expire 30 days after they’re issued, which matches the monthly billing cycle.
Precision can’t be changed after you create the credit. For token counts, use 0.
3

Skip Overage at the Credit Level

Leave overage disabled on the credit. You configure it per plan when you attach the credit to each product, so the Starter plan can block usage at zero while the Pro plan allows overage.
Overage settings on the credit are defaults. Each product attachment can override them, which Step 3 does for the Pro plan.
4

Save and Copy the Credit ID

Click Create Credit. Open the saved credit and copy its ID, which starts with cde_.
The API Tokens credit entitlement is ready. Next, create a meter so that usage events deduct credits.

Step 2: Create a Meter for Token Usage

A meter aggregates incoming usage events. When you link it to a credit, the aggregated usage is deducted from the customer’s credit balance. Create the meter before the plan products, because you attach it while you create them in Step 3.
1

Open the Meters Section

  1. In the dashboard sidebar, go to Products → Meters.
  2. Click Create Meter.
2

Configure the Meter

Enter these values:Meter Name: Token Usage MeterEvent Name: api.tokens_used. This must match the event_name your app sends.Aggregation Type: Sum, to add up the token count from each event.Over Property: tokens, the metadata key whose value is summed.Measurement Unit: tokens
Event names are case-sensitive: api.tokens_used and Api.Tokens.Used are different events. You can’t edit a meter after you create it, so check every value before you confirm.
Create the meter. You select it by name when you attach it to products.
The meter is created. Next, link it to the credit on each plan product.

Step 3: Create the Plan Products

Create both plans with the Usage Based Billing pricing type, not plain Subscription. Meters attach to Usage Based Billing products, and the meter is what deducts credits as customers call your API. A Usage Based Billing product still charges a recurring base fee ($29 or $99), and usage on top of it is billed in credits.
Usage Based Billing pricing configuration

Usage Based Billing pricing type with meter configuration.

Starter Plan ($29/month — 10M Tokens, No Overage)

1

Create the Starter Product

  1. Go to Products and click Add Product.
  2. Under Pricing Type, select Usage Based Billing.
  3. Enter these values:
Product Name: NeuralAPI StarterDescription: 10 million API tokens per month. Perfect for individual developers and small projects.Price: 29.00. This is the recurring base fee, charged every month even before any usage.Repeat payment every: 1 monthCurrency: USD
2

Attach the Meter

In the Select meter section, click + and add Token Usage Meter. Then configure the meter:
  1. Turn on Bill usage in credits.
  2. Select credit: API Tokens
  3. Meter units per credit: 1. Each token in an event deducts one credit.
  4. Free Threshold: 0. The free threshold applies only when a meter bills in money. When it bills in credits, every unit is deducted from the balance.
Meter with Bill usage in Credits enabled and API Tokens selected

Toggle 'Bill usage in Credits' on the meter and pick the credit entitlement.

This link is what makes incoming api.tokens_used events deduct from the customer’s balance.
3

Configure Credit Issuance for Starter

After you attach a credit-billed meter, the product shows a credit configuration section. Enter:Credits issued per billing cycle: 10000000Import Default Credit Settings: on, so the product uses the 30-day expiry from the credit entitlement.Allow Overage: off. The default from Step 1 keeps overage disabled, so Starter customers stop at zero.
Credit configuration form with per-cycle amount and overage settings

Configure credit issuance per cycle on the UBB product.

Save the product and copy its ID, which starts with pdt_.
Starter Plan: $29/month base fee, 10M tokens per cycle, blocked at zero, and deducted through the meter.

Pro Plan ($99/month — 40M Tokens, Overage Enabled)

1

Create the Pro Product

Follow the Starter flow with these values:Product Name: NeuralAPI ProDescription: 40 million API tokens per month with overage. Built for production applications.Price: 99.00Repeat payment every: 1 monthCurrency: USD
2

Attach the Meter

Configure the meter as you did for Starter: add Token Usage Meter, turn on Bill usage in credits, select API Tokens, and set Meter units per credit to 1 and Free Threshold to 0.
3

Configure Credit Issuance with Overage

Configure credit issuance, this time with overage enabled:Credits issued per billing cycle: 40000000Import Default Credit Settings: off, so you can set overage for this product.Allow Overage: onPrice Per Unit: 0.000005 USD per token. That is $0.005 per 1K tokens, or $5 per 1M tokens, which is above the plan’s effective per-token rate and discourages overage.Overage Behavior: Bill overage at billing. Overage is charged on the next invoice, and then the balance resets.Save the product and copy its ID.
Pro Plan: $99/month base fee, 40M tokens per cycle, overage at $0.005 per 1K tokens, and deducted through the meter.

Step 4: Create the Token Top-Up Pack

The top-up pack is a one-time purchase that adds 5,000,000 tokens to an existing customer’s balance.
Product pricing section with Single Payment selected

One-time pricing selected for a credit product.

1

Create a One-Time Product

  1. Go to Products and click Add Product.
  2. Under Pricing Type, select One Time.
  3. Enter these values:
Product Name: Token Top-Up PackDescription: Add 5 million tokens to your NeuralAPI balance.Price: 19.00Currency: USD
2

Attach the Token Credit

  1. In the Entitlements section, click Attach next to Credits.
  2. Select API Tokens.
  3. Set No of credits issued to 5000000.
  4. Turn off Import Default Credit Settings to override the default 30-day expiry.
  5. Set Credit Expiry to Custom and enter 365 days.
  6. Save the product.
Copy the product ID.
Pourquoi une durée d’expiration plus longue pour les recharges ? Les crédits d’abonnement expirent après 30 jours, car c’est le cycle de facturation. Une recharge est un achat prépayé : le client a payé 19 $ à l’avance et s’attend à ce que les tokens durent plus d’un mois. Une expiration de 365 jours correspond au fonctionnement des crédits API prépayés chez OpenAI et Anthropic, où les crédits achetés expirent un an après l’achat, tout en limitant votre responsabilité afin que les clients ne puissent pas accumuler des crédits indéfiniment.
The Top-Up Pack is configured. Buying it grants 5,000,000 tokens that stay valid for 365 days.

Step 5: Build the Backend

Build the Express server. It creates subscription and top-up checkouts, calls OpenAI and bills the tokens, reads balances, and receives credit webhook events.
1

Set Up Your Project

Create a tsconfig.json:
tsconfig.json
Update package.json scripts:
package.json
2

Set Up Environment Variables

Create .env with a test mode API key from Developer → API Keys and the IDs from the previous steps:
.env
Never commit .env to version control. Add it to .gitignore before your first commit.
You fill in DODO_PAYMENTS_WEBHOOK_KEY in Step 7, after you register the webhook endpoint.
3

Implement the Server

Créez src/server.ts. L’endpoint de completion appelle le modèle gpt-6-luna d’OpenAI, adapté aux requêtes à haut volume. L’onglet package.json affiche la liste complète des dépendances :
Le backend est terminé : checkout d’abonnement, checkout de recharge, completion OpenAI avec facturation des tokens à l’usage, lecture du solde et handler de webhook vérifié.
@dodopayments/ingestion-blueprints fournit des trackers qui effectuent l’appel usageEvents.ingest pour vous, notamment pour l’utilisation de LLM Blueprint, de API gateway, de object storage, de streams et de time-range.
4

How Deductions Happen

Le serveur n’appelle jamais d’endpoint « deduct N credits ». C’est le meter qui effectue la déduction :
  1. Votre handler appelle OpenAI et lit usage.total_tokens, par exemple 1532.
  2. Vous ingérez un événement d’utilisation avec event_name: api.tokens_used et metadata: { tokens: 1532 }.
  3. Token Usage Meter agrège les événements par client. Un worker en arrière-plan traite les nouveaux événements chaque minute.
  4. Comme le meter facture API Tokens credit via Bill usage in credits, Dodo Payments déduit 1532 crédits, en commençant par le grant du client qui expire en premier (FIFO).
  5. Si l’overage est activé et que le solde est épuisé, le déficit est suivi et facturé sur la prochaine invoice.
Votre code ne fait qu’ingérer les événements.

Étape 6 : ajouter un frontend de démonstration

Créez public/index.html pour tester chaque flux dans votre navigateur. La page enregistre l’ID du client dans localStorage afin que l’abonnement, la génération et la recharge partagent une même identité, comme dans une application avec connexion :

Étape 7 : configurer le webhook

Les webhooks permettent à votre serveur de réagir aux changements de solde, par exemple pour envoyer un e-mail à un client dont le solde devient faible.
1

Expose Your Local Server

Les webhooks nécessitent une URL publique. Pour le développement local, utilisez ngrok ou un autre tunnel :
Copiez l’URL de transfert HTTPS, qui se termine par ngrok-free.app.
2

Register the Webhook in Dodo Payments

  1. Dans le dashboard, accédez à Developer → Webhooks et cliquez sur Add endpoint.
  2. Saisissez l’URL https://your-tunnel.ngrok-free.app/webhooks/dodo en utilisant votre propre hôte de tunnel.
  3. Sélectionnez au moins ces événements :
    • credit.added
    • credit.deducted
    • credit.overage_charged
  4. Cliquez sur Create endpoint, puis copiez le signing secret depuis l’onglet Overview de l’endpoint.
  5. Collez-le dans .env en tant que DODO_PAYMENTS_WEBHOOK_KEY, puis redémarrez npm run dev.
Le dodo.webhooks.unwrap() du SDK vérifie les headers webhook-id, webhook-timestamp et webhook-signature avec votre signing secret, puis analyse le payload. N’écrivez pas votre propre vérification HMAC : Dodo Payments suit Standard Webhooks, qui signe id.timestamp.body, et non le body seul.

Étape 8 : tester le flux complet

1

Subscribe a Test Customer

  1. Exécutez npm run dev.
  2. Ouvrez http://localhost:3000.
  3. Sélectionnez Pro, saisissez une adresse e-mail et un nom de test, puis cliquez sur Get Checkout Link. Terminez le checkout avec les informations de carte de test.
  4. Dans le dashboard, accédez à Customers, ouvrez le client le plus récent et copiez son ID, qui commence par cus_.
  5. Collez l’ID dans le champ Logged-in customer ID de la démo, puis cliquez sur Save.
Le client dispose de 40 000 000 tokens. Cliquez sur Refresh Balance pour confirmer.
2

Generate an AI Response

Saisissez un prompt et cliquez sur Generate. Le serveur appelle OpenAI, lit le total_tokens réel, ingère un événement d’utilisation et renvoie la réponse.
Un worker en arrière-plan traite les événements d’utilisation chaque minute ; le solde ne diminue donc pas immédiatement. Attendez une ou deux minutes, puis cliquez à nouveau sur Refresh Balance. Si le solde reste inchangé lors de la première actualisation, cela ne signifie pas que le metering a échoué.
3

Test the Top-Up Flow

Cliquez sur Buy 5M Tokens — $19 et terminez le checkout. Une fois le paiement réussi, actualisez le solde : il augmente de 5 000 000 tokens et le log du serveur affiche un événement credit.added.

Dépannage

Causes possibles :
  • Le nom d’événement du meter ne correspond pas à event_name que vous envoyez. api.tokens_used est sensible à la casse.
  • Le meter n’est pas associé au crédit API Tokens du produit. Ouvrez la configuration du meter du produit et vérifiez que Bill usage in credits est activé.
  • La clé metadata.tokens ne correspond pas à l’Over Property du meter.
  • Le grant du client a expiré. Consultez l’historique des crédits du client.
Points à vérifier :
  1. Dans Products → Meters, ouvrez le meter et vérifiez que l’association au produit affiche le nom du crédit lié.
  2. Ouvrez l’onglet Events du meter. Les événements ingérés y apparaissent même avant toute déduction.
  3. Ouvrez le client dans Customers et sélectionnez l’onglet Credits. Les entrées du ledger apparaissent sous une ou deux minutes.
Causes possibles :
  • Le client n’a pas terminé le checkout. Les crédits sont émis uniquement après un paiement réussi.
  • Vous interrogez avec le mauvais customer_id. Utilisez l’ID qui commence par cus_ depuis le dashboard, et non un ID de votre propre base de données.
  • CREDIT_ENTITLEMENT_ID dans .env ne correspond pas au crédit associé au produit.
Points à vérifier : Ouvrez le client dans Customers et sélectionnez l’onglet Credits. Si aucun crédit n’apparaît, le crédit n’a pas été associé au produit ou le paiement n’a pas été effectué.
Causes possibles :
  • L’overage n’est pas activé sur l’association de crédit du produit Pro. Le paramètre du crédit ne constitue qu’une valeur par défaut.
  • Le client utilise Starter, et non Pro.
  • Overage Limit est défini sur 0.
Points à vérifier : Modifiez le produit Pro, ouvrez le crédit dans Entitlements et vérifiez que Allow Overage est activé et que Price Per Unit est 0.000005 (5 $ par million de tokens). Vérifiez les zéros initiaux : le champ attend un prix par token, et non par 1K tokens.
Causes possibles :
  • Ordre d’analyse du body : express.json() s’est exécuté sur /webhooks/dodo avant express.raw(). Le SDK a besoin des octets bruts de la requête, et non du JSON analysé.
  • DODO_PAYMENTS_WEBHOOK_KEY contient le mauvais signing secret.
  • Un reverse proxy réécrit les headers de la requête.
Points à vérifier : Vérifiez que la ligne app.use('/webhooks/dodo', express.raw(...)) se trouve avant app.use(express.json()) dans server.ts.

Besoin d’aide ?

Félicitations ! Vous avez créé une facturation basée sur les crédits pour NeuralAPI

NeuralAPI facture désormais en crédits, du checkout à la déduction :

Token Credit Entitlement

Un crédit API Tokens réutilisable avec une expiration de 30 jours, partagé par les deux plans et le pack de recharge.

Tiered Plans, One Credit

Starter (10 M tokens, limite stricte) et Pro (40 M tokens avec overage), configurés par produit sans dupliquer le crédit.

One-Time Top-Up Pack

Les clients ajoutent 5 M tokens pour 19 $ sans modifier leur abonnement.

Deduction Through a Meter

Les décomptes réels de tokens OpenAI sont ingérés comme événements et le meter déduit les crédits selon FIFO, sans suivi manuel.

Live Balance API

Le solde actuel, lu via le SDK, permet de contrôler l’accès, d’afficher l’utilisation ou d’avertir les clients dans votre application.

Verified Webhook Pipeline

Les événements du ledger de crédits (credit.added, credit.deducted, credit.overage_charged) sont acheminés via un handler qui vérifie les signatures avec l’utilitaire Standard Webhooks du SDK.
Prêt pour la production ? Renforcez les points suivants :
  • Ajoutez l’authentification à /credits/:customerId et /api/generate. Tel qu’il est écrit, n’importe qui peut les appeler avec n’importe quel ID client. Authentifiez les utilisateurs et recherchez leur ID client sur le serveur.
  • Utilisez des valeurs event_id stables. L’exemple utilise Date.now() avec une chaîne aléatoire. En production, utilisez l’ID de votre requête afin que les retries soient idempotents : Dodo Payments ignore un événement dont event_id a déjà été ingéré.
  • Stockez l’association client-utilisateur. Enregistrez customer_id dans votre base de données après le premier checkout afin que les utilisateurs n’aient pas à le coller manuellement.
  • Déterminez ce qui se passe lorsqu’un abonnement prend fin. Les crédits de plan restent dans le ledger du client jusqu’à leur expiration, 30 jours après leur émission, tandis que les crédits de recharge restent valides pendant 365 jours. Le /api/generate du tutoriel vérifie uniquement le solde, et non le statut de l’abonnement ; un client ayant annulé peut donc toujours utiliser ses tokens restants. C’est le comportement par défaut le plus favorable au client. Pour un accès plus strict, vous pouvez soit (a) écouter le webhook subscription.cancelled et conditionner /api/generate au statut de l’abonnement, soit (b) lors de l’annulation, débiter les crédits de plan inutilisés avec l’API du ledger. Les débits utilisent d’abord le grant qui expire en premier ; les crédits de plan à 30 jours sont donc utilisés avant les crédits de recharge à 365 jours.
  • Surveillez le dashboard Usage Billing afin de détecter rapidement les anomalies de metering.

Credit-Based Billing Reference

Le rollover, les modes d’overage, la gestion du ledger et chaque endpoint de l’API des crédits.

Credit Webhook Events

Les schémas de payload pour chaque événement de crédit que votre serveur peut recevoir.
Dernière modification le 26 septembre 2026