Customer.io Customer.io
  • Log In
Book demo Start trial
  • Platform
  • Pricing
  • Customers
  • Docs

Request Demo Sign In
  • Get Started
    • Welcome to Customer.io
    • Quick start guide
    • Academy: Structured Learning
    • 1. Create your workspace
    • 2. Set up message channels
    • 3. Integrate with Customer.io
    • 4. Add people
    • 5. Send events and make segments
    • 6. Start sending campaigns and workflows
  • Journeys
    • Introduction to Journeys
    • People & Events
    • Objects & non-people data
    • Segmentation
    • Design Studio
    • Campaigns & Workflows
    • Message Channels
    • Liquid & Personalization
    • Metrics
  • Integrations
    • Integration Directory
    • Get Started
    • Data In
    • Data Out
    • APIs
      • Pipelines API
      • Track API
      • App API
      • Reporting Webhooks
      • Comparing the Pipelines and Track APIs
    • Mobile SDKs
      • iOS
      • Android
      • React Native
      • Expo
      • Flutter
    • Account Verification
    • Audit Logs
    • Billing
    • Your Account
    • Workspaces
    • Privacy & Security
    • Troubleshooting
  • AI Features
    • Use Customer.io with AI
    • Your Customer.io agent
    • Customer.io CLI
    • Customer.io MCP
    • Email content analysis
    • In-app message suggestions
    • In-app survey analysis
    • Use our docs with AI
  • Releases
    Releases

    Latest features at Customer.io

    Automatically clean up stale segments
    2026-06-30

    Auto-archive is an optional, workspace-level setting that archives unused dynamic segments. This helps you keep your list of segments up-to-date and …

    Automatically convert emails to Design Studio
    2026-06-29

    Use our converter tool to migrate emails made in the classic drag-and-drop editor to Design Studio, where you have access to more features like global …

    No-code notification inbox for your website
    2026-06-23

    We’ve made it easy to set up a notification inbox for your website, complete with messages styled to match your brand’s look and feel. You …

  • Welcome to Customer.io
  • Quick start guide
  • Academy: Structured Learning
  • 1. Create your workspace
  • 2. Set up message channels
  • 3. Integrate with Customer.io
  • 4. Add people
  • 5. Send events and make segments
  • 6. Start sending campaigns and workflows
  • Introduction to Journeys
      • People and their profiles
      • Add or update people
      • How to identify people
      • Manage customer attributes
      • Manage devices
      • Resolve duplicate people
      • What's the Last Visited field, and how do I use it?
      • Delete people and suppress profile IDs
      • Export a person's data
      • Export data for multiple people
    • Storing and using JSON
    • Events
    • Import people or events via CSV
      • Search for people
      • Filter Activity Logs
      • Using your Data Index
      • How do I know what data I have available?
      • Anonymous people
      • Anonymous activity
      • Merging anonymous activity
      • Anonymous events
    • How do I create multiple subscription types?
    • Shortcuts to external services
    • Overview: Objects vs Collections
      • Objects: how they work
      • Objects: video tutorials
      • Object types
      • Objects
      • Relationships
      • Import objects or relationships via CSV
      • Export objects or relationships via CSV
      • Objects and relationships in campaigns
      • Use objects in liquid
      • Upsell: monetize power users
      • Adoption: drive feature usage
      • Awareness: announce events
      • Conversion: activate people on your event waitlist
    • Collections
    • How segments work
    • Build segments with AI
    • Data-driven segments
    • Manual Segments
    • Create segments based on mobile devices
    • Ad Audiences
    • Timestamp Conditions
    • Using JSON in segments
    • Timestamp Conditions FAQ
    • Timestamp Rules for Building Segments
    • Why don't people match 'within the past X days' conditions?
    • Setting Up Segments for Specific Purposes
    • Welcome to Design Studio!
    • Manage your files
    • Convert emails to Design Studio
      • Keyboard shortcuts
        • Set global styles
        • Assign global styles to components
        • Dark mode
        • Responsive styles
        • Get started
        • Style individual messages
        • Add & preview liquid
        • Rules: Display content based on conditions
        • Get started
        • Validate your email
          • MJML framework
          • CSS inlining
          • Formatting
          • Set URL parameters for a single message
          • CSS cleanup
          • CSS variables
          • Accessibility fixes
        • Use Emmet syntax
        • Use MSO syntax
      • Preview email in Design Studio
        • Connect an email to an automation
        • Edit connected messages & publish changes
        • Disconnect an email from an automation
      • Understand components
      • Add components to your message
      • Understand and style standard components
        • How to create & edit a component
        • Create a component from scratch
        • Create modifiable, placeholder content
        • Style custom components
        • Delete a component
          • Understand syntax
          • Add conditionals & directives
          • Loop through data
          • Create a stylesheet
        • Migrate components from Parcel
      • How to collaborate
      • Submit & manage feedback
      • Manage version history
      • Send a test message
    • WhatsApp templates
    • Campaigns, broadcasts, and transactional messages
    • Tags
      • Campaign concepts & settings
      • Campaign journeys
      • Create a campaign
      • Campaigns page
      • Triggers, filters, and frequencies
      • When to use filters
      • Goals & conversion criteria
      • Exit conditions
      • Schedule a campaign
      • Change the state of a campaign
        • Why aren't people entering my campaign?
        • Why aren't people receiving my message?
        • Edit triggers, filters, or frequencies
        • Edit goals
        • Edit workflows
        • Webhook campaigns
        • Send event
        • Batch update
        • Follow up on NPS responses
        • Sync customers from Stripe to Customer.io
        • Campaign for syncing Mixpanel cohorts
        • Slack notification for support tickets
      • Grace periods
      • Our Recipe Book
      • Send a Welcome Email
      • Birthday and Anniversary Campaigns
      • Cart Abandonment
      • Double Opt-In
      • Onboarding Campaign
      • Optimize emails with Just Words
      • Trial expiration reminders
      • Cohort tests
      • Trigger campaigns based on Roles
      • RSS Feed Email Campaign
      • Reminders for multiple upcoming trips
      • Delete inactive people
      • Introduction to broadcasts
      • Newsletters
      • API-triggered broadcasts
      • Personalize messages with trigger data
      • Format API-Triggered Broadcasts
      • Edit live API-triggered broadcasts
      • Common API-Triggered Broadcast errors
      • Getting started: key concepts
      • Set up a transactional email
      • Set up a transactional push
      • Set up a transactional in-app message
      • Set up a transactional SMS
      • Transactional examples
      • Common transactional API errors
      • Frequently Asked Questions
      • Campaigns with transactional messages
      • Workflow builder
      • LLM actions: Generate data & decisions with AI
      • Send event
      • Batch update
      • Conditions
      • Holdout tests
      • A/B tests
      • Copy workflow items
        • Create or update person
        • Set journey attributes
        • Fix inconsistent attribute names
        • Reformat timestamp attributes
        • Types of branches
        • Multi-Split Branches
        • Random Cohorts
        • True/False Branches
        • Exit Blocks
        • Time Window
        • Wait Until...
        • Randomized delay
        • Send and receive data with webhook actions
        • Configure reusable webhooks
        • Send in-app messages using webhooks
        • Web push with webhooks
        • Send direct mail with Lob
      • Default sending settings
      • Sending behavior options
      • Queue Draft for Campaign QA
      • Geolocation and time zone data
      • Recommended send time
      • Send messages in users' time zones
      • Supported time zone formats
      • Message Limits
      • Email: Getting Started
      • Transitioning to Customer.io as a sender
      • Introduction to Creating Emails
      • Test your emails
      • Email Attachments
        • Email Deliverability Best Practices
        • Domain Authentication
        • Delete a domain
        • Domain warming
        • Track links with your domain
        • IP addresses: shared vs dedicated
        • Spamhaus blocklist listings
        • How to manage suppressions
        • Email suppression lists
        • Google Postmaster Tools
        • Custom unsubscribe links (RFC 8058)
        • Authenticating for Apple Private Email Relay
        • Set up anonymized email relay addresses
        • Verify deliverable email addresses with Kickbox
          • Use Your Own SMTP Server
          • Using Multiple SMTP servers
          • Use your Mailgun Account
          • Use your Mailjet Account
          • Use your Mandrill Account
          • Use your Postmark Account
          • Use your SendGrid Account
          • Use your Sparkpost Account
          • Use your Oracle Dyn Account
        • Choose the right email editor
        • Drag-and-Drop Emails: The Basics
        • Drag-and-Drop Editor FAQ
        • Troubleshooting Your Drag-and-Drop Emails
        • Email code editor
        • Introduction to Email Layouts
        • Customizing Email Layouts
        • Archive layouts
        • HTML and CSS Email vs. Web
        • CSS pre-processing
        • AMP for email
        • Adding a view in browser link
        • Resources for templates, code, and best practices
        • Adapting Foundation's Basic template
        • Adapting MailChimp's Two-Column template
        • How do I add an avatar/logo to my emails?
        • Set Custom Email Headers
        • Set custom preheader/preview text
        • What does the Fake BCC option do?
        • Create multiple from addresses
        • Welcome Email Copy
        • Gmail Promotions
        • Code editor: send Trustpilot reviews
      • Get started
      • Integrate your app
      • Migrate from another provider
      • Registering device tokens
      • Send push notifications
      • Custom push payloads
      • Test push notifications
      • Push metrics and message statuses
      • Best practices for push notifications
      • Frequently Asked Questions
      • Troubleshooting mobile issues
      • Get Started
      • Send SMS/MMS messages
      • Link shortening
        • Getting started
        • Inbound statuses and activities
        • Respond to inbound keywords
      • Senders
      • Tracking
      • Frequently Asked Questions
      • Smart character encoding
      • Opt-out keyword handling
      • Validate Mobile Phone Numbers
        • Getting a phone number
        • Update your privacy policy for SMS
        • Build a compliant SMS opt-in form
        • Brand and campaign registration
        • Opt-in and out flow
        • What kind of phone number do I need?
        • HIPAA compliance and privacy regulations
      • Get started
      • Set up your website
      • Send in-app messages
      • Global styles for in-app messages
        • Get started
        • Send inbox messages
        • Trigger inbox messages from your backend
        • Inbox message metrics
          • Overview
          • Compose JSON messages
          • Display inbox messages in your app
        • Anonymous messages
        • Forms
        • FAQ
        • Forms
        • Lead capture
        • Surveys
      • Inline messages
      • Multi-step messages
      • In-app metrics
      • Test your messages
      • Localize messages
      • In-App FAQ
        • NPS Surveys
        • Promotions and offers
        • Promote upcoming event
        • Milestones and achievements
        • Feature adoption
        • The visual editor
        • In-app component reference
        • Legacy in-app editor
      • Get Started
      • Create content templates
      • Send a WhatsApp Message
      • WhatsApp metrics and reporting
        • Getting started
        • Respond to inbound messages
        • Inbound statuses and activities
      • Frequently Asked Questions
      • Get Started
      • Send messages
      • LINE metrics and reporting
      • Get Started
      • Translate your messages
      • Set up your localization attribute
      • Track metrics for translations
      • Link Tracking
      • Checking Link Status
      • Adding URL parameters to links
      • Track universal links and app links in email
      • HTTPS Link Tracking
      • Overview of subscription options
      • Global unsubscribes
      • The subscription center
      • Brand your subscription pages
      • Subscription FAQs
      • Manage subscription preferences
      • Subscription preference metrics
      • Multi-language support for the subscription center
      • Migrate subscription preferences
      • Set preferences outside of the subscription center
    • Find messages using the Message Library
    • Assets library: store files
    • Image requirements
    • Message Statuses
    • Deliveries & Drafts data
    • Personalize messages with liquid
    • Liquid upgrade
    • Liquid syntax list
    • Liquid recipes
    • Personalize actions with JavaScript
    • Reusing content with snippets
    • Composer errors
    • Metrics Overview
    • Goals
    • Campaign and Broadcast Metrics
    • Home dashboard
    • Workspace Performance dashboard
    • Analysis page & reports
    • Email deliverability metrics
    • Understanding your A/B test results
    • Getting conclusive results from A/B tests
    • Failed and attempted messages
  • Integration Directory
    • Quick start guide
    • Understanding Integrations in Customer.io
    • Troubleshooting
    • Data Compliance and Privacy
    • Introduction
      • Understanding incoming data
      • Identify
      • Group
      • Page
      • Screen
      • Track
      • Alias
      • Common fields
    • Custom events
      • Understanding Semantic Events
      • A/B Test events
      • Customer.io events
      • Ecommerce Events
      • Email events
      • Live chat events
      • Mobile App Lifecycle Events
      • Video playback events
    • Backfill historical data
    • Proxying requests to Customer.io
      • Customer.io API
      • Journeys Message Metrics
      • Mobile App Sources
        • Get started
        • Formstack
        • Jotform
        • Squarespace
        • Typeform
        • Unbounce
        • Webflow
        • Wordpress with WPForms
        • Custom JS integrations
        • Facebook Lead Ads
        • Use form data in Customer.io
        • Forms API (backend integrations)
        • Edit or disconnect forms
        • Getting Started
        • JavaScript Frameworks
        • Method Reference
        • Migrate from another service
        • Managing identities
        • Cookies and identity management
        • Utility Methods and Performance
        • In-app messages
        • Notification inbox
        • Content Security Policy (CSP)
        • Proxying the JavaScript client
          • Get started
          • Identify people
          • Track and page events
          • In-app messages
          • Content Security Policy (CSP)
        • Add a Classic Track API integration
        • Mapping Customer.io to outgoing integrations
        • Advanced: transform data
        • Invalid Track API Requests
        • Get started
        • Map HubSpot data to Customer.io
        • Filter incoming data
        • Deleting Data
        • HubSpot forms
        • About Reverse ETL
        • Amazon Redshift
        • Google BigQuery
        • Microsoft SQL Server
        • MySQL
        • PostgreSQL
        • Snowflake
          • Reverse ETL Overview
          • Amazon Redshift
          • Google BigQuery
          • Microsoft SQL server
          • MySQL
          • PostgreSQL
          • Snowflake
        • Getting Started
        • Map Salesforce data to Customer.io
        • Map data to other services
        • Scheduled syncs
        • Deleting Data
        • API Call Calculator
        • Node.js
        • Python
        • Go
        • Segment
        • Segment data-in (classic)
        • Rudderstack
        • mParticle (Legacy)
        • Using Zapier with the Track API
        • Zoho integration
        • Hubspot integration
    • Getting Started
    • Add a data-out integration
    • Actions
    • Action triggers: code mode
      • Introduction
      • Standard integrations
      • Advanced Integrations
    • Filtering and mapping actions
    • Resend past data
      • Actable Predictive
      • Adobe Target
      • Algolia Insights
      • Amazon Redshift
      • Amazon Redshift (Advanced)
      • Amazon S3
      • Amazon S3 (Advanced)
      • Amplitude
      • Amplitude (Message Metrics)
      • Attio
      • Azure blob storage
      • Bing Ads
      • Braze
      • Braze Cohorts
      • Clevertap
      • Close
      • CommandBar
      • Cordial
      • Criteo Audiences
      • Customer.io
      • Facebook Conversions API
      • Friendbuy
      • FullStory
      • Gainsight PX
      • Google Ad Conversions
      • Google Ads (Gtag)
      • Google Analytics
      • Google BigQuery
      • Google BigQuery (Advanced)
      • Google Cloud Storage
      • Google Cloud Storage (Advanced)
      • Google Sheets
      • Google Tag Manager (GTM)
      • Heap
      • HubSpot
      • Intercom
      • Koala
      • LaunchDarkly
      • LiveLike
      • LogRocket
      • Meta (Facebook) Pixel
      • Metronome
      • Mixpanel
      • Mixpanel (Message Metrics)
      • MoEngage
      • MS Azure Blob Storage (Advanced)
      • Pinterest Conversions
      • Pipedrive
      • PlayerZero
      • Qualtrics
      • Reporting Webhooks
      • Ripe
      • Rudderstack (legacy)
        • About this integration
        • Sent messages as tasks
        • Frequently Asked Questions
      • SalesWings
      • Segment
      • Segment (Message Metrics)
      • SendGrid Marketing Campaigns
      • Slack
      • Snowflake
      • Snowflake (Advanced)
      • Sprig
      • Talon.One
      • TikTok Conversions
      • Twilio
      • Twilio Engage Messaging
      • Twilio Studio
      • Twitter Pixel
      • Visual Website Optimizer (VWO)
      • Webhooks
      • Wisepops
      • Yandex
      • Zendesk
    • About our APIs
    • Comparing the Pipelines and Track APIs
    • Pipelines API
    • Track API
    • App API
    • Design Studio: HTML best practices
    • Journeys Webhooks
      • Quick Start Guide
        • How it works
        • Authentication
        • Packages and Configuration Options
        • Swift 6
        • Troubleshooting
        • Identify people
        • Track events
        • Screen tracking
        • Mobile Lifecycle events
        • Anonymous activity
        • Location tracking
        • Set up push notifications
        • Set up rich push
        • App Groups for push tracking
        • Deep Links
        • Push metrics
        • Sound in push notifications
        • Provisional Push
        • Push service certificates
        • Test your push implementation
        • Set up in-app messaging
        • Inline in-app messages
        • Page rules
        • In-app event listeners
        • Notification inbox
        • 4.x -> 4.4.0
        • 3.x -> 4.0.0
        • 3.x -> 3.13.0
        • 3.x -> 3.9.0
        • 2.x -> 3.x
        • 1x -> 2.x
        • Changelog
        • Quick Start Guide
          • How it works
          • Authentication
          • Packages and Configuration Options
          • Troubleshooting
          • Identify people
          • Track events
          • Screen tracking
          • Mobile Lifecycle events
          • Anonymous activity
          • Set up push notifications
          • Set up rich push
          • Deep Links
          • Push metrics
          • Sound in push notifications
          • Provisional Push
          • Push service certificates
          • Test your push implementation
          • Set up in-app messaging
          • Inline in-app messages
          • Page rules
          • In-app event listeners
          • 3.x -> 3.13.0
          • 3.x -> 3.9.0
          • 2.x -> 3.x
          • 1x -> 2.x
          • Changelog
        • Get Started
        • Identify people
        • Track events
        • Push notifications
        • Rich push notifications
        • In-app messages
        • Test support
        • Changelog
        • Get Started
        • Identify people
        • Track events
        • Push notifications
        • In-app messages
        • Test support
        • Update from 2.10 to 2.11
        • Migrate from an earlier version
        • Troubleshooting
        • Changelog
      • Quick Start Guide
        • How it works
        • Authentication
        • Packages and Configuration Options
        • Troubleshooting
        • Identify people
        • Screen tracking
        • Mobile Lifecycle events
        • Anonymous activity
        • Track events
        • Location tracking
        • Push notifications
        • Deep Links
        • Channel
        • Push service certificates
        • Test your push implementation
        • In-app messages
        • In-app event listeners
        • Inline in-app messages
        • Page rules
        • Notification inbox
        • 4.x -> 4.10
        • 3.x -> 4.x
        • 2.x -> 3.x
        • Changelog
        • Get Started
        • Identify people
        • Track events
        • Push notifications
        • In-app messages
        • Test support
        • Migrate from an earlier version
        • Troubleshooting
        • Changelog
        • Get Started
        • Identify people
        • Track events
        • Push notifications
        • Rich push notifications
        • Test support
        • Migrate from an earlier version
        • Changelog
      • Quick Start Guide
        • How it works
        • Authentication
        • Packages and Configuration Options
        • Troubleshooting
        • Identify people
        • Track events
        • Screen tracking
        • Mobile Lifecycle events
        • Anonymous activity
        • Location tracking
        • Set up push notifications
        • App Groups for push tracking
        • Deep Links
        • Handling Multiple Push Providers
        • Capture Push Metrics
        • Android channels
        • Set up in-app messages
        • Inline in-app messages
        • In-app event listeners
        • Notification inbox
        • 6.x -> 6.4.0
        • 5.x -> 6.0.0
        • 4.x -> 5.0.0
        • 4.x -> 4.3
        • 3.4x -> 4.x
        • 3.x -> 3.4
        • 2.x -> 3.x
        • Changelog
        • Quick Start Guide
          • How it works
          • Authentication
          • Packages and Configuration Options
          • Troubleshooting
          • Identify people
          • Track events
          • Screen tracking
          • Mobile Lifecycle events
          • Anonymous activity
          • Set up push notifications
          • Deep Links
          • Handling Multiple Push Providers
          • Capture Push Metrics
          • Android channels
          • Set up in-app messages
          • Inline in-app messages
          • In-app event listeners
          • 4.x -> 4.3
          • 3.4x -> 4.x
          • 3.x -> 3.4
          • 2.x -> 3.x
          • Changelog
        • Quick Start Guide
          • How it works
          • Authentication
          • Packages and Configuration Options
          • Troubleshooting
          • Identify people
          • Track events
          • Screen tracking
          • Mobile Lifecycle events
          • Anonymous activity
          • Set up push notifications
          • Deep Links
          • Handling Multiple Push Providers
          • Capture Push Metrics
          • Android channels
          • Set up in-app messages
          • Inline in-app messages
          • In-app event listeners
          • 4.x -> 5.0.0
          • 4.x -> 4.3
          • 3.4x -> 4.x
          • 3.x -> 3.4
          • 2.x -> 3.x
          • Changelog
        • Get Started
        • Identify people
        • Track events
          • Set up push notifications
          • Deep Links
          • Handling Multiple Push Providers
          • Capture Push Metrics
          • Set up in-app messages
          • In-app event listeners
          • Migrate from an earlier version
          • Troubleshooting
          • Changelog
        • Get Started
        • Identify people
        • Track events
          • Set up push notifications
          • Deep Links
          • Handling Multiple Push Providers
          • Capture Push Metrics
          • Set up in-app messages
          • In-app event listeners
          • Migrate from an earlier version
          • Update to version 3.4
          • Troubleshooting
          • Changelog
      • Quick Start Guide
        • How it works
        • Authentication
        • Packages and Configuration Options
        • Troubleshooting
        • Identify people
        • Track events
        • Screen tracking
        • Mobile Lifecycle events
        • Anonymous activity
        • Location tracking
        • Set up push notifications
        • App Groups for push tracking
        • Deep Links
        • Capture Push Metrics
        • Android channels
        • Multiple push providers
        • Inline in-app messages
        • Notification inbox
        • Set up in-app messages
        • In-app event listeners
        • 3.x -> 3.3
        • 2.x -> 3.x
        • 1x -> 2.x
        • Changelog
        • Get Started
        • Identify people
        • Track events
          • Set up push notifications
          • Deep Links
          • Capture Push Metrics
          • Set up in-app messages
          • In-app event listeners
          • Troubleshooting
          • Changelog
      • Quick Start Guide
        • How it works
        • Authentication
        • Configuration Options
        • Troubleshooting
        • Identify people
        • Mobile Lifecycle events
        • Anonymous activity
        • Screen tracking
        • Track events
        • Location tracking
        • Set up push notifications
        • App Groups for push tracking
        • Deep links
        • Handling multiple push providers
        • Capture push metrics
        • Android channels
        • In-app messages
        • Inline in-app messages
        • Notification inbox
        • In-app event listeners
        • 3.x -> 4.0.0
        • 3.x -> 3.5.0
        • 2.x -> 3.0.0
        • 2.x -> 2.2
        • Upgrade to Flutter 2.x
        • Changelog
        • Quick Start Guide
          • How it works
          • Authentication
          • Configuration Options
          • Troubleshooting
          • Identify people
          • Mobile Lifecycle events
          • Anonymous activity
          • Screen tracking
          • Track events
          • Set up push notifications
          • Deep links
          • Handling multiple push providers
          • Capture push metrics
          • Android channels
          • In-app messages
          • Inline in-app messages
          • In-app event listeners
          • 2.x -> 2.2
          • Upgrade to Flutter 2.x
          • Changelog
        • Get Started
        • Identify people
        • Track events
        • Update Flutter SDK
          • Set up push notifications
          • Deep Links
          • Handling Multiple Push Providers
          • Capture Push Metrics
          • In-app messages
          • In-app event listeners
          • Update iOS
          • Troubleshooting
          • Changelog
  • Account Verification
  • Audit logs
  • Tasks: Workspace performance
    • How We Bill
    • Billing for SMS messages
    • Billing for WhatsApp messages
    • AI credits
    • Reducing billing overages
    • Payment Problems
    • Canceling Your Account
    • Plan Features
    • Builder plan
      • How to add team members
      • Assign standard roles
      • Create & assign custom roles
    • Switch between accounts
    • Edit Account Information
    • Customize your UI
    • Manage your API credentials
    • Security Best Practices
    • Two-Factor Authentication
    • Single Sign-on (SSO)
    • Account Regions (US and EU)
    • Enable experimental features
    • Workspaces in Customer.io
    • Understand timezone conversion
    • Case sensitivity and your data
    • Search your workspace
    • Session cookies and expiration
    • Allowlist our IP addresses
    • Customer.io, GDPR, and you!
    • Security
    • Mobile and App Store Privacy
    • Privacy
    • Respecting your users' privacy
    • AI settings
    • Customer.io Security Qualifications
    • Troubleshooting login and browser issues
    • Create a HAR file for help troubleshooting
  • Use Customer.io with AI
    • Ask the agent
    • Custom skills
    • Routines
    • Segment builder
    • Troubleshooting and feedback
    • Get started
    • Service accounts
    • Command reference
    • Get Started
    • ChatGPT setup
    • Claude setup
    • Cursor and other IDEs
    • Update your MCP client
  • Email content analysis
  • In-app message suggestions
  • In-app survey analysis
  • Use our docs with AI
