Using runtime data in workflows
Runtime data is the live information a workflow has while it runs: the visitor's name, the new ticket's number, an API's answer or the AI step's verdict. Put it in a message, a field or a condition, and each run fills in the right details by itself.
For example, a Slack alert that says New lead from {{record.visitorName}} arrives as "New lead from Jane Doe".
For example, a Slack alert that says New lead from {{record.visitorName}} arrives as "New lead from Jane Doe".
Before you start
- You have made at least one workflow. If you have not, see Creating your first workflow, step by step.
Add runtime data to a step
Select it from the list (easiest)
Most fields have a list above them that shows Enter a custom value. Open the list and select a value, for example Chat · Visitor email. The list shows only the values that the field accepts.
Type it into your text
Keep Enter a custom value, and type the value's path between double braces anywhere in your text. Use this to mix live details with your own words, for example in a Slack message:

When the workflow runs, it replaces each path with the real value:
| You write | The run gives |
|---|---|
| Call back {{trigger.name}} on {{trigger.phone}} | Call back Sam Lee on +14155550123 |
| Ticket #{{trigger.ticket.humanId}} "{{trigger.ticket.subject}}" from {{trigger.ticket.requester.name}} has no agent reply after 4 hours. | Ticket #1042 "Order arrived damaged" from Jane Doe has no agent reply after 4 hours. |
Tip: Copy each path exactly as the Available runtime data panel shows it. Paths are case-sensitive: visitorName works, but visitorname does not. Do not put spaces inside the braces.
Where each value can go
Not every value works in every field. Personal details, such as the visitor's name, email or last message, can go in Slack messages and conditions, but not in a task title or a ticket.
Each step has an Available runtime data (N) panel. Click it to see every value the step can use, with its exact path and where it works.
Each step has an Available runtime data (N) panel. Click it to see every value the step can use, with its exact path and where it works.

The use in line on each value tells you where it works:
| use in shows | You can use the value in |
|---|---|
| triggerFilter | The trigger's Only run when conditions match filter |
| condition | Condition steps |
| action | Action fields, for example a task title or a card title |
| eventWait | A Wait for an event step, to find the right record |
| notify | Send Slack notification messages |
Example: for a chat, Visitor name ({{record.visitorName}}) shows use in: condition, notify. You can put the visitor's name in a Slack alert or check it in a condition, but not use it in a task title. If a value is not in a field's list, that field does not accept it.
Each row in the panel also shows:
Each row in the panel also shows:
- The type: string (text), number, boolean (yes or no), array (list) or object.
- required or optional: an optional value can be empty for some events.
- nullable: the value can be empty.
- related: the value is the ID of another record, for example a conversation, contact or organization.
- sensitive: the value is personal data, for example an email address.
- example: a typical value.
Where runtime data comes from
The first part of each path tells you where the value comes from:
| Starts with | What it holds | Examples |
|---|---|---|
| trigger. | Details of what started the run: the event, schedule, webhook call or AI agent request | {{trigger.conversationId}}, {{trigger.ticket.subject}}, {{trigger.card.id}} |
| record. | The record behind the event (a chat, ticket, conversation, card, activity, contact, organization or Feedback issue), with its linked contact and organization | {{record.visitorEmail}}, {{record.title}}, {{record.contact.name}} |
| nodes. | The results of earlier steps in this run | {{nodes.summarize.output}}, {{nodes.create_ticket.output.ticketId}} |
Common paths for each trigger
The values you get depend on the trigger. For what each trigger does, see Choosing what triggers a workflow. The panel always shows the full list; these are the paths used most:
| Trigger | Useful paths |
|---|---|
| Chat transcript created | trigger.conversationId, trigger.conversation.offline, trigger.conversation.answered, record.visitorName, record.visitorEmail, record.rating, record.lastMessage, record.tags |
| Ticket created | trigger.ticket.id, trigger.ticket.humanId (ticket number), trigger.ticket.subject, trigger.ticket.requester.name, trigger.ticket.requester.email |
| Omnichannel Inbox events | trigger.omnichannel.conversationId, trigger.omnichannel.inboxId, record.channel, record.subject, record.contactName, record.status, record.priority |
| Pipeline events | trigger.card.id, trigger.card.title, record.title, record.value, record.currency, record.stageName, record.expectedCloseDate |
| Feedback events | trigger.issueId, record.title, record.description, record.votes, record.authorName, record.authorEmail |
| AI agent | Each input that you set, for example trigger.email or trigger.orderNumber, plus trigger.conversationId and trigger.channel |
| Webhook | Each field in the JSON body that you send. For example, {"orderId":"1001"} gives trigger.orderId. |
- Linked contact and organization: if the record has a linked contact or organization, you can use their details, for example {{record.contact.name}}, {{record.contact.primaryEmail}} or {{record.organization.name}}.
- Custom fields: a record's custom fields are under record.customAttributes, for example {{record.customAttributes.plan}}.
See the shape of your trigger data
Run now shows the trigger data as JSON. Each level in the JSON is one part of the path, joined by dots. For example, "conversation": { "offline": true } becomes {{trigger.conversation.offline}}.

