CRM migration

Migrate from Customer.io to Twenty CRM

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

Customer.io logo

Customer.io

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

75%

9 of 12

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

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Customer.io and Twenty CRM serve fundamentally different roles, which makes this migration a category shift as much as a platform switch. Customer.io is a behavioral messaging platform where People records are enriched by event streams and trait updates. Twenty CRM is a relationship management platform built around Contacts, Organizations, Opportunities, and Activities with a structured data model. The migration challenge is translating Customer.io's identity-and-event profile into Twenty's contact-object schema, mapping Custom Object namespaces to Twenty's custom object types, and carrying event history into Activity records that remain readable but are not live-segmentable. We do not migrate Campaigns, Journeys, Broadcasts, or transactional message templates as automations; we document their structure so your admin rebuilds them in Twenty's workflow engine. Push notification setup is out of scope because it depends on app SDK changes that happen independently of data migration.

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

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Customer.io objects map to Twenty CRM

Each row shows how a Customer.io object lands in Twenty 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

Person (Profile)

maps to

Twenty CRM

Person

1:1
Fully supported

Customer.io People records map to Twenty CRM Person objects. The email address serves as the dedupe key during import. Standard CRM fields (name, email, phone, job title, address components) are extracted from traits where present. The Customer.io userId is stored in a custom field for audit traceability. Any trait that does not map to a native Twenty field is created as a custom field during schema setup. Anonymous profiles with no email are flagged in the reconciliation report and held for admin decision before import. Event history is not embedded in the Person record but migrated as separate Activity records.

Customer.io

Custom Object: Company

maps to

Twenty CRM

Company

1:1
Fully supported

Customer.io Custom Objects with object_type_id indicating a company map to Twenty CRM Company records. The company name is the primary field; domain and website are extracted from traits and mapped to the corresponding Company fields. Relationships to People are preserved as a Company-Person association in Twenty. Custom fields on the Customer.io company object migrate to Twenty Company custom fields.

Customer.io

Segment

maps to

Twenty CRM

Tag

lossy
Fully supported

Customer.io segment membership is exported as a list of segment names per Person. In Twenty, each segment name becomes a Tag applied to the Person record. Because segments in Customer.io are dynamic (membership changes with trait updates), we capture membership as a snapshot at migration time. The written handoff document includes the full segment criteria for the customer to rebuild equivalent dynamic segments as Twenty Views and saved filters.

Customer.io

Custom Object (general)

maps to

Twenty CRM

Custom Object

1:1
Fully supported

Customer.io Custom Object namespaces beyond Companies (for example Products, Partners, or custom relationship objects) map to Twenty CRM custom objects. We pre-create the destination schema in Twenty before import, including all custom fields matching the source object_type_id field definitions. Lookup relationships between custom objects and People are resolved at migration time using the object_id and the corresponding Person record.

Customer.io

Custom Event

maps to

Twenty CRM

Activity

1:1
Fully supported

Customer.io custom events (created via track()) migrate to Twenty CRM Activity records. Each Activity record stores the event name, properties as a JSON field, and the original timestamp. The Activity is linked to the corresponding Person record via a Person lookup. Event properties are not flattened into individual fields to preserve schema flexibility. Activity records are readable in the Twenty timeline but do not drive segmentation in the same way Customer.io event triggers do.

Customer.io

Engagement: Email (sent through Customer.io)

maps to

Twenty CRM

Activity

1:1
Fully supported

Email send events recorded in Customer.io migrate as Activity records in Twenty. The activity title captures the email campaign or broadcast name, and the properties field stores subject line, send timestamp, and delivery status (sent, delivered, bounced, undeliverable). The Activity is linked to the Person record. Note that Customer.io broadcast API has a rate limit of 1 request per 10 seconds; large email send histories are chunked during export to avoid rate-throttle gaps.

Customer.io

Engagement: Call

maps to

Twenty CRM

Activity

1:1
Fully supported

Call engagements recorded in Customer.io migrate as Activity records in Twenty with call disposition and duration stored in the Activity properties. Each Activity is linked to the Person record via lookup. Call recording URLs stored in Customer.io are not importable and are flagged in the written handoff for manual re-linking post-migration.

Customer.io

Engagement: Meeting

maps to

Twenty CRM

Activity

1:1
Fully supported

Meeting engagements migrate as Activity records in Twenty with start and end timestamps, location, and attendee list preserved in the properties field. Each Activity links to the Person record. Meeting recording links stored in Customer.io are flagged for manual re-association.

Customer.io

Engagement: Note

maps to

Twenty CRM

Comment

1:1
Fully supported

Customer.io note engagements map to Comment records in Twenty CRM linked to the Person timeline. The note body migrates as plain text. Attachments on notes cannot be imported via CSV and are flagged in the written handoff for manual re-upload. Note author is stored in the Comment author field.

Customer.io

Engagement: Task

maps to

Twenty CRM

Activity

1:1
Fully supported

Task engagements in Customer.io migrate as Activity records in Twenty. Task status (completed, open) maps to Activity completion. Assigned owner resolves by email match to the corresponding Person record if the assignee is a Customer.io user who also exists as a Person in Twenty.

Customer.io

Broadcast

maps to

Twenty CRM

Workflow (configuration export)

lossy
Fully supported

Customer.io Broadcasts are one-time sends to a segment or full audience. They do not migrate as live automations because Twenty's workflow engine has a different trigger and action model. We export broadcast configuration including name, target segment, content, and send timestamp as a structured JSON document delivered in the written handoff. The customer's admin rebuilds equivalent one-time outreach sequences in Twenty Workflows using the exported criteria.

Customer.io