This page is part of the Customer.io documentation. For the complete documentation index, see llms.txt.
integrations/data-in/connections/classic-api/typical-mappings.md

11

Mapping Customer.io to outgoing integrations

Updated June 27, 2025

How it works

When we receive traffic from some integrations, like the Track API, we translate them to our newer and more generic Pipelines format to better support downstream, data outAn integration that sends data out of Customer.io. integrations. This might be a little confusing when you send data in to Customer.io with one format, and then see the resulting Data Out calls in a different format!

This page explains how we map the Track API to our Pipelines API for data out integrations, to help you understand how your data transforms as we send it out of Customer.io. You can even change the way we map your data to destinations if you need to.

How the Track API maps to the Pipelines API

The Track and Pipelines APIs are very similar. In many cases, they share the same “method” names—they both identify people, track events, and so on. This makes it easy to map calls from the Track API to Pipelines, but we discuss mappings in greater detail in the sections below.

The Journeys Track API doesn’t have a group method; rather, it handles group calls with a cio_relationships object in identify calls. We discuss this in greater detail in the Group calls section below, but this means that the Journeys Track API identify method with cio_relationships in the payload will produce two calls to Pipelines: one identify call and one group call.

Pipelines API callJavaScript Client methodTrack v1 API callTrack v2 API call
Identifyidentify/v1/identify/{customer_id}Any object where "type": "person" and "action" is "identify"
Tracktrack/v1/customers/{customer_id}/eventAny object where"type": "person" and "action" is "event", "add_device", or "remove_device"
Pagepage/v1/customers/{customer_id}/event where "type": "page"Any object where "type": "person", "action": "page"
ScreenN/A/v1/customers/{customer_id}/event where "type": "screen"Any object where "type": "person", "action": "screen"
GroupN/A/v1/identify/{customer_id} containing cio_relationshipsAny object where type: "group","action": "add_relationship", or "action": "delete_relationship"
AliasN/A/v1/merge_customers"type": "identify", "action": "merge"
SuppressN/A/v1/customers/{customer_id}/suppressAny object where "type": "person", "action": "suppress"
UnsuppressN/A/v1/customers/{customer_id}/unsuppressAny object where "type": "person", "action": "unsuppress"

 Some Track API calls don’t map neatly to downstream destinations

