Reserved attributes
In Customer.io, attributes marked as reserved support core functionality in the platform. Some of them are generated by our system and immutable; for others, you can modify the values. Make sure you understand the purpose of reserved attributes before making changes so you don't unintentionally impact system workflows.
Identifiers
To add, update, or delete people, you need an identifier unique to each person, so your workspace needs to reserve attributes for identification. What attributes count as identifiers depend on your workspace settings.
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
anonymous_id | An anonymous identifier that your website or app assigns to a visitor before you know who they are. When you identify a person with an anonymous_id, Customer.io links the events and page views recorded under that ID to the person. | Yes | String |
cio_id | A unique, immutable identifier set by Customer.io, set automatically when you add a person. | No, system-generated | String |
email | A person’s email address. If your workspace uses email as a unique identifier (the default setting for new workspaces), and the email address does not yet exist, we create a new person. The TO line of your email templates is pre-filled with this attribute. | Yes | String, valid RFC 5322 email addresses |
id | A unique identifier for people. If the id does not yet exist, Customer.io creates a new person. | Yes | String, max 150 characters |
phone | A person’s phone number. If your workspace uses phone as a unique identifier (the default setting for new workspaces), and the phone number does not yet exist, Customer.io creates a new person. | Yes | String, E.164 format (like +14155552671). Values that aren’t valid E.164 numbers can’t identify a person. |
Message subscription preferences
To manage people’s communication preferences, you need to use these reserved attributes. Customer.io updates these attributes when people subscribe or unsubscribe from messaging using your workspace’s unsubscribe links.
You have to set up and enable a subscription center for subscription preferences to apply. Otherwise, your workspace automatically supports a global unsubscribe page where people can indicate if they want any messaging from you. Each person has a global subscription status managed by the unsubscribed attribute.
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
cio_subscription_preferences | Stores the topic and channel preferences a person set through the subscription center, or that you set on their behalf. You can’t delete this attribute. | Yes | JSON object with topics and channels keys. |
_cio_subscription_preferences_computed | Stores all of a person’s subscription preferences, including defaults for topics and channels the person hasn’t explicitly set. Customer.io computes this value from cio_subscription_preferences and your topic settings. You can’t set or edit it. | No, system-generated | JSON object with topics and channels keys. |
unsubscribed | Determines whether a person is globally unsubscribed from messages. | Yes | Boolean, but will accept other data formats |
Consent records aren’t attributes. Customer.io stores them as activities, so you won’t find them on people’s Attributes tabs.
Custom objects & relationships
These attributes are reserved for managing custom objects An object is a non-person entity that you can associate with one or more people—like a company, account, or online course. The connection between an object and a person in your workspace. For instance, if you have Account objects, people could have relationships to an Account if they're admins.
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
cio_object_id | A unique, immutable identifier for objects provided by Customer.io. If this id doesn’t exist in your workspace, Customer.io creates a new object. | No, system-generated | String |
object_id | A unique identifier for objects. If the object_id doesn’t exist, Customer.io creates a new object. | Yes | String, max 150 characters |
objectId | An analog for object_id in some Customer.io integrations. | Yes | String |
created_at | Unix timestamp when the object was first created. For example, used when listing objects in the UI. | Yes | Integer, unix timestamp |
These two JSON objects are reserved for relationship attributes and let you pull in information for different types of audience members in your automations.
| Key | Purpose | Editable | Data Format |
|---|---|---|---|
relationship | Stores attributes for a relationship to a custom object. Use this to reference relationships in liquid. Cannot be used as the name of an object attribute. | Yes | JSON object |
_relationship | In relationship-triggered automations, this stores relationship attributes for audience members who didn’t trigger the journey which you can use to personalize messages. Cannot be used as the name of a customer attribute. | Yes, by editing the relationship attributes | JSON object |
Localization
Customer.io uses these attributes when you want to send messages in certain timezones or at certain times of day. You store timezone information on people’s profiles.
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
timezone | The user’s time zone. Used for sending localized messages. | Yes | String, region format |
timezone_valid | A computed attribute that tells you whether a person’s timezone attribute contains a valid IANA time zone. Customer.io sets and maintains this value automatically—you can’t set or change it. Use it to find and fix people with missing or invalid time zones. | No, system-generated | Boolean. true when timezone holds a valid IANA time zone; false when timezone is missing or isn’t a valid IANA time zone. |
Geolocation
When you enable automatic geolocation data collection, Customer.io sets these attributes when you identify a person. You don’t set them yourself. When geolocation is enabled, you can’t delete them.
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
cio_city | City name. | No, system-generated | String |
cio_continent | Continent name, like North America. | No, system-generated | String |
cio_country | Country name, like United States. | No, system-generated | String |
cio_iso_continent | ISO continent code, like NA for North America. | No, system-generated | String |
cio_iso_country | ISO 3166-1 alpha-2 country code, like US. | No, system-generated | String |
cio_iso_region | ISO region code, like CA for California. | No, system-generated | String |
cio_latitude | Latitude of the person’s location. For IP-based geolocation, this is the approximate latitude of the city. For device-based geolocation, this is the precise GPS latitude. | No, system-generated | Decimal degrees |
cio_location_source | Which source provided the person’s current location: ip (IP address lookup) or device (mobile SDK GPS coordinates). | No, system-generated | String: ip or device |
cio_longitude | Longitude of the person’s location. For IP-based geolocation, this is the approximate longitude of the city. For device-based geolocation, this is the precise GPS longitude. | No, system-generated | Decimal degrees |
cio_postal_code | Postal or ZIP code, approximated from the IP address. It may not be exact. | No, system-generated | String |
cio_region | Region name, like California. Usually a state, province, or administrative division. | No, system-generated | String |
cio_timezone | The person’s time zone. Customer.io uses it for recommended send time and as a fallback when timezone isn’t set. | No, system-generated | String, region format |
Ad audiences
Customer.io uses these attributes to securely share data with any advertising networks you’ve integrated with your workspace. Learn more about Ad audiences.
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
email_sha256 | To keep your data secure, you can hash your customer email using the SHA256 algorithm before sending it to your account. This field is only used in Ad Audiences and cannot be used to send messages. | Yes | Valid encoded sha256 |
mobile_ad_id | Used to record either Apple’s Advertising Identifier (IDFA) or Android’s Advertising ID (AAID). This id can improve match accuracy in Google or Facebook Ads when using Ad Audiences. | Yes | Apple’s Advertising Identifier (IDFA) or Android’s Advertising ID (AAID) |
mobile_ad_id_sha256 | To keep your data secure, you can hash the mobile_ad_id using the SHA256 algorithm before sending it to your account. This field is only used in Ad Audiences. | Yes | Valid encoded sha256 |
Other
| Attribute | Purpose | Editable | Data Format |
|---|---|---|---|
cio_email_tracking_consent | Records whether a person has consented to email open tracking, honored when the workspace uses consent-based open tracking. For attributes that track subscription preferences, whether people want to receive email and other messages, see cio_subscription_preferences and unsubscribed. | Yes | String, granted means the person consented; denied means they objected. |
cio_sms_unsendable_reason | Records that a person’s phone number can’t receive SMS, based on a provider bounce, so we stop sending SMS to that number. Customer.io sets this value automatically and clears it when the phone attribute changes. | No, system-generated | String: invalid, landline, or unreachable. |
_created_in_customerio_at | The date-time when a person was added in Customer.io. This value can be different from created_at. In the API, this value is represented by the timestamp for the cio_id attribute. | No, system-generated | Integer, unix timestamp |
created_at | Stores a timestamp. Use this to capture information like when your customer was first added to your system. Use _created_in_customerio_at for when people were added to Customer.io. | Yes | Integer, unix timestamp |
_last_visit | The date-time when a person was last active on your site or app. Customer.io updates this value from page views and events, and shows it as the Last Visited field. You can set it in an identify call. | Yes | Integer, unix timestamp |