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 en prenumerationsprodukt med engångsprodukter i samma checkout-session. Detta möjliggör startavgifter, hårdvarupaket med SaaS och liknande användningsfall. Se Checkout Sessions för exempel.Du kan också sälja två eller fler prenumerationsprodukter i en checkout. Kunden betalar en gång och får en separat prenumeration per produkt, var och en med sin egen faktureringscykel. En sådan varukorg kan inte innehålla engångsprodukter. Se Multi-Subscription Cart.

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 dashboarden. Se Webhooks för information om hur du konfigurerar din webhook-endpoint.

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 ändrades
  3. subscription.on_hold — En debitering för förnyelse eller planändring misslyckades
  4. subscription.failed — Det gick inte att skapa prenumerationen (slutgiltigt; kunden måste prenumerera igen)
  5. subscription.renewed — En återkommande debitering lyckades
  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. För hela listan, inklusive paused, unpaused och update_payment_method, se Subscription Webhooks.
Använd subscription.updated för realtidsaviseringar om alla prenumerationsändringar, så att applikationens tillstånd hålls synkroniserat utan att API:t behöver avfrågas.

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 faktureringscykel när förnyelsebetalningen dras, alltid tillsammans med payment.succeeded. Den innehåller även det 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 misslyckad betalning
  1. Prenumerationsfel
  • subscription.failed - Det gick inte att skapa prenumerationen eftersom ett medgivande inte kunde skapas.
  • payment.failed - Anger en misslyckad betalning.
  1. Prenumeration pausad
  • subscription.on_hold - Prenumerationen pausas på grund av en misslyckad förnyelsebetalning eller en misslyckad debitering för planändring. 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 Subscription States.
  • 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.
För 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, se Handle Payment Failures.

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

Dessa två händelser är lätta att förväxla, men de kräver mycket olika hantering:
subscription.failed är slutgiltig. Prenumerationen kan inte återaktiveras. Kunden måste skapa en ny prenumeration. Ge aldrig förmåner när denna händelse utlöses.

Hantera pausade prenumerationer

När en prenumeration övergå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, ett utgånget kort eller avslag från banken
  • Debiteringen för planändring misslyckas: En omedelbar debitering vid uppgradering 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

För att återaktivera en prenumeration från tillståndet on_hold använder du API:t Update Payment Method. Detta gör automatiskt följande:
  1. Skapar en debitering för återstående skuld
  2. Skapar 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 subscription.on_hold-webhook uppdaterar du applikationens tillstånd och meddelar kunden:
2

Update payment method

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

Monitor webhook events

Efter att 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 gör att du kan ändra prenumerationens produkt, kvantitet och hantera proportionell debitering.

Change Plan API Reference

Mer 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 faktureringscykeln, proportionellt efter återstående tid. Krediten täcker basplanen, kvantiteten och eventuella tillägg
  • Debiterar sedan en hel cykel enligt den nya planen, kvantiteten och tilläggen. Själva debiteringen proportioneras aldrig
  • Netto omedelbar debitering = (hel ny cykel) minus (återstående andel × hel gammal cykel). Om krediten är större hålls mellanskillnaden som prenumerationsspecifik kredit för framtida förnyelser
  • Under en provperiod växlar 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 på 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 skillnaden. Exempel: $30/månad → $80/månad = $50 debiteras direkt
  • Vid nedgradering sparas prisskillnaden som prenumerationsspecifik kredit och används automatiskt vid 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, kvantiteten och tilläggen kan användas direkt
  • Eftersom inget debiteras nu får kunden vid en uppgradering den högre planen utan kostnad under resten av den aktuella cykeln. En nedgradering träder i kraft omedelbart utan kredit för den oanvända delen av cykeln som redan har betalats
  • Tillägg som beviljats genom do_not_bill krediteras inte vid en senare planändring, eftersom de aldrig fakturerades. En efterföljande ändring fakturerar den nya mängden tillägg i sin helhet
  • Den uppdaterade planen (och kvantiteten/tilläggen) faktureras vid nästa schemalagda förnyelse, och det ursprungliga faktureringsdatumet bevaras
Alla tre lägena för ”debitera nu” återställer faktureringscykeln. 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 återstoden till prenumerationens kreditsaldo. Dessa krediter gäller endast den prenumerationen och används bara för att kvitta framtida återkommande betalningar för samma prenumeration
  • Med difference_immediately är nettot alltid exakt 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 faktureringen 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 faktureras vid nästa förnyelse. Det enda läget som bevarar det ursprungliga faktureringsdatumet.

Debiteringshantering

  • Den omedelbara debitering som initieras när planen ändras slutförs vanligtvis på mindre än 2 minuter
  • Om den omedelbara debiteringen misslyckas av någon anledning pausas prenumerationen automatiskt tills problemet är löst

On-Demand-prenumerationer

On-Demand-prenumerationer gör att du kan debitera kunder flexibelt, inte bara enligt ett fast schema. Den här funktionen är tillgänglig för alla konton.
Så skapar du en On-Demand-prenumeration: För att skapa en On-Demand-prenumeration använder du API-endpointen POST /checkouts och inkluderar fältet subscription_data.on_demand i request body. Detta gör att du kan 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 integrationer, men nya integrationer bör skapa On-Demand-prenumerationer genom en Checkout Session (POST /checkouts) med subscription_data.on_demand. Se On-Demand Subscriptions Guide 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.
För en komplett steg-för-steg-guide (inklusive exempel på request/response, säkra retry-policyer och webhook-hantering), se On-Demand Subscriptions Guide.

Viktigt att känna till om prenumerationsfakturering

Ange en längre prenumerationsperiod än betalningsfrekvensen. Om prenumerationsperioden motsvarar betalningsfrekvensen (t.ex. period = 1 månad, frekvens = 1 månad) gäller prenumerationen i en enda cykel och övergå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 uttryckligen när checkouten skapas. Om de utelämnas identifieras de från kundens IP (Adaptive Currency), och när prenumerationen genomför sin första debitering fastställs valutan för hela dess livstid. En kund som senare reser kan inte byta den.
Provperioder gör en auktorisering på $0, inte en debitering. När en prenumeration har en provperiod skapar provperiodens start en mandatauktorisering på $0 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örskott.
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 på utfärdarens sida (otillräckliga medel, avvisat kort), inte ett Dodo-fel.
Indiska kort använder ett RBI-e-mandat. Off-session-debiteringar (förnyelser och debiteringar för planändringar) kan ta upp till cirka 48 timmar att slutföra, och återkommande automatiska debiteringar över ₹15,000 kräver ny kundautentisering (så en uppgradering som passerar denna gräns kan inte använda det befintliga medgivandet). Medan en debitering fortfarande har 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.
Prenumerationer har ett minimibelopp på $1,00 i USD. Checkout avvisar en lägre totalsumma med TOTAL_PAYMENT_AMOUNT_BELOW_MINIMUM_AMOUNT. Valutor som inte är USD, EUR eller GBP måste också vara värda minst $1,00; se Minimum Amounts. En On-Demand-debitering product_price under 100 i den minsta valutaenheten avvisas med product_price: value out of range. En prenumerationsprodukt med priset exakt $0 är tillåten; se Card-Optional at Zero Price. För att 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 Sessions för nya integrationer

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 prenumerationsdetaljer och konfiguration
Senast ändrad 8 oktober 2026