Campaign / Journey

maps to

Twenty CRM

Workflow (configuration export)

lossy
Fully supported

Customer.io Campaigns and Journeys are automated workflows with entry triggers, branching conditions, and multi-channel message actions. These do not migrate as automation code because Twenty's workflow engine uses a different trigger-action model and does not support the same multi-channel campaign step types. We export the full campaign and journey structure including trigger conditions, wait steps, branching logic, and channel assignments as a structured document. The customer's admin rebuilds equivalent sequences in Twenty Workflows using the exported criteria.

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

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Deleted profiles still count toward billing in Customer.io

    Customer.io includes profiles deleted within the current billing period in the billable profile count. If your integration re-imports deleted profiles before the cycle closes, you are billed for both sets. We flag all profiles deleted within the migration scoping window and check whether active integrations could re-import them mid-migration. This report lets you confirm the final record count before cutover so that your Customer.io bill at cycle close reflects only the records you intend to migrate and retain.

  • File attachments are excluded from Twenty CRM CSV imports

    Twenty's CSV import does not handle file attachments. Any attachments on People records, Custom Objects, or note engagements in Customer.io do not transfer via the standard import path. We flag every attachment in scope during discovery and either migrate them via the Twenty API or document their location in Customer.io for manual re-upload. Attachments left behind create gaps in compliance records and customer communication history.

  • Behavioral event history is migrated as Activity records, not live triggers

    Customer.io stores event history as the primary behavioral record on each Person. Events drive segmentation, trigger campaigns, and power the timeline in Customer.io. Twenty CRM Activity records are stored as historical timeline entries but are not used as live segmentation criteria in the same way. Events migrate fully and remain readable in the Person timeline, but they do not automatically populate Twenty segment filters or trigger workflows. This is a functional difference that your admin should account for when rebuilding Customer.io-style behavioral triggers in Twenty Workflows.

  • Transactional message content may be redacted in stored logs

    Customer.io can disable message retention to prevent storing sensitive content like password reset tokens or one-time codes. When exporting transactional message logs, some message bodies may be redacted or replaced with a placeholder. We check the message retention setting before export and flag any redacted payloads so that compliance records in Twenty are marked accordingly. If your transactional messages contain sensitive content that is central to your audit trail, you should verify the retention setting before migration scoping begins.

  • Broadcast API rate limit constrains large send-history exports

    Customer.io API-triggered broadcasts are limited to 1 request per 10 seconds. For large send histories, this rate creates sequencing constraints during export. We chunk large audience exports into batches with jitter and route high-volume send history through the transactional API path where possible, which has different rate characteristics. For most migration scopes, the rate limit adds latency but does not block export completion.

Migration approach

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

  1. Discovery and scoping

    We audit the Customer.io workspace across profile count, trait schemas, Custom Object types and volumes, segment definitions, event names and property schemas, engagement history volume, and active broadcast and campaign configurations. We pair this with a Twenty CRM environment review to confirm the target schema, custom object availability, and any self-hosted versus cloud configuration differences that affect the import path. The discovery output is a written migration scope document covering record counts per object type, field mapping specifications, and a list of all objects requiring custom field creation in Twenty.

  2. Schema design and field mapping

    We design the destination schema in Twenty CRM before any data moves. This includes creating custom fields on Person to host Customer.io traits that do not map to native Twenty fields, pre-creating Custom Object types to match Customer.io object_type_id namespaces, and defining the tag set that will represent segment membership. We also document every Customer.io segment and campaign structure as a structured rule set for the written handoff. The schema is validated in Twenty before production migration begins.

  3. Sandbox migration and reconciliation

    We run a migration using a subset of production-like data into Twenty CRM to validate the field mapping, custom object schema, and deduplication logic. The customer reviews the reconciled output, spot-checks Person records against the Customer.io source, and confirms that Custom Object relationships are preserved. Mapping corrections are made at this stage. We do not proceed to production migration until the customer signs off on the sandbox output.

  4. Deleted profile audit and integration freeze

    We extract all profiles deleted within the current billing cycle and cross-reference them against active Customer.io integrations that could re-import them mid-migration. We present this report to the customer before cutover. The customer pauses or redirects integrations that could re-import deleted profiles. This step ensures that the final migrated record count matches the intended scope and that the Customer.io billing cycle closes on the correct profile total.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Person records first (with email as dedupe key, trait fields mapped, and userId preserved), Company records next (with Person lookup resolved), Custom Objects next (with object_type_id preserved and Person and Company lookups resolved), then Activity history (events, emails, calls, meetings, notes, tasks as Activity or Comment records with Person lookup). Attachments are migrated via API after the main record import or flagged for manual re-upload. Each phase emits a row-count reconciliation report before the next phase begins.

  6. Cutover, validation, and workflow rebuild handoff

    We freeze writes to Customer.io during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty CRM as the system of record. We deliver the written handoff document containing all segment criteria, broadcast configurations, and campaign journey structures for the customer to rebuild in Twenty Workflows. We do not rebuild Customer.io automations as Twenty Workflows inside the migration scope; that is a separate engagement. We support a one-week hypercare window for reconciliation issues raised during the first week of live use.

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.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 Twenty 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 Twenty 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 Twenty CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most tier2 migrations land between three and five weeks for workspaces under 15,000 People with no custom objects and event history migrated as a 90-day snapshot. Migrations with multiple Custom Object types, full event history preservation, large segment snapshots, or self-hosted Twenty deployments requiring database and Docker setup move to six to ten weeks. The deleted profile audit step and integration freeze add up to three days to the schedule but prevent billing surprises at cycle close.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Customer.io.
Land in Twenty 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