Send messages in users' time zones

Updated August 17, 2026

Customer.io aims to help you send the right messages at the right time to your users. Two critical parts of this are sending messages in a given profile's time zone and localizing time in emails. Here, we'll explain how to do both.

How it works

You can schedule messages for your users in their local timezones, so you engage customers at the right times, wherever they are. This feature relies on a timezone attribute you set yourself or the cio_timezone attribute, which is set by our automatic geolocation data collection.

If the timezone attribute exists, we’ll use it to send the message in the customer’s time zone. If it doesn’t exist, we’ll use the cio_timezone attribute as a fallback. If neither of these attributes exist, we’ll use a fallback timezone. This ensures that profiles that don’t have timezone data still get messages.

Find and fix profiles with an invalid time zone

Time zone match relies on a profile’s timezone attribute having an IANA time zone value (like America/New_York). Otherwise, the profile uses the system-generated cio_timezone attribute if you enabled geolocation data collection, followed by your fallback time zone.

Customer.io maintains a computed timezone_valid attribute on every profile so you can find and fix invalid timezone values.

  • It’s true when timezone contains a valid IANA time zone.
  • It’s false when timezone is missing or isn’t a valid IANA time zone.

Customer.io sets and updates timezone_valid automatically whenever the timezone attribute changes—you can’t change it yourself.

Use the timezone_valid attribute to find profiles with invalid timezones and correct the formatting in your source integration—the system that sets the values in the first place.

If your integration doesn’t resync timezone data, you can create an automation instead that reformats timezone values:

  1. Create an automation with an attribute or segment trigger. Set two attribute conditions: “timezone_valid equals false AND timezone exists” so people with invalid time zone values trigger a journey.
    /images/timezone-valid-false-and-timezone-exists.png
    timezone exists” ensures only people with improperly formatted time zone values trigger the automation, not those with an empty timezone attribute (which wouldn’t need reformatting).
  2. Add a Create or update profile action or a Run LLM action to set timezone to a valid regional IANA value. For an LLM action, you should change the output from a journey attribute to a profile attribute so it’s stored beyond the journey’s lifecycle.

Once the timezone value is corrected, Customer.io updates timezone_valid to true automatically.

You can use our recommended send time feature to automatically schedule messages at the best times for your audience.

Automations: schedule a message with a time window

Time zone match is available when using a “Time Window” delay in your workflows:

/images/user-timezone.png

With this setting, you can tell Customer.io to wait until a given time in a customer’s time zone before taking the next action.

You must also set a fallback here, telling Customer.io which time zone to use if a customer doesn’t have the timezone attribute.

Send one-time sends in recipients’ timezones

You can schedule delivery of a one-time send in the Review step. Here you have the option to Send in recipient’s timezone.

Under the date/time of your schedule, you can togggle on the option to send in recipient's timezone.

You must also set a Fallback Time Zone, telling Customer.io which time zone to use if a customer doesn’t have the timezone or cio_timezone attributes. If a customer has an invalid value (not empty/missing) for the timezone attribute, they will receive the message during the last date/time we send to across all timezones.

You can also combine sending in a recipient’s timezone with a rate limit to maintain deliverability and reach your audience at the right time.

Keep in mind, you cannot send in a recipient’s timezone if your one-time send contains variants for A/B tests. If this is important for your company, please email win@customer.io with your use case!

Use time zone data in messages

You can also localize time in your messages using liquid syntax. Imagine that you want to send an appointment reminder, and you have an appointment_time attribute formatted as a UNIX timestamp.

The way you use time zone data in your messages depends on the liquid version you’re using.

{{ customer.appointment_time | date: "%H:%M %A %b %d, %Y", customer.timezone }}
{{ customer.appointment_time | timezone: customer.timezone | date: "%H:%M %A %b %d, %Y" }}

If customer.timezone is US/Pacific, then the above liquid code will display: 05:00 Friday Oct 28, 2033.