A custom attribute records something the flow already knows onto the conversation record: whether a payment link was sent, whether the call was handed to a live agent, which plan the customer chose. You define a key and an output type in Project Settings, drop a Set Attribute node where the flow knows the answer, and the value is on the conversation afterwards, ready to be shown as a column, filtered on, exported and used to build a test dataset.
This article covers the Custom Attributes tab of Project Settings > Conversation Attributes, the Set Attribute node that writes the values, and where those values then appear. The other tab of the same section, AI Insights, holds definitions a model infers from the transcript after the conversation ends; it works differently and is covered in its own article.
A custom attribute never reads the conversation. It holds only what a flow explicitly wrote, so where the branch carrying the node never ran, the value is empty.
📝 Note: Conversation Attributes is available in the Premium edition only. On a Basic or Standard tenant the section does not appear in Project Settings and the values never surface anywhere. This is an edition change rather than a setting you can switch on, so contact your Sestek representative.
📝 Note: Conversation Attributes also has to be switched on for the project, in Project Settings > General. It is off by default on a new project. While it is off, the Custom Attributes tab is invisible, a Set Attribute node is invalid, and nothing is shown or exported on the Conversations and Dataset pages.
Defining an attribute
Open the project settings gear, then Conversation Attributes. The section has two tabs: AI Insights and Custom Attributes. The Custom Attributes tab carries its own one-line summary of the mechanism: "Define a key and an output type. The value is set in the flow with a Set Attribute node."
Definitions belong to the project version and are edited on the Draft version. On a published version the tab is read-only. A conversation records values against the definitions of the version it ran on, so a new attribute reaches live traffic once the project is published.

1. Custom Attributes tab: The second tab of Conversation Attributes. AI Insights sits on the first one; the two lists are separate, including their limits.
2. Key: The attribute's identifier, and the name the column, the filter and the export use. It must start with a letter or an underscore and can then contain letters, digits and underscores only, up to 100 characters. Anything else is refused with "The name must start with a letter or underscore and can only contain letters, digits, and underscores." The placeholder suggests the shape: e.g. selected_plan. Two attributes cannot share a key; the check ignores case, and the refusal reads "An AI Insight with the same name already exists. Please use a different name."
3. Output Type: What the attribute holds. See the table below. The type decides which value editor the Set Attribute node offers and how the value is displayed.
4. Possible Values: For a Category type, the closed list of values the attribute can hold, entered one at a time as chips. Up to 20 values, each up to 50 characters.
A custom attribute has no description field. An AI insight needs one because a model reads it; nothing reads an attribute's definition, so there is nothing to describe it to.
Each row also carries its own switch, so an attribute can be disabled instead of deleted.
Output types
Eight output types are offered, grouped into single-value and list types.
| Output type | Holds | What you configure |
|---|---|---|
| Category | One value from your fixed list | Possible Values |
| Categories | Several values from your fixed list | Possible Values |
| Free text | One text value | Nothing further |
| Free text list | Several text values | Nothing further |
| Score (whole number) | One whole number inside a range | A minimum and a maximum |
| Score list (whole number) | Several whole numbers inside a range | A minimum and a maximum |
| Score (decimals) | One decimal number inside a range | A minimum and a maximum |
| Score list (decimals) | Several decimal numbers inside a range | A minimum and a maximum |
💡 Tip: If a supervisor will ever filter or count on it, make it a Category. Category values are the only ones the Conversations filter offers as clickable chips, and they are the only type whose values are checked against the definition when the node is configured in Static mode.
Setting the value in a flow
The value is written by a Set Attribute node, described in the palette as "Set custom attribute values in the flow to persist them after the conversation."
The node is available in every flow type: the Main flow, Survey, subflows, the fallback flow, an intent's Actions flow, the Post Session Flow, and an AI Agent tool's own workflow. Putting it inside a tool's workflow is often the most precise place for it, because the value is then written whenever the agent calls that tool, which is exactly the moment the answer is known. Tool workflows are covered in Tool Management.

