# Eingebaute Variablen

Einen Teil der Daten erhält der Code ohne Funktionsaufrufe — in fertigen JavaScript-Variablen. Welche es gibt, hängt vom Block ab, in dem der Code läuft.

## Daten des Kontakts

In allen Blöcken außer „Eingehender Webhook“ stehen die Daten des Kontakts, für den der Code läuft, sofort zur Verfügung. Im „Eingehenden Webhook“ erscheinen sie, nachdem der Code den Kontakt mit einer [Funktion zur Kontaktauswahl](https://support.watbot.org/de/api/javascript/contact) gefunden hat.

| Variable | Was darin steht |
|---|---|
| `id` | ID des Kontakts auf der Plattform |
| `bot_id` | ID des Bots |
| `name` | Vollständiger Name des Kontakts |
| `first_name` | Erstes Wort des Namens |
| `last_name` | Zweites Wort des Namens |
| `phone` | Telefon |
| `email` | E-Mail |
| `address` | Adresse |
| `username` | Benutzername im Messenger: `@flower_lover` in Telegram und MAX, `id123456` in VK |
| `telegram_id` | ID der Person in Telegram |
| `max_id` | ID der Person in MAX |
| `created_at` | Wann der Kontakt beim Bot erschienen ist, im Format `2026-01-31 12:00:00` (UTC) |

Die Werte sind Zeichenketten, auch `id` und `bot_id`. Im „Eingehenden Webhook“ kommen `id` und `bot_id` als Zahlen, bringen Sie sie daher vor einem Vergleich in dieselbe Form: `Number(id) === 12345`.

Fehlt dem Kontakt etwas — etwa die Telefonnummer —, gibt es die Variable gar nicht, und ein Zugriff darauf bricht den Code mit einem `ReferenceError` ab. Prüfen Sie solche Variablen mit `typeof`:

```js
if (typeof phone !== 'undefined') {
    setContactVariable('telefon_kurier', phone);
} else {
    sendMessage('Bitte hinterlassen Sie eine Telefonnummer für den Kurier.');
}
```

Im „Eingehenden Webhook“ gibt es nach der Kontaktauswahl noch einige Variablen — ebenfalls nur, wenn der Kontakt einen Wert hat:

| Variable | Was darin steht |
|---|---|
| `start_message` | Die erste Nachricht, die der Kontakt an den Bot gesendet hat |
| `amocrm_lead_id`, `amocrm_contact_id` | IDs von Deal und Kontakt in amoCRM |
| `bitrix_lead_id`, `bitrix_deal_id`, `bitrix_contact_id` | IDs von Lead, Deal und Kontakt in Bitrix24 |

Variablen des Kontakts und globale Variablen des Bots kommen nicht als fertige Variablen — lesen Sie sie mit den Funktionen [`getContactVariable` und `getGlobalVariable`](10-variables.md).

## Serverantwort

Im Code des Blocks [„HTTP-Anfrage“](https://support.watbot.org/de/chatbots/blocks/developer/http) liegt die Antwort des Servers im Objekt `response`:

| Feld | Was darin steht |
|---|---|
| `response.status` | Antwortcode als Zahl: `200`, `404` und so weiter |
| `response.body` | Body der Antwort als Zeichenkette, so wie er angekommen ist |
| `response.data` | Body der Antwort, als JSON gelesen. Ist die Antwort kein JSON, steht hier ein leeres Objekt `{}` |

Der Code startet nur, wenn der Server geantwortet hat. Gibt es keine Antwort — der Server hat in der Zeit aus dem Feld „Timeout“ nicht geantwortet oder die Verbindung kam nicht zustande —, verlässt der Block den Ausgang „Keine Antwort vom Server“, und der Code läuft nicht. Eine Antwort mit Fehlercode, etwa `500`, ist eine normale Antwort: Der Code läuft, prüfen Sie `response.status` selbst.

Der Code läuft nach den übrigen Einstellungen des Blocks: Die Variablen aus „JSON-Antwort in Variablen schreiben“ sind zu diesem Zeitpunkt bereits geschrieben.

```js
if (response.status !== 200) {
    sendMessage('Der Lieferdienst ist gerade nicht erreichbar, bitte versuchen Sie es später.');
    disableContinue();
} else if (response.data.slots && response.data.slots.length > 0) {
    setContactVariable('naechste_lieferung', response.data.slots[0].time);
} else {
    sendMessage('Für heute gibt es keine freien Lieferfenster.');
}
```

## Eingehende Anfrage

Im Code des Blocks [„Eingehender Webhook“](https://support.watbot.org/de/chatbots/blocks/developer/incoming-webhook) liegt die eingegangene Anfrage im Objekt `request`:

| Feld | Was darin steht |
|---|---|
| `request.query` | Parameter aus dem Query-String. Die Werte sind Zeichenketten |
| `request.headers` | Header der Anfrage. Namen in Kleinbuchstaben: `request.headers['content-type']` |
| `request.body` | Body der Anfrage als Zeichenkette, so wie er angekommen ist |
| `request.data` | Alle Parameter der Anfrage zusammen: aus dem Query-String, dem Formular und einem JSON-Body. Zahlen und Wahrheitswerte aus JSON bleiben Zahlen und `true`/`false` |

Hat die Anfrage keine Parameter, ist `request.query` ein leeres Objekt. Prüfen Sie verschachtelte Felder vor dem Zugriff, damit der Code nicht an `undefined` scheitert:

```js
var order = request.data.order;

if (order && order.contact_id && setContactById(order.contact_id)) {
    setContactVariable('bestellnummer', String(order.id));
    sendMessage('Bestellung Nr. ' + order.id + ' ist gepackt und an den Kurier übergeben.');
}
```

Signiert der Absender seine Anfragen, können Sie die Signatur mit der Funktion [`hash_hmac`](30-crypto.md#hashhmac) prüfen — anhand von `request.body` und dem Header mit der Signatur.

## Tabellenzeilen

Im Code des Blocks [„Zeilen aus Google Sheets lesen“](https://support.watbot.org/de/chatbots/blocks/lists/google-sheet-reader) liegen die gefundenen Zeilen in `sheet.data` — einem Array von Zeilen, in dem jede Zeile ein Array von Zellen ist.

- `sheet.data` enthält nur Zeilen, die die Filter des Blocks passiert haben, und nicht mehr als in „Anzahl der Einträge in der Nachricht“ angegeben.
- Die Zellen sind Zeichenketten. Die erste Zelle des Arrays ist Spalte `A`.
- Der Block lädt die Spalten bis zur rechtesten, die in seinen Einstellungen vorkommt. Damit der Code auch andere Spalten erhält, rufen Sie am Anfang des Codes `setColumnRange("A:F")` mit dem gewünschten Bereich auf — der Block liest diesen Aufruf vor der Abfrage der Tabelle. Leere Zellen am Zeilenende sendet Google nicht, deshalb können Zeilen unterschiedlich lang sein.
- Werden keine Zeilen gefunden, läuft der Code nicht: Der Block verlässt den Ausgang „Einträge nicht gefunden“.

```js
setColumnRange("A:C");

var rows = sheet.data;
var total = 0;

for (var i = 0; i < rows.length; i++) {
    total += Number(rows[i][2] || 0);
}

setContactVariable('bestellsumme', total);
```

Hier steht in Spalte `C` der Preis des Straußes, und der Code addiert die Preise aller gefundenen Zeilen.
