Skip to main content

Förutsättningar

Innan du börjar behöver du:
  • Ett handlarkonto hos Dodo Payments
  • En API-nyckel från Developer → API Keys i kontrollpanelen, lagrad i DODO_PAYMENTS_API_KEY
  • En webhook-hemlighet från Developer → Webhooks, lagrad i DODO_PAYMENTS_WEBHOOK_KEY
  • Minst en prenumerationsprodukt skapad under Products
Mer information finns i Förutsättningar för integreringsguiden.

API-integrering

Checkout-sessioner

Skapa en prenumeration genom att bygga en checkout-session med din prenumerationsprodukt. Kunden godkänner en betalningsmetod och prenumerationen aktiveras när kunden slutför checkouten.
Du kan kombinera prenumerationsprodukter med engångsprodukter i samma checkout-session. Det möjliggör startavgifter, hårdvarupaket med SaaS och liknande användningsfall. Se Checkout-sessioner för exempel.

API-svar

Svaret innehåller en checkout_url:
Omdirigera kunden till denna URL. Kunden godkänner betalningsmetoden och prenumerationen aktiveras.

Webhooks

Webhooks meddelar din server när prenumerationshändelser inträffar. Konfigurera din endpoint under Developer → Webhooks i kontrollpanelen. Information om hur du konfigurerar din webhook-endpoint finns i Webhooks.

Typer av prenumerationshändelser

Spåra dessa händelser för att hantera prenumerationens livscykel:
  1. subscription.active — Prenumerationen aktiveras
  2. subscription.updated — Ett fält i prenumerationen ändras
  3. subscription.on_hold — En förnyelse- eller planändringsdebitering misslyckas
  4. subscription.failed — Det gick inte att skapa prenumerationen (slutgiltigt; kunden måste prenumerera igen)
  5. subscription.renewed — En återkommande debitering lyckas
  6. subscription.past_due — En förnyelse misslyckades och respitperioden började; kunden behåller åtkomsten till past_due_ends_at
  7. subscription.plan_changed — Planen uppgraderades, nedgraderades eller ändrades
  8. subscription.cancelled — Prenumerationen avslutades
  9. subscription.expired — Prenumerationen nådde slutet av sin löptid
Detta är kärnhändelserna. Se Prenumerations-webhooks för hela listan, inklusive paused, unpaused och update_payment_method.
Använd subscription.updated för att få realtidsmeddelanden om alla prenumerationsändringar och hålla applikationens tillstånd synkroniserat utan att polla API:et.

Betalningsscenarier

Flöde för lyckad betalning Webhook-sekvensen beror på om prenumerationen har en provperiod. Omedelbar debitering (0 provdagar):
  1. subscription.active: medgivandet godkänns och prenumerationen aktiveras.
  2. payment.succeeded: bekräftar den första debiteringen. Förvänta dig denna inom 2–10 minuter efter checkout.
Med en provperiod:
  1. Vid provperiodens start (checkout): subscription.active utlöses när betalningsmetoden har godkänts. Ingen återkommande debitering görs ännu. Den första riktiga debiteringen skjuts upp tills provperioden är slut.
  2. Vid provperiodens slut: det återkommande beloppet debiteras och du får payment.succeeded tillsammans med subscription.renewed.
Varje efterföljande förnyelse:
  • subscription.renewed: utlöses vid varje debiteringscykel när förnyelsebetalningen dras, alltid tillsammans med payment.succeeded. Den innehåller även den uppdaterade next_billing_date.
När pengar faktiskt dras för en prenumerationsprodukt får du subscription.renewed och payment.succeeded. Använd subscription.renewed (i stället för enbart payment.succeeded) som signal för att förlänga åtkomsten till nästa cykel.
Scenarier för misslyckade betalningar
  1. Prenumerationsfel
  • subscription.failed - Det gick inte att skapa prenumerationen eftersom ett medgivande inte kunde skapas.
  • payment.failed - Anger en misslyckad betalning.
  1. Prenumerationen pausad
  • subscription.on_hold - Prenumerationen pausas på grund av en misslyckad förnyelsebetalning eller misslyckad planändringsdebitering. Om ditt företag har en respitperiod flyttas en misslyckad förnyelse först till past_due (subscription.past_due), och flyttas till on_hold (eller cancelled, beroende på inställningarna för respitperioden) först när respitperioden löper ut. Se Prenumerationstillstånd.
  • När en prenumeration pausas förnyas den inte automatiskt förrän betalningsmetoden har uppdaterats.