1. The tool's Workflow tab: The node here sits inside the CreatePaymentLink tool's own workflow, not in the project's Main flow.
2. The Set Attribute node: Placed between Start and End With Result, so the attribute is written on every call of the tool.
The node never stops or fails a conversation. Whatever it can write, it writes, and the flow continues to the next node.
The node's configuration

1. Key: A pick list of the project's enabled custom attributes. Keys are not typed here, so a node can only ever write to an attribute that exists. A node can carry more than one row, one per key, so several attributes can be set at once.
2. Value: What to write. In Static mode the editor follows the attribute's output type: a dropdown limited to the possible values for a Category type, range-checked and precision-checked entries for a score type, and free entries for a text type. In Variable mode it becomes a rich text field where you insert context variables with % mentions.
3. Static / Variable toggle: Which of the two modes the row is in. See below, because the difference is larger than it looks.
A row can hold up to 5 values, and more than one value is only accepted when the output type is a list type.
Static and Variable
A row is in one of two modes. In Static mode you choose the value yourself, from the attribute's own definition: a Category attribute offers its possible values, and a score attribute accepts a number inside its range. In Variable mode the value comes from the flow, resolved when the node runs, so it can carry something the flow worked out earlier such as an API result or a customer's answer.
💡 Tip: Use Static wherever the answer is fixed at design time, which is most of the time.
TransferredToHumanon the branch that performs a transfer is alwaystrue, so there is nothing to compute. Keep Variable for values that genuinely differ per conversation, and make sure the flow can only produce values the attribute is defined to hold.
📝 Note: The toggle's label shows the mode the row is currently in, not the mode clicking it will switch to. "Static" beside the switch means this row is Static.
When the value is recorded
⚠️ Warning: Values are written to the conversation record at the end of the conversation, not at the moment the node runs. A conversation that never reaches its end records nothing at all, even though the node ran and the value was carried by the flow the whole time.
Until then, the values set so far are readable inside the flow through the CustomAttributes context variable, which holds them as JSON. A list output type renders as a JSON array, and every other type as a single value.
⚠️ Warning: A value written for a key that no longer exists in the version the conversation ran on is discarded silently. Nothing on the conversation record shows that a value was produced and dropped, so delete an attribute only when you have also removed the nodes that write it.
Recorded values are trimmed to 2,000 characters. They are also part of the conversation's data, so they are removed with it when a data retention policy expires the session.
When Conversation Attributes is off
⚠️ Warning: A Set Attribute node cannot be used while Conversation Attributes is switched off for the project. Flow validation marks it invalid and publishing is refused with "The {0} Node cannot be used because Conversation Attributes are disabled for this project. Flow: {1}". A node whose configuration is wrong for another reason is refused with "Set Attribute configuration is invalid in the {0} Node. Flow: {1}".
A Set Attribute node is invalid when Conversation Attributes is inactive, when a row points at a key that does not exist or has been disabled, when a row has no value, when a row has more than 5 values, when a non-list type is given more than one value, when a Variable row's value is empty, or when a Static value is not allowed by the attribute's own definition.
📝 Note: Exporting a flow strips the Set Attribute nodes' configured rows. The nodes arrive in the target project empty, so their keys and values are chosen again there against that project's own attribute definitions.
Where the values appear
Columns on the Conversations page
Every enabled attribute is available as a column on Insights > Conversations, grouped under a Custom Attributes heading and ordered the way the definitions are ordered in Project Settings.

1. Column options: Opened from the wrench icon immediately left of Export. It lists the columns currently shown and the columns available to add.
2. The attribute rows: One row per custom attribute, added the same way as any other optional column.
3. Save: Applies the selection to the list.
📝 Note: Attribute columns are hidden by default. After defining your attributes and running conversations that write them, the Conversations page looks exactly as it did before, because none of the new columns is on. Switch them on in Column options before concluding that nothing was recorded.
Filtering

