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

# Ein Gratisgeschenk ab einem Schwellenwert automatisch hinzufügen

> Ein Cart-SDK-Anwendungsfall, der ein Gratisgeschenk hinzufügt, wenn die Warenkorbsumme einen Schwellenwert überschreitet, und es entfernt, wenn die Summe darunter fällt.

Beobachte die Warenkorbsumme und halte ein Gratisgeschenk damit synchron: Füge das Geschenk hinzu, sobald der Käufer einen Ausgabenschwellenwert überschreitet, und entferne es, wenn er wieder darunter fällt.

<Note>
  Für eine vom Händler konfigurierbare Version mit Stufen, marktspezifischen Regeln und einer Fortschrittsleiste nutze den [Rewards](/de/aftersell/cart/rewards-block)-Block, ganz ohne Code. Dieses Beispiel ist für Fälle, in denen der Block deine Regel nicht abbilden kann.
</Note>

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

Füge es in **Cart settings → Custom script → Initialization** ein und setze die beiden Konstanten:

```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">
  ## So funktioniert es
</div>

**`reconcileGift`** beschreibt den Zustand, in dem der Warenkorb sein *sollte*, und nimmt dann höchstens eine Änderung vor, um dorthin zu kommen:

* Qualifiziert und das Geschenk fehlt → [`addItem`](/de/aftersell/cart/sdk-actions#additemvariantid-quantity) fügt es hinzu.
* Qualifiziert nicht und das Geschenk ist da → [`removeItem`](/de/aftersell/cart/sdk-actions#removeitemkey) entfernt es, anhand des `key` der Position.
* Andernfalls → nichts tun.

Es läuft sowohl bei [`cart_loaded`](/de/aftersell/cart/sdk-events#cart_loaded) (damit ein Warenkorb, der schon beim Seitenaufruf qualifiziert, das Geschenk bekommt) als auch bei [`cart_updated`](/de/aftersell/cart/sdk-events#cart_updated) (damit es danach auf jede Änderung reagiert). Da `cart_loaded` für späte Abonnenten erneut abgespielt wird, funktioniert das unabhängig davon, wann dein Script läuft.

<Warning>
  **Die Guards `!gift` / `gift` verhindern die Endlosschleife.** Das Hinzufügen des Geschenks feuert `cart_updated`, was `reconcileGift` erneut ausführt — der zweite Durchlauf findet das Geschenk bereits vor und tut nichts. Entfernst du die Guards, bekommst du eine Endlosschleife. Siehe [die zwei Regeln](/de/aftersell/cart/sdk-events#the-two-rules).
</Warning>

Beachte, dass das Hinzufügen des Geschenks **die Warenkorbsumme erhöht** — ein Schwellenwert nahe am Preis eines Produkts kann also oszillieren: Ein 0-\$-Geschenk ist sicher, aber ein Geschenk mit Preis könnte den Warenkorb von selbst über den Schwellenwert heben. Halte das Geschenk kostenlos oder vergleiche mit einer Summe, die es ausschließt.

<div id="adapting-it">
  ## Anpassungen
</div>

**Nach Artikelanzahl statt Ausgaben gaten:**

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

**Daran gaten, dass ein bestimmtes Produkt im Warenkorb ist:**

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

**Nur in bestimmten Ländern.** Lies [`context`](/de/aftersell/cart/sdk-overview#context), das schon vor dem Laden des Warenkorbs verfügbar ist:

```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);
}
```

**Das Geschenk vom Schwellenwert ausschließen**, damit es sich nicht selbst im Warenkorb hält:

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

**Das Geschenk so markieren, dass es als Geschenk erkennbar ist.** Eine [Line-Transform](/de/aftersell/cart/sdk-hooks#registerlinetransform) kann Titel, Variantentitel, Ausblendstatus und interne Properties einer Position ändern — benenne es also um:

```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>
  Eine Line-Transform **kann die Mengensteuerung einer Position nicht ausblenden** — ihre einzigen Setter sind `setTitle`, `setVariantTitle`, `setHidden` und `setInternalProperties`. Wenn ein Käufer die Menge des Geschenks ändert, korrigiere sie stattdessen in einem `cart_updated`-Handler.
</Note>

<div id="where-to-go-next">
  ## Nächste Schritte
</div>

* **[Rewards-Block](/de/aftersell/cart/rewards-block)**: die No-Code-Version, mit Stufen.
* **[Actions](/de/aftersell/cart/sdk-actions)**: `addItem`, `removeItem` und der Rest.
* **[Events](/de/aftersell/cart/sdk-events)**: warum die Guards wichtig sind.