Bästa praxis: För att förenkla implementeringen rekommenderar vi att du främst spårar prenumerationshändelser för att hantera prenumerationens livscykel.
En komplett genomgång av hur du läser error_code/error_message, avgör när du ska försöka igen och visar fel för kunder finns i Hantera betalningsfel.

subscription.failed jämfört med subscription.on_hold

Dessa två händelser är lätta att blanda ihop, men kräver helt olika hantering:
subscription.failed är slutgiltig. Prenumerationen kan inte återaktiveras. Kunden måste skapa en ny prenumeration. Ge aldrig behörigheter när denna händelse utlöses.

Hantera pausad prenumeration

När en prenumeration går till tillståndet on_hold måste du uppdatera betalningsmetoden för att återaktivera den. Detta avsnitt förklarar när prenumerationer pausas och hur du hanterar dem.

När prenumerationer pausas

En prenumeration pausas när:
  • Förnyelsebetalningen misslyckas: Den automatiska förnyelsedebiteringen misslyckas på grund av otillräckliga medel, utgånget kort eller avslag från banken
  • Planändringsdebiteringen misslyckas: En omedelbar debitering vid upp- eller nedgradering av planen misslyckas
  • Godkännande av betalningsmetoden misslyckas: Betalningsmetoden kan inte godkännas för återkommande debiteringar
Prenumerationer i tillståndet on_hold förnyas inte automatiskt. Du måste uppdatera betalningsmetoden för att återaktivera prenumerationen.

Återaktivera pausade prenumerationer

Om du vill återaktivera en prenumeration från tillståndet on_hold använder du API:et Update Payment Method. Detta gör automatiskt följande:
  1. Skapar en debitering för återstående skuld
  2. Genererar en faktura för debiteringen
  3. Behandlar betalningen med den nya betalningsmetoden
  4. Återaktiverar prenumerationen till tillståndet active när betalningen lyckas
1

Handle subscription.on_hold webhook

När du får en webhook för subscription.on_hold uppdaterar du applikationens tillstånd och meddelar kunden:
2

Update payment method

När kunden är redo att uppdatera sin betalningsmetod anropar du API:et Update Payment Method:
Du kan även använda ett befintligt ID för betalningsmetoden om kunden har sparade betalningsmetoder:
3

Monitor webhook events

När betalningsmetoden har uppdaterats övervakar du följande webhook-händelser:
  1. payment.succeeded - Debiteringen för återstående skuld lyckades
  2. subscription.active - Prenumerationen har återaktiverats

Exempel på nyttolast för prenumerationshändelse


Ändra prenumerationsplaner

Du kan uppgradera eller nedgradera en prenumerationsplan med API-endpointen för planändring. Detta låter dig ändra prenumerationens produkt och antal samt hantera proportionell debitering.

Change Plan API Reference

Detaljerad information om hur du ändrar prenumerationsplaner finns i vår API-dokumentation för Change Plan.

Alternativ för proportionell debitering

När du ändrar prenumerationsplaner har du fyra alternativ för hur den omedelbara debiteringen ska hanteras:

1. prorated_immediately

  • Krediterar den oanvända delen av den aktuella debiteringscykeln, proportionellt efter återstående tid. Krediten omfattar basplanen, antalet och eventuella tillägg
  • Debiterar sedan en hel cykel enligt den nya planen, antalet och tilläggen. Själva debiteringen är aldrig proportionell
  • Omedelbar nettodebitering = (full ny cykel) minus (återstående andel x full gammal cykel). Om krediten är större behålls mellanskillnaden som prenumerationsspecifik kredit för framtida förnyelser
  • Under en provperiod byter detta omedelbart användaren till den nya planen och debiterar kunden direkt

