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

# Variables reference

> Every Kerux variable (merge tags) with a search box: what it means, where its value comes from, what it writes when empty, and how to bring in your own.

This page lists the variables you can put in a message, invitation note, InMail, email (or [email template](/help/campaigns/email-templates.md)), note, task or webhook step, what it means and where its value comes from. To add one to a message, see [Variables](/help/campaigns/variables.md).

Variables are also called merge tags or placeholders. Need data that isn't listed? See [How do I get a variable for something that isn't listed?](#how-do-i-get-a-variable-for-something-that-isnt-listed) to bring in your own: a custom field, a CSV column, the API, a workspace variable or another app.

Type a word in the box below (for example "company", "meeting", "emoji" or "video") to find a variable. Click **Copy** and paste it in your text, or pick it in **Variables** above the text box.

Search variables

## How to read this page

* **Variable** is what goes in the text, between double braces. You can type it or pick it in **Variables**, the menu above every message box (**More variables** in an integration step's fields). Contact fields are written `{{contact.first_name}}`, as **Variables** inserts them. Texts that use the older `{{lead.first_name}}` or the short form `{{first_name}}` keep working the same way.
* **In the Variables menu** is the name that list shows. Names in a group read "group: name", for example **Contact's company: Industry**. **Type it** means the list doesn't offer it, but it works when you type it.
* **When it's empty** is what the contact gets when there is no value. **Waits** means the message never goes out with a hole: the contact waits on that step with **Paused: this step needs data the contact doesn't have** until you add the value, give the variable a default, or click **Send anyway**. See [Filters](#filters) to give any variable a default.

## Contact

The person the campaign writes to. Every campaign and step can use these. The **Variables** menu calls them **Contact** fields (for example **Contact first name**).

**Where the values come from:** your import, contacts added by hand, the [API](/help/developers/api.md) or a form. When Kerux reads the contact's LinkedIn profile, it also fills an empty first name, last name, headline, job title, company and location, without changing what the contact already has. Emails and phones can also come from [enrichment](/help/leads/companies-and-enrichment.md).

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{contact.first_name}}` | Contact first name | The contact's first name, for example "Sam". | Writes "there" |
| `{{contact.last_name}}` | Contact last name | The contact's last name. | Writes nothing |
| `{{contact.full_name}}` | Contact full name | First and last name together, for example "Sam Carter". | Waits (when both names are empty) |
| `{{contact.company}}` | Contact company | The company name saved on the contact, for example "Acme Sales". `{{company}}` alone means the same. | Writes "your company" |
| `{{contact.title}}` | Contact job title | Their job title, for example "Head of Sales". | Writes nothing |
| `{{contact.headline}}` | Contact headline | The line under their name on LinkedIn. | Writes nothing |
| `{{contact.location}}` | Contact location | Where they are, for example "Austin, Texas". | Writes nothing |
| `{{contact.address}}` | Contact address | Their postal address (street and number). | Waits |
| `{{contact.city}}` | Contact city | Their city, for example "Austin". | Writes nothing |
| `{{contact.country}}` | Contact country | Their country, for example "United States". | Writes nothing |
| `{{contact.postal_code}}` | Contact postal code | Their postal or ZIP code. | Waits |
| `{{email}}` | Email | Their email address. | Waits |
| `{{contact.phone}}` | Contact phone | Their phone number. | Waits |
| `{{contact.linkedin_url}}` | Contact LinkedIn URL | The link to their LinkedIn profile. | Waits |
| `{{contact.email_or_fallback}}` | Type it | Their email, or a stand-in address unique to the contact when they have none. Made for other apps that need an email (webhook steps), not for messages. | Never empty |

First name, last name, company, job title, headline, location, city and country have a default, and you can change each one in **Integrations > Variables**, under **When a contact field is empty**: type another default, leave the box empty to write nothing, or tick **Wait for the data** so contacts without it wait. Picking **Contact first name** inserts it with its default already written: `{{contact.first_name | default: "there"}}`.

## You (the sender)

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{sender.first_name}}` | Your first name | The first name of the LinkedIn account the campaign sends from. | Waits |
| `{{sender.name}}` | Type it | The full name of that LinkedIn account. | Waits |

**Where the values come from:** the name of the connected LinkedIn account. They are filled in steps that write to the contact (invitations, messages, InMails, emails, WhatsApp). Steps that don't send from a LinkedIn account, like **Notify the team**, **Notify on Slack** or a webhook, don't have them: write your name there instead.

## Company

The contact's company, as saved in **Contacts > Companies** (Kerux links each contact to a company by its name).

**Where the values come from:** the company's page in **Contacts > Companies** (you can edit it), [enrichment](/help/leads/companies-and-enrichment.md) and the API. None of them has a default: an empty company field always waits, unless you give it one in the text.

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{company.industry}}` | Contact's company: Industry | The company's industry, for example "Software". | Waits |
| `{{company.location}}` | Contact's company: Location | Where the company is. | Waits |
| `{{company.size}}` | Contact's company: Size | Its size range (number of employees). | Waits |
| `{{company.employee_count}}` | Contact's company: Employees | How many people work there, as a number. | Waits |
| `{{company.website}}` | Contact's company: Website | The company's website. | Waits |
| `{{company.domain}}` | Contact's company: Domain | Its web domain, for example "acme.example". | Waits |
| `{{company.tagline}}` | Contact's company: Tagline | Its short tagline. | Waits |
| `{{company.technologies}}` | Contact's company: Technologies | The tools it uses, separated by commas. | Waits |
| `{{company.market}}` | Contact's company: Market | Its market (the **Market** field on the company's page). | Waits |
| `{{company.last_funding_round}}` | Contact's company: Last funding round | Its last funding round. | Waits |
| `{{company.name}}` | Type it | The company's name. Without a saved company, the company name on the contact. | Waits |
| `{{company.sub_industry}}` | Type it | The **Sub-industry** field. | Waits |
| `{{company.headquarters}}` | Type it | The **Headquarters** field. | Waits |
| `{{company.revenue}}` | Type it | The **Revenue** field. | Waits |
| `{{company.founded_year}}` | Type it | The year it was founded (**Founded**). | Waits |
| `{{company.type}}` | Type it | The **Type** field. | Waits |
| `{{company.description}}` | Type it | The **Description** field. | Waits |
| `{{company.specialties}}` | Type it | Its **Specialties**, separated by commas. | Waits |
| `{{company.linkedin_url}}` | Type it | Its **LinkedIn page**. | Waits |
| `{{company.employee_growth_3m}}` | Type it | **Employee growth (3 months)**. | Waits |
| `{{company.linkedin_followers}}` | Type it | How many **LinkedIn followers** it has. | Waits |

## Campaign

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{campaign.name}}` | Campaign: Campaign name | The name of the campaign the contact is in. | Never empty |
| `{{campaign.link}}` | Campaign: Campaign link | The full link to this campaign in Kerux, handy in a Slack or team notification. | Never empty |
| `{{campaign.id}}` | Campaign: Campaign ID | The campaign's ID, for other apps and the API. | Never empty |

## Meeting

Only in campaigns that start from **Meeting booked**, **Meeting cancelled**, **Meeting starts soon** or **Call summary ready**, and in the Always-on boxes about meetings (for example **When a meeting is booked**). Times are in your workspace's time zone. See [Meetings booked by contacts](/help/campaigns/meetings.md).

**Where the values come from:** the meeting in your connected calendar or booking tool.

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{meeting.start}}` | Meeting: Meeting date and time | When it starts, for example "2026-11-10 10:00 (America/New\_York)". An all-day meeting shows only the date. | Waits |
| `{{meeting.title}}` | Meeting: Meeting title | The meeting's title. | Waits |
| `{{meeting.link}}` | Meeting: Meeting link | The video call link. Often empty, so give it a default or the `optional` filter (see [Filters](#filters)). | Waits |
| `{{meeting.date}}` | Type it | The day, for example "2026-11-10". | Waits |
| `{{meeting.time}}` | Type it | The start time, for example "10:00". Empty for an all-day meeting. | Waits |
| `{{meeting.weekday}}` | Type it | The day of the week, for example "Tuesday". | Waits |
| `{{meeting.end}}` | Type it | When it ends, written like the start. | Waits |
| `{{meeting.timezone}}` | Type it | The time zone the times are written in. | Never empty |
| `{{meeting.start_utc}}` | Type it | The start in UTC, for other apps, for example "2026-11-10T15:00:00.000Z". | Waits |

## Call

Only in campaigns that start from **Call recorded** or **Call summary ready**. Times are in your workspace's time zone. See [Automations driven by calls](/help/campaigns/call-automations.md).

**Where the values come from:** the recorded call (Google Meet, Zoom, another tool, an upload or a pasted transcript).

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{call.source}}` | Recorded call: Where the call came from | Google Meet, Zoom, or the tool's name. | Waits |
| `{{call.title}}` | Recorded call: Call title | The call's title. | Waits |
| `{{call.started_at}}` | Recorded call: When it started | For example "2026-11-10 10:00 (America/New\_York)". | Waits |
| `{{call.duration_minutes}}` | Recorded call: Length (minutes) | The call's length in minutes. | Waits |
| `{{call.transcript_url}}` | Recorded call: Transcript link in Kerux | A link to the call's transcript on the contact page, for a task or a Slack message. | Never empty |
| `{{call.recording_url}}` | Recorded call: Recording link | A link to the recording at its tool (outside calls only). | Waits |
| `{{call.summary}}` | Recorded call: Call summary | The AI summary. Only with **Call summary ready**. | Waits |
| `{{call.interest}}` | Recorded call: Interest in the call | High, medium, low or unclear. Only with **Call summary ready**. | Waits |
| `{{call.next_steps}}` | Recorded call: Next steps | Only with **Call summary ready**. | Waits |
| `{{call.follow_up_date}}` | Recorded call: Follow-up date | YYYY-MM-DD. Only with **Call summary ready**. | Waits |

