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

# Aggiungi automaticamente un omaggio a una soglia

> Un caso d'uso del Cart SDK che aggiunge un omaggio quando il totale del carrello supera una soglia, e lo rimuove se il totale scende sotto.

Osserva il totale del carrello e mantieni un omaggio sincronizzato con esso: aggiungi l'omaggio quando l'acquirente supera una soglia di spesa, rimuovilo se scende di nuovo sotto.

<Note>
  Per una versione configurabile dal merchant con livelli, regole per mercato e una barra di avanzamento, usa il blocco [Rewards](/it/aftersell/cart/rewards-block), senza codice. Questo è per quando la tua regola è qualcosa che il blocco non può esprimere.
</Note>

<div id="the-snippet">
  ## Lo snippet
</div>

Incolla in **Cart settings → Custom script → Initialization**, e imposta le due costanti:

```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">
  ## Come funziona
</div>

**`reconcileGift`** descrive lo stato in cui il carrello *dovrebbe* essere, poi effettua al massimo una modifica per arrivarci:

* Qualifica e l'omaggio non c'è → [`addItem`](/it/aftersell/cart/sdk-actions#additemvariantid-quantity) lo aggiunge.
* Non qualifica e l'omaggio c'è → [`removeItem`](/it/aftersell/cart/sdk-actions#removeitemkey) lo rimuove, tramite la `key` della riga.
* Altrimenti → non fa nulla.

Viene eseguito sia su [`cart_loaded`](/it/aftersell/cart/sdk-events#cart_loaded) (così un carrello che qualifica già al caricamento della pagina riceve l'omaggio) sia su [`cart_updated`](/it/aftersell/cart/sdk-events#cart_updated) (così reagisce a ogni cambiamento successivo). Poiché `cart_loaded` viene riprodotto per gli iscritti tardivi, questo funziona indipendentemente da quando viene eseguito il tuo script.

<Warning>
  **Le guardie `!gift` / `gift` sono ciò che impedisce il loop.** Aggiungere l'omaggio attiva `cart_updated`, che esegue di nuovo `reconcileGift`, e il secondo passaggio trova l'omaggio già presente, quindi non fa nulla. Togli le guardie e ottieni un loop infinito. Vedi [le due regole](/it/aftersell/cart/sdk-events#the-two-rules).
</Warning>

Nota che aggiungere l'omaggio **aumenta il totale del carrello**, quindi una soglia vicina al prezzo di un prodotto può oscillare: aggiungere un omaggio da \$0 è sicuro, ma un omaggio con un prezzo potrebbe da solo spingere il carrello sopra la soglia. Mantieni l'omaggio gratuito, oppure confronta con un totale che lo esclude.

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

**Condiziona sul numero di articoli invece che sulla spesa:**

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

**Condiziona sulla presenza di un prodotto specifico nel carrello:**

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

**Solo in certi paesi.** Leggi [`context`](/it/aftersell/cart/sdk-overview#context), che è disponibile prima che il carrello si carichi:

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

**Escludi l'omaggio dalla soglia** così non può sostenersi da solo:

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

**Marca l'omaggio così si legge come un omaggio.** Un [line transform](/it/aftersell/cart/sdk-hooks#registerlinetransform) può cambiare il titolo di una riga, il titolo della variante, lo stato nascosto e le proprietà interne — quindi rietichettalo:

```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>
  Un line transform **non può nascondere i controlli di quantità di una riga** — i suoi unici setter sono `setTitle`, `setVariantTitle`, `setHidden` e `setInternalProperties`. Se un acquirente cambia la quantità dell'omaggio, correggila invece da un gestore `cart_updated`.
</Note>

<div id="where-to-go-next">
  ## Dove andare adesso
</div>

* **[Blocco Rewards](/it/aftersell/cart/rewards-block)**: la versione senza codice, con livelli.
* **[Actions](/it/aftersell/cart/sdk-actions)**: `addItem`, `removeItem` e il resto.
* **[Events](/it/aftersell/cart/sdk-events)**: perché le guardie sono importanti.
