> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aftersell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Auto-tilføj en gratis gave ved en tærskel

> En Cart SDK-use case, der tilføjer en gratis gave, når kurvtotalen krydser en tærskel, og fjerner den, hvis totalen falder under.

Overvåg kurvtotalen og hold en gratis gave synkroniseret med den: tilføj gaven, når kunden krydser en forbrugstærskel, og fjern den, hvis de falder tilbage under.

<Note>
  For en forhandler-konfigureret version med niveauer, per-marked-regler og en progressbar skal du bruge [Rewards](/da/aftersell/cart/rewards-block)-blokken, helt uden kode. Dette er til, når din regel er noget, blokken ikke kan udtrykke.
</Note>

<div id="the-snippet">
  ## Snippet'et
</div>

Indsæt i **Cart settings → Custom script → Initialization**, og sæt de to konstanter:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const FREE_GIFT_VARIANT_ID = 1234567890; // the gift product's variant id
const THRESHOLD_CENTS = 5000;            // $50.00, since totals are in cents

function reconcileGift(state) {
  const gift = state.items.find((line) => line.variantId === FREE_GIFT_VARIANT_ID);
  const qualifies = state.totalPrice >= THRESHOLD_CENTS;

  if (qualifies && !gift) {
    window.aftersell.cart.actions.addItem(FREE_GIFT_VARIANT_ID, 1);
  } else if (!qualifies && gift) {
    window.aftersell.cart.actions.removeItem(gift.key);
  }
}

window.aftersell.cart.events.on('cart_loaded', reconcileGift);
window.aftersell.cart.events.on('cart_updated', reconcileGift);
```

<div id="how-it-works">
  ## Sådan virker det
</div>

**`reconcileGift`** beskriver den tilstand, kurven *bør* være i, og laver derefter højst én ændring for at nå dertil:

* Kvalificerer og gaven er der ikke → [`addItem`](/da/aftersell/cart/sdk-actions#additemvariantid-quantity) tilføjer den.
* Kvalificerer ikke og gaven er der → [`removeItem`](/da/aftersell/cart/sdk-actions#removeitemkey) fjerner den, via linjens `key`.
* Ellers → gør ingenting.

Den kører både på [`cart_loaded`](/da/aftersell/cart/sdk-events#cart_loaded) (så en kurv, der allerede kvalificerer ved sideindlæsning, får gaven) og [`cart_updated`](/da/aftersell/cart/sdk-events#cart_updated) (så den reagerer på hver ændring derefter). Fordi `cart_loaded` afspilles igen til sene abonnenter, virker dette uanset hvornår dit script kører.

<Warning>
  **`!gift`- / `gift`-guardsene er det, der forhindrer dette i at loope.** At tilføje gaven fyrer `cart_updated`, som kører `reconcileGift` igen, og den anden gennemgang finder gaven allerede til stede, så den gør ingenting. Fjern guardsene, og du får et uendeligt loop. Se [de to regler](/da/aftersell/cart/sdk-events#the-two-rules).
</Warning>

Bemærk, at tilføjelse af gaven **hæver kurvtotalen**, så en tærskel nær et produkts pris kan svinge: at tilføje en gave til \$0 er sikkert, men en gave med en pris kan selv skubbe kurven over tærsklen. Hold gaven gratis, eller sammenlign mod en total, der ekskluderer den.

<div id="adapting-it">
  ## Tilpas det
</div>

**Baser på antal varer i stedet for forbrug:**

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const qualifies = state.itemCount >= 3;
```

**Baser på at et bestemt produkt er i kurven:**

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const qualifies = state.items.some((line) => line.productId === TRIGGER_PRODUCT_ID);
```

**Kun i visse lande.** Læs [`context`](/da/aftersell/cart/sdk-overview#context), som er tilgængelig, før kurven indlæses:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const ELIGIBLE = ['US', 'CA'];

// Only register the handlers for eligible countries.
if (ELIGIBLE.includes(window.aftersell.cart.context.customer_country)) {
  window.aftersell.cart.events.on('cart_loaded', reconcileGift);
  window.aftersell.cart.events.on('cart_updated', reconcileGift);
}
```

**Ekskludér gaven fra tærsklen**, så den ikke kan holde sig selv oppe:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
const subtotalWithoutGift = state.items.reduce(
  (sum, line) => (line.variantId === FREE_GIFT_VARIANT_ID ? sum : sum + line.finalLinePrice),
  0
);
const qualifies = subtotalWithoutGift >= THRESHOLD_CENTS;
```

**Markér gaven, så den fremstår som en gave.** En [line transform](/da/aftersell/cart/sdk-hooks#registerlinetransform) kan ændre en linjes titel, varianttitel, skjulte tilstand og interne properties — så omdøb den:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.hooks.registerLineTransform((line) => {
  if (line.variantId === FREE_GIFT_VARIANT_ID) {
    line.setTitle('Free gift 🎁');
  }
});
```

<Note>
  En line transform **kan ikke skjule en linjes antalsvælgere** — dens eneste settere er `setTitle`, `setVariantTitle`, `setHidden` og `setInternalProperties`. Hvis en kunde ændrer gavens antal, så ret det fra en `cart_updated`-handler i stedet.
</Note>

<div id="where-to-go-next">
  ## Hvor du kan gå hen herfra
</div>

* **[Rewards-blokken](/da/aftersell/cart/rewards-block)**: no-code-versionen, med niveauer.
* **[Actions](/da/aftersell/cart/sdk-actions)**: `addItem`, `removeItem` og resten.
* **[Events](/da/aftersell/cart/sdk-events)**: hvorfor guardsene betyder noget.
