Migrate your Customer.io data
Event-driven behavioral messaging platform for product-led teams. Most value comes from well-mapped event schemas and custom object relationships — both areas where migration accuracy matters most.
In its favor
Why people choose Customer.io
The signal that keeps Customer.io on the shortlist. Sourced from G2, Capterra, and customer scoping calls.
Flexible visual workflow builder for complex, event-triggered campaigns across email, SMS, push, and in-app channels.
Identity resolution that merges anonymous and authenticated profiles under a single userId, reducing duplicate records at scale.
Multi-channel messaging from a single platform eliminates the need to maintain separate email and push tools.
API-first architecture with track and identify endpoints that technical teams can wire directly into their data pipelines.
Profile-based pricing model rewards high-engagement audiences — inactive users are billed but can be excluded from campaigns.
Pricing scales aggressively with profile count, and inactive users still count toward the monthly bill, creating surprises for large user bases.
Steep learning curve: workflows and segmentation require developer involvement, making the platform inaccessible for non-technical marketers.
No built-in CRM functionality forces teams to maintain a separate CRM and sync it via integration, adding operational overhead.
Support response times on the Essentials plan frustrate teams hitting complex setup issues that require expert guidance.
Implementation typically takes 4–8 weeks to reach full maturity, including IP warming, event mapping, and workflow replication.
Reasons to switch
Why people leave Customer.io
The recurring reasons buyers give for replacing Customer.io. Presented as facts, not knocks.
Platform scorecard
Strengths, weaknesses, and where Customer.io fits
Grades across six dimensions, plus a SWOT-style view of where the platform shines and where it falls short.
SWOT — strengths, weaknesses, and use-case fit
Strengths
Weaknesses
Where it works
Where it struggles
Pricing tiers
Customer.io pricing overview
Customer.io prices on total stored profiles, not messages sent. The Essentials plan starts at $100/month for 5k profiles and scales upward as profile count grows. Inactive and recently deleted profiles still count toward the billable total, making large user bases expensive even when most profiles never receive campaigns. Premium starts at $1,000/month for advanced compliance and support, with Enterprise pricing negotiated custom.
Essentials
Tier 1 of 3
$100/month for 5k profiles (billed monthly)
What's included
Need help selecting your CRM?
Book a free 30 minute consultationPricing is informational. FlitStack AI does not bill on Customer.io's schedule — see our quote-based pricing →
What gets migrated
Customer.io object support
Object-by-object support for Customer.io migrations. Per-pair details surface during scoping.
People (Profiles)
Fully supportedThe core Customer.io object. Every profile has a userId, optional anonymousId, timestamped traits, and event history. We export all attributes including nested JSON and preserve the full event timeline during migration. Deleted profiles that were re-added in the same billing cycle are flagged to prevent double-billing.
Custom Events
Fully supportedEvents are created via the track() API and stored with a name, properties object, and sentAt/receivedAt timestamps. We export all event names and property schemas and map them 1:1 into the destination. Event names must be unique strings; we flag any naming collisions before import.
Traits and Attributes
Fully supportedTraits are key-value pairs set on a Person via identify() or track calls. They can take any JSON type including arrays and nested objects. We flatten or preserve nested structure depending on the destination schema, and we flag boolean opt-out fields to ensure GDPR/CCPA compliance in the target system.
Segments
Mapping requiredSegments are dynamic audience definitions based on trait values and event conditions. We export segment criteria as a structured rule set and rebuild equivalent segments in the destination using that logic. Complex nested conditions may require manual verification in the target system.
Campaigns and Journeys
Mapping requiredCampaigns are automated workflows with entry triggers, branching conditions, and message actions. We export campaign structure including trigger type, wait steps, and channel assignments. Workflow logic (especially branching and A/B split paths) requires field-level mapping to match destination campaign semantics.
Broadcasts
Mapping requiredBroadcasts are one-time sends to a segment or full audience. We export broadcast name, target segment, content, and send timestamp. API-triggered broadcasts have a rate limit of 1 request per 10 seconds, which we respect during re-import to avoid queue overflow.
Custom Objects
Mapping requiredCustom Objects (Companies, Accounts, etc.) are stored as separate object_type_id namespaces with their own object_id per record. They can have custom fields and are linked to People via relationships. We export the object type definitions and all object records and rebuild the object_type_id hierarchy in the destination, preserving relationship links to People.
Transactional Messages
Mapping requiredTransactional messages are single, recipient-specific sends (receipts, password resets) that bypass standard unsubscribe rules. We export transactional message templates, content, and delivery logs. Message retention settings must be checked before export — sensitive content may be redacted in stored payloads.
Workspaces and Account Settings
Not in this platformWorkspaces contain billing, SSO, IP allowlists, and region settings (US/EU). These are account-level and not migratable across platforms. We exclude workspace config from the migration scope and flag which settings need manual reconfiguration in the destination.
Message Delivery Logs
Mapping requiredWe can export message delivery status (sent, delivered, undeliverable, bounced) for audit and compliance purposes. Delivery logs are linked to Person records via messageId. Undeliverable statuses are preserved so the destination can apply the same suppression rules.
| Object | Support | Notes |
|---|---|---|
| People (Profiles) | Fully supported | The core Customer.io object. Every profile has a userId, optional anonymousId, timestamped traits, and event history. We export all attributes including nested JSON and preserve the full event timeline during migration. Deleted profiles that were re-added in the same billing cycle are flagged to prevent double-billing. |
| Custom Events | Fully supported | Events are created via the track() API and stored with a name, properties object, and sentAt/receivedAt timestamps. We export all event names and property schemas and map them 1:1 into the destination. Event names must be unique strings; we flag any naming collisions before import. |
| Traits and Attributes | Fully supported | Traits are key-value pairs set on a Person via identify() or track calls. They can take any JSON type including arrays and nested objects. We flatten or preserve nested structure depending on the destination schema, and we flag boolean opt-out fields to ensure GDPR/CCPA compliance in the target system. |
| Segments | Mapping required | Segments are dynamic audience definitions based on trait values and event conditions. We export segment criteria as a structured rule set and rebuild equivalent segments in the destination using that logic. Complex nested conditions may require manual verification in the target system. |
| Campaigns and Journeys | Mapping required | Campaigns are automated workflows with entry triggers, branching conditions, and message actions. We export campaign structure including trigger type, wait steps, and channel assignments. Workflow logic (especially branching and A/B split paths) requires field-level mapping to match destination campaign semantics. |
| Broadcasts | Mapping required | Broadcasts are one-time sends to a segment or full audience. We export broadcast name, target segment, content, and send timestamp. API-triggered broadcasts have a rate limit of 1 request per 10 seconds, which we respect during re-import to avoid queue overflow. |
| Custom Objects | Mapping required | Custom Objects (Companies, Accounts, etc.) are stored as separate object_type_id namespaces with their own object_id per record. They can have custom fields and are linked to People via relationships. We export the object type definitions and all object records and rebuild the object_type_id hierarchy in the destination, preserving relationship links to People. |
| Transactional Messages | Mapping required | Transactional messages are single, recipient-specific sends (receipts, password resets) that bypass standard unsubscribe rules. We export transactional message templates, content, and delivery logs. Message retention settings must be checked before export — sensitive content may be redacted in stored payloads. |
| Workspaces and Account Settings | Not in this platform | Workspaces contain billing, SSO, IP allowlists, and region settings (US/EU). These are account-level and not migratable across platforms. We exclude workspace config from the migration scope and flag which settings need manual reconfiguration in the destination. |
| Message Delivery Logs | Mapping required | We can export message delivery status (sent, delivered, undeliverable, bounced) for audit and compliance purposes. Delivery logs are linked to Person records via messageId. Undeliverable statuses are preserved so the destination can apply the same suppression rules. |
Gotchas
What to watch for in Customer.io migrations
Issues we've hit on past Customer.io migrations, tagged by severity. FlitStack AI handles every one — surfacing them up front because buyer engineering teams want to know.
Deleted profiles still count toward billing for the remainder of the cycle
Push migration requires a new app version with the Customer.io SDK
Broadcast API rate limit constrains high-volume re-imports
Inactive user profiles inflate monthly billing with no campaign benefit
Transactional message content may be redacted in stored logs
| Severity | Issue |
|---|---|
| High | Deleted profiles still count toward billing for the remainder of the cycle |
| High | Push migration requires a new app version with the Customer.io SDK |
| Medium | Broadcast API rate limit constrains high-volume re-imports |
| Medium | Inactive user profiles inflate monthly billing with no campaign benefit |
| Low | Transactional message content may be redacted in stored logs |
Leaving Customer.io?
Where Customer.io customers move next
12 destinations Customer.io can migrate to.
How a Customer.io migration works
Four steps, Customer.io-specific
Connect
API key (Bearer token via HTTP API) into Customer.io. Scopes limited to read-only on the data we move.
Map
We translate Customer.io-specific structures (custom fields, objects, value lists) to the destination's model.
Sample
Test with a 50–200 record subset to validate Customer.io quirks before production.
Migrate
Full migration with Customer.io rate-limit handling. Rollback available throughout.
FAQ
Customer.io migration FAQ
Answers to the questions buyers ask most during Customer.io migration scoping. Not seeing yours? Book a call.
Can't find your answer?
Walk through your Customer.io migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationReady when you are
Migrate Customer.io.
Without the rebuild.
Free scoping call with a migration engineer. Tell us about your Customer.io setup and destination — written quote back within a business day.