## Trigger

What the trigger that started the campaign hands over. Each one only exists in campaigns that start from that trigger.

| Variable | In the Variables menu | What it is | Only with the trigger | When it's empty |
| - | - | - | - | - |
| `{{trigger.invitation_note}}` | LinkedIn invitation: Invitation note | The note the person wrote with their invitation. Often empty. | **Invitation received** | Waits |
| `{{trigger.reaction}}` | LinkedIn reaction: Reaction (emoji) | The emoji the contact reacted with. | **Reacted to a LinkedIn message** | Waits |
| `{{trigger.clicked_link}}` | Email click: Link clicked | The link the contact clicked in your email. | **Email link clicked** | Waits |
| `{{trigger.call_summary}}` | Call summary: What was discussed | The AI summary of the call: what it was about and where it ended. | **Call summary ready** | Waits |
| `{{trigger.call_interest}}` | Call summary: Interest | How interested the contact sounded: high, medium, low or unclear. | **Call summary ready** | Waits |
| `{{trigger.call_next_steps}}` | Call summary: Next steps | What each side agreed to do next, separated by semicolons. | **Call summary ready** | Empty when nothing was agreed |
| `{{trigger.follow_up_date}}` | Call summary: Follow-up date | The day the contact asked to be contacted again (YYYY-MM-DD). | **Call summary ready** | Empty when no day was said |
| `{{trigger.from_stage}}` | Type it | The pipeline stage id the contact left (empty when it wasn't on the board). | **Pipeline stage changed** | Waits |
| `{{trigger.to_stage}}` | Type it | The pipeline stage id the contact moved to (empty when it was taken off the board). | **Pipeline stage changed** | Waits |
| `{{trigger.engagement_score}}` | Type it | The contact's engagement score when it became hot, or when it went up. | **Contact became hot**, **Engagement score changed** | Waits |
| `{{trigger.reply_channel}}` | Type it | Where the contact replied: linkedin, email, sms or whatsapp. | **Contact replied** | Waits |
| `{{trigger.reply_text}}` | Type it | The contact's reply (the first 500 characters). | **Contact replied** | Waits |
| `{{trigger.note}}` | Type it | The note that was added (the first 300 characters). | **Note added** | Waits |
| `{{trigger.task_title}}` | Type it | The task's title. | **Task added**, **Task completed**, **Task due** | Waits |
| `{{trigger.task_due}}` | Type it | When the task is due (date and time in UTC). | **Task added**, **Task completed**, **Task due** | Waits (a task without a due date) |
| `{{trigger.dnd_channel}}` | Type it | The channel of the do-not-contact change: all, email, sms or whatsapp. | **Do not contact changed** | Waits |
| `{{trigger.account_name}}` | Type it | The name of the LinkedIn account that needs attention. | **LinkedIn account needs attention** | Waits |
| `{{trigger.account_problem}}` | Type it | The problem, in one word: locked, restricted, signin, removed or down. | **LinkedIn account needs attention** | Waits |
| `{{trigger.account_fix}}` | Type it | What to do about it, in one sentence (in English). | **LinkedIn account needs attention** | Waits |

In the builder's **Canvas** view, **Variables** lists the trigger's variables once the campaign has that trigger. In the **Timeline** view, type them. See [Kerux events](/help/campaigns/kerux-triggers.md), [LinkedIn invitations](/help/inbox/linkedin-invitations.md), [Reactions on LinkedIn messages](/help/inbox/reactions.md) and [Email opens and clicks](/help/campaigns/email-opens-and-clicks.md).

## Personal links

Links made for each contact, so Kerux knows who clicked or answered.

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{links.booking}}` | Booking link (theirs) | Your workspace's default [booking page](/help/campaigns/booking-page.md) with the contact's own key: when they book, Kerux knows it is them for sure, and their name and email are filled in on the page. | Waits (when there is no default booking link taking bookings) |
| `{{links.webinar}}` | Type it | The contact's own trigger link: a click takes them to your page and puts them in the campaign that has the **Trigger link clicked** event with that name (`webinar` is an example name). Works in any campaign's messages. See [Kerux events](/help/campaigns/kerux-triggers.md#trigger-links). | Waits (when no trigger link has that name) |
| `{{forms.my_step}}` | Type it | The contact's own link to the Kerux form of a **Wait for webhook** step in this campaign, by the step's key (`my_step` is an example). Their answers come back to that step. See [Trigger URLs and forms](/help/developers/trigger-urls-and-forms.md). | Waits (when the campaign has no form step with that key) |

## Workspace variables

Fixed values every campaign of the workspace can use, like your calendar link.

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{workspace.vars.calendar_link}}` | workspace.vars: calendar\_link | The value you saved under that name in **Integrations > Variables**. `calendar_link` is an example: use the name you gave it. | Waits (also when no variable has that name) |

