CRM migration

Migrate from Customer.io to Odoo CRM

Field-level mapping, validation, and rollback between Customer.io and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

Customer.io logo

Customer.io

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

58%

7 of 12

objects map 1:1 between Customer.io and Odoo CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Customer.io is an event-driven behavioral messaging platform built around People profiles, custom events, and Campaign-driven audience segmentation. Odoo CRM is an ERP-integrated sales CRM built around Contacts, Leads, Opportunities, and pipeline stages. These are different data models by design, and the migration requires a deliberate translation layer rather than a direct record copy. We export People, their traits, and their full event timeline from Customer.io, map profile attributes to Odoo Contact fields, represent event history as Odoo activity log entries (calls, emails, meetings, notes), and translate segment membership into Contact tags and Lead scoring fields. Campaign structures and Journey workflows do not migrate to Odoo because Odoo has no equivalent Campaign or Journey object. We deliver a written audit of every active Campaign and Segment with a recommended Odoo CRM configuration so your admin can rebuild the audience logic post-migration. Push notification setup requires a separate mobile SDK integration and cannot be imported from Customer.io.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

Customer.io logo

Customer.io

What's pushing teams away

  • 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.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How Customer.io objects map to Odoo CRM

Each row shows how a Customer.io object lands in Odoo 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 (Profiles)

maps to

Odoo CRM

Contact (res.partner)

1:1
Fully supported

Customer.io People profiles map to Odoo res.partner records. The userId becomes partner_ref or the external ID field; email maps to email; name maps to name. Anonymous traits (city, country, plan tier) map to custom fields on res.partner that we create via Odoo Studio or XML data migration. The full trait JSON is preserved as a serialized field for compliance auditing. Active-to-inactive ratio is calculated during scoping and inactive profiles can be flagged as archived partners rather than imported as active records to keep the Odoo partner table clean.

Customer.io

Custom Events

maps to

Odoo CRM

CRM Activity Log (mail.activity)

1:many
Fully supported

Customer.io event history has no direct Odoo equivalent, so we represent each event as a mail.activity record linked to the migrated Contact. Event name becomes activity.activity_type_id (or a custom activity type); event properties become the activity.note field in structured JSON; sentAt/receivedAt becomes activity.date_deadline and activity.create_date. This preserves the timeline and properties but loses the event-as-first-class-object granularity. Customers who rely heavily on event segmentation in Customer.io should rebuild that logic using Odoo Lead Automation rules and contact tags post-migration.

Customer.io

Segments

maps to

Odoo CRM

Tags (ir.exports.line) + Lead Scoring Fields

lossy
Mapping required

Customer.io dynamic Segments are rebuilt in Odoo as a combination of contact tags and custom Lead scoring fields. During migration we export each segment's rule criteria as a structured JSON object, then create equivalent Odoo tags (using the contacts_base module or res.partner.category). Segment criteria that rely on event conditions are translated into Odoo Lead Automation rules referencing the activity log entries created during event migration. Customers receive a Segment-to-Tag mapping document as part of the handoff.

Customer.io

Campaigns

maps to

Odoo CRM

CRM Pipeline Stage + Tag

lossy
Fully supported

Customer.io Campaigns do not have a native Odoo CRM equivalent because Odoo has no multi-step journey or campaign automation object. We export campaign structure (name, trigger type, entry conditions, channel assignments, wait steps) as a structured JSON document and map campaign entry to Odoo pipeline stage assignment or a Contact tag identifying the campaign source. The customer's Odoo admin rebuilds multi-step campaign logic using Odoo Lead Automation (crm.lead.automation) or Odoo Marketing (if licensed) post-migration.

Customer.io

Broadcasts

maps to

Odoo CRM

CRM Lead / Contact with Tag

1:1
Mapping required

Historical Broadcast sends are represented in Odoo as Contact records tagged with the broadcast name, with a mail.message note recording the send timestamp and approximate audience size. Broadcast content and targeting criteria are exported as structured records in the broadcast audit document. API-triggered broadcast rate limits (1 request per 10 seconds on Customer.io) do not apply in Odoo; any automated send logic rebuilds as Odoo Lead Automation or a custom mail.mass_mailing configuration.

Customer.io

Custom Objects (Companies, Accounts)

maps to

Odoo CRM

res.partner (Company type)

1:1
Fully supported

Customer.io Custom Objects with object_type_id = company or account map to Odoo res.partner records where is_company = True. The custom object ID becomes the external ID; custom fields on the object map to custom fields on the res.partner record. If the customer uses multiple Custom Object types, each maps to a separate res.partner category or a custom res.partner.subtype field. Relationships between People and Companies in Customer.io are preserved as parent_id links on the res.partner record in Odoo.

Customer.io

Transactional Messages

maps to

Odoo CRM

mail.template + mail.mail

1:1
Mapping required

