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

# Funktion Flagga Rättighet

> Begränsa funktioner i din egen applikation baserat på ett köp. Funktion flagga rättigheter levererar en boolean förmåga direkt vid betalning och återkallar den automatiskt vid avbokning.

<Info>
  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.
</Info>

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

<Note>
  `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`.
</Note>

## Skapa en funktion flagga

<Steps>
  <Step title="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**.
  </Step>

  <Step title="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.

    <Frame caption="Creating a feature flag. The Feature ID is what your application checks; Meta Data attaches limits alongside the flag.">
      <img src="https://mintcdn.com/dodopayments/oS2MTbJuY6MeBjjs/images/entitlements/feature-flags/create.png?fit=max&auto=format&n=oS2MTbJuY6MeBjjs&q=85&s=08d8fc2cfee102ff08fd150c76b5fcf9" alt="Ny Funktion Flagga formulär med visningsnamn, funktion ID, beskrivning och metadata nyckel-värde angivelser" style={{ maxHeight: '500px', width: 'auto' }} width="1196" height="776" data-path="images/entitlements/feature-flags/create.png" />
    </Frame>
  </Step>

  <Step title="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](#attach-limits-with-metadata).
  </Step>

  <Step title="Confirm">
    Klicka på **Bekräfta**. Flaggan visas i din rättighetslista, redo att bifogas till produkter.

    <Frame caption="The created feature flag. The right pane tracks every customer grant issued from it.">
      <img src="https://mintcdn.com/dodopayments/oS2MTbJuY6MeBjjs/images/entitlements/feature-flags/list.png?fit=max&auto=format&n=oS2MTbJuY6MeBjjs&q=85&s=02eedcbbf7ece9f67d375c984c5515b9" alt="Rättighetsdashboard som visar Avancerade Rapporter funktion flagga med sin beviljande aktivitetsfönster" style={{ maxHeight: '500px', width: 'auto' }} width="1316" height="898" data-path="images/entitlements/feature-flags/list.png" />
    </Frame>
  </Step>
</Steps>

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

<Frame caption="Attaching the feature flag to a product. One product can deliver multiple entitlements.">
  <img src="https://mintcdn.com/dodopayments/oS2MTbJuY6MeBjjs/images/entitlements/feature-flags/attach-picker.png?fit=max&auto=format&n=oS2MTbJuY6MeBjjs&q=85&s=da2137873e285cc6ce0ce234fe899ed3" alt="Rättigheter bifoga panel med Avancerade Rapporter funktion flagga vald" style={{ maxHeight: '500px', width: 'auto' }} width="1316" height="898" data-path="images/entitlements/feature-flags/attach-picker.png" />
</Frame>

Den bifogade flaggan visas på produktformuläret, och förhandsgranskningen av kassan listar den under **Inkluderar**.

<Frame caption="The product now includes the feature flag. Every successful purchase or active subscription grants it.">
  <img src="https://mintcdn.com/dodopayments/oS2MTbJuY6MeBjjs/images/entitlements/feature-flags/attach-to-product.png?fit=max&auto=format&n=oS2MTbJuY6MeBjjs&q=85&s=3556181389997edddde9c396d0ce408d" alt="Produktformulär med Avancerade Rapporter funktion flagga fäst i Rättigheter kortet" style={{ maxHeight: '500px', width: 'auto' }} width="1316" height="898" data-path="images/entitlements/feature-flags/attach-to-product.png" />
</Frame>

## Obligatorisk konfiguration

| Fält           | Obligatorisk | Beskrivning                                                                                           |
| -------------- | ------------ | ----------------------------------------------------------------------------------------------------- |
| `feature_id`   | Ja           | Identifierare som din applikation kontrollerar, t.ex. `advanced_reports`. Inte unik över rättigheter. |
| `feature_type` | Ja           | Typ av förmåga som ges. Endast `boolean` stöds idag.                                                  |

### Skapa via API

<CodeGroup>
  ```typescript TypeScript theme={null} theme={null}
  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,
    },
  });
  ```

  ```python Python theme={null} theme={null}
  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,
      },
  )
  ```

  ```go Go theme={null} theme={null}
  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"),
      },
    ),
  })
  ```
</CodeGroup>

***

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

<Tip>
  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.
</Tip>

***

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

<CodeGroup>
  ```typescript TypeScript theme={null} theme={null}
  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
  }
  ```

  ```python Python theme={null} theme={null}
  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")
  ```

  ```go Go theme={null} theme={null}
  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
    }
  }
  ```
</CodeGroup>

<Note>
  `feature` nyttolasten fylls endast på `feature_flag` beviljanden; det är `null` för alla andra integrationstyper. Se den [Lista Kund Grants](/api-reference/entitlements/list-customer-grants) API-referens för hela svarformatet.
</Note>

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](/features/entitlements/introduction#how-grants-work) med en förenkling: det finns inget leveranssteg, så beviljanden sitter aldrig i `pending` och flyttas aldrig till `failed`.

| Utlösare                                                    | Effekt                                                                                                   |
| ----------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
| Engångsbetalning lyckas / prenumeration blir aktiv          | Beviljande skapat med `status: delivered` och `delivered_at` satt.                                       |
| Prenumeration sätts på vänt, avbokas eller utgår            | Beviljande återkallat med matchande `revocation_reason`.                                                 |
| Återbetalning på en engångsbetalning                        | Beviljande å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-återkallning                                    | Beviljande å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](/developer-resources/webhooks/intents/entitlement-grant) 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 TypeScript theme={null} theme={null}
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.