2. full_immediately

  • Debiterar kunden hela prenumerationsbeloppet för den nya planen utan kredit för den föregående cykeln
  • Vid både uppgradering och nedgradering betalar kunden hela priset för den nya planen från början
  • Användbart när du vill debitera hela beloppet oavsett hur mycket tid som återstod av den gamla planen

3. difference_immediately

  • Kunden betalar endast skillnaden mellan priset för den gamla och den nya planen
  • Beloppet beror inte på när under cykeln ändringen görs. Samma uppgradering kostar lika mycket dag 1 som dag 29
  • Vid uppgradering debiteras kunden omedelbart mellanskillnaden. Exempel: $30/månad → $80/månad = $50 debiteras direkt
  • Vid nedgradering sparas prisskillnaden som prenumerationsspecifik kredit och används automatiskt för framtida förnyelser. Exempel: $50/månad → $20/månad = $30 sparas som kredit

4. do_not_bill

  • Tillämpa planändringen omedelbart utan att debitera något vid ändringstillfället. Den nya planen, antalet och tilläggen kan användas direkt
  • Eftersom inget debiteras nu får kunden vid en uppgradering den dyrare planen gratis under återstoden av den aktuella cykeln. En nedgradering träder i kraft omedelbart utan kredit för den oanvända delen av cykeln som kunden redan har betalat för
  • Tillägg som beviljas via do_not_bill krediteras inte vid en senare planändring, eftersom de aldrig debiterades. En efterföljande ändring debiterar hela den nya tilläggsmängden
  • Den uppdaterade planen (samt antal/tillägg) debiteras vid nästa planerade förnyelse, och det ursprungliga debiteringsdatumet bevaras
Alla tre lägena för ”debitera nu” återställer debiteringscykeln. prorated_immediately, difference_immediately och full_immediately flyttar prenumerationens next_billing_date till ändringsdatumet. Endast do_not_bill behåller det ursprungliga förnyelsedatumet, men tillämpar ingen omedelbar debitering.

Beteende

  • När du anropar detta API initierar Dodo Payments omedelbart en debitering baserat på det valda alternativet för proportionell debitering
  • Med prorated_immediately beräknas en kredit för den oanvända delen av den aktuella cykeln vid varje ändring, både uppgradering och nedgradering. Om krediten överstiger debiteringen för den nya cykeln läggs resten till prenumerationens kreditbalans. Dessa krediter är specifika för prenumerationen och används endast för att kvitta framtida återkommande betalningar för samma prenumeration
  • Med difference_immediately är nettot alltid den exakta prisskillnaden. Vid nedgraderingar sparas överskottet som prenumerationsspecifik kredit, på samma sätt som med prorated_immediately
  • Alternativet full_immediately kringgår kreditberäkningar och debiterar hela beloppet för den nya planen
  • Alternativet do_not_bill tillämpar ändringen omedelbart men skjuter upp debiteringen till nästa förnyelsedatum, som bevaras
Välja läge för proportionell debitering:
  • difference_immediately — kunden betalar prisskillnaden. Det mest förutsägbara alternativet; debiteringen är densamma oavsett när under cykeln ändringen görs.
  • prorated_immediately — kunden krediteras endast för oanvänd tid i den aktuella cykeln. Debiteringen varierar beroende på när under cykeln ändringen görs.
  • full_immediately — kunden betalar hela beloppet för den nya planen. Ingen kredit för den föregående cykeln.
  • do_not_bill — ingen debitering nu. Den nya planen debiteras vid nästa förnyelse. Det enda läget som bevarar det ursprungliga debiteringsdatumet.

Debiteringshantering

  • Den omedelbara debitering som initieras vid planändringen slutförs vanligtvis på mindre än 2 minuter
  • Om denna omedelbara debitering misslyckas av någon anledning pausas prenumerationen automatiskt tills problemet har lösts

On-demand-prenumerationer