1. Custom Attributes section: A section of the filter panel, directly below AI Insight Filters. + Add Custom Attribute Filter opens a picker over the project's attributes, with a search box and, when there are none, the message "No custom attributes available".
2. Value: A Category attribute filters through clickable value chips. Unlike an AI insight filter, an attribute filter also accepts free text.
3. The narrowed list: The conversation list re-queries as the filter is applied.
The same filters are available on the Datasets page of AI Testing, as Custom Attribute Filters, so a dataset can be built from the conversations where a flow actually did something.
The conversation record

1. AI Insights block: What a model inferred from the transcript.
2. Custom Attributes block: What the flow wrote, with nothing interpreted.
The Custom Attributes block is built from the values stored on the conversation, not from the current definitions. A value whose attribute was later deleted still shows here even though its column is gone from the list.
Exports
Both exports carry the values:
| Export | What it contains |
|---|---|
| Conversation list export | One column per currently defined attribute, in the definitions' order |
| Single conversation export | A Custom Attributes section built from the values stored on that conversation |
Nothing is exported while Conversation Attributes is switched off for the project. The list export takes its columns from the definitions, so an attribute deleted after the conversations ran no longer has a column, even though the values are still on the records.
Changing an attribute after it exists
** The key and the output type cannot be changed once an attribute has been saved. Both fields are locked on an existing row. What stays editable is the possible values, the score range, the order and the enable switch. If a key turns out to be wrong, the way out is a new attribute beside it.
The check looks at Static values configured in the nodes. A Variable row writes whatever it resolves to at runtime, so it cannot be protected this way.
📝 Note: Switching Conversation Attributes off for the project hides the values and stops new ones from being recorded, but it does not delete what was already recorded. Switch it back on and the earlier values are on the records again.
A worked example
The project has an AI agent with a CreatePaymentLink tool, and the question is how often a conversation ends with a payment link actually sent.
1. Define the attribute. In Project Settings > Conversation Attributes > Custom Attributes, add:
| Field | Value |
|---|---|
| Key | PaymentLinkCreated |
| Output Type | Category |
| Possible Values | true, false |
2. Write it where the flow knows. Open the CreatePaymentLink tool, go to its Workflow tab, and drop a Set Attribute node between Start and End With Result. In the node:
- Key:
PaymentLinkCreated - Value:
true - Static / Variable: Static
Because the node is inside the tool, the attribute is written whenever the agent calls the tool, and not on conversations that never got that far.
3. Run a conversation and let it end. In Test Chat, one exchange that reaches the tool is enough:
"Hello, my bill seems higher than usual this month." "My customer ID is CUST-1001." "Yes please, send me the payment link."
Close the chat. The values are written when the conversation ends, not while it is running.
4. Show the column. On Insights > Conversations, open Column options with the wrench left of Export, add PaymentLinkCreated, and save.
5. Filter on it. In the filter panel, Custom Attributes > + Add Custom Attribute Filter, pick PaymentLinkCreated, then click its true chip. The list narrows to the conversations where the tool ran.
The same pattern works for a live agent handover: define TransferredToHuman as a Category with true and false, and put the Set Attribute node on the branch that performs the transfer.
Limits and naming rules
| Item | Value |
|---|---|
| Custom attributes per project version | 20, counted separately from the 20 AI Insights |
| Key | Up to 100 characters; must start with a letter or underscore, then letters, digits and underscores; unique among the project's attributes, ignoring case |
| Possible values on a Category type | Up to 20 values, each up to 50 characters |
| Score minimum and maximum | Between -1,000,000 and 1,000,000; the minimum must be lower than the maximum |
| Decimal places on a decimal score | 2 |
| Values per key in one Set Attribute row | 5, and more than one only for a list output type |
| Length of a recorded value | 2,000 characters; longer values are trimmed to it |
| Edition | Premium |

