CRM migration
Field-level mapping, validation, and rollback between Customer.io and Zoho CRM. We move data and schema; workflows are rebuilt natively in Zoho CRM.
Customer.io
Source
Zoho CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Customer.io and Zoho CRM.
Complexity
BStandard
Timeline
3-6 weeks
Overview
Customer.io and Zoho CRM serve different functions: Customer.io is a behavioral messaging platform built around an event-driven identity model, while Zoho CRM is a relationship management platform built around Leads, Contacts, Accounts, and Deals. Migrating between them requires translating a profile-and-event data model into a structured CRM schema. We map People Profiles to either Zoho Lead (unqualified) or Contact (qualified, attached to Account) based on the customer's engagement stage logic. Custom Events stored in Customer.io become Tasks on the Contact record with event name and properties preserved as custom fields. Segments become Zoho Tags and Groups. Campaigns and Journeys do not migrate as automation; we deliver a written Blueprint and Workflow inventory for the customer's Zoho admin to rebuild. We do not migrate push notification device tokens because Customer.io requires a new app SDK version before those tokens are valid. Transactional message logs migrate as Email Templates without execution history if message retention was disabled in Customer.io. Deleted profiles that still count toward billing are flagged before migration so the customer can reconcile billable totals at month-end.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Customer.io object lands in Zoho CRM, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Customer.io
People (Profile)
Zoho CRM
Lead or Contact (split required)
1:manyCustomer.io People with no engagement history or early-stage traits (first_visited, signed_up) map to Zoho Lead. People with purchase events, subscription status, or high trait counts map to Zoho Contact attached to an Account. We define the split rule during scoping based on the customer's event set and engagement funnel, and preserve the original Customer.io userId in a custom field cio_user_id__c on both Lead and Contact for audit and reconciliation.
Customer.io
Traits and Attributes
Zoho CRM
Standard or Custom Fields on Lead/Contact
1:1Standard Customer.io traits (email, name, created_at, last_visited) map to Zoho standard fields (Email, Last_Name, Created_Time, Last_Activity_Time). Custom traits stored as JSON in Customer.io (arrays, nested objects) flatten into Zoho custom fields with a 255-character limit on text fields; longer values truncate with a flag in the migration report. Boolean and numeric traits map to Zoho Checkbox and Currency/Number fields respectively.
Customer.io
Custom Event
Zoho CRM
Task (Task Type = Event)
1:1Customer.io events (track() calls with name, properties, and timestamp) migrate to Zoho Task records with Task Type set to Event and Subject set to the event name. Event properties serialize into a JSON string stored in a custom Task field event_properties__c, or into individual custom fields if the event schema is stable and limited. sentAt timestamp migrates to Task Created_Time and Activity_Date for timeline ordering. Events without a matching Contact (anonymous profiles) link to a reconciliation queue for email lookup resolution.
Customer.io
Segment
Zoho CRM
Tag or Group
lossyCustomer.io Segments are dynamic audience definitions based on trait and event conditions. We export segment criteria as a structured rule set and translate them to Zoho Tags (record-level labels) for manual segmentation, or to Zoho Workflow Rules with filter conditions for automated segmentation. Static segments with a fixed member list migrate to Zoho Group records. Dynamic segment rebuild in Zoho Blueprint requires manual configuration by the customer's admin.
Customer.io
Custom Object: Company
Zoho CRM
Account
1:1Customer.io Custom Objects with object_type_id for Companies map to Zoho Account. Custom fields on the Customer.io Company object map to Zoho Account custom fields. The Account is created before any Contact import so that the Account-Contact lookup relationship is satisfied at the moment of Contact insert. We resolve the relationship between Customer.io People and their linked Company object during the transform phase.
Customer.io
Custom Object: Generic
Zoho CRM
Custom Module
1:1Customer.io Custom Object namespaces other than Company map to Zoho Custom Modules. We pre-create the destination schema in Zoho including all custom fields, lookup relationships to standard objects (Contact, Account, Deal), and field validation rules before any data import. The API name in Zoho uses the __c suffix per Zoho convention, matched to the Customer.io object_type_id name.
Customer.io
Campaign
Zoho CRM
Workflow Rule + Blueprint (documentation only)
lossyCustomer.io Campaigns and Journeys are automation structures that do not migrate as executable code to Zoho. We export campaign trigger type (event-triggered, segment-triggered, API-triggered), wait steps, condition branches, and channel assignments as a written Blueprint and Workflow inventory document. The customer's Zoho admin rebuilds the equivalent automation using Zoho Blueprint (for process enforcement) and Workflow Rules (for field updates, notifications, and task creation). Campaign membership status does not migrate as active enrollments.
Customer.io
Broadcast
Zoho CRM
Campaign (Email)
1:1Customer.io Broadcasts (one-time sends to a segment or full audience) map to Zoho Campaigns with Campaign Type set to Email. We export broadcast name, target segment criteria, subject, content, and sent timestamp. Broadcast API rate limits (1 request per 10 seconds on API-triggered broadcasts) affect the export speed; we chunk the export with jitter to stay within limits. Send history (delivered, bounced, opened) migrates as Campaign Member status records.
Customer.io
Transactional Message
Zoho CRM
Email Template
1:1Customer.io transactional message templates (password resets, receipts, notifications) migrate to Zoho Email Templates. Template content and dynamic field placeholders preserve. Delivery logs (sent, delivered, undeliverable, bounced) migrate to Zoho Tasks on the Contact record if message retention was enabled in Customer.io. If message retention was disabled (redaction setting), we flag redacted payloads and migrate templates only without execution history.
Customer.io
Message Delivery Log
Zoho CRM
Campaign Member Status
1:1Customer.io message delivery status (sent, delivered, bounced, undeliverable) per recipient per message migrates to Zoho Campaign Member records with Status values (Sent, Delivered, Bounced, Undelivered). Open and click tracking events migrate as custom Campaign Member fields or as Notes on the Contact record. Complaint events (mark as spam) migrate as a Contact custom field with a flag for email compliance.
Customer.io
Owner
Zoho CRM
User
1:1Customer.io workspace Owners map to Zoho CRM Users. We resolve owners by email match against the Zoho destination User table. Any Customer.io Owner without a matching Zoho User goes to a reconciliation queue for the customer's admin to provision before record import resumes. Owner assignment on migrated records (Contacts, Accounts, Deals) resolves to the Zoho OwnerId.
Customer.io
Engagement: Email (sent via Campaign)
Zoho CRM
Task + Email Communications History
1:1Customer.io email engagements sent via Campaigns migrate to Zoho Tasks (type Email) linked to the Contact record with Subject, Description (email body), and Activity_Date preserved. Open and click tracking events from Customer.io migrate as custom Task fields or Notes for audit. This does not include transactional emails, which are handled separately via Email Templates.
| Customer.io | Zoho CRM | Compatibility | |
|---|---|---|---|
| People (Profile) | Lead or Contact (split required)1:many | Fully supported | |
| Traits and Attributes | Standard or Custom Fields on Lead/Contact1:1 | Fully supported | |
| Custom Event | Task (Task Type = Event)1:1 | Fully supported | |
| Segment | Tag or Grouplossy | Fully supported | |
| Custom Object: Company | Account1:1 | Fully supported | |
| Custom Object: Generic | Custom Module1:1 | Fully supported | |
| Campaign | Workflow Rule + Blueprint (documentation only)lossy | Fully supported | |
| Broadcast | Campaign (Email)1:1 | Fully supported | |
| Transactional Message | Email Template1:1 | Fully supported | |
| Message Delivery Log | Campaign Member Status1:1 | Fully supported | |
| Owner | User1:1 | Fully supported | |
| Engagement: Email (sent via Campaign) | Task + Email Communications History1:1 | Fully supported |
Gotchas + challenges
Platform-specific issues from each side, plus the pair-specific challenges that don't show up on either platform's page on its own.
Customer.io gotchas
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
Zoho CRM gotchas
API access requires Professional tier or above
Subform fields do not export cleanly via CSV
API credit consumption is non-linear
Export download links expire in 7 days
Owner (User) assignments require pre-mapped user IDs
Pair-specific challenges
Migration approach
Discovery and engagement audit
We audit the source Customer.io workspace across plan tier (Essentials/Premium/Enterprise), profile count, event schema (event names and property types), Custom Object namespaces, active Segments, active Campaigns and Journeys, Broadcast send history, and transactional message template count. We pair this with a Zoho CRM edition assessment: Standard ($14/user) covers basic CRM migrations; Professional ($23/user) is required for Workflow Rules, multiple layouts, and SalesIQ; Enterprise ($47/user) is required for Blueprint, advanced analytics, and multiple currencies. The discovery output is a written migration scope document with object counts, event schema summary, and Zoho edition recommendation.
Schema design and split rule definition
We design the destination Zoho CRM schema. This includes provisioning Custom Modules (matched to Customer.io Custom Object namespaces), custom fields (with Zoho field types mapped from Customer.io trait types), Tags and Groups (rebuilt from Customer.io Segments), Blueprint structures (documented from Customer.io Journey triggers and steps), and the Lead-Contact split rule based on the customer's event and trait set. Schema is deployed into a Zoho Sandbox org first for validation. The split rule defines which profiles become Leads (no purchase event, low trait count) versus Contacts attached to Accounts (purchase event, subscription status, or engagement above threshold).
Sandbox migration and reconciliation
We run a full migration into the Zoho Sandbox using production-like data volume. The customer's RevOps lead reconciles record counts (Profiles in, Leads out, Contacts out, Accounts out, Tasks out, Campaign Members out), spot-checks 25-50 random records against the Customer.io source, and signs off the schema and mapping before production migration begins. Any mapping corrections happen here. Deleted profile flags are verified against the billable profile count.
Owner reconciliation and Zoho User provisioning
We extract every distinct Customer.io Owner referenced on profiles and events and match by email against the Zoho CRM destination's User table. Owners without a matching Zoho User go to a reconciliation queue for the customer's admin to provision. Migration cannot proceed past this step because Owner lookups are required on most Zoho standard modules. We also validate that the migration user has API access enabled in Zoho CRM, which is required for Bulk API imports.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from Customer.io Company Custom Objects), Contacts and Leads (with the split rule applied and AccountId resolved for Contacts), Custom Module records (with lookup relationships to Contact and Account), Event history as Tasks (chunked by date range to avoid Zoho API rate limits), Campaign history (Broadcasts as Campaigns, delivery status as Campaign Members), Email Templates (from transactional messages), and Tags (from Segments). Each phase emits a row-count reconciliation report before the next phase begins. We use Zoho's Bulk API with batch chunking and exponential backoff.
Cutover, validation, and Journey rebuild handoff
We freeze Customer.io SDK writes during cutover, run a final delta migration of any records created or updated during the migration window, then enable Zoho CRM as the system of record. We deliver the Journey and Campaign automation inventory document to the customer's Zoho admin team with recommended Blueprint and Workflow Rule equivalents. We support a one-week hypercare window where we resolve any reconciliation issues. We do not rebuild Customer.io Journeys as Zoho Blueprint inside the migration scope; that is a separate Zoho implementation engagement.
Platform deep dives
Customer.io
Source
Strengths
Weaknesses
Zoho CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Customer.io and Zoho CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
Customer.io: Not publicly documented for general API; transactional broadcast endpoint capped at 1 request per 10 seconds.
Data volume sensitivity
Customer.io exposes a bulk API — large-volume migrations stream efficiently.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during Customer.io to Zoho CRM migration scoping. Not seeing yours? Book a call.
Walk through your Customer.io to Zoho CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Customer.io
Other ways to arrive at Zoho CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.