Hoppa till huvudinnehåll
En funktion flagga rättighet förvandlar Dodo Payments till ett betalningsmedvetet funktion-flagglager. Bifoga en flagga som advanced_reports till en produkt, och varje betalande kund får en beviljande som din applikation kan kontrollera via API eller hålla i sync med webhooks. Ingen extern plattform, ingen OAuth, inget leveranssteg — beviljandet i sig är förmågan.

Vad som levereras

Inget lämnar Dodo Payments — beviljandet är leveransen:
  • Vid köp skapas beviljandet och flyttas direkt till delivered. Det finns ingen pending fas, ingen kundåtgärd och ingen möjlighet för leverans att misslyckas.
  • Beviljandet bär en typad feature nyttolast: { "feature_type": "boolean", "feature_id": "advanced_reports" }. Din applikation läser feature_id för att bestämma vad som ska låsas upp.
  • Avbokning, återbetalning eller manuell återkallning flyttar beviljandet till revoked, och din applikation ser flaggan försvinna.
Vanliga användningar inkluderar planbaserad funktionsbegränsning (Pro låser upp analys), tilläggsförmågor (en “API-åtkomst” uppgradering) och tidiga åtkomstprogram som säljs som engångsköp.
feature_id är en handlarchosen identifierare, inte unik över rättigheter. Två rättigheter kan ge samma feature_id — till exempel, en månads- och en årsplan för Pro som båda ger advanced_reports.

Skapa en funktion flagga

1

Open Entitlements

I din Dodo Payments dashboard, gå till Rättigheter och klicka på + för att starta en ny rättighet, välj sedan Funktion Flaggar.
2

Name the flag

Ge flaggan ett Visningsnamn för din dashboard, ett Funktion ID som din applikation kommer att kontrollera (dashboarden föreslår ett från namnet) och en Beskrivning så att ditt team vet vad den kontrollerar.
Ny Funktion Flagga formulär med visningsnamn, funktion ID, beskrivning och metadata nyckel-värde angivelser
3

Optionally add metadata

Toggle Meta Data för att bifoga nyckel-värde konfiguration — gränser, nivånamn, kvoter — som levereras till din applikation tillsammans med flaggan. Se Bifoga gränser med metadata.
4

Confirm

Klicka på Bekräfta. Flaggan visas i din rättighetslista, redo att bifogas till produkter.
Rättighetsdashboard som visar Avancerade Rapporter funktion flagga med sin beviljande aktivitetsfönster

Bifoga till en produkt

Öppna en produkt (eller skapa en), hitta Rättigheter kortet och klicka på + för att bifoga befintliga rättigheter. Välj din funktion flagga och klicka på Klar.
Rättigheter bifoga panel med Avancerade Rapporter funktion flagga vald
Den bifogade flaggan visas på produktformuläret, och förhandsgranskningen av kassan listar den under Inkluderar.
Produktformulär med Avancerade Rapporter funktion flagga fäst i Rättigheter kortet

Obligatorisk konfiguration

FältObligatoriskBeskrivning
feature_idJaIdentifierare som din applikation kontrollerar, t.ex. advanced_reports. Inte unik över rättigheter.
feature_typeJaTyp av förmåga som ges. Endast boolean stöds idag.

Skapa via API

import DodoPayments from 'dodopayments';

const client = new DodoPayments({
  bearerToken: process.env['DODO_PAYMENTS_API_KEY'],
  environment: 'test_mode',
});

