- 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:- 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.
The Credits tab under Products shows all your credit entitlements.
Navigate to Credits
- Log in to the Dodo Payments dashboard.
- Click Products in the sidebar.
- Select the Credits tab.
- Click Create Credit.
Configure the Credit Unit
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.Skip Overage at the Credit Level
Save and Copy the Credit ID
cde_.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.Open the Meters Section
- In the dashboard sidebar, go to Products → Meters.
- Click Create Meter.
Configure the Meter
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: tokensCreate the meter. You select it by name when you attach it to products.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 type with meter configuration.
Starter Plan ($29/month — 10M Tokens, No Overage)
Create the Starter Product
- Go to Products and click Add Product.
- Under Pricing Type, select Usage Based Billing.
- Enter these values:
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: USDAttach the Meter
Token Usage Meter. Then configure the meter:- Turn on Bill usage in credits.
- Select credit:
API Tokens - Meter units per credit:
1. Each token in an event deducts one credit. - 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.

Toggle 'Bill usage in Credits' on the meter and pick the credit entitlement.
api.tokens_used events deduct from the customer’s balance.Configure Credit Issuance for Starter
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.
Configure credit issuance per cycle on the UBB product.
pdt_.Pro Plan ($99/month — 40M Tokens, Overage Enabled)
Create the Pro Product
NeuralAPI ProDescription: 40 million API tokens per month with overage. Built for production applications.Price: 99.00Repeat payment every: 1 monthCurrency: USDAttach the Meter
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.Configure Credit Issuance with Overage
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.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.
One-time pricing selected for a credit product.
Create a One-Time Product
- Go to Products and click Add Product.
- Under Pricing Type, select One Time.
- Enter these values:
Token Top-Up PackDescription: Add 5 million tokens to your NeuralAPI balance.Price: 19.00Currency: USDAttach the Token Credit
- In the Entitlements section, click Attach next to Credits.
- Select
API Tokens. - Set No of credits issued to
5000000. - Turn off Import Default Credit Settings to override the default 30-day expiry.
- Set Credit Expiry to Custom and enter
365days. - Save the product.
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.Set Up Your Project
tsconfig.json:package.json scripts:Set Up Environment Variables
.env with a test mode API key from Developer → API Keys and the IDs from the previous steps:DODO_PAYMENTS_WEBHOOK_KEY in Step 7, after you register the webhook endpoint.Implement the Server
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 :How Deductions Happen
- Votre handler appelle OpenAI et lit
usage.total_tokens, par exemple 1532. - Vous ingérez un événement d’utilisation avec
event_name: api.tokens_usedetmetadata: { tokens: 1532 }. Token Usage Meteragrège les événements par client. Un worker en arrière-plan traite les nouveaux événements chaque minute.- Comme le meter facture
API Tokenscredit 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). - Si l’overage est activé et que le solde est épuisé, le déficit est suivi et facturé sur la prochaine invoice.
Étape 6 : ajouter un frontend de démonstration
Créezpublic/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.Expose Your Local Server
ngrok-free.app.Register the Webhook in Dodo Payments
- Dans le dashboard, accédez à Developer → Webhooks et cliquez sur Add endpoint.
- Saisissez l’URL
https://your-tunnel.ngrok-free.app/webhooks/dodoen utilisant votre propre hôte de tunnel. - Sélectionnez au moins ces événements :
credit.addedcredit.deductedcredit.overage_charged
- Cliquez sur Create endpoint, puis copiez le signing secret depuis l’onglet Overview de l’endpoint.
- Collez-le dans
.enven tant queDODO_PAYMENTS_WEBHOOK_KEY, puis redémarreznpm run dev.
Étape 8 : tester le flux complet
Subscribe a Test Customer
- Exécutez
npm run dev. - Ouvrez
http://localhost:3000. - 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.
- Dans le dashboard, accédez à Customers, ouvrez le client le plus récent et copiez son ID, qui commence par
cus_. - Collez l’ID dans le champ Logged-in customer ID de la démo, puis cliquez sur Save.
Generate an AI Response
total_tokens réel, ingère un événement d’utilisation et renvoie la réponse.Test the Top-Up Flow
credit.added.Dépannage
Credits not deducting after usage events
Credits not deducting after usage events
- Le nom d’événement du meter ne correspond pas à
event_nameque vous envoyez.api.tokens_usedest sensible à la casse. - Le meter n’est pas associé au crédit
API Tokensdu produit. Ouvrez la configuration du meter du produit et vérifiez que Bill usage in credits est activé. - La clé
metadata.tokensne correspond pas à l’Over Property du meter. - Le grant du client a expiré. Consultez l’historique des crédits du client.
- Dans Products → Meters, ouvrez le meter et vérifiez que l’association au produit affiche le nom du crédit lié.
- Ouvrez l’onglet Events du meter. Les événements ingérés y apparaissent même avant toute déduction.
- Ouvrez le client dans Customers et sélectionnez l’onglet Credits. Les entrées du ledger apparaissent sous une ou deux minutes.
Balance always shows 0 or 'customer not found'
Balance always shows 0 or 'customer not found'
- 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 parcus_depuis le dashboard, et non un ID de votre propre base de données. CREDIT_ENTITLEMENT_IDdans.envne correspond pas au crédit associé au produit.
Overage not working for Pro plan customers
Overage not working for Pro plan customers
- 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.
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.Webhook verification failed in logs
Webhook verification failed in logs
- Ordre d’analyse du body :
express.json()s’est exécuté sur/webhooks/dodoavantexpress.raw(). Le SDK a besoin des octets bruts de la requête, et non du JSON analysé. DODO_PAYMENTS_WEBHOOK_KEYcontient le mauvais signing secret.- Un reverse proxy réécrit les headers de la requête.
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
API Tokens réutilisable avec une expiration de 30 jours, partagé par les deux plans et le pack de recharge.Tiered Plans, One Credit
One-Time Top-Up Pack
Deduction Through a Meter
Live Balance API
Verified Webhook Pipeline
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.- Ajoutez l’authentification à
/credits/:customerIdet/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_idstables. L’exemple utiliseDate.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 dontevent_ida déjà été ingéré. - Stockez l’association client-utilisateur. Enregistrez
customer_iddans 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/generatedu 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 webhooksubscription.cancelledet conditionner/api/generateau 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.