> ## 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.

# v1.97.6 (7 maj 2026)

> Entitlements lanseras med fem nya uppfyllelseintegrationer (Discord, GitHub, Telegram, Framer, Notion), orsaker till avbokning av prenumeration i kundportalen, konfigurerbar INR e-mandat golv, adaptiv valutakostnadsinställning, Dodo Payments Desktop-app för macOS/Windows/Linux, stabila kryptovalutabetalningar (USDC/USDP/USDG), importera befintliga licensnycklar, require_phone_number för checkout-sessioner och bugfixar.

## 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.

![Entitlements dashboard med listan på entitlements till vänster och beviljningsaktivitet till höger](https://mintcdn.com/dodopayments/do-W-dMDGVB_xzr_/images/entitlements/list.png?fit=max\&auto=format\&n=do-W-dMDGVB_xzr_\&q=85\&s=12a326205f64d1e71485bce46114d296)

**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` |

> [!TIP]
>
> 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](https://docs.dodopayments.com/features/entitlements/introduction.md) | [Entitlement Grant Webhooks](https://docs.dodopayments.com/developer-resources/webhooks/intents/entitlement-grant.md)

### 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.

![Kundportal avbokningsmodal med 'Varför avbokar du?' dropdown som visar orsaker som För dyr, Saknar funktioner, och Annat](https://mintcdn.com/dodopayments/RlXcM7JO-E_w40Np/images/customer-portal/cancellation-reasons.png?fit=max\&auto=format\&n=RlXcM7JO-E_w40Np\&q=85\&s=979394da2a9aa3907cbf9f4e225f9a4b)

**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**

* **Subscription object**: Nytt `cancellation_feedback`-fält (ett av värdena ovan) och `cancellation_comment` (valfri fritext), fylls i när kunden avslutar prenumerationen
* **`subscription.cancelled` webhook**: Båda fälten inkluderas i payloaden
* **API**: Skicka `cancellation_feedback` och `cancellation_comment` till `PATCH /subscriptions/{subscription_id}` när en avslutning schemaläggs eller utförs programmatiskt

```typescript theme={null}
// 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"
```

> [!TIP]
>
> Kombinera `cancellation_feedback` med [Prenumerationsdrift](https://docs.dodopayments.com/features/recovery/subscription-dunning.md) 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](https://docs.dodopayments.com/features/customer-portal.md#cancelling-a-subscription) | [Prenumerationswebhooks](https://docs.dodopayments.com/developer-resources/webhooks/intents/subscription.md)

### 3. **Konfigurerbar Mandat Minsta Belopp för INR E-mandat**

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.

```typescript theme={null}
// Per-subscription override
const subscription = await client.subscriptions.create({
  product_id: 'pdt_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: 'pdt_inr_monthly', quantity: 1 }],
  mandate_min_amount_inr_paise: 2_000_000,
  return_url: 'https://yoursite.com/return'
});
```

**Upplösningsprioritet**

1. Per förfrågan överskrivning (`mandate_min_amount_inr_paise` på checkout-sessionen, betalningen eller prenumerationen)
2. Handlarnivåinställning i affärsinställningar
3. 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 |

> [!NOTE]
>
> 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](https://docs.dodopayments.com/features/payment-methods/india.md#mandate-types) | [Prenumerationer med RBI Mandates](https://docs.dodopayments.com/features/subscription.md#subscriptions-with-rbi-compliant-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 handlarens standardinställning för enskilda betalningar, debiteringar för on-demand-prenumerationer och planändringar med hjälp av den booleska variabeln `adaptive_currency_fees_inclusive`:

```typescript theme={null}
const payment = await client.payments.create({
  product_cart: [{ product_id: 'pdt_abc', quantity: 1 }],
  customer: { customer_id: 'cus_123' },
  billing: { country: 'US' },
  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 |

> [!NOTE]
>
> INR → INR transaktioner behandlas alltid som inkluderande oavsett affärsinställning eller per förfrågan överskrivning.

Läs mer: [Adaptive Currency](https://docs.dodopayments.com/features/adaptive-currency.md)

### 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

> [!TIP]
>
> Hämta den senaste installatören för din plattform från [Desktop App Releases sida](https://github.com/dodopayments/dodo-desktop/releases/latest). Repon är helt öppen källkod.

### 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 |
| Länder som stöds | Globalt (exklusive Indien) |
| Prenumerationer | Stöds inte (endast engångsbetalningar) |
| Minsta belopp | \$0.50 |
| Avräkning | USD |

**Konfiguration**

Skicka `crypto_currency` i `allowed_payment_method_types` när du skapar en utcheckningssession:

```javascript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_123', quantity: 1 }],
  allowed_payment_method_types: ['crypto_currency', '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.

> [!NOTE]
>
> 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](https://docs.dodopayments.com/features/payment-methods/stablecoins.md)

### 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](https://docs.dodopayments.com/api-reference/licenses/create-license-key.md). 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.

```typescript theme={null}
const licenseKey = await client.licenseKeys.create({
  customer_id: 'cus_abc123',
  product_id: 'pdt_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.

> [!WARNING]
>
> 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.

> [!TIP]
>
> Migrera från Polar.sh eller Lemon Squeezy? [`dodo-migrate` CLI](https://docs.dodopayments.com/migrate-to-dodo) automatiserar bulkimporter av produkter, kunder, rabatter och licensnycklar i ett enda kommando.

Läs mer: [Licensnycklar](https://docs.dodopayments.com/features/license-keys.md#import-existing-license-keys-via-api) | [Create License Key API](https://docs.dodopayments.com/api-reference/licenses/create-license-key.md)

### 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.

```typescript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_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 |

> [!WARNING]
>
> `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.

> [!TIP]
>
> 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](https://docs.dodopayments.com/features/checkout.md) | [Create Checkout Session API](https://docs.dodopayments.com/api-reference/checkout-sessions/create.md)

## Buggfixar & Förbättringar

* Mindre buggfixar och stabilitetsförbättringar över plattformen


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.