Custom Fields
Custom fields allow you to store any additional data about your customers beyond the standard fields (email, name, city, country, score). They enable powerful personalization and segmentation.
How Custom Fields Work
Custom fields are stored as flexible key-value pairs on each customer record. They are automatically created when you upload a CSV with non-standard column headers.
Standard fields (built-in):
email,first_name,last_name,phone,city,country,score
Custom fields (anything else):
plan_type,signup_date,company,industry,lifetime_value, etc.
Creating Custom Fields
Custom fields are created implicitly when you upload a CSV:
email,first_name,company,plan_type,renewal_date
alice@example.com,Alice,Acme Corp,enterprise,2025-06-01
bob@example.com,Bob,StartupXYZ,free,2025-03-15
In this upload, company, plan_type, and renewal_date are automatically stored as custom fields.
Custom fields are flexible — different customers can have different custom fields. There's no need to predefine a schema.

Using Custom Fields
In Email Content (Merge Tags)
Reference custom fields in your email content using the {{custom.FIELD_NAME}} syntax:
<p>Hi {{first_name}},</p>
<p>Your {{custom.plan_type}} plan renews on {{custom.renewal_date}}.</p>
You can add fallback values:
<p>Welcome to {{custom.company|our platform}}!</p>
In Segments
Custom fields can be used as segment conditions:
- Go to Segments → New Segment
- Add an Attribute Condition
- Select Custom Field as the field type
- Enter the field name (e.g.,
plan_type) - Choose an operator (equals, contains, starts with, etc.)
- Enter the comparison value
Example segment: All customers where plan_type equals enterprise AND country equals US.
In Journey Conditions
Journey condition steps can evaluate custom field values to branch customer flows. For example, route premium customers down a different path than free-tier users.
Supported Operators for Custom Fields
When used in segments, custom fields support these operators:
| Operator | Description | Example |
|---|---|---|
eq | Equals | plan_type = 'premium' |
neq | Not equals | plan_type ≠ 'free' |
contains | Contains substring | company contains 'Corp' |
starts_with | Starts with | email starts with 'admin' |
ends_with | Ends with | email ends with '.edu' |
gt / gte | Greater than (or equal) | lifetime_value > 100 |
lt / lte | Less than (or equal) | score < 50 |
between | Between two values | score between 10 and 90 |
is_set | Field has a value | phone is set |
is_not_set | Field is empty/null | company is not set |
Best Practices
- Use consistent naming: Stick to
snake_casefor field names across all uploads (e.g.,plan_type, notPlan TypeorplanType) - Document your fields: Keep a reference of what custom fields you use and their expected values
- Plan ahead: While flexible, consistent field names make segmentation much easier
- Store dates in ISO format: Use
YYYY-MM-DDfor date fields to enable proper comparison operators - Keep values clean: Avoid trailing spaces or inconsistent casing in values