Use the results of earlier steps
When a step finishes, its result goes into nodes.<step ID>.output, and later steps can use it. For what each step does, see Building workflow steps: actions, conditions, waits and AI steps.
| Step | What later steps can use |
|---|---|
| AI step | The AI's full answer: {{nodes.<step ID>.output}} |
| AI step with output fields | Each field on its own: {{nodes.<step ID>.output.<field name>}}, for example {{nodes.write_update.output.title}} |
| Find Feedback issues | …output.count, …output.issueIds, …output.issues, …output.hasMore (more issues matched than fit) |
| Publish to Changelog | …output.entryId, …output.status |
| Send email, Send SMS, Send WhatsApp message, Reply to inbox conversation | …output.conversationId, …output.messageId, …output.status (delivery status) |
| Create ticket | …output.ticketId |
| Create card, Create activity | …output.sourceRef.value, the reference of the new record. Later actions such as Move card to stage or Complete created activity use it to find the record. |
| HTTP request | …output.data.status (HTTP status), …output.data.body (response body), …output.data.headers, …output.data.bodyTruncated |
| Create FAQ, Update FAQ | …output.data.qna.id |
| Add issue in Feedback, Update issue in Feedback | …output.issue.id, …output.issue.status |
| Fetch conversation | The conversation's transcript, for an AI step to read. You cannot put it straight into a ticket or a message. To send it, ask the AI step to copy it, then use the AI's answer. |
| Wait for an event (with a timeout route) | …output.timedOut: yes if no event came in time |
In the panel and in the lists, a step result has the step number in its label, for example Step 1 · HTTP status.
About step IDs
The <step ID> is a fixed name for each step, so your paths keep working when you move steps.
- Templates use readable IDs, for example fetch_chat or summarize.
- Steps that you add get a generated ID, for example n_lSrH6QRTuBxEMXSm.
Runtime data in AI steps
You write AI step instructions in plain language, without double braces. Tell the AI where the data is by its path:
You qualify sales leads. The chat transcript is in nodes.fetch_chat.output. The visitor details are in record. Start your reply with INTENT=HOT, INTENT=WARM or INTENT=COLD. Then write one sentence about who the visitor is and what they need.
To give a conversation to an AI step, add a Fetch conversation step before it. Set Conversation ID to {{trigger.conversationId}}, then select the conversation's Channel.
Later steps can then use the AI's answer, for example {{nodes.summarize.output}} in a task description or a Slack message. To get separate values instead of one answer, add Output fields to the AI step.
You qualify sales leads. The chat transcript is in nodes.fetch_chat.output. The visitor details are in record. Start your reply with INTENT=HOT, INTENT=WARM or INTENT=COLD. Then write one sentence about who the visitor is and what they need.
To give a conversation to an AI step, add a Fetch conversation step before it. Set Conversation ID to {{trigger.conversationId}}, then select the conversation's Channel.
Later steps can then use the AI's answer, for example {{nodes.summarize.output}} in a task description or a Slack message. To get separate values instead of one answer, add Output fields to the AI step.
Runtime data in conditions
In a Condition step or a trigger filter:
- The field can be any value in the list. If a step result is not in the list, select Advanced field path, then type the path without braces, for example nodes.classify.output.
- The value can be a Fixed value that you type, or Runtime data. For runtime data, enter one reference on its own, for example {{trigger.card.value}}.

When a value is missing
- Slack messages: an optional value with no data shows Not provided.
- AI agent inputs: if the agent cannot find an input in the conversation, the input is set to Not provided, and the run gets the label Some inputs not provided. If the workflow cannot work without an input, make it Required. See Letting your AI agent run workflows.
- Values that the trigger does not give: the run fails, and the error names the missing value. For example: "Step 2 uses {{trigger.orderId}}, which this run's trigger didn't include." Use a value that the trigger gives, or remove it from the step.
- Data on every route: after a Condition, a step can use results only from steps that always run before it. If not, you see this error when you save: "Step N uses runtime data that is not available on every route to that step." Move the step, or use data from a step on every route.
- Wait for an event: the event's data exists only if the event came. Steps on the Nothing arrives route cannot use it.
Tips
- URLs: runtime data in a URL is not URL-encoded. If a value can contain spaces, ? or &, encode it first.
- Dates: a date field accepts a date, or one runtime data path on its own, for example {{trigger.activity.dueAt}}.
- Testing with Run now: change the JSON in Run now to try other values, for example a different rating or email. This is a real run, so its actions really happen.
- Sensitive data: values marked sensitive, such as email addresses, are personal data. Send them only to channels and apps that your team trusts.
Related guides
Have a question we haven't covered or need support?
- Chat with us (live chat is available 24/7)
- Visit our Feedback page
- Schedule a call with us