const entitlement = await client.entitlements.create({
  name: 'Advanced Reports',
  integration_type: 'feature_flag',
  integration_config: {
    feature_type: 'boolean',
    feature_id: 'advanced_reports',
  },
  metadata: {
    tier: 'pro',
    monthly_report_limit: 100,
  },
});
client.entitlements.create(
    name="Advanced Reports",
    integration_type="feature_flag",
    integration_config={
        "feature_type": "boolean",
        "feature_id": "advanced_reports",
    },
    metadata={
        "tier": "pro",
        "monthly_report_limit": 100,
    },
)
client.Entitlements.New(ctx, dodopayments.EntitlementNewParams{
  Name:            dodopayments.F("Advanced Reports"),
  IntegrationType: dodopayments.F(dodopayments.EntitlementIntegrationTypeFeatureFlag),
  IntegrationConfig: dodopayments.F[dodopayments.IntegrationConfigUnionParam](
    dodopayments.IntegrationConfigFeatureFlagConfigParam{
      FeatureType: dodopayments.F(dodopayments.FeatureTypeBoolean),
      FeatureID:   dodopayments.F("advanced_reports"),
    },
  ),
})

Bifoga gränser med metadata

En boolean flagga svarar “har denna kund funktionen?”. Metadata svarar “med vilken konfiguration?”. Rättighetsmetadata accepterar strängar, heltal, nummer och boolean värden, och varje beviljande tar en fryst ögonblicksbild av rättighetens metadata i det ögonblick det skapas. Denna ögonblicksbildsbeteende är det som gör metadata säkra att använda för planegränser:
  • Att redigera rättighetens metadata senare påverkar endast framtida beviljanden. Kunder behåller de gränser de köpt under.
  • Ögonblicksbilden returneras på varje beviljande som dess metadata fält, så ett API-anrop ger dig både flaggan och dess konfiguration.
Till exempel, en advanced_reports flagga med { "tier": "pro", "monthly_report_limit": 100 } låter din applikation låsa upp dashboarden och påtvinga 100-rapport kvoten utan en andra uppslagning. Om du senare höjer gränsen till 250, förblir befintliga kunder på 100 tills de får en ny beviljande (till exempel, efter en planförändring).
Använd metadata för gränser och konfiguration; använd feature_id endast för identitet. Att koda gränser i id:t (advanced_reports_100) tvingar en ny flagga för varje gränsändring och bryter dina applikationskontroller.

Kontrollera en kunds funktioner

Lista en kunds levererade funktion-flagg beviljanden och bygg upp uppsättningen av aktiverade funktioner. Endpointen returnerar en rad per beviljande över alla rättigheter, filtrerbar efter integration_type och status.
const features = new Map<string, Record<string, unknown>>();

for await (const grant of client.customers.listEntitlementGrants('cus_abc123', {
  integration_type: 'feature_flag',
  status: 'Delivered',
})) {
  if (grant.feature) {
    features.set(grant.feature.feature_id, grant.metadata ?? {});
  }
}

if (features.has('advanced_reports')) {
  const limit = features.get('advanced_reports')?.monthly_report_limit;
  // unlock the dashboard, enforce the limit
}
page = client.customers.list_entitlement_grants(
    customer_id="cus_abc123",
    integration_type="feature_flag",
    status="Delivered",
)

features = {
    grant.feature.feature_id: grant.metadata
    for grant in page.items
    if grant.feature
}

if "advanced_reports" in features:
    limit = features["advanced_reports"].get("monthly_report_limit")
page, _ := client.Customers.ListEntitlementGrants(
  ctx, "cus_abc123",
  dodopayments.CustomerListEntitlementGrantsParams{
    IntegrationType: dodopayments.F("feature_flag"),
    Status:          dodopayments.F("Delivered"),
  },
)

features := map[string]bool{}
for _, grant := range page.Items {
  if grant.Feature.FeatureID != "" {
    features[grant.Feature.FeatureID] = true
  }
}
feature nyttolasten fylls endast på feature_flag beviljanden; det är null för alla andra integrationstyper. Se den Lista Kund Grants API-referens för hela svarformatet.
Att kontrollera API på varje begäran lägger till latens till din heta väg. Cacha funktionsuppsättningen per kund med en kort TTL (minuter, inte timmar), och ogiltigförklara cachen från din webhook-hanterare när en beviljande ändrar tillstånd - den kombinationen håller kontroller snabb och återkallningar nästan direkt.

Livscykel