On-demand-prenumerationer låter dig debitera kunder flexibelt, inte bara enligt ett fast schema. Funktionen är tillgänglig för alla konton.
Så skapar du en on-demand-prenumeration: Om du vill skapa en on-demand-prenumeration använder du API-endpointen POST /checkouts och inkluderar fältet subscription_data.on_demand i request body. Detta låter dig godkänna en betalningsmetod utan en omedelbar debitering eller ange ett anpassat startpris.
POST /subscriptions är föråldrat. Det fungerar fortfarande för befintliga integreringar, men nya integreringar bör skapa on-demand-prenumerationer via en Checkout-session (POST /checkouts) med subscription_data.on_demand. Se Guiden för on-demand-prenumerationer för det aktuella flödet.
Så debiterar du en on-demand-prenumeration: För efterföljande debiteringar använder du endpointen POST /subscriptions//charge och anger det belopp som ska debiteras kunden för transaktionen.
En komplett steg-för-steg-guide (inklusive exempel på request/response, säkra retry-policyer och webhook-hantering) finns i Guiden för on-demand-prenumerationer.

Viktigt att känna till om prenumerationsdebitering

Ange en längre prenumerationsperiod än betalningsfrekvensen. Om prenumerationsperioden motsvarar betalningsfrekvensen (t.ex. period = 1 månad, frekvens = 1 månad) gäller prenumerationen under en enda cykel och går sedan till expired i stället för att förnyas. För en löpande månadsplan anger du en lång prenumerationsperiod (t.ex. 20 år) med månadsvis betalningsfrekvens.
Valutan låses vid den första lyckade debiteringen. Skicka alltid billing_currency och billing_address.country explicit när du skapar checkouten. Om de utelämnas identifieras de från kundens IP (Adaptive Currency), och när prenumerationen har genomfört sin första debitering är valutan fast under hela dess livstid. En kund som senare reser kan inte byta den.
Provperioder använder ett $0-godkännande, inte en debitering. När en prenumeration har en provperiod skapar provperiodens början ett $0-medgivandegodkännande för att spara kortet; den första riktiga debiteringen sker när provperioden slutar. I betalningslistan visas exakt en betalning med total_amount på 0 för en prenumeration med kostnadsfri provperiod. En betald provperiod debiterar i stället dess trial_amount i förväg.
Prenumerationens livscykel: past_due = en förnyelse misslyckades och respitperioden pågår (kunden behåller åtkomsten). on_hold = en förnyelse misslyckades (kan återställas: be kunden uppdatera sin betalningsmetod; dunning-försök tillämpas). expired = löptiden tog slut utan förnyelse och kan inte återaktiveras. Kunden måste prenumerera igen. cancelled = avslutad av kunden eller handlaren. De flesta förnyelsefel är avslag från kortutgivaren (otillräckliga medel, kortet avvisades), inte ett Dodo-fel.
Indiska kort använder ett RBI-e-mandat. Off-session-debiteringar (förnyelser och planändringsdebiteringar) kan ta upp till cirka 48 timmar att slutföra, och återkommande autodebiteringar över ₹15,000 kräver ny kundautentisering (så en uppgradering som överskrider gränsen kan inte använda det befintliga medgivandet). Medan en debitering fortfarande har statusen processing misslyckas en andra debitering på samma prenumeration med “Cannot create new charge as previous payment is not successful yet.” Icke-indiska kort bekräftas nästan omedelbart.
Prenumerationsdebiteringar har ett minimibelopp på $1 (eller motsvarande i valutan). Belopp på $0.01–$0.99 avvisas med product_price: value out of range. En prenumerationsprodukt med priset exakt $0 är tillåten; se Kort valfritt vid nollpris. Om du vill godkänna ett kort utan att debitera det använder du en on-demand mandate_only-konfiguration.

Relaterad API-referens

Create Subscription (Deprecated)

Äldre API för att skapa en prenumeration direkt. Använd Checkout-sessioner för nya integreringar

Change Subscription Plan

API-referens för att uppgradera, nedgradera eller ändra prenumerationsplaner med alternativ för proportionell debitering

Update Payment Method

API-referens för att uppdatera betalningsmetoder och återaktivera pausade prenumerationer

Patch Subscription

API-referens för att uppdatera prenumerationsuppgifter och konfiguration
Senast ändrad 26 september 2026