> ## Documentation Index
> Fetch the complete documentation index at: /help/llms.txt
> Use this file to discover all available pages before exploring further.

# Variables

> Personalize messages, safely.

Variables fill in each contact's data when the message is sent. Write them between double braces: `Hi {{contact.first_name}}, I saw {{contact.company}} is hiring.`

See every variable and what it means in the [Variables reference](/help/campaigns/variables-reference.md).

Variables show in color wherever you write or read a message: in the text box while you type, in the subject, in the email editor, on the step cards and in your templates. A variable that won't be filled in (a misspelled name, an unknown field or a secret) shows in red with a wavy underline; hover it in a list to see why. In a step's **Preview**, the parts that came from variables are colored too, and an empty one shows its name in red.

## Add a variable to a message

**1. Open the message**

Click the **Message** (or **Connect**) step on the builder.

**2. Use the row above the text box**

Click **Variables** (next to **Templates**, **Write** and **Vary**). The list starts with the usual ones (**Contact first name**, **Contact job title**, **Contact company**). Its search box is ready to type in: write part of a name ("industry", "campaign"; capitals and accents don't matter), press **Enter** to insert the first match, or **Esc** to close. **Create variable** adds a new contact field right there. In a subject, the single **Insert** button next to it holds the variables, your templates, **Write with AI** and **Vary with AI**. In an integration step's fields (for example Slack), the bar shows quick buttons and **More variables**.

**3. Check what an empty value writes**

The step's panel has a **Handle missing data** section with one box per variable in the message (click its line to open it; it says how many variables have no fallback). An empty box shows what the contact gets without a value: your workspace's default (for example **Default: "there"** for the first name) or, for a variable with no default, **No fallback: the contact waits**. Type something to use it in this message only, or leave the box empty to keep the default.

## Type a variable as you write

You don't need the menu: in any text box (messages, subjects, emails, notes, Slack texts, templates), type `{{` and a small list of variables opens right where you're writing. Keep typing to narrow it (`{{fir` finds **Contact first name**; you can type the name in your language too, and capitals and accents don't matter), then:

* **Up / Down arrows** to move, **Enter** or **Tab** to insert, **Esc** to close.
* Or click (tap on a phone) the one you want.

Typing `contact.`, `company.`, `sender.`, `links.` or `steps.` at the start of a word opens the list too, showing only that kind of variable: pick one and Kerux writes the whole variable, braces included (`contact.` then **Email** gives `{{email}}`). After a bare `contact.` nothing is chosen until you press an arrow, so **Enter** still starts a new line. Email addresses and links (`ana@contact.com`, `www.contact.io`) never open it. To open the list anywhere, press **Ctrl+Space**.

The list holds the same variables as the **Variables** menu, including your custom fields and the results of earlier steps. It inserts the plain variable; add what to write when it's empty in **Handle missing data**.

## Kinds of variables

* **Contact fields** (the person the campaign writes to): `{{contact.first_name}}`, `{{contact.last_name}}`, `{{contact.company}}`, `{{contact.title}}`, `{{contact.linkedin_url}}`, `{{email}}`, plus your custom fields as `{{contact.custom.field_name}}`. The buttons say whose each one is: **Contact first name**, **Contact LinkedIn URL**... Older texts keep working: `{{lead.first_name}}` and the short form `{{first_name}}` mean the same as `{{contact.first_name}}`, so you don't need to change saved campaigns. The email is always `{{email}}` (the button **Email**), never `{{contact.email}}`; the old `{{lead.email}}` no longer works. Kerux already changed it to `{{email}}` in every campaign, template and rule that used it; if you type or paste `{{lead.email}}`, the step says a variable is written incorrectly, so change it to `{{email}}`.
* **You**: **Your first name** inserts `{{sender.first_name}}`, the first name of the LinkedIn account that sends.
* **Company fields**: `{{company.industry}}`, `{{company.website}}`, `{{company.employee_count}}`...
* **Campaign**: **Campaign name** `{{campaign.name}}`, **Campaign link** `{{campaign.link}}` (the full link to this campaign in Kerux, handy in a Slack or team notification) and **Campaign ID** `{{campaign.id}}`. They are never empty for a contact in a campaign, so they need nothing in **Handle missing data**.
* **Meeting** (campaigns that start from **Meeting booked**, **Meeting cancelled** or **Meeting starts soon**, and Always-on boxes about meetings): `{{meeting.start}}` (date and time in your workspace's timezone, like 2026-11-10 10:00 (America/New\_York)), `{{meeting.date}}`, `{{meeting.time}}`, `{{meeting.weekday}}` (the day of the week), `{{meeting.timezone}}`, `{{meeting.title}}` and `{{meeting.link}}` (the video call link; often empty, so give it a default text like `{{meeting.link | default: "the link is in the invite"}}`, or the message waits). See [Meetings booked by contacts](/help/campaigns/meetings.md).
* **Email click** (campaigns that start from **Email link clicked**): **Link clicked** `{{trigger.clicked_link}}`, the link the contact clicked in your email.
* **LinkedIn reaction** (campaigns that start from **Reacted to a LinkedIn message**): **Reaction (emoji)** `{{trigger.reaction}}`, the emoji the contact reacted with.
* **LinkedIn invitation** (campaigns that start from **Invitation received**): **Invitation note** `{{trigger.invitation_note}}`, the note the person wrote with their invitation. It is often empty, so give it a value in the message's **Handle missing data** section.
* **Workspace variables**: values every campaign can use, like `{{workspace.vars.calendar_link}}`. Edit them in **Integrations > Variables**.
* **Data from other apps**: answers from webhook steps, for example a video link.

The full list, with where each value comes from and what it writes when it's empty, is in the [Variables reference](/help/campaigns/variables-reference.md).

## Message templates

Save messages you reuse, with their variables, and insert them in any campaign. Above each message, open **Templates** and pick one, or click **Save this message as a template**. **Manage templates** (or **Templates** in the left menu) lists them, where you can add, edit or delete them. Deleting a template doesn't change campaigns that used it.

A template can keep a subject too (**Subject (InMail or email)** in **Manage templates**; optional). Inserting it in an InMail or email step fills the step's subject as well (the menu says **with subject**); in a message step only the text goes in. **Save this message as a template** from an InMail or email step saves its subject with it. From a rich text or HTML email it also keeps the formatting and pictures (up to 8,000 characters), and inserting that template in an email step brings them back. For bigger, designed emails (blocks, your own HTML, up to 100,000 characters), use [Email templates](/help/campaigns/email-templates.md) instead: they are separate, under **Templates > Email templates**, and a **Send email** step picks them with **Use a template**.

## Variations (Spintax)

A variation is a group of options between single braces, separated by bars: `{Hi|Hello|Hey}`. Each contact gets one of the options, so your messages are not all word for word the same. It works in every text you send: LinkedIn messages, invitation notes, InMails, emails (subject and body), WhatsApp, text messages, broadcasts and saved templates.

`{Hi|Hello|Hey} {{contact.first_name}}, {quick|short} question about {{contact.company}}.`

That one line has 6 versions (3 greetings x 2 wordings). One contact reads "Hello Ana, short question about Acme.", another "Hey Luis, quick question about Globex."

### Let Kerux write them: Vary

**1. Write your message**

Write it as you normally would, with its variables.

**2. Click Vary**

It is in the row above the text box, next to **Variables**, **Templates** and **Write**. In a subject, open **Insert** and pick **Vary with AI**.

**3. Check the examples**

A box shows how many versions the message would have and three of them for a sample contact, with the changed words underlined. Nothing has changed yet.

**4. Apply, or Cancel**

**Apply** writes the variations into your message. **Undo** right above the text takes them out again.

What **Vary** does and doesn't do:

* It keeps your own words as the first option of each group, and adds 1 to 3 other ways to say the same thing (the greeting, a few phrases, the sign-off).
* It never touches a variable, a link, an email address, a number or variations you already wrote.
* Every version fits the limit of the channel. In an invitation note, each version stays within LinkedIn's 300 characters; the counter under the note shows the longest one.
* It uses one AI credit, like **Write with AI**. When the AI can't answer, Kerux still varies the usual greetings and sign-offs (in English, Spanish, German and French) and tells you so.
* In an email written as **Rich text** or **HTML**, the button is off: variations go in **Text** emails. You can still type them by hand in a rich text email.

### See them and remove them

Variations show in teal while you write, on the step cards and in your templates, apart from the violet of variables. Under the text box a chip says how many versions the message has (**18 versions**), with an (i) and **Remove variations**, which puts each group back to its first option.

In a step's **Preview**, the words a variation picked are underlined, and **Show another version** shows the message as another contact could get it.

### Good to know

* The same contact always gets the same version, also when a send is retried. The contact's history shows which options were picked.
* Variations can hold a variable (`{Hi {{contact.first_name}}|Hello}`) and can be nested, up to 6 levels deep. Start an option with a word, not with a variable.
* To write a real brace or bar in a message, put a backslash before it: `\{`, `\}`, `\|`.
* Messages that are not all identical look less like a bulk send, which is one of the things LinkedIn, WhatsApp and email providers look at. It helps, and it is no guarantee: sending limits, consent and a message people want to read matter more.

## When a contact has no value

These contact fields have a default value (a fallback), so a message never has a hole: `Hey {{contact.first_name}}` becomes "Hey there" when a contact has no first name. The defaults are in **Integrations > Variables**, under **When a contact field is empty**:

| Field | Writes when empty |
| - | - |
| First name | there |
| Last name | nothing |
| Company | your company |
| Job title, Headline, Location, City, Country | nothing |

Type another default, or leave a box empty to write nothing, then click **Save defaults**. Tick **Wait for the data** next to a field so contacts without it wait instead. What you type in a message's **Handle missing data** section always wins over these defaults.

Kerux also fills empty names, headline, job title, company and location from the LinkedIn profile when it reads it, without changing anything the contact already has. The contact's history shows **Filled in from LinkedIn**.

## Safe sending

> [!WARNING]
>
> A message never goes out with an empty variable that has no default. That covers email, phone, LinkedIn URL, your own custom fields, answers from other steps, and any field set to **Wait for the data**. The contact waits on the step with **Paused: this step needs data the contact doesn't have**. The [Preflight](/help/campaigns/launch.md) check warns you before launching.

In the builder, click the red **need attention** on the step (or **Fix now** in the campaign's banner): a small window lists the contacts waiting there and the exact variable each one is missing, with the same fixes plus **Or give ... a fallback on this step, for every contact** (type what to write when it's empty and click **Use and retry**: it's saved on the step for every contact, and the paused contacts go on), **Skip this step** and **Retry now**. See [Follow your contacts](/help/campaigns/follow-your-leads.md).

Or open the contact: **Kerux AI** says which field is missing, right on the step where it stopped ("Hi! Ana stopped here because they have no Last name..."), and offers the ways out:

* For a field of the contact, type the value and click **Save and continue**: the step goes on by itself, no Retry needed. Filling the field on the contact page (or through the API) works the same way.
* **Send anyway**: the step goes out now with that value left empty. The same button is in **Home > Tasks**, next to a send waiting for missing data.
* **Remove Last name from the message and retry**: takes the variable out of that step for every contact in the campaign, and every contact paused on it goes on now. Kerux asks you to confirm first.
* **Change the message**: opens the step, to edit it or give the variable a value in **Handle missing data**.
* **Ask me about this**: opens the assistant with the question already asked.

To have the AI speak only when you ask, turn off **Proactive** under **AI assistant** in **Preferences** (account menu). The fixes are then one click away under the line that says what's missing.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.