Documentation Index
Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
Use this file to discover all available pages before exploring further.
Nya funktioner
1. Entitlements
Dodo Payments levereras nu med enhetliga Entitlements — ett enda lager som driver automatisk leverans för varje uppfyllelseintegration. En enda produkt kan leverera flera entitlements vid varje lyckad köp eller aktiv prenumeration.
Fem nya plattformsintegrationer
Fram till nu har Dodo Payments levererat licensnycklar och digitala filer automatiskt vid köp. Entitlements utökar omfånget till fem ytterligare plattformar — så betalande kunder kan få tillgång till din community, kod eller ditt innehåll i samma ögonblick som betalningen lyckas, utan manuell uppfyllelse från din sida:
| Integration | Vad den levererar | Återkallandebeteende |
|---|
| Discord | Tilldelar en vald roll i din Discord-server efter att kunden slutför OAuth | Roll tas bort vid avbokning/återbetalning |
| GitHub | Lägger till kunden som en medarbetare till ett privat arkiv med vald behörighetsnivå | Medarbetare tas bort vid avbokning/återbetalning |
| Telegram | Utfärdar en engångsinbjudan att gå med i en privat chatt eller kanal via din Telegram-bot | Kunden sparkas ut från chatten vid avbokning/återbetalning |
| Framer | Låser upp en Framer-mall remix-länk med åtkomstkod | Åtkomstkod inaktiveras vid avbokning/återbetalning |
| Notion | Duplicerar en Notion-mallsida till kundens arbetsyta efter att de godkänt via OAuth | Levererad sida arkiveras vid avbokning/återbetalning |
Dessa går ihop med befintliga Licensnycklar (unika nycklar med aktiveringsgränser och utgånget) och Digitala filer (försignerade nedladdnings-URL:er för e-böcker, mallar, media) integrationer, alla nu hanterade genom samma beviljningslivscykel.
Vad du får ut ur lådan
| Funktion | Beskrivning |
|---|
| Återanvändbara mallar | Definiera en entitlement en gång (aktiveringsgränser, filpaket, Discord-roll, repo-behörigheter, etc.) och bifoga den till vilken produkt som helst |
| Automatiska beviljningar | Utfärdas på payment.succeeded och subscription.active, idempotenta vid förnyelser och återaktiveringar |
| Livscykelmedvetet återkallande | Återkallas på subscription.cancelled, subscription.on_hold, INLINE_CODE_PLACEHOLDER_5ef9d90e37561a1_END, refund.succeeded, subscription.plan_changed, eller manuell API/dashboard-återkallelse — med en befolkad revocation_reason |
| OAuth + plattformsdirekta flöden | OAuth för Discord, GitHub och Notion prenumerantsamtycke; direkta plattformsanrop för Telegram, Framer och Digital Files |
| Driftavkänning | Upptäcker när en Discord-roll, GitHub-medarbetare eller Notion-sida går ur synkronisering på plattformsnivå och återkallar med revocation_reason: platform_external |
| Kryptering i vila | Alla plattformstoken (OAuth, bot, appinstallationer) lagrade med AES-256-GCM |
Webhooks
Fyra nya livscykelhändelser utlöses för varje beviljning:
| Händelse | Utlöses när |
|---|
entitlement_grant.created | En ny beviljning skapas för en kund |
entitlement_grant.delivered | Kundåtkomst beviljad |
entitlement_grant.failed | Leverans kunde inte slutföras; inspektera error_code och error_message |
entitlement_grant.revoked | Åtkomst återkallad; inspektera revocation_reason |
För nya integrationer, lyssna på entitlement_grant.delivered istället för payment.succeeded. Betalningsframgång betyder inte att leveransen är klar, särskilt för OAuth-baserade integrationer.
Läs mer: Entitlements | Entitlement Grant Webhooks
2. Prenumerationsavbokningsorsaker i Kundportalen
När kunder avbokar en prenumeration från Kundportalen uppmanas de nu att dela med sig av varför de avbokar innan de bekräftar. Den fångade orsaken lagras på prenumerationen som cancellation_feedback, visas i API- och webhook-payloads, och finns tillgänglig i instrumentpanelen så du kan upptäcka mönster för churn vid en blick.
Orsaksval
| Värde | Kundmötesetikett |
|---|
too_expensive | För dyrt |
missing_features | Saknar funktioner |
switched_service | Bytte till annan tjänst |
unused | Använder det inte tillräckligt |
customer_service | Dålig kundservice |
low_quality | Låg kvalitet |
too_complex | För komplext |
other | Annat |
Var det visas
- Prenumerationsobjekt: Ny
cancellation_feedback fält (en av värdena ovan) och cancellation_comment (valfri fri text), fylld när kunden avbokar
subscription.cancelled webhook: Båda fälten ingår i payload
- API: Förmedla
cancellation_feedback och cancellation_comment till PATCH /subscriptions/{id} när du schemalägger eller utför en avbokning programmatiskt
// Reading the captured feedback
const subscription = await client.subscriptions.retrieve('sub_123');
console.log(subscription.cancellation_feedback); // e.g., "too_expensive"
console.log(subscription.cancellation_comment); // e.g., "Switching to a competitor"
Kombinera cancellation_feedback med Prenumerationsdrift för att skräddarsy dina vinna tillbaka-mejl — t.ex. skicka en rabattkod till too_expensive avbeställare och en “vad saknas?”-undersökning till missing_features avbeställare.
Läs mer: Kundportalen | Prenumerationswebhooks
Du kan nu konfigurera mandatgolvet för INR e-mandat på indiska kort återkommande prenumerationer. Tidigare använde varje indiskt kort prenumeration under ₹15,000 ett fast ₹15,000 påbegäran mandat. Nu kan du åsidosätta detta golv på handlarens nivå — och per checkout-session eller prenumeration om det behövs.
Mandatbeloppet registrerat hos kundens bank är max(mandate_min_amount_inr_paise, billing_amount), så detta värde fungerar som kundmötes auktoriseringtak när faktureringen är lägre än golvet.
// Per-subscription override
const subscription = await client.subscriptions.create({
product_id: 'prod_inr_monthly',
customer: { email: 'customer@example.in' },
billing: { country: 'IN' /* ... */ },
mandate_min_amount_inr_paise: 2_000_000 // ₹20,000 ceiling for this subscription
});
// Or via a checkout session
const session = await client.checkoutSessions.create({
product_cart: [{ product_id: 'prod_inr_monthly', quantity: 1 }],
mandate_min_amount_inr_paise: 2_000_000,
return_url: 'https://yoursite.com/return'
});
Upplösningsprioritet
- Per förfrågan överskrivning (
mandate_min_amount_inr_paise på checkout-sessionen, betalningen eller prenumerationen)
- Handlarnivåinställning i affärsinställningar
- Systemstandard på ₹15,000 (1,500,000 paise)
| Fält | Typ | Område | Gäller för |
|---|
mandate_min_amount_inr_paise | integer (INR paise) | >= 1 | Indiska kort INR prenumerationer på icke-Airwallex kontakter |
Denna inställning påverkar endast e-mandat som registrerats för indiska utfärdade kort (Visa, Mastercard, RuPay) på INR prenumerationer. UPI prenumerationer följer sitt eget AutoPay-flöde och påverkas inte.
Läs mer: Indiska Betalningsmetoder | Prenumerationer med RBI Mandates
4. Adaptive Currency Fees Inclusive Business Setting
Adaptive Currency är funktionen som låter dig debitera kunder i deras lokala valuta. Som standard bär kunden 2–4% adaptive currency fee som läggs på ditt visade pris. Med den nya Avgifter Inkluderad inställningen kan du vända på detta: hålla det visade priset oförändrat för kunden och stå för avgiften själv.
Var man kan konfigurera
Gå till Inställningar → Affärs, se till att Adaptiv Prissättning är aktiverad och aktivera Avgifter Inkluderad i sektionen Adaptiv Valuta.
Per förfrågan överskrivning
Du kan också åsidosätta handelsstandard för enskilda checkout, betalningar och on demand prenumerationer med hjälp av adaptive_currency_fees_inclusive boolean:
const session = await client.checkoutSessions.create({
product_cart: [{ product_id: 'prod_abc', quantity: 1 }],
adaptive_currency_fees_inclusive: true, // override business default
return_url: 'https://yoursite.com/return'
});
| Mode | Kund ser | Handlaren avvecklar |
|---|
| Exklusiv (standard) | Lokal pris + 2–4% avgift på toppen | Fullt grundpris |
| Inkluderande | Lokal pris (oförändrat) | Grundpris minus 2–4% avgift |
INR → INR transaktioner behandlas alltid som inkluderande oavsett affärsinställning eller per förfrågan överskrivning.
Läs mer: Adaptive Currency
5. Dodo Payments Desktop App
Den officiella Dodo Payments Desktop appen är nu allmänt tillgänglig för macOS, Windows, och Linux. Kör din betalningsdashboard som en snabb, inhemsk app — ingen webbläsarflik krävs.
| Plattform | Ladda ner |
|---|
| macOS (Apple Silicon) | Dodo.Payments_<version>_aarch64.dmg |
| macOS (Intel) | Dodo.Payments_<version>_x64.dmg |
| Windows | Dodo.Payments_<version>_x64-setup.exe (eller .msi) |
| Linux (Debian/Ubuntu) | Dodo.Payments_<version>_amd64.deb |
| Linux (Fedora/RHEL) | Dodo.Payments-<version>-1.x86_64.rpm |
| Linux (AppImage, auto-uppdatera) | Dodo.Payments_<version>_amd64.AppImage |
Vad finns inuti
- Liten inhemsk binär — byggd med Tauri på systemets inhemska webbvy, ~5 MB totalt (ingen inbäddad Chromium)
- Signerad och godkänd — macOS-byggnader är signerade med Apple Developer ID och godkända, så inga Gatekeeper varningar
- Auto-uppdatering — kontrollerar var 4:e timme och tillämpar signerade uppdateringar automatiskt från GitHub Releases (fungerar på macOS, Windows och Linux AppImage)
- System tray + menyfält — göm till tray på macOS, fulla Fil/Redigera/Vy/Hjälp-menyer med kortkommandon (
⌘⇧H gå till dashboard, ⌘L kopiera aktuell URL, ⌘⌥I utvecklingsverktyg)
- Djup-länkstöd — magiska-länk autentiseringslänkar öppnas direkt i appen
- Multi-fönster — öppna flera dashboards sida vid sida
6. Stabila kryptovaluta betalningar (USDC, USDP, USDG)
Acceptera stabila kryptovalutabetalningar globalt med USD-avräkning. Kunder betalar från sin valda stabila kryptovaluta plånbok på nätverket av deras val; du får fiat USD utan exponering för kryptovolatilitet, inga chargebacks och ingen bankinfrastruktur som krävs på kundens sida.
Stödda valutor och nätverk
| Stabil kryptovaluta | Nätverk |
|---|
| USDC | Ethereum, Solana, Polygon, Base |
| USDP | Ethereum, Solana |
| USDG | Ethereum |
Täckning
| Detalj | Värde |
|---|
| Faktureringsvaluta | USD |
| Stödda länder | Global (utom Indien) |
| Prenumerationer | Ej stödda (endast engångsbetalningar) |
| Minsta belopp | $0.50 |
| Avräkning | USD |
Konfiguration
Förmedla crypto i allowed_payment_method_types när du skapar en checkout-session:
const session = await client.checkoutSessions.create({
product_cart: [{ product_id: 'prod_123', quantity: 1 }],
allowed_payment_method_types: ['crypto', 'credit', 'debit'],
return_url: 'https://example.com/success'
});
Kunden visas en plånboksadress och QR-kod med stabil kryptovalutabeloppet beräknat vid realtidsväxelkursen; när blockkedjan bekräftar transaktionen, utlöses din payment.succeeded webhook och kunden omdirigeras till din framgångssida.
Stabila kryptovalutabetalningar är irreversibla av design — det finns inga chargebacks. Vi rekommenderar alltid att erbjuda credit och debit som reservmetoder för kunder utan stabil kryptovaluta plånbok.
Läs mer: Stabila kryptovalutabetalningar
7. Importera befintliga licensnycklar
Du kan nu importera licensnycklar från ett annat system till Dodo Payments med hjälp av Create License Key API. Detta låser upp störningsfri migrering från vilken extern licensnyckelleverantör som helst, så att dina befintliga kunder kan fortsätta aktivera, validera, och avaktivera sina nycklar mot Dodo Payments utan nyutgivning.
const licenseKey = await client.licenseKeys.create({
customer_id: 'cus_abc123',
product_id: 'prod_456',
key: 'YOUR-EXISTING-LICENSE-KEY',
activations_limit: 5,
expires_at: '2026-12-31T23:59:59Z',
});
Importerade nycklar är taggade med source: "import" (vs. source: "auto" för nycklar som genereras automatiskt vid betalning), så att du kan skilja migrerat lager från organiskt utfärdade nycklar när du frågar GET /license_keys. payment_id på importerade nycklar är null eftersom de inte är knutna till en Dodo Payments-transaktion.
Licensnycklar som skapas eller uppdateras genom API utlöser inte e-postmeddelanden till kunderna. Om du behöver meddela kunder om en importerad nyckel, hantera det separat i din applikation.
Migrera från Polar.sh eller Lemon Squeezy? dodo-migrate CLI automatiserar bulkimporter av produkter, kunder, rabatter och licensnycklar i ett enda kommando.
Läs mer: Licensnycklar | Create License Key API
8. require_phone_number för checkout-sessioner
Tvinga kunder att ange ett telefonnummer under utcheckningen genom att ställa in feature_flags.require_phone_number: true när du skapar en checkout-session. Telefonnummer blir ett obligatoriskt fält i utcheckningsformuläret, med validering som visar “Telefonnummer är obligatoriskt” om kunden lämnar det tomt.
const session = await client.checkoutSessions.create({
product_cart: [{ product_id: 'prod_abc', quantity: 1 }],
feature_flags: {
allow_phone_number_collection: true,
require_phone_number: true
},
return_url: 'https://yoursite.com/return'
});
| Flagga | Standard | Beteende |
|---|
allow_phone_number_collection | true | Visar telefonnummerfältet i utcheckningen |
require_phone_number | false | Gör telefonnummerfältet obligatoriskt |
require_phone_number: true kräver allow_phone_number_collection: true. API avvisar sessioner där require_phone_number är true medan telefoninsamling är inaktiverad.
Användbar för B2B SaaS, reglerade industrier eller något flöde där du behöver en verifierad kontaktkanal för support, bedrägerigranskning eller efterlevnad.
Läs mer: Utcheckningsfunktioner | Create Checkout Session API
Buggfixar & Förbättringar
- Mindre buggfixar och stabilitetsförbättringar över plattformen