> This page is part of the [Customer.io documentation](https://docs.customer.io). For the complete index, see [llms.txt](https://docs.customer.io/llms.txt).
> Last updated: October 15, 2026
> To take actions in Customer.io from an agent, use the [Customer.io CLI](https://docs.customer.io/ai/cli/get-started.md) or the [MCP server](https://docs.customer.io/ai/mcp/get-started.md).

# 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](/messaging/people/manage/add-or-edit-people/#set-allowed-identifiers-in-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](/messaging/people/anonymous/). 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 ↗](https://en.wikipedia.org/wiki/E.164) (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](/messaging/channels/subscriptions/overview/#how-topics-and-channels-work-together) 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,](/messaging/channels/subscriptions/manage-subscription-preferences/#subscription-preferences-in-the-api) 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](/messaging/channels/subscriptions/unsubscribes/).

Yes

Boolean, [but will accept other data formats](/messaging/channels/subscriptions/unsubscribes/#set-unsubscribed-attributes)

[Consent records](/messaging/channels/subscriptions/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](/messaging/objects-data/objects/start/) and [relationships](/messaging/objects-data/objects/relationships/), two distinct types of data in Customer.io.

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](/messaging/objects-data/objects/in-liquid/#relationship-attribute). 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](/messaging/objects-data/objects/in-liquid/#audience-attribute). 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](/messaging/send/timezones/match/).

Yes

String, [region format](/messaging/send/timezones/example-timezones/#region-format)

`timezone_valid`

A computed attribute that tells you whether a person’s [`timezone` attribute](/messaging/send/timezones/match/) contains a valid [IANA time zone](/messaging/send/timezones/example-timezones/). 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](/messaging/send/timezones/match/#find-profiles-with-an-invalid-time-zone).

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](/messaging/people/geolocation/), 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](/messaging/send/timezones/recommended-send-time/) and as a fallback when `timezone` isn’t set.

No, system-generated

String, [region format](/messaging/send/timezones/example-timezones/#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](/messaging/segmentation/ad-audiences-sync/).

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](/messaging/segmentation/ad-audiences-sync/) 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](/messaging/segmentation/ad-audiences-sync/).

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](/messaging/segmentation/ad-audiences-sync/).

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](/messaging/channels/subscriptions/open-tracking-consent/). 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](/messaging/channels/sms/unsendable-numbers/), 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](/integrations/api/app/tag/customers/getPersonAttributes/).

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](/messaging/people/manage/last-visited/). You can set it in an identify call.

Yes

Integer, unix timestamp

©2026 Peaberry Software, Inc. [Status](https://status.customerio.com/) [Terms of Service](https://customer.io/legal/terms-of-service/) [Privacy Policy](https://customer.io/legal/privacy-policy/)

[](https://www.linkedin.com/company/customer-io)[](https://twitter.com/customerio)[](https://www.youtube.com/channel/UCkCaWdezRoa8ZyR9pEVaipA)[](https://www.instagram.com/customer.io/)
