Custom fields
Three scopes:
- CONTACT — per-human attribute (e.g.
class_grade,birthday) - ACCOUNT — per-account / company attribute (
tier,mrr) - AGENCY — workspace-wide attribute (
signature,support_url)
Field types
text · number · email · phone · url · boolean · date · select ·
multiselect
Type-validated at write time. Setting lead_score = "abc" on a number field throws —
the inbox surfaces the validation error.
Create a field
Two paths:
/dashboard/custom-fields— full editor (label, key, type, options for select, default value, required flag, description)- Inline from the flow editor — type
{{in a text body or user-input question → popover → + Create custom field. Same dialog, scoped to CONTACT.
The key is auto-generated from the label ("First name" → first_name). Once
generated, the key is immutable — renames don’t propagate to existing data, but
the label can change freely.
Reading in flows
Reference any custom field as {{contact.[key]}} in text bodies, user-input
questions, HTTP request URLs / headers / body, AI prompts. See
Variables for the full substitution syntax.
Writing from flows
The user-input block has a “Save answer to” dropdown — pick a custom field, the
customer’s reply persists to ContactProfile.attributes[[key]] automatically. Future
broadcasts + drips + flows see it as a regular attribute.
The HTTP request block extracts response JSON paths into custom fields the same way.