Funktion flagg beviljanden följer den standard bevilja livscykel med en förenkling: det finns inget leveranssteg, så beviljanden sitter aldrig i pending och flyttas aldrig till failed.
UtlösareEffekt
Engångsbetalning lyckas / prenumeration blir aktivBeviljande skapat med status: delivered och delivered_at satt.
Prenumeration sätts på vänt, avbokas eller utgårBeviljande återkallat med matchande revocation_reason.
Återbetalning på en engångsbetalningBeviljande återkallat med revocation_reason: refund.
Prenumeration återställs (till exempel, inkassering lyckas)Det återkallade beviljandet återställs till delivered — samma bevilja id, återkallningsfält rensade.
Manuell API-återkallningBeviljande återkallat med revocation_reason: manual. Återställs inte automatiskt vid förnyelse.
Beviljanden är idempotenta per rättighet och kund: medan en kund har en icke-återkallad beviljande för en flagga, skapar upprepade köp och förnyelser inga dubbletter.

Webhooks

Prenumerera på entitlement_grant.* händelser för att spegla flaggor in i din egen databas i stället för att fråga:
  • entitlement_grant.created — kommer redan delivered med feature nyttolasten. Aktivera funktionen.
  • entitlement_grant.delivered — utlöses när en tidigare återkallad beviljande återställs. Återaktivera funktionen.
  • entitlement_grant.revoked — åtkomst återtagen. Inaktivera funktionen och kontrollera revocation_reason för att bestämma ditt meddelande.
TypeScript
app.post('/webhooks/dodo', async (req, res) => {
  const event = req.body;

  if (event.type.startsWith('entitlement_grant.') && event.data.feature) {
    const { customer_id, feature } = event.data;
    const enabled = event.type !== 'entitlement_grant.revoked';

    await db.customerFeatures.upsert({
      customerId: customer_id,
      featureId: feature.feature_id,
      enabled,
      config: event.data.metadata ?? {},
    });
  }

  res.sendStatus(200);
});
There is no entitlement_grant.failed for feature flags — delivery happens entirely inside Dodo Payments and cannot fail.

Exempel: Pro plan låser upp avancerade rapporter

  1. Skapa flaggan. feature_id: advanced_reports med metadata { "tier": "pro", "monthly_report_limit": 100 }.
  2. Bifoga den till din Pro Plan prenumerationsprodukt.
  3. En kund prenumererar. Dodo Payments skapar en delivered beviljande och utlöser entitlement_grant.created; din webhook hanterare aktiverar advanced_reports för kunden med en gräns på 100.
  4. Din app begränsar funktionen. Vid dashboard-laddning, kontrollera den cachade funktion-uppsättningen (eller ring listEntitlementGrants) och visa rapportfliken endast när advanced_reports är närvarande.
  5. Kunden avbokar. Dodo Payments återkallar beviljandet och utlöser entitlement_grant.revoked; din hanterare inaktiverar funktionen. Om kunden senare återhämtar sig via inkassering, entitlement_grant.delivered återställer det — inga kodändringar behövs.

Bästa praxis

  • Använd stabila, snake_case funktion id:n. Din applikationskod kontrollerar dessa strängar; att byta namn på en är en brytande ändring på båda sidor.
  • En flagga per förmåga. Föredra advanced_reports + api_access som två rättigheter över en enda pro_bundle — återkallning och planblandningar förblir rena.
  • Driv status från webhooks, verifiera med API. Webhooks håller din databas aktuell; listan endpoint är sanningskälla för avstämningsjobb och cachemissar.
  • Behandla revoked som omedelbar. En återkallad flagga innebär att kunden inte längre betalar för funktionen. Begränsa vid nästa begäran, inte nästa session.
  • Sätt gränser i metadata, inte i kod. Att ändra en kvot kräver då bara redigering av rättigheten — nya kunder hämtar det automatiskt medan befintliga beviljanden behåller sin köpta ögonblicksbild.
Senast ändrad 9 juli 2026