Supported content
- Campaigns, newsletters (one-time sends), broadcasts, and transactional messages.
- Message types: email (saved as HTML, opens in HTML File view), in-app messages (also HTML), push notifications, SMS (including Twilio), WhatsApp, and Slack messages (saved as JSON).
- Drag-and-drop emails are supported through the linked Design Studio email. Import brings in the component markup, subject, and preheader. Push writes the translated content back through the Design Studio API as an unpublished draft. Publish the email in Customer.io to go live.
- Out of scope: multilingual A/B variants. Newsletter and transactional messages with several default variants (A/B tests) import each variant but are skipped on push, because their translations share one per-language slot. Webhook actions carry machine config and are always skipped.
- Configure locales on each Customer.io action before pushing translations. Customer.io cannot create or match a locale it does not have — except on Design Studio emails, where push creates a missing language automatically.
Prerequisites
Connect Customer.io
- Open workspace Integrations and find Customer.io.
- Paste the App API key and choose the region for that workspace.
- Save. Hyperlocalise pings the Customer.io App API in that region to confirm the key can list broadcasts. A rejected key or unreachable region is not stored.
- Confirm the connection shows as connected.
Translate campaigns and broadcasts
Step 1: Set up locales in Customer.io
Add a language variant for each locale you plan to translate into before you create the automation. Hyperlocalise can only import and push locales that already exist on the message — the Customer.io API cannot create language variants. For Design Studio emails you can skip this step: push creates a missing language on the linked email automatically.- In Customer.io, open the broadcast or campaign message.
- Add each target language to the message. Note the locale key shown for each language (for example
en,fr-FR). - Save the message as a draft.
Step 2: Match project locales
Create or choose a native project whose locale tags match Customer.io.- Set the project source locale to the language of the default copy in Customer.io.
- Add a project target locale for each Customer.io language you will write back.
- Use the same tag as the Customer.io locale key or name (
fr-FRmatchesfr-FR). Matching is exact after hyphen/underscore normalization. There is no language fallback:esdoes not map toes-MX, andfrdoes not map tofr-FR. - Keep locked pairs on separate projects or omit the unused tag:
en-USis noten-GB,zh-CNis notzh-TW, andptis notpt-BR.
Step 3: Create the automation
- Open workspace Automations and select New Automation.
- Apply the Translate Customer.io Campaigns, Broadcasts, Newsletters & Transactional template, or add the Translate Customer.io Campaigns, Broadcasts, Newsletters & Transactional skill from Add Skill.
- Attach the native project from Step 2.
- Choose a scheduled or manual trigger. A schedule imports changed message actions. It does not push translations.
- Under Customer.io, set:
- Source locale (usually the project source). It must be the same language as the project source locale.
- Optional Broadcasts, Newsletters, and Transactional messages to limit import. Leave all empty to discover everything. Limit by campaign in the skill when needed.
- Existing translations: Only empty locales (default), Refresh imported locales, or Overwrite all locales
- Save the automation.
Import message actions
Run now or wait for the schedule. Import writes one source file per eligible action:- Campaign actions at
customer-io/campaigns/{campaign-slug}/{action-slug}.json, except email actions (HTML below). - Broadcast actions at
customer-io/broadcasts/{broadcast-slug}/actions/{action-slug}.json, except email actions. - Email actions at
customer-io/{broadcasts|campaigns|newsletters|transactional}/{slug}/{actions|contents}/{action-slug}.html, with subject and preheader in field blocks. They open in HTML File view. - Newsletter content at
customer-io/newsletters/{newsletter-slug}/contents/{content-slug}.json. - Transactional content at
customer-io/transactional/{message-slug}/contents/{content-slug}.json. - Push, SMS (including Twilio), WhatsApp, Slack, and in-app actions at the matching
.jsonpaths.
Review and push locales
- Translate and approve every visible string for a mapped locale on each action you plan to write back.
- Open a Customer.io file in the Content editor. The header shows Ingest and Push to Customer.io for that file. Choose Ingest to import the automation’s configured set, or Push to Customer.io when at least one mapped locale is fully approved and no push is already running. Hyperlocalise then opens the automation Run History tab so you can follow the run.
- Confirm Customer.io shows updated draft content for each locale. Push never publishes. For transactional messages it only updates message content — it never sends.
Change or remove access
Disconnect Customer.io from Integrations when this workspace should stop using that App API key. Inspect automations that depend on the connection before you disconnect. The key is stored in WorkOS Pipes; Hyperlocalise stores only the region.If import or push does not run
- Confirm Customer.io is connected with the correct US or EU region and the automation is Active.
- Confirm each target locale exists on the message in Customer.io (except Design Studio emails, where push can create a missing language).
- Confirm project locale tags match Customer.io locale keys or names exactly after hyphen/underscore normalization.
- If Push to Customer.io or Ingest is missing, open a Customer.io file. Those actions stay hidden on other files. Approve at least one mapped locale, confirm you can manage automations, and wait until any in-progress push finishes.
- Open Run History for the failed action or locale.