There are a couple of sparsely-used Track API calls that don’t have an analog in Pipelines and therefore don’t map neatly to downstream destinations:

  • Calls that add or remove people from manual segments
  • Custom unsubscribe calls

Mapping Track v2 calls

The Track v1 API includes methods that generally map to our Pipelines API—they both have methods to identify, track, send page events, etc.

The Track v2 API uses the type and action keys to dictate an action. We use these keys to map actions to Pipelines. For example, if the v2 action is identify and type is person, that represents a Pipelines identify call. If the type is object, that represents a group call.

Pipelines API methodTrack v2 API typeTrack v2 API action
Identifypersonidentify
Groupobjectidentify or add_relationship
Grouppersonadd_relationship
Trackpersonevent
Pagepersonpage
Screenpersonscreen
Aliaspersonmerge
flowchart TD a(Incoming Track API v2 call)-->b(type: person) b-->f(action: identify)-->t(identify) b-->g(action: event)-->u(track) b-->h(action: page)-->v(page) b-->i(action: screen)-->w(screen) b-->k(action: merge)-->x(alias) b-->j(action: add_relationship)-->y a-->c(type: object)-.->d(action: identify)-->y(group) c-.->e(action: add_relationship)-->y

Identify

The Track v1 API includes an identify method that maps cleanly to the identify method in Pipelines. We map Track v2 calls to the Pipelines identify method when type is person and action is identify.

