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.
Varför längre giltighetstid för påfyllningar? Prenumerationskrediter upphör att gälla efter 30 dagar eftersom det är faktureringscykeln. En påfyllning är ett förbetalt köp: kunden betalade $19 i förskott och förväntar sig att tokens ska räcka längre än en månad. En giltighetstid på 365 dagar motsvarar hur förbetalda API-krediter fungerar hos OpenAI och Anthropic, där köpta krediter upphör att gälla ett år efter köpet, och begränsar samtidigt ditt ansvar så att kunder inte kan samla på sig krediter i all oändlighet.
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

Skapa src/server.ts. Completion-endpointen anropar OpenAI:s modell gpt-6-luna, som passar för förfrågningar med hög volym. Fliken package.json visar hela listan över beroenden:
Backend är klart: prenumerationscheckout, påfyllningscheckout, en OpenAI-completion med mätbaserad tokenfakturering, en saldoavläsning och en verifierad webhook-hanterare.
@dodopayments/ingestion-blueprints tillhandahåller trackers som utför anropet usageEvents.ingest åt dig, inklusive användning av LLM Blueprint, API gateway, objektlagring, strömmar och tidsintervall.
4

How Deductions Happen

Servern anropar aldrig en endpoint för ”dra av N krediter”. Mätaren utför avdraget:
  1. Din handler anropar OpenAI och läser usage.total_tokens, till exempel 1532.
  2. Du skickar in en användningshändelse med event_name: api.tokens_used och metadata: { tokens: 1532 }.
  3. Token Usage Meter aggregerar händelser per kund. En bakgrundsworker bearbetar nya händelser varje minut.
  4. Eftersom mätaren fakturerar API Tokens-krediten via Bill usage in credits, drar Dodo Payments av 1532 krediter, med början från kundens tilldelning som löper ut först (FIFO).
  5. Om överdebitering är aktiverad och saldot tar slut spåras underskottet och faktureras på nästa faktura.
Din kod skickar bara in händelser.

Steg 6: Lägg till ett demo-frontend

Skapa public/index.html för att testa alla flöden i webbläsaren. Sidan sparar kund-ID:t i localStorage, så prenumeration, generering och påfyllning delar samma identitet, precis som i en app där användaren är inloggad:

Steg 7: Koppla in webhooken

Webhooks låter servern reagera på saldoändringar, till exempel genom att skicka e-post till en kund vars saldo börjar ta slut.
1

Expose Your Local Server

Webhooks behöver en offentlig URL. För lokal utveckling kan du använda ngrok eller en annan tunnel:
Kopiera HTTPS-vidarebefordrings-URL:en, som slutar på ngrok-free.app.
2

Register the Webhook in Dodo Payments

  1. Gå till Developer → Webhooks i dashboarden och klicka på Add endpoint.
  2. Ange URL:en https://your-tunnel.ngrok-free.app/webhooks/dodo och använd din egen tunnelvärd.
  3. Välj minst dessa händelser:
    • credit.added
    • credit.deducted
    • credit.overage_charged
  4. Klicka på Create endpoint och kopiera sedan signeringshemligheten från endpointens flik Overview.
  5. Klistra in den i .env som DODO_PAYMENTS_WEBHOOK_KEY och starta sedan om npm run dev.
SDK:ns dodo.webhooks.unwrap() kontrollerar headerfälten webhook-id, webhook-timestamp och webhook-signature med din signeringshemlighet och tolkar sedan nyttolasten. Skriv inte en egen HMAC-kontroll: Dodo Payments följer Standard Webhooks, som signerar id.timestamp.body, inte enbart body-innehållet.

Steg 8: Testa hela flödet

1

Subscribe a Test Customer

  1. Kör npm run dev.
  2. Öppna http://localhost:3000.
  3. Välj Pro, ange en test-e-postadress och ett namn och klicka på Get Checkout Link. Slutför checkout med testkortuppgifter.
  4. Gå till Customers i dashboarden, öppna den nyaste kunden och kopiera dess ID, som börjar med cus_.
  5. Klistra in ID:t i fältet Logged-in customer ID i demon och klicka på Save.
Kunden har 40 000 000 tokens. Klicka på Refresh Balance för att bekräfta.
2

Generate an AI Response

Skriv en prompt och klicka på Generate. Servern anropar OpenAI, läser det faktiska total_tokens, skickar in en användningshändelse och returnerar svaret.
En bakgrundsworker bearbetar användningshändelser varje minut, så saldot minskar inte direkt. Vänta en eller två minuter och klicka sedan på Refresh Balance igen. Ett oförändrat saldo vid den första uppdateringen betyder inte att mätningen misslyckades.
3

Test the Top-Up Flow

Klicka på Buy 5M Tokens — $19 och slutför checkout. När betalningen har genomförts uppdaterar du saldot: det ökar med 5 000 000 tokens och serverloggen visar en credit.added-händelse.

Felsökning

Möjliga orsaker:
  • Mätarens händelsenamn matchar inte event_name som du skickar. api.tokens_used är skiftlägeskänsligt.
  • Mätaren är inte länkad till API Tokens-krediten på produkten. Öppna produktens mätarkonfiguration och bekräfta att Bill usage in credits är aktiverat.
  • Nyckeln metadata.tokens matchar inte mätarens Over Property.
  • Kundens tilldelning har upphört att gälla. Kontrollera kundens kredithistorik.