Customer.io transactional message templates (receipts, password resets, shipping notifications) map to Odoo mail.template records. We export template content, trigger conditions, and the unsubscribe bypass flag. Delivery logs (sent, delivered, undeliverable, bounced) map to mail.mail records with mail.mail.state preserved. Note that Customer.io's message retention setting may redact some transactional content; we flag any redacted payloads before export and mark those mail.mail records as content_redacted in Odoo.

Customer.io

Message Delivery Logs

maps to

Odoo CRM

mail.mail records

1:1
Mapping required

Delivery status for emails sent from Customer.io maps to Odoo mail.mail records. Sent, delivered, bounced, and undeliverable statuses migrate with the status code preserved. Open and click tracking data does not have a native Odoo equivalent and is exported as structured metadata on the mail.mail record rather than a tracked engagement event.

Customer.io

Traits and Attributes

maps to

Odoo CRM

res.partner custom fields

lossy
Fully supported

Customer.io trait key-value pairs (strings, numbers, booleans, arrays, nested objects) map to Odoo res.partner custom fields created via Odoo Studio or a data migration CSV. Flat traits map directly; nested objects are flattened using a dot-notation convention (e.g., subscription.plan_name becomes x_subscription_plan_name). Arrays (e.g., enabled_channels) become Odoo char or many2many fields depending on the customer's use case, decided during scoping.

Customer.io

Engagement: Email

maps to

Odoo CRM

mail.message on Contact

1:1
Fully supported

Customer.io email engagement records map to Odoo mail.message records linked to the res.partner. Body, subject, send timestamp, and delivery status migrate. Open and click tracking are exported as structured metadata on the message. Email threads that span multiple Customer.io sends are represented as a sequence of mail.message records ordered by timestamp.

Customer.io

Engagement: SMS

maps to

Odoo CRM

mail.message on Contact

1:1
Fully supported

Customer.io SMS engagement records map to Odoo mail.message records with a custom sms_channel field identifying them as SMS rather than email. Body, recipient phone number, send timestamp, and delivery status migrate. Odoo SMS delivery receipts are not natively supported in the Community edition; SMS migration is scoped for Odoo Enterprise or Online with iap_sms configured.

Customer.io

Engagement: Push Notification

maps to

Odoo CRM

mail.message (flagged, not sent)

lossy
Fully supported

Push notification history migrates as mail.message records flagged as x_push_notification = True, recording the message body and send timestamp. We do not re-send push notifications in Odoo because Odoo CRM has no native push notification capability and device tokens from Customer.io cannot be transferred to any other provider. Customers requiring push notifications post-migration must implement a separate push service (Firebase, OneSignal, etc.) and do not migrate device tokens as part of the CRM data migration scope.

Gotchas + challenges

What specifically takes care here

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 logo

Customer.io gotchas

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

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Customer.io Campaigns and Journeys have no Odoo CRM equivalent

    Customer.io Campaign and Journey objects define multi-step, event-triggered message sequences with branching conditions, delays, and channel routing. Odoo CRM has no Campaign or Journey object; it uses pipeline stages, Lead Automation rules, and optional Odoo Marketing (separate license) for similar workflows. Campaign and Journey logic does not migrate as automation code. We export every active Campaign and Journey with its full structure (trigger type, conditions, actions, wait steps, channel assignments) as a structured JSON document and deliver it to the customer's admin for Odoo configuration. Skipping this step means losing the audience logic entirely.

  • Behavioral event history cannot be queried as events in Odoo

    Customer.io stores every track() event as a first-class record with properties that can be queried, segmented, and triggered on. Odoo has no event log table. We represent event history as mail.activity records linked to Contacts, which preserves the timeline and properties but does not support event-triggered automation in Odoo without custom development. If the customer's operational workflows depend on event conditions triggering actions in the CRM, those automations must be rebuilt in Odoo Lead Automation referencing the migrated activity records. The event schema itself migrates; the event-driven trigger logic does not.

  • Push notification device tokens cannot migrate to Odoo or any other provider

    Customer.io stores device tokens scoped to its own SDK installation. These tokens are not portable across push providers and cannot be imported into Odoo, Firebase, OneSignal, or any other service. Users who had push enabled through Customer.io must receive a new app version with the replacement push SDK installed before push messages can be delivered from the new system. We flag this as a prerequisite in the migration plan and sequence the push re-enrollment after the new SDK version is live, typically over a 4-to-8-week app rollout period.

  • Odoo data model differences cause schema restructuring

    Customer.io stores People and Companies as separate namespaces with a many-to-many relationship, while Odoo uses a single res.partner table where is_company determines whether a record is an organization or an individual. People who are employees of a Company in Customer.io become Contacts with a parent_id pointing to the Company partner; they cannot be a separate People record with a Company relationship field as in Customer.io. We resolve this during schema design by flattening the relationship to Odoo's parent_id model. Any Custom Object types beyond Company require Odoo Studio custom fields or custom models created before migration begins.

  • Deleted Customer.io profiles still bill for the remainder of the billing cycle

    Customer.io bills on billable profile count including profiles deleted within the current billing period. If the migration deletes a large volume of inactive profiles and Customer.io re-imports them via an active integration mid-migration, both sets count toward the final bill. We flag all deleted profiles in scope during discovery, check active SDK and API integrations that could re-import profiles during migration, and recommend pausing or disconnecting integrations before the profile deletion window. This prevents double-billing on profiles that are intentionally removed.

