If you want to send user events from Segment to Customer.io and trigger automated emails, here’s what matters: a clean setup, Customer.io as a Segment destination, and the right API keys. That’s it.
Screw that up, and your campaigns won’t fire. Your data won’t sync. Your team will blame the tools.
Propel is a Platinum Customer.io Partner - so we don't just have experience, we've mastered customer.io and segment set ups!
This guide shows you how to wire it up the right way - from first click to live events.
So we’ll cover:
You came for answers. Let’s get you shipping.
Customer.io is a messaging platform that lets you trigger campaigns based on user actions. You can send emails, push, SMS, or in-app messages - driven by real-time data.
Before you ask, "is customer.io a CDP?"...
No, it’s not a CDP.
A CDP collects, unifies, and routes customer data across tools.
Customer.io is a messaging platform - it reacts to that data to trigger emails, SMS, and push notifications.
You send events to Customer.io, and it reacts instantly. You can trigger campaigns, personalize messages, and target data-driven segments automatically.
Customer.io doesn’t store all your data; it listens, filters, and fires. Segment tracks. Customer.io talks. Together, they’re your growth engine - if you wire them up right.
Segment is a Customer Data Platform (CDP) that tracks what users do across your app, site, and backend.
It collects anonymous events, traits, and IDs, then sends them to tools like Customer.io. You can create segments based on behavior, traits, or both.
It uses the 'Identify' method to attach data to real users. Segment’s job? Pipe clean, real-time data to destinations, like Customer.io, as a Segment source. One tool tracks, the other talks. Don’t confuse them.
Yes - Customer.io is an official Segment destination, and the setup is fully supported. Segment sends track, identify, and group calls, including anonymous events from Segment, directly to Customer.io.
The flow is one-way: Segment to Customer.io, never the other way around.
You can send email events, traits, and page views. Both Segment’s classic integration with Customer.io and the newer Destination Actions feature are available.
Setup is fast. Just plug in your API keys, test events, and watch data flow. Here's Segment’s docs if you need receipts.
You need a Segment workspace (Free works, but Team gives you more control) and a Customer.io account with API access.
After copying the API Key and Site ID from Customer.io, make sure that no extra spaces are copied over. These credentials link your Segment data to the correct Customer.io workspace, so any errors here can result in misdirected or missing data.
Use the identify method to link traits to users early- don’t rely on anonymous junk. Keep segment membership clean: consistent userId
, no weird casing, no duplicates.
Garbage in = broken campaigns.
If you're looking for a seamless set up, better to work with a certified customer.io partner.
Here’s how to wire up Segment and Customer.io without breaking your data, your campaigns, or your team’s trust. This is the only segment destination actions integration guide you need.
Before we begin with the steps, just know, the steps are not very complex, but as a fresher, they could be overwhelming for you. Feel free to get help from customer.io agency partners. They not only simplify the process for you but also ensure a seamless execution.
Segment sends event and trait data directly to Customer.io as a Segment destination. This isn't a webhook or a workaround - it’s a native, production-ready pipeline. You configure it once, and it powers every campaign trigger that follows.
Setup time? Under 15 minutes if you’ve done this before. Longer if you skip steps.
Note on Destination Actions vs. Legacy Version: When selecting the destination in Segment, be sure to choose Destination Actions, not the legacy version of Customer.io.
The new Customer.io segment destination actions feature offers more powerful features, including enhanced event processing, segmentation capabilities, and real-time data syncing.
You’ve now enabled Customer.io as a Segment destination. Data will move automatically - no cron jobs, no guesswork.
Start by sending what matters:
track()
to send events like Signed Up
, Viewed Pricing
, Added to Cart
identify()
to attach traits like plan_type
, is_trial
, email
Track Events: When you track events (e.g., Signed Up
, Viewed Pricing
, Added to Cart
), Segment sends these events to Customer.io, where they can trigger campaigns. Make sure each event name is clean and descriptive. For instance:
analytics.track('Signed Up', { plan_type: 'Pro' });
Events like this can trigger onboarding campaigns, upsell emails, or special promotions based on user actions.
Page and Screen Events: Besides track(), Segment also supports page() and screen() events. These are important for tracking user actions such as page views or screen views in mobile apps, and they send events to Customer.io to trigger campaigns based on user interactions.
// Page event example
analytics.page();
// Screen event example (for mobile apps)
analytics.screen('Home');
Identify Users Early: As mentioned, you should always call identify() immediately after you track events for an anonymous user. This ensures that the data is tied to a real user profile when they sign up. For example:
analytics.identify('userId123', { email: 'john.doe@example.com', plan_type: 'Pro' });
This is where you go from “data flowing” to “revenue flowing.”
Before users sign up, all events are tied to anonymousId
. After signing up, you send anonymous events and then immediately call identify()
to bind them to a real userId
.
If you skip this step, you’ll fragment profiles, bloat your system, and never know who actually converted. For example:
// First, track the eventanalytics.track('Viewed Pricing', { plan_type: 'Pro' });// Then identify the user after they sign upanalytics.identify('userId123', { email: 'john.doe@example.com' });
Here’s how you know it’s working:
email
, plan_type
, etc.?In addition to checking the Event Delivery Debugger in Segment and verifying with Customer.io Logs, here’s a suggestion to enhance the troubleshooting process:
plan_type
, is_trial
, etc., are appearing correctly in Customer.io’s Activity Logs.If these traits are missing or inconsistent, it might mean the identify() method wasn't used properly or the data wasn’t passed in the right format.
The final check? Open a campaign, choose a box next to each segment, and preview who qualifies. If it’s empty, you’ve got a problem upstream.
This is your foundation. Nail this setup, and everything else - campaign triggers, segment membership, even removing people from manual segments - just works.
Customer.io can’t automate anything unless you send it the right signals. These are the events and traits that make segmentation work and trigger campaigns without guesswork. Get this wrong, and you’ll be stuck updating people in Customer.io by hand. Forever.
These are the backbone of your automation. If you’re not tracking these, don’t bother building campaigns:
Signed Up
– starts onboardingViewed Feature
– used for engagement nudgesClicked CTA
– great for winback flowsTraits make your segments smart. Send these with every identify()
:
plan_type
– target by pricing tieris_trial
– split trial vs. paidchurn_risk_score
– fire alerts or winbacksUse them to personalize messages or create segments based on the customer lifecycle. This is how you make data-driven campaigns, not blast emails. This is how you stop guessing.
Bad segments cost money. Build clean ones.
last_seen < 7 days
to define engagementis_trial
, trial_started_at
) to shape flowsKeep your list of segments clean. No duplicates. No bloated junk from 2022. Every new segment should have a job - or it doesn’t belong.
This isn’t just an integration. It’s the switch that turns your data into revenue.
When you treat Customer.io as a Segment source, you’re reacting to user behavior the second it happens. No stale lists. No weekly exports. Just real-time campaigns that work while you sleep.
To enable this feature,
Trigger onboarding emails the moment a Signed Up
event hits Segment. Use traits like plan_type
and signup_source
to branch flows - free trial users get a guided tour, paid users get a feature deep-dive. Precision beats drip every time. Every campaign trigger maps to a real-time decision.
Catch the Started Checkout
event. If there’s no Purchased
within 30 minutes, fire a reminder. Add traits like cart_value
to prioritize high-ticket carts. Segment detects intent. Customer.io follows up. You send email events instantly - no batch delays, no guesswork.
Low activity? Use traits like last_seen
, session_count
, or ignored features to trigger helpful nudges. Let Customer.io add people to manual segments or dynamically include them in data-driven segments automatically. Push blog content, feature spotlights, or upsell paths without lifting a finger.
When users sign up but never touch the core product, Segment calls it out. Create segments based on users who skip key flows. Fire reactivation messages before they ghost you. Every new segment should serve a purpose, or be deleted. Period.
If your campaigns aren’t firing, it’s not Customer.io’s fault. Or Segment’s. It’s your setup. Here’s how to debug the most common failures, and fix them fast.
First check: Did you actually plug in the right API key? Yes, it still happens.
What else could be the cause? Open Segment’s Event Delivery debugger. If the event isn’t showing up there, it’s not going anywhere. If it is, check the delivery status to Customer.io as a Segment destination. Anything other than “200 OK”? You’ve got a problem upstream.
Sometimes, events fail to deliver because the Segment source is misconfigured. Go to Segment > Sources, find your source, and check if the source is correctly integrated with the destination (Customer.io). If the source isn't sending data properly, Customer.io won’t receive any events.
You’re probably tracking events with anonymousId
, but never following up with identify()
. Rookie mistake. Always use identify() after track() to merge anonymous sessions with real users.
If you don’t, Customer.io will never know who to message. And you’ll be staring at anonymous events from Segment forever.
Also, ensure that track() calls are always followed by an identify() call to merge the anonymous session with the user’s profile. If you skip the identify() call or don’t provide the correct user ID, Customer.io will continue to associate the events with an anonymous ID, making it difficult to properly segment and trigger actions for the correct users.
Traits only sync when you explicitly send them. No magic here.
Call identify()
early - and make sure your payload includes fresh values.
Use Customer.io payload logs to confirm what’s actually getting stored. If the value’s not there, it won’t show up in filters, segments, or personalize messages logic.
Check Data in Payloads: When you identify a user and send traits, ensure that the payload contains the expected keys and values. If traits are missing, check your identify() call to ensure the correct traits are being passed. For example:
analytics.identify('userId123', { email: 'john.doe@example.com', plan_type: 'Pro', is_trial: true});
Use Customer.io's Activity Logs to check the payload to ensure all attributes (like plan_type
) are correctly received.
You’ve got users falling in and out of the wrong segments. Why?
Inconsistent userId
, lowercase vs. camelCase mismatches, or worse - bad segment logic.
Verify User ID Consistency: Consistency in the userId is essential. Check whether the userId you're passing in identify() is consistent across all events. Inconsistent casing or different identifiers (like using email
for some users and id
for others) can result in segmentation issues.
Check for Duplicates: Avoid having duplicate user profiles in Customer.io by enforcing a consistent userId strategy (e.g., always using a UUID or email address).
Segments are only as smart as the filters behind them. Broken filters = broken automations. Don’t guess. Rebuild. Test. Verify. Segment membership is a logic problem, not a software one.
This setup is key for push notifications, in-app messages, and other device-specific actions.
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [self deviceTokenStringFromData:deviceToken]; [Analytics sharedAnalytics].context.device.token = token;}
analytics.addSourceMiddleware(function(payload) { if (window.device) { analytics.context.device.token = device.token; // Your device token here } return payload;});
If device tokens aren’t set up correctly, Customer.io won’t be able to send push notifications to mobile users, causing a breakdown in your campaigns.
Getting events from Segment to Customer.io is table stakes. Scaling it? That’s where most teams choke. Here’s how to stay clean, fast, and future-proof - at any volume.
Need to sync message engagement back into your warehouse or analytics tool? Flip the flow. Use Customer.io as a Segment source and push opens, clicks, and conversions back into your data layer.
Don’t rely on messaging tools for insights. Pipe the same events into Mixpanel or Amplitude and watch user behavior before and after your campaigns. You’ll know what actually worked, not just what got clicked.
Traits rot fast. Use reverse ETL tools like Hightouch to push fresh traits (e.g. LTV
, risk_score
, CRM_status
) into Segment daily. This keeps your data-driven segments smart and your messages on point.
Send too many events and you’ll overload your destinations - or worse, trigger spam filters. Add event throttling, use filters, and set up custom destinations for noisy, low-priority events. Clean firepower only.
How to Hire a Customer.io Expert and Maximize Your Marketing Automation? [2025 Guide]
Customer.io Key Terms and Meaning
Looking for set up tutorials - oh there's a whole cluster from Customer.io - check it out!
Ready to start integrating Segment with Customer.io?
Get more out of your Customer.io subscription with Propel - Platinum Customer.io Partner.
Segment is a Customer Data Platform (CDP) that collects, standardizes, and routes user data to various tools, including analytics, email, and marketing platforms like Customer.io.
Customer.io is a messaging automation platform that uses customer data to send behavior-based emails, push notifications, and in-app messages across the customer lifecycle.
No, Customer.io is not a CDP. It is a messaging platform. It relies on external tools like Segment to unify and deliver customer data for triggering campaigns.
Not exactly. A CDP like Segment manages unified customer data for real-time personalization. A CRM is more focused on sales and relationship management. They serve different but complementary purposes.
Segment acts as a data pipeline - it collects events and traits from multiple sources and sends them to tools like Customer.io for automation, analytics, and personalization.
Use our free Retention Impact Calculator to see how much revenue you’re leaving on the table — and how much you could unlock by improving retention.
👉 Calculate My Impact