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

# Cart-Objekt

> Die Struktur des Aftersell Cart SDK-Warenkorbs und seiner Zeilen: jedes Feld auf dem Warenkorb, Warenkorb-Zeilen, Bundles und Selling Plans.

Eine einzige Objektstruktur fließt durch das gesamte SDK. Sie ist das, was [`getCart()`](/de/aftersell/cart/sdk-actions#getcart) zurückgibt, was [`cart_loaded` und `cart_updated`](/de/aftersell/cart/sdk-events) deinem Handler übergeben und was ein [Custom-Code-Block](/de/aftersell/cart/custom-code-blocks) erhält.

<Note>
  **Alle Geldbeträge sind in der kleinsten Einheit der Währung** (Cents für USD), nie ein formatierter String. `5779` ist \$57,79. Verwende [`formatMoney`](/de/aftersell/cart/sdk-actions#formatmoneycents), um sie anzuzeigen.
</Note>

<div id="the-cart">
  ## Der Warenkorb
</div>

| Feld                   | Typ                      | Beschreibung                                                                                                                                                        |
| ---------------------- | ------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `token`                | `string`                 | Der Shopify-Cart-Token.                                                                                                                                             |
| `items`                | `AftersellCartLine[]`    | Die Line Items. Siehe [Warenkorb-Zeilen](#cart-lines).                                                                                                              |
| `itemCount`            | `number`                 | Gesamte Artikelmenge, wie sie der Käufer sieht.                                                                                                                     |
| `hasSubscriptionItems` | `boolean`                | `true`, wenn mindestens eine Zeile in `items` einen Selling Plan trägt, einschließlich Add-on-Zeilen, die `itemCount` auslässt. `false` bei einem leeren Warenkorb. |
| `totalPrice`           | `number`                 | Aktuelle Gesamtsumme, in Cents.                                                                                                                                     |
| `originalTotalPrice`   | `number`                 | Gesamtsumme vor Rabatten, in Cents.                                                                                                                                 |
| `totalDiscount`        | `number`                 | Rabattsumme, in Cents.                                                                                                                                              |
| `compareAtTotalPrice`  | `number \| null`         | Summe aus Vergleichspreis (UVP) × Menge jeder Zeile, in Cents. `null`, wenn nicht verfügbar — falle dann auf `originalTotalPrice` zurück.                           |
| `currency`             | `string`                 | Währungscode.                                                                                                                                                       |
| `discountCodes`        | `string[]`               | Auf dem Warenkorb akzeptierte Rabattcodes, sortiert. `[]`, wenn keine.                                                                                              |
| `attributes`           | `Record<string, string>` | Warenkorb-Attribute. Vom SDK aus schreibgeschützt.                                                                                                                  |

<Warning>
  **`itemCount` ist nicht immer die Summe von `items`.** `items` spiegelt den echten Shopify-Warenkorb wider, einschließlich Add-on-Zeilen, die der Drawer ausblendet, wie Versandschutz. `itemCount` ist die käuferseitige Zahl, die zum Warenkorb-Badge passt. Für „wie viele Dinge hat der Käufer gewählt“ verwende `itemCount`; um über die Zeilen zu iterieren, die der Warenkorb rendert, verwende `items`.

  Zwei Dinge fehlen in `items` vollständig: Zeilen, die mit [`setHidden`](/de/aftersell/cart/sdk-hooks#registerlinetransform) ausgeblendet wurden, und [Bundle-Kinder](#bundles), die auf ihren Anker wandern. Beide zählen weiterhin zu den Warenkorb-Summen, die direkt von Shopify kommen.
</Warning>

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.events.on('cart_updated', (state) => {
  console.log(state.itemCount, 'items');
  console.log('Total:', window.aftersell.cart.actions.formatMoney(state.totalPrice));
  console.log('Saved:', window.aftersell.cart.actions.formatMoney(state.totalDiscount));
  console.log('Codes:', state.discountCodes.join(', ') || 'none');
});
```

<div id="cart-lines">
  ## Warenkorb-Zeilen
</div>

Jeder Eintrag in `items` sowie das `item` bei [`item_added`](/de/aftersell/cart/sdk-events#item_added) und [`item_removed`](/de/aftersell/cart/sdk-events#item_removed):

| Feld                  | Typ                              | Beschreibung                                                                                                                                                                |
| --------------------- | -------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `key`                 | `string`                         | Der Shopify-Key der Zeile. Übergib ihn an die Item-[Actions](/de/aftersell/cart/sdk-actions).                                                                               |
| `productId`           | `number`                         | Shopify-Produkt-ID.                                                                                                                                                         |
| `variantId`           | `number`                         | Shopify-Varianten-ID.                                                                                                                                                       |
| `handle`              | `string`                         | Produkt-Handle.                                                                                                                                                             |
| `title`               | `string`                         | Anzeigetitel.                                                                                                                                                               |
| `productTitle`        | `string`                         | Produkttitel ohne die Variante.                                                                                                                                             |
| `variantTitle`        | `string \| null`                 | Varianten-Label, oder `null`.                                                                                                                                               |
| `variantOptions`      | `Array<{ name, value }>`         | Gewählte Optionen, z. B. `[{ name: 'Size', value: 'Medium' }]`. Shopify gibt bei einem Produkt mit nur einer Variante `Title: Default Title` aus.                           |
| `quantity`            | `number`                         | Menge dieser Zeile.                                                                                                                                                         |
| `linePrice`           | `number`                         | Zeilenpreis, in Cents.                                                                                                                                                      |
| `finalLinePrice`      | `number`                         | Zeilenpreis nach Rabatten, in Cents.                                                                                                                                        |
| `originalLinePrice`   | `number`                         | Zeilenpreis vor Rabatten, in Cents.                                                                                                                                         |
| `compareAtPrice`      | `number \| null`                 | Vergleichspreis (UVP) der Variante **pro Einheit**, in Cents. `null`, wenn keiner.                                                                                          |
| `properties`          | `Record<string, string> \| null` | Line-Item-Properties.                                                                                                                                                       |
| `internalProperties`  | `Record<string, string>`         | Nur fürs Rendering bestimmtes Overlay aus [`registerLineTransform`](/de/aftersell/cart/sdk-hooks#registerlinetransform). Wird nie in Shopify gespeichert. `{}`, wenn keins. |
| `discountAllocations` | `Array<{ title, amount }>`       | Auf diese Zeile angewendete Rabatte. `amount` ist in Cents. `[]`, wenn keine.                                                                                               |
| `isGiftCard`          | `boolean`                        | Ob die Zeile eine Geschenkkarte ist.                                                                                                                                        |
| `sellingPlan`         | `{ id, name } \| null`           | Der aktive Abo-Plan, oder `null` bei einem Einmalkauf.                                                                                                                      |
| `bundle`              | `AftersellCartBundle \| null`    | [Bundle](#bundles)-View-Model auf der Ankerzeile; `null` bei Nicht-Bundle-Zeilen und Kindern.                                                                               |
| `metadata`            | `Record<string, unknown>`        | [Enrichment](/de/aftersell/cart/sdk-hooks#registercartenricher)-Daten, verschlüsselt nach Enricher-`id`. `{}`, bis ein Enricher sie befüllt.                                |

<Warning>
  `properties` kann vom Käufer bereitgestellte Eingaben enthalten, etwa das Freitext-Feld eines Produktformulars. Rendere sie als Text, nie als rohes HTML.
</Warning>

<div id="identifying-a-line">
  ### Eine Zeile identifizieren
</div>

Verwende `key` für alles, was auf eine Zeile einwirkt, und `variantId` oder `productId` für alles, was ein *Produkt* identifiziert:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// ✅ Acting on a line: use key.
window.aftersell.cart.actions.removeItem(line.key);

// ✅ Recognising a product: use variantId.
const hasGift = state.items.some((line) => line.variantId === GIFT_VARIANT_ID);
```

Dieselbe Variante kann in mehreren Zeilen erscheinen, wenn sich die Properties unterscheiden. Zwei gravierte Tassen mit unterschiedlichem Gravurtext sind zwei Zeilen mit einer gemeinsamen `variantId`. Deshalb nehmen die Actions `key`.

<div id="prices-on-a-line">
  ### Preise auf einer Zeile
</div>

Drei Preise, leicht zu verwechseln:

| Gewünscht                                   | Verwende                      |
| ------------------------------------------- | ----------------------------- |
| Was der Käufer für diese Zeile zahlt        | `finalLinePrice`              |
| Was sie vor Warenkorb-Rabatten gekostet hat | `originalLinePrice`           |
| Der durchgestrichene UVP, pro Einheit       | `compareAtPrice` × `quantity` |

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Is this line discounted?
const isDiscounted = line.finalLinePrice < line.originalLinePrice;

// Is it free? (A common way to detect a gift line.)
const isFree = line.finalLinePrice === 0;
```

<div id="bundles">
  ## Bundles
</div>

Wenn Zeilen zu einem Bundle gruppiert sind, trägt die **Anker**-Zeile ein `bundle`-Objekt. Die Kinder werden in sie hineingefaltet und erscheinen nicht mehr eigenständig in `items`. Siehe [Bundle-Zeilen einer anderen App gruppieren](/de/aftersell/cart/sdk-use-case-bundles) für die Einrichtung der Gruppierung.

| Feld           | Typ                      | Beschreibung                                                     |
| -------------- | ------------------------ | ---------------------------------------------------------------- |
| `id`           | `string`                 | Bundle-Identifikator.                                            |
| `source`       | `'native' \| 'grouped'`  | Ein Shopify-natives Bundle oder von Aftersell gruppierte Zeilen. |
| `memberKeys`   | `string[]`               | Der `key` jeder Zeile im Bundle.                                 |
| `children`     | `AftersellBundleChild[]` | Der Inhalt des Bundles.                                          |
| `displayPrice` | `number`                 | Der für das Bundle angezeigte Preis, in Cents.                   |

Jedes Kind trägt `key` (`null` bei einer nativen Komponente), `title`, `variantTitle`, `quantity`, `perAnchorQty`, `imageUrl`, `finalLinePrice`, `originalLinePrice` und `compareAtPrice`.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Skip bundle children when totalling your own line list.
const topLevel = state.items.filter((line) => !isBundleChild(line, state));
```

<div id="subscription-plans">
  ## Abo-Pläne
</div>

Der aktive Plan einer Zeile ist `sellingPlan`, oder `null` bei einem Einmalkauf. Für eine Antwort auf Warenkorb-Ebene lies `hasSubscriptionItems`, statt die Zeilen selbst zu durchsuchen, da es auch Add-on-Zeilen zählt, die `items` enthält, `itemCount` aber überspringt:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
if (state.hasSubscriptionItems) {
  // The cart contains at least one subscription line.
}

const subscriptions = state.items.filter((line) => line.sellingPlan);
console.log(subscriptions.length, 'subscription lines');
```

Die *verfügbaren* Pläne einer Zeile, die im Picker, liegen nicht auf dem Cart-Objekt. Gestalte sie mit [`registerSubscriptionOptionsTransform`](/de/aftersell/cart/sdk-hooks#registersubscriptionoptionstransform) und [`registerDefaultSubscriptionOptionSelector`](/de/aftersell/cart/sdk-hooks#registerdefaultsubscriptionoptionselector).

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

* **[Actions](/de/aftersell/cart/sdk-actions)**: den Warenkorb lesen und ändern.
* **[Events](/de/aftersell/cart/sdk-events)**: woher dieses Objekt kommt.
* **[Hooks](/de/aftersell/cart/sdk-hooks)**: füge einer Zeile mit einem Enricher eigene Daten hinzu.
* **[Use Cases](/de/aftersell/cart/sdk-use-cases)**: vollständige Lösungen, die diese Felder lesen.
