# Variables

Contact variables hold one person's data: city, the bouquet chosen, the order total. Global variables are shared by the whole bot: the shop address, an exchange rate, an order counter. Where they are shown and how to insert them into a message is described in [Data you can insert](https://support.watbot.org/chatbots/templates/data).

What the functions write is saved once the code has finished without an error. Inside the code, reading already sees what was written.

## getContactVariable

```js
getContactVariable(name)
```

Returns the value of a contact variable.

| Parameter | Type | What to pass |
|---|---|---|
| `name` | String | The variable name, as on the contact card. Spaces and non-Latin letters are allowed |

**Returns** the value as a string, or `undefined` if the contact has no such variable. Wrap the value in `Number()` for calculations.

```js
var count = Number(getContactVariable('roses_count') || 0);

if (count >= 11) {
    setContactVariable('discount', 10);
}
```

If the variable was written by this same code, the function returns the value in the form it was written: a number stays a number.

## setContactVariable

```js
setContactVariable(name, value)
```

Writes a contact variable. If the variable does not exist, it is created.

| Parameter | Type | What to pass |
|---|---|---|
| `name` | String | The variable name |
| `value` | String, number, `true` or `false` | The value |

**Returns nothing.**

An object, an array, `null` and `undefined` are not saved as they are — the variable gets an empty value. To save an object or an array, turn it into a string, and parse it back when reading:

```js
setContactVariable('cart', JSON.stringify(['Roses', 'Tulips']));

var cart = JSON.parse(getContactVariable('cart') || '[]');
```

Booleans are better stored as strings, such as `'yes'` and `'no'`: `true` and `false` come back as the strings `'1'` and `''` the next time another block reads them.

## deleteContactVariable

```js
deleteContactVariable(name)
```

Deletes a contact variable.

| Parameter | Type | What to pass |
|---|---|---|
| `name` | String | The variable name |

**Returns nothing.** After deletion, `getContactVariable` with this name returns `undefined`.

```js
deleteContactVariable('promo_code');
```

## getGlobalVariable

```js
getGlobalVariable(name)
```

Returns the value of a global variable of the bot.

| Parameter | Type | What to pass |
|---|---|---|
| `name` | String | The global variable name |

**Returns** the value as a string, or `undefined` if there is no such variable.

```js
var freeDelivery = Number(getGlobalVariable('free_delivery_from') || 0);
var sum = Number(getContactVariable('order_total') || 0);

if (sum >= freeDelivery) {
    sendMessage('Delivery is free for you.');
}
```

## setGlobalVariable

```js
setGlobalVariable(name, value)
```

Writes a global variable of the bot. If the variable does not exist, it is created. The value is immediately visible to all of the bot's contacts.

| Parameter | Type | What to pass |
|---|---|---|
| `name` | String | The global variable name |
| `value` | Any | The value. It is saved as a string: the number `5` becomes `'5'`, and an object becomes `'[object Object]'`, so turn objects into a string with `JSON.stringify` |

**Returns nothing.**

```js
var orders = Number(getGlobalVariable('orders_today') || 0);
setGlobalVariable('orders_today', orders + 1);
```

> [!WARNING]
> If code with such a write runs for several contacts at the same time, each one reads the same old value, and some of the increments are lost. Such a counter is not suitable for exact counting.

## deleteGlobalVariable

```js
deleteGlobalVariable(name)
```

Deletes a global variable of the bot.

| Parameter | Type | What to pass |
|---|---|---|
| `name` | String | The global variable name |

**Returns nothing.**

```js
deleteGlobalVariable('deal_of_the_day');
```