Det här ska du kontrollera:
  1. Öppna mätaren via Products → Meters och bekräfta att produktkopplingen visar det länkade kreditnamnet.
  2. Öppna mätarens flik Events. Inskickade händelser visas där även innan något avdrag görs.
  3. Öppna kunden i Customers och välj fliken Credits. Huvudboksposter visas inom en eller två minuter.
Möjliga orsaker:
  • Kunden har inte slutfört checkout. Krediter utfärdas först efter en genomförd betalning.
  • Du frågar med fel customer_id. Använd ID:t från dashboarden som börjar med cus_, inte ett ID från din egen databas.
  • CREDIT_ENTITLEMENT_ID i .env matchar inte krediten som är kopplad till produkten.
Det här ska du kontrollera: Öppna kunden i Customers och välj fliken Credits. Om inga krediter visas var krediten inte kopplad till produkten eller så slutfördes inte betalningen.
Möjliga orsaker:
  • Överdebitering är inte aktiverad på Pro product’s credit attachment. Inställningen på krediten är endast ett standardvärde.
  • Kunden använder Starter, inte Pro.
  • Overage Limit är inställd på 0.
Det här ska du kontrollera: Redigera Pro-produkten, öppna krediten under Entitlements och bekräfta att Allow Overage är aktiverat och att Price Per Unit är 0.000005 ($5 per miljon tokens). Kontrollera de inledande nollorna: fältet tar emot ett pris per token, inte per 1K tokens.
Möjliga orsaker:
  • Ordningen för body-tolkning: express.json() kördes på /webhooks/dodo innan express.raw(). SDK:n behöver förfrågans råa bytes, inte tolkad JSON.
  • DODO_PAYMENTS_WEBHOOK_KEY innehåller fel signeringshemlighet.
  • En reverse proxy skriver om förfrågans headers.
Det här ska du kontrollera: Bekräfta att raden app.use('/webhooks/dodo', express.raw(...)) kommer före app.use(express.json()) i server.ts.

Behöver du hjälp?

Grattis! Du har byggt kreditbaserad fakturering för NeuralAPI

NeuralAPI fakturerar nu i krediter från checkout till avdrag:

Token Credit Entitlement

En återanvändbar API Tokens-kredit med 30 dagars giltighetstid, som delas av båda planerna och påfyllningspaketet.

Tiered Plans, One Credit

Starter (10M tokens, hård gräns) och Pro (40M tokens plus överdebitering), konfigurerade per produkt utan att duplicera krediten.

One-Time Top-Up Pack

Kunder kan lägga till 5M tokens för $19 utan att ändra sin prenumeration.

Deduction Through a Meter

Faktiska OpenAI-tokenantal skickas in som händelser och mätaren drar av krediter enligt FIFO utan manuell spårning.

Live Balance API

Det aktuella saldot, som läses via SDK:n, för att begränsa åtkomst, visa användning eller varna kunder i din app.

Verified Webhook Pipeline

Kredithändelser i huvudboken (credit.added, credit.deducted, credit.overage_charged) som dirigeras genom en handler som verifierar signaturer med SDK:ns Standard Webhooks-hjälpfunktion.
Ska du gå i produktion? Skärp dessa delar:
  • Lägg till autentisering för /credits/:customerId och /api/generate. Som koden är skriven kan vem som helst anropa dem med valfritt kund-ID. Autentisera användare och slå upp deras kund-ID på servern.
  • Använd stabila värden för event_id. Exemplet använder Date.now() plus en slumpmässig sträng. I produktion ska du använda ditt request-ID så att retries blir idempotenta: Dodo Payments ignorerar en händelse vars event_id redan har skickats in.
  • Lagra kopplingen mellan kund och användare. Spara customer_id i din databas efter den första checkout-processen, så att användarna inte behöver klistra in det manuellt.
  • Bestäm vad som händer när en prenumeration avslutas. Plankrediter ligger kvar i kundens huvudbok tills de upphör att gälla 30 dagar efter utfärdandet, och påfyllningskrediter är giltiga i 365 dagar. Tutorialens /api/generate kontrollerar endast saldot, inte prenumerationsstatusen, så en avslutad kund kan fortfarande använda sina återstående tokens. Det är det kundvänliga standardalternativet. För striktare åtkomst kan du antingen (a) lyssna efter webhooken subscription.cancelled och begränsa /api/generate utifrån prenumerationsstatus, eller (b) vid avslut debitera de oanvända plankrediterna via huvudboks-API:t. Avdrag görs från den tilldelning som löper ut först, så de 30 dagar långa plankrediterna används före de 365 dagar långa påfyllningskrediterna.
  • Övervaka Usage Billing-dashboarden för att upptäcka mätavvikelser tidigt.

Credit-Based Billing Reference

Rollover, överdebiteringslägen, huvudbokshantering och alla credit API-endpoints.

Credit Webhook Events

Nyttolastsscheman för varje kredithändelse som servern kan ta emot.
Senast ändrad 26 september 2026