Signal Variables
Last updated: September 8, 2026
When a signal matches someone, it does not just add them to a list. It also writes down why they matched, on that specific lead, as variables you can drop straight into your sequence copy.
So instead of "I saw you are hiring", you can write the actual role. Instead of "I saw your post", you can reference the actual post.
Where to find them
Open any lead and scroll to the bottom of the lead drawer. The Variables section lists every personalisation value held for that contact.
Each row shows the variable name, its value, and a Signal badge when the value was filled in automatically by a signal rather than typed by someone. Use the pencil to edit a value and the bin to remove it.
Two ways a variable gets there
A signal fills it in. The moment a signal matches the lead, the details of that match are written onto the lead. Nothing to set up — if the lead came from a signal, the variables are already there.
You add it manually. Click + Add variable at the bottom of the section, give it a name and a value. Useful for anything you researched yourself and want to reuse in copy.
Contact and account variables
Variables are grouped into two scopes:
Contact — the value belongs to that one person.
Account — the value belongs to their company, and is shared by everyone you contact there.
The same variable name can exist in both places. A hiring signal, for example, detects a company and the job it posted, so the job details sit at account level — and if you import several people at that company, they can each carry the detail at contact level too.
What a signal fills in
Each signal writes the details of its own match. A hiring signal records the job it found, an engagement signal records the post that was engaged with, and so on.
Here is the hiring signal as a worked example:
Variable | What it holds | Example value |
|---|---|---|
| The role the company is advertising | Sales Development Representative SDR |
| A link to the job post itself | linkedin.com/jobs/view/… |
| Where the role is based | Sakarya |
To see what any other signal provides, open a lead that signal matched and read its Variables section. Anything carrying the Signal badge was filled in for you.
A signal variable only exists on a lead that signal actually matched. A contact you imported from a lead search or a CSV will not have them.
Using them in a sequence
Write them like any other variable, as {{variable_name}}, or pick them from the variable menu in the message editor. For example:
Saw you are hiring a
{{hiring_job_title}}in{{hiring_job_location}}— usually a sign the team is about to get busy.
Topo checks variable names when you save the draft, so a name that does not exist is rejected there and then.
Always give signal variables a fallback
This is the one to watch. If a variable has no value for a given lead and no fallback, that lead's message step fails and they do not get the message.
Signal variables are the most likely to be missing, because they only resolve for leads their signal matched. The moment a sequence mixes signal leads with leads from anywhere else, the ones without the signal will fail on that step.
Give them a fallback: {{hiring_job_title | default("a new role")}}
Better still, keep a signal-fed list in its own sequence so the copy can lean on the signal all the way through.
Signal variables or AI variables?
Signal variables | AI variables | |
|---|---|---|
Where the value comes from | The event the signal detected — a fact | Generated by AI from lead and company context |
When it is set | The moment the signal matches the lead | When the message is sent |
Use it for | Referencing the exact post, job or technology | Written phrasing, icebreakers, summaries |
📄 Why am I seeing a "No Fallback Value" warning on my message variables?