Migration approach

Six steps for a successful Customer.io to Odoo CRM data migration

  1. Discovery and Odoo edition selection

    We audit the Customer.io workspace: profile count, trait schema, active event names and property types, Custom Object types and record counts, active Segments and their rule criteria, active Campaigns and Journeys, broadcast history, and transactional message templates. We pair this with an Odoo edition review (Community, Online, or Enterprise) based on the customer's data volume, custom field requirements, and SMS or push needs. The discovery output is a written migration scope document covering what migrates, what is exported as an audit document, and what requires post-migration rebuild.

  2. Schema design and Odoo custom field provisioning

    We design the destination Odoo schema before any data moves. For Community edition this means creating custom fields via Odoo Studio on res.partner and crm.lead. For Enterprise this may include custom models via module development. We create all fields needed to receive migrated traits, event history types, and Custom Object attributes. Segment rule criteria are translated into a Tag naming convention and a Lead Automation plan. Schema is validated in an Odoo test database before production migration begins.

  3. Data cleansing and trait flattening

    We run a data quality pass on the Customer.io export. Duplicate profiles (same email or userId) are flagged and deduplicated. Inactive profiles are identified and marked for optional exclusion based on the customer's preference. Nested trait objects are flattened to dot-notation field names compatible with Odoo's character field naming convention. Event properties exceeding Odoo's field type constraints are stored as serialized JSON in a dedicated field rather than individual columns.

  4. Segment and campaign audit export

    We export every active Customer.io Segment as a structured JSON object containing its name, rule criteria, event conditions, and membership count at export time. We export Campaign and Journey structure including trigger, conditions, actions, wait steps, and channel assignments. This audit document is the primary handoff artifact for the customer's Odoo admin to rebuild audience logic in Odoo using Lead Automation rules, contact tags, and pipeline stage assignments.

  5. Production migration in record order

    We run production migration in dependency order: res.partner records (Company partners first, then individual Contact partners with parent_id resolved to the Company partner), crm.lead records for any lead-scoped profiles, mail.activity records representing event history linked to the resolved Contact, mail.message records for engagement history, mail.template records for transactional messages, and mail.mail records for delivery log history. Each phase emits a row-count reconciliation report before the next phase begins. Push notification device tokens are excluded from migration scope and flagged for separate handling.

  6. Cutover, validation, and rebuild handoff

    We freeze Customer.io writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver the Segment, Campaign, and Journey audit document to the customer's admin team with a recommended Odoo Lead Automation configuration for each migrated campaign. We support a one-week hypercare window for reconciliation issues. Workflow rebuild, Odoo Lead Automation setup, and push SDK re-enrollment are outside the standard migration scope and are handled as separate engagements.

Platform deep dives

Context on both ends of the pair

Customer.io logo

Customer.io

Source

Strengths

  • Event-driven automation engine purpose-built for triggering messages from real-time application events, well-suited to SaaS and product-led growth motions.
  • Multi-channel orchestration covers email, push, SMS, in-app, and webhooks (with RCS support added in 2026 updates) under a single workflow canvas.
  • Drag-and-drop visual workflow editor handles delays, branches, and multichannel steps without code, while still allowing Liquid templating for advanced personalization.
  • Behavior-based segmentation with real-time event ingestion means segments update as users act, not on a scheduled batch.
  • Strong developer ergonomics — REST API, robust webhooks, and a Data Pipelines product for warehouse-native ingestion appeal to engineering-led teams.

Weaknesses

  • Profile-based billing counts inactive and deleted (within billing cycle) profiles, inflating costs for large user bases.
  • Workflow and segmentation setup requires developer involvement; non-technical marketers hit a ceiling quickly.
  • No free plan and opaque Enterprise pricing make budget forecasting difficult for SMBs.
  • Push notification migration requires a full app SDK update — users must upgrade before they can receive messages from Customer.io.
  • Support tiers mean critical issues during migration may not get fast enough responses on Essentials.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across Customer.io and Odoo CRM.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    Customer.io: Not publicly documented for general API; transactional broadcast endpoint capped at 1 request per 10 seconds.

  • Data volume sensitivity

    A

    Customer.io exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Customer.io to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about Customer.io to Odoo CRM data migrations

Answers to the questions buyers ask most during Customer.io to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Customer.io to Odoo CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between three and five weeks for accounts under 10,000 People profiles with straightforward trait schemas and no custom object types. Migrations with large event histories (over 250,000 engagement records), multiple Custom Object types, complex Segment logic requiring translation to Odoo tags and Lead Automation rules, and Odoo Community-to-Enterprise edition upgrades move to eight to twelve weeks. Discovery and schema design typically require two to three weeks regardless of size.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Customer.io.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day