For a typical identify call, we map any keys that aren’t identifiers to traits. The lone exception is cio_relationships: we don’t pass this key in identify calls, but rather send a separate group call to set relationships. See Group calls below for more information.

flowchart LR a(Incoming Journeys
identify API call) a-->b(identify) a-->c{"does call include
cio_relationships?"} c-.->|Yes|d(group)
Track v1 API CallPipelines Result
_cio.identify('customer-id', {
  "email": "customer@example.com",
  "created_at": 1361205308,
  "first_name": "Bob",
  "plan": "basic"
})
{
  "type": "identify",
  "traits": {
    "created_at": 1361205308,
    "first_name": "Bob",
    "plan": "basic"
  },
  "userId": "97980cfea0067",
  "integrations": {
    "All": true,
  },
  "sentAt": "2023-08-24T14:15:22Z",
  "messageId": "01H95X6RDPC4P9DHPC0JX52YKE",
  "timestamp": "2023-08-24T14:15:22Z",
  "context": {
    "journeys": {
      "identifiers": {
        "id": "customer-id",
        "email": "customer@example.com"
      }
    }
  }
}

Track, page, and screen events

The Track v1 API includes a track method that maps cleanly to Pipelines track method. The Track v1 API doesn’t have methods for page and screen events. Rather, you’ll send standard track events with a type of page or screen. These map to the Pipelines page and screen methods respectively.

flowchart TD a(Incoming Journeys
track API call) a-->b(type: page)-->c(page) a-->d(type: screen)-->e(screen) a-->f(type is event)-->g(track) a-->h(type is not set)-->g a-->i(type is not
page or screen)-->g

The Track v2 API works similarly. We map Track v2 calls to Pipelines track, page, and screen methods when the incoming type is person and the action is event, page, or screen respectively.

The event name maps directly to the event key in the Pipelines API. The data object in your event call maps to the properties key in the Pipelines API. For page calls, the event name is typically the URL of the page a person viewed. For screen calls, the event name is typically the name of the screen in your app.

Track v1 API CallPipelines Result
curl --request POST \
  --url https://track.customer.io/api/v1/customers/customer-id/events \
  --header "Authorization: Basic $(echo -n site_id:api_key | base64)" \
  --header 'content-type: application/json' \
  --data '{"name":"Started Game","data":{"game":"checkers","moves":0}}'
{
  "type": "track",
  "event": "Started Game",
  "properties": {
    "game": "checkers",
    "moves": 0
  },
  "userId": "customer-id",
  "integrations": {
    "All": true,
  },
  "sentAt": "2023-08-24T14:15:22Z",
  "messageId": "01H95X6RDPC4P9DHPC0JX52YKE",
  "timestamp": "2023-08-24T14:15:22Z",
  "context": {
    "journeys": {
      "identifiers": {
        "id": "customer-id",
      }
    }
  }
}

Semantic Events

A number of default actionsThe source event and data that triggers an API call to your destination. For example, an incoming identify event from your sources adds or updates a person in our Customer.io Journeys destination. for data out integrations are based on the event name in a track call. We call these semantic events. If you send events with names and structures corresponding to our semantic events, you’ll be able to use our default actions in destinations without any extra work.

For example, we typically use an event name called Application Installed to trigger the Add Device action in destinations.

Track API CallSemantic event
{
  "name": "Application Installed",
  "data": {
    "version": 1.2.3,
    "build": "v8"
  }
}
{
  "userId": "abcde12345",
  "type": "track",
  "event": "Application Installed",
  "properties": {
    "version": "1.2.3", 
    "build": "v8"
  }
}

Group calls (cio_relationships)

In Customer.io Journeys, we refer to groups as objectsAn object is a non-person entity that you can associate with one or more people—like a company, account, or online course.. The Journeys Track API and associated integrations don’t have a specific endpoint to create groups. Instead, we base “group” calls on payloads of the Track API:

  • Track v1 API: identify method containing cio_relationships.
  • Track v2 API: Where type is object or whenever action is add_relationship.

Because the Track API revolves around people, the calls in which you set relationships will result in two actions in Pipelines: one identify call and one group call.

While an identify call including cio_relationships will result in two actions (identify and group), we’ll just show the resulting group call in the example below.

Track v1 API CallData out integration Result
curl --request PUT \
  --url https://track.customer.io/api/v1/customers/example-person-id \
  --header "Authorization: Basic $(echo -n site_id:api_key | base64)" \
  --header 'content-type: application/json' \
  --data '{
    "email": "person@example.com",
    "cio_relationships": {
        "action": "add_relationships",
        "relationships": [
            {
                "identifiers": {
                    "object_type_id": "1",
                    "object_id": "acme"
                }
            }
        ]
    },
  }'
{
  "userId": "97980cfea0067",
  "groupId": "acme",
  "traits": {},
  "integrations": {},
  "messageId": "01H95X6RDPC4P9DHPC0JX52YKE",
  "timestamp": "2023-08-23T22:28:55.111Z,",
  "context": {
    "journeys": {
      "identifiers": {
        "id": "example-person-id"
      }
    }
  },
  "receivedAt": "2023-08-23T22:28:55.387Z,",
  "type": "group"
}