## Your custom fields

Extra contact fields you create, like "Pain point" or "Deal size". Each contact can have its own value.

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{contact.custom.pain_point}}` | Contact custom fields: Pain point | That contact's value for the field. `pain_point` is an example: Kerux makes the name from the field's name, in lowercase with `_` for spaces. | Waits |

**Where the values come from:** the contact page (under **Custom fields**), imports, the API, the answers and quiz score of a Kerux form (see [Surveys and quizzes](/help/campaigns/surveys-and-quizzes.md)) and scanned business cards (**Website**, see [Scan business cards](/help/leads/business-cards.md)). See [How do I get a variable for something that isn't listed?](#how-do-i-get-a-variable-for-something-that-isnt-listed)

## Data from other steps and other apps

Values a step hands to the steps after it. They are filled when the contact passes that step, so the preview says **Filled in when this contact gets here, from an earlier step** until then. Empty ones wait.

In these variables, `research`, `sendspark` or `my_step` stand for the step's name: its **Step key**, under **Step key and all settings (JSON)** in the step's panel. Picking the value in **Variables** writes the right name for you.

| Variable | In the Variables menu | What it is |
| - | - | - |
| `{{steps.research.personalization_hook}}` | Research with AI online (step 3) > Personalization hook | From **Research with AI online**: an opening line about the contact. The step's other answers are `company_summary` (Company summary), `person_summary` (Person summary), `recent_news` (Recent news), `company_website` (Company website), `email` (Email found) and `email_source` (Where the email was found). |
| `{{steps.my_step.text}}` | Ask AI (step 4) > Answer | From **Ask AI**: the answer it wrote. A **Classify** step also gives `label` (Label); **Extract values** gives one variable per value you asked for, by its name. |
| `{{steps.my_step.value}}` | Transform data (step 5) > Result | From **Transform data**: the result. |
| `{{steps.sendspark.video_link}}` | Data from sendspark: video\_link | From an integration step (Sendspark, Slack and other apps): each value it hands over, by name. |
| `{{steps.my_step.payload.email}}` | Data from my\_step: email | From **Wait for webhook** or **Call & wait**: a field of the data the other app sent (here, `email`). Also the answers of a Kerux form on a **Wait for webhook** step. |
| `{{steps.my_step.response.body.id}}` | Type it | From **Webhook / HTTP** or **Poll until**: a field of the app's answer (here, `id`). |
| `{{steps.my_step.status}}` | Type it | From **Webhook / HTTP** or **Poll until**: the answer's status code, for example 200. |
| `{{steps.my_step.reaction}}` | Type it | From **If they react**: the emoji the contact reacted with. |
| `{{vars.my_name}}` | Type it | From **Set variable**: the value it saved under **Variable name** (here, `my_name`). |
| `{{listeners.my_step.callback_url}}` | Type it | The contact's own address for a **Wait for webhook** step, to send to the other app. Only in **Webhook / HTTP** requests. |

**Get the exact name of a field the other app sends:** on the **Wait for webhook** (or **Call & wait**) step, click **Listen for test event** and send a test from the other app. Kerux shows the data it received: click a field to copy its variable. The fields then also show in **Variables** as **Data from** the step. See [Webhook steps](/help/integrations/webhook-steps.md), [Research with AI online](/help/campaigns/research-with-ai-online.md), [Team and AI steps](/help/campaigns/team-and-ai-steps.md) and [Sendspark](/help/integrations/sendspark.md).

## Date and time

| Variable | In the Variables menu | What it is | When it's empty |
| - | - | - | - |
| `{{system.today}}` | Type it | Today's date when the text is sent, in your workspace's time zone, for example "2026-11-10". | Never empty |
| `{{system.weekday}}` | Type it | Today's day of the week, for example "Tuesday". | Never empty |
| `{{system.now}}` | Type it | The exact time it's sent, in UTC, for other apps. | Never empty |

## Keys of your connections

`{{secrets.*}}` holds the keys of a connection in **Integrations > Connections**. It only works inside **Webhook / HTTP** requests that use that connection. Kerux never writes it in a message, note, task or anything a person reads: there it is flagged with **A variable is written incorrectly.** and left out.

## Filters

A filter changes a value. Write it after the variable, with a `|`:

* `{{company.industry | default: "your industry"}}` writes "your industry" when it's empty, so the message goes out instead of waiting. The **Handle missing data** section in the step's panel writes this for you.
* `{{meeting.link | optional}}` writes nothing when it's empty, and the message still goes out. An empty default (`default: ""`) doesn't do this: use `optional`.
* `{{company.website | or: "contact.linkedin_url"}}` uses another variable when this one is empty.
* `{{contact.first_name | capitalize}}` writes "Sam" for "sAM". `upper` and `lower` write it all in capitals or small letters.
* `{{contact.title | first_word}}` keeps only the first word. `trim` removes spaces around the value.
* `{{company.description | truncate: 80}}` keeps the first 80 characters.
* `{{contact.company | replace: "Inc.", ""}}` replaces some text with other text.
* `{{meeting.start_utc | date_format: "DD/MM/YYYY"}}` writes a date your way (`YYYY` year, `MM` month, `DD` day, `HH` hour, `mm` minutes). `date_add: 3` adds 3 days first.

For webhook steps there are also `urlencode` (a value inside a link), `math` (for example `math: "+", 1`), `split`, `join`, `length` and `json_path`.

You can chain filters: `{{contact.first_name | capitalize | default: "there"}}`. A filter's default always wins over the workspace defaults in **Integrations > Variables**.

## How do I get a variable for something that isn't listed?

Pick the way that fits where the data is.

### A new field on every contact (custom field)

**1. Create the field**

Above any message, open **Variables** and click **Create variable**. Type its name (for example "Pain point") and confirm. Kerux creates the field and puts `{{contact.custom.pain_point}}` in your text. You can also create it in **Contacts > Custom fields**: type the **Field name** and click **Create field**.

**2. Fill it in for your contacts**

Open a contact, type the value under **Custom fields** and click **Save**. To fill many contacts at once, import them or use the API (below).

If Kerux says **Couldn't create that variable. Use letters, numbers and spaces.**, choose a simpler name.

### From a column of your CSV

1. Click **Contacts**, then **Import**, and upload your file.
2. At the column, open **Save as** and pick one of **Your custom fields**, or **New custom field: ...** to create one from the column's name.
3. Finish the import. Each contact gets its value, and the field shows in **Variables** under **Contact custom fields**.

See [Import contacts](/help/getting-started/import-leads.md).

### Through the API

Send the values in the contact's `custom` data when you create or update contacts: `POST /v1/leads`, `POST /v1/leads/bulk` or `PATCH /v1/leads/{id}` (a `PATCH` only changes the fields you send). Each value can be up to 2,000 characters. Create the field first in **Contacts > Custom fields** with the same name, so it shows in **Variables**. See [API](/help/developers/api.md).

### The same value for everyone (workspace variable)

1. Go to **Integrations > Variables** and click **Add variable**.
2. Type a **Name** (letters, numbers and `_`, starting with a letter, for example `calendar_link`) and its **Value**.
3. Click **Save**. Every campaign can now use `{{workspace.vars.calendar_link}}`, and **Variables** lists it.

### From another app

Add a **Webhook / HTTP**, **Call & wait**, **Wait for webhook** or **Poll until** step before the message. The app's answer becomes variables for the next steps (see [Data from other steps and other apps](#data-from-other-steps-and-other-apps)). Use **Listen for test event** to see the fields and copy their variables. See [Webhook steps](/help/integrations/webhook-steps.md).

### From the web or with AI

**Research with AI online** looks the contact and their company up and gives you a personalization hook, summaries and recent news. **Ask AI** with **Extract values** pulls the values you name out of the contact's data. **Transform data** can turn a value into another (a date, a number, part of a text) and save it in a contact field or a custom field. See [Research with AI online](/help/campaigns/research-with-ai-online.md) and [Team and AI steps](/help/campaigns/team-and-ai-steps.md).

## Common problems

> [accordion] The message shows the variable's name instead of the value
>
> Use double braces: `{{contact.first_name}}`. Single braces like `{Hi|Hello}` are [Spintax](/help/campaigns/variables.md): Kerux picks one of the options.

> [accordion] Every contact waits on the step
>
> The variable is probably misspelled (for example `{{contact.frist_name}}`), so it's empty for everyone. Pick it in **Variables** instead of typing it. The [Preflight](/help/campaigns/launch.md) check lists the empty variables before you launch.

> [accordion] Kerux says a variable is written incorrectly
>
> The group before the dot doesn't exist (like `{{person.first_name}}`), a filter is misspelled, or the text uses `{{secrets.*}}`, which only works in webhook requests. Use the names on this page.

> [accordion] A meeting or trigger variable doesn't show in Variables
>
> They only show in the **Canvas** view, and only when the campaign has that trigger. In the **Timeline** view, type them as written on this page.


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