What is a variable?
If you’ve ever done a mail merge, you already know variables. You write one letter, “Dear [First name]”, and each copy comes out with the right person’s name. The “[First name]” bit is a placeholder that gets filled in later. A variable in Connie is exactly that: a placeholder for a value that is only known when the workflow runs. You write a step once. Each time the workflow runs, Connie swaps every variable for the real value for that run.{{Find Email.Work Email}}, which reads as “the Work Email that the step called Find Email produced”.
Where variables come from
A step can use data from anything that happens before it in the same path:Insert a variable
Click into the field
Open the picker
Find the value
Click it
Save the step
- Hover a chip to see its exact path and, after a test, the value it had.
- Click a chip to change which field it points at.
- Click its × (Remove variable) to delete it.
- @ inside a word doesn’t open the picker, so typing an email address like
ana@acme.comis safe. - To insert a whole object or list rather than one field inside it, click its Insert button in the picker.
- Typing
{{by hand doesn’t create a variable reliably. Always insert from the picker; it gets the name and spelling exactly right.
Worked example: enrich a lead list, then send a personalised email
You have a list of webinar sign-ups with First Name, Company and LinkedIn URL columns. You want Connie to find each person’s work email, then send each one a personal note.Start with a list-based workflow
Add a step that finds the email
Test it once
Add the email step
- To Email: + → Find Email → Work Email.
- Subject: type
Quick question forthen + → Record → Company. - Body: type
Hi, insert Record → First Name, type,and carry on with your message. Insert Company again wherever you mention the company.
Run it
{= ifempty(value, "your company") =}. Set the value to the First Name variable and the fallback text to "there". Rows with a name still get “Hi Ana,”; rows without get “Hi there,”.
Handle row 4 with a branch. Add a Router between the two steps with the condition Find Email › Work Email · Is not empty, and put Send Email on that branch. Rows with no email found go to the fallback branch instead of failing. See Router.
Exact step and field names vary by action, which is why the steps above say “pick from the picker” rather than “type this”.
Worked example: branch on an AI step’s answer
A Run AI agent step named “Qualify Lead” researches each company. In its Output settings you add a field called Fit and ask the agent to answer “Yes” or “No”. Later steps can use that field like any other variable. It sits under the agent’s response:{{Qualify Lead.response.Fit}}.
- Add a Router after “Qualify Lead”.
- On Flow 1, add the condition Qualify Lead › response › Fit · Equals ·
Yes. - Put your outreach steps under Flow 1. Rows where the agent said “No” take the fallback branch.
Read a step’s output
To use a step’s data, you need to know what it produces. There are four places to look:- The Test panel. Click the step → Test → Run test. The Output tab lists every field and its value. Copy output copies it all.
- The variable picker. After a test, each field under the step’s group shows a sample value.
- The Runs tab. After a real run, click any cell for Cell Details, with Input (what went in, with variables filled in) and Output (what came out). Copy as JSON copies it.
- The record. Click a row to open it and see every step’s output for that row.
Column "Work Email" created.
How variables are written
You rarely need to type these yourself, but knowing the pattern helps you read hover text and error messages.- The step name comes first. That’s why renaming steps clearly helps.
- Dots separate levels. Spaces and colons inside a field name are fine (
{{Enrich Person.Job Title}}). - Lists start at 0.
[0]is the first item,[1]the second. When you pick a field inside a list, the picker inserts[0](the first item) by default. - Inside a For each,
itemis the current item,indexis its position (starting at 0) andtotalItemsis how many there are. From a step after the loop, use{{Step name[*].field}}to get every iteration’s result, or[2]for the third. - What comes out:
- A field containing only one variable passes the value as it is: a number stays a number, a list stays a list.
- A variable mixed with other text becomes text. A list of simple values reads like “Acme, Globex”.
- A whole object mixed into text comes out as raw data in curly braces. If you see that in an email, pick a single field inside the object instead.
- Data is never treated as a variable. If a scraped web page or an email contains
{{something}}, it stays as plain text.
Functions and fallbacks
Functions transform a value or supply one. Open the picker → Functions. Categories: Templates, Variables, Logic, Operators, Math, Text, Date & Time, Arrays, Keywords. Functions that need inputs open a small editor with Cancel and Save.Environment variables (secrets)
Store API keys and other secrets once in Settings → Environment, then insert them from the picker’s Environment Variables group. The chip shows only the key’s name, never its value. If the key is deleted, runs that use it fail. See Environment variables.Renaming and deleting steps
- Renaming a step updates every variable that points at it, automatically.
- Renaming a list column is safe for variables inserted from the picker.
- Deleting a step does not update variables that used it. Those chips turn amber with a warning icon (”… doesn’t point at anything anymore — the node or column it came from is gone. Delete the chip and pick a replacement.”), and the card shows 1 unresolved variable (or N unresolved variables). Open the step, remove the amber chip, and insert a replacement.
Why is my variable empty?
First, what happens when a value isn’t there:Good to know
- Variables only offer steps above the current step in the same path.
{{table.row_id}}no longer works. Use Record ID from the Record group.- In a Test, a variable holding a whole object is sent as text. A real run passes it as an object. If a test behaves slightly differently from a real run, this may be why.
- In an AI Agent step’s Task field, typing / opens your skills, not variables.
Troubleshooting
UNFILLED_VARIABLES: The following template variables could not be resolved
UNFILLED_VARIABLES: The following template variables could not be resolved
A chip turned amber and the card says 1 unresolved variable
A chip turned amber and the card says 1 unresolved variable
The picker shows no fields under a step
The picker shows no fields under a step
The variable is empty when I test, but the step works in real runs
The variable is empty when I test, but the step works in real runs
My email contains text in curly braces instead of a value
My email contains text in curly braces instead of a value
The Router failed instead of taking the fallback branch
The Router failed instead of taking the fallback branch
You cannot use variables from the current node
You cannot use variables from the current node
Only array variables can be used as an iterator
Only array variables can be used as an iterator
Arrays are not supported for this field
Arrays are not supported for this field
[0] for just the first item.Fill in the required fields to run this test
Fill in the required fields to run this test
The run failed with WORKSPACE_ENV_MISSING
The run failed with WORKSPACE_ENV_MISSING
A loop item is empty in a step after the loop
A loop item is empty in a step after the loop
item only exists inside the For each.
Fix: Move the step inside the loop, or use the loop step’s results with [*] (all) or an index such as [0].Related
- Build a workflow — add and configure steps
- Logic and control — Router conditions, For each loops
- Test and run — test steps and read results
- Webhooks — use data sent by outside apps
- Environment variables — store secrets for workflows
- Workflow troubleshooting — more fixes