Context from the Track API

Payloads for the Pipelines API contain a context object including information about the source of the data. For data coming in through our Track API (including integrations like our classic JavaScript snippet), the context contains a child object called journeys with identifiers from the original call. This can help you understand which calls were made from the Track API (or our associated libraries).

The context object contains a journeys.identifiers object with identity information for the person or group represented in the original call.

{
  "context": {
    "journeys": {
      "identifiers": {
        "object_type_id": "1",
        "object_id": "acme",
        "id": "42",
      }
    }
  }
}
Copied to clipboard!
    • How it works
    • How the Track API maps to the Pipelines API
      • Mapping Track v2 calls
    • Identify
    • Track, page, and screen events
      • Semantic Events
    • Group calls (cio_relationships)
    • Context from the Track API
Download .md
Is this page helpful?

How can we make it better?

No
Yes
Please provide a valid email address

We appreciate your feedback!

Our support team will contact you as soon as possible


Platform
  • Platform overview
  • Platform features
  • Journeys
  • Data Pipelines
  • Parcel
  • Pricing
Resources
  • Documentation
  • Release Notes
  • Blog
  • Community
  • Competitors
  • API
  • Guides
Company
  • About
  • Careers
  • Support
  • Partners
  • Startup Program
  • Contact
Customer.io
win@customer.io

9450 SW Gemini Dr
Suite 43920
Beaverton, Oregon 97008-7105 US
LinkedIn
Twitter (X)
Youtube
Instagram
Status Terms of Service Privacy Policy @2024 Peaberry Software, Inc.