CRM migration

Migrate from Customer.io to Microsoft Dynamics 365 Sales

Field-level mapping, validation, and rollback between Customer.io and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .

Customer.io logo

Customer.io

Source

Microsoft Dynamics 365 Sales

Destination

Microsoft Dynamics 365 Sales  logo

Compatibility

60%

6 of 10

objects map 1:1 between Customer.io and Microsoft Dynamics 365 Sales .

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from Customer.io to Microsoft Microsoft Dynamics 365 Sales is a platform-type migration: Customer.io is an event-driven behavioral messaging platform, while Microsoft Dynamics 365 Sales is a relational CRM. The two systems use fundamentally different data models — Customer.io stores identity-first Profiles with a full event timeline and nested traits; Dynamics 365 separates Leads, Contacts, and Accounts into a normalized relational schema. We resolve this structural gap during scoping by designing the Lead-versus-Contact split rule, pre-creating Dataverse custom entities for event history and behavioral traits, and mapping the Customer.io userId to the appropriate Dynamics 365 primary key. We migrate active People records as Contacts or Leads, Customer.io Companies as Accounts, Custom Objects as Dataverse custom entities, and the full event timeline as a custom event entity linked to the Contact. We do not migrate Campaigns, Journeys, Workflows, Segments, or Broadcasts as code; we deliver a written inventory of every active workflow and segment for the customer to rebuild in Microsoft Dynamics 365 Sales or Power Automate. Push notification migration is not applicable to this destination pair because Microsoft Dynamics 365 Sales has no native push channel and device tokens 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

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

What's pulling them in

  • Deep Microsoft 365, Teams, and Outlook integration makes Microsoft Dynamics 365 Sales a natural fit for Microsoft-first organizations already invested in that ecosystem
  • Sales Enterprise and Premium tiers offer unlimited custom tables and advanced AI-driven forecasting and predictive analytics not available in lower tiers
  • Professional tier pricing at $65 per user per month offers a lower entry cost than Salesforce for SMB teams with straightforward CRM needs
  • Flexible customization options allow businesses to build bespoke apps, tailor forms and views, and integrate with other Dynamics 365 modules
  • Microsoft Copilot AI tools are embedded directly into the sales workflow on Enterprise and Premium, automating routine tasks and providing deal intelligence

Object mapping

How Customer.io objects map to Microsoft Dynamics 365 Sales

Each row shows how a Customer.io object lands in Microsoft Dynamics 365 Sales , 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

Microsoft Dynamics 365 Sales

Contact or Lead (split required)

1:many
Fully supported

Customer.io Profiles with a clear email address and business identity map to Dynamics 365 Contact. Anonymous Profiles (identified by anonymousId only with no email) map to Dynamics 365 Lead or are flagged for manual review. We compute the split using the presence of a valid email property in the Customer.io identify() payload and apply a minimum trait count threshold (e.g., more than two traits) as a secondary qualification signal. The original Customer.io userId is stored in a custom field cio_user_id__c on both Lead and Contact for cross-system reconciliation.

Customer.io

Company (Custom Object)

maps to

Microsoft Dynamics 365 Sales

Account

1:1
Fully supported

Customer.io Companies stored as object_type_id namespaces map to Dynamics 365 Account. The company name maps to Account Name; domain maps to Website; city and country map to Address fields. If the Customer.io Company has a relationship to a Person via the group() call, we create the Account first, then resolve the AccountId lookup when importing the Contact. If multiple Customer.io Persons reference the same Company object, we deduplicate on Company ID to create one Account.

Customer.io

Custom Event

maps to

Microsoft Dynamics 365 Sales

Custom Event Entity (Dataverse)

1:1
Fully supported

Customer.io events created via track() have no direct Dynamics 365 equivalent because Sales does not have a native event store. We pre-create a Dataverse custom entity (e.g., cio_event) with fields for event_name, event_timestamp, user_id (lookup to Contact), and a properties JSON column or individual attribute fields for the most common event property keys. We export the full event schema during scoping, map property keys that appear in more than 10 percent of events to named columns, and store the remainder in a JSON properties field. Events are the highest-volume object in a Customer.io migration and are batched in chunks of 5,000 records during import.

Customer.io

Trait (attribute)

maps to

Microsoft Dynamics 365 Sales

Contact Field or Custom Field

1:1
Fully supported

Customer.io traits set via identify() migrate to typed Dynamics 365 Contact fields. String traits map to Single Line of Text, boolean traits to Two Options, date traits to Date and Time, numeric traits to Decimal or Whole Number, and array traits to Multiple Lines of Text (JSON serialized) or a custom multi-select field depending on the customer's preference. Traits with more than 10 unique values across the dataset map to Option Set fields. We flag any trait with a null rate above 80 percent so the customer can decide whether the field is worth migrating.

Customer.io

Segment

maps to

Microsoft Dynamics 365 Sales

Static View or Dynamic List

lossy
Fully supported

Customer.io Segments are dynamic audience definitions with rule-based inclusion criteria (trait conditions, event conditions, membership time). We export the full segment rule set as a structured JSON document and translate it into a Dynamics 365 Advanced Find fetchXML query or a Power Automate flow that rebuilds the segment membership on a schedule. Segments do not migrate as active audience data; they migrate as rule documentation for the customer's admin to implement in Dynamics 365.

Customer.io

Campaign / Journey

maps to

Microsoft Dynamics 365 Sales

Campaign (documentation only)

lossy
Fully supported

Customer.io Journeys and Campaigns contain entry triggers, branching conditions, wait steps, and multi-channel message actions that have no direct Microsoft Dynamics 365 Sales equivalent. Sales Cloud has a Campaign object for tracking marketing campaign membership but no native Journey builder. We export the Journey structure as a written document including trigger type, step sequence, channel per step, and condition branches. The customer's admin rebuilds the campaign logic in Dynamics 365 Customer Insights - Journeys, Power Automate, or a third-party marketing tool.

Customer.io

Broadcast

maps to

Microsoft Dynamics 365 Sales

Campaign

1:1
Fully supported

Customer.io one-time Broadcasts map to Dynamics 365 Campaign records for tracking purposes. Broadcast name becomes Campaign Name; target segment is documented as Campaign Type and intended audience in a custom field. Active broadcast history (send timestamp, recipient count) migrates as Campaign Member records with Member Status set to Responder or Sent. Broadcast content does not migrate as a reusable template.

Customer.io

Custom Object (arbitrary type)

maps to

Microsoft Dynamics 365 Sales

Custom Entity (Dataverse)

1:1
Fully supported

Customer.io arbitrary Custom Objects stored under object_type_id namespaces map to Dataverse custom entities. We pre-create the destination schema including all custom fields, attribute types, and lookup relationships to standard entities (Contact, Account, Opportunity) before data import. Custom object naming in Dynamics 365 uses the New_ prefix for custom entities; we preserve the original Customer.io object name in a custom field for reference. Lookup relationships between custom objects are resolved in dependency order during import.

Customer.io

Transactional Message

maps to

Microsoft Dynamics 365 Sales

Email Template (documentation)

lossy
Fully supported

Customer.io transactional message templates (receipts, password resets, order confirmations) migrate as documented email content rather than active templates because Dynamics 365 does not have a transactional messaging channel. We export template name, subject line, body content (HTML), and liquid variable mappings. The customer's admin uses this documentation to rebuild templates in Dynamics 365 Email Templates, Power Automate email actions, or the destination transactional email provider.

Customer.io

Message Delivery Log

maps to

Microsoft Dynamics 365 Sales

Campaign Member Status

1:1
Fully supported

Customer.io delivery status data (sent, delivered, bounced, undeliverable) migrates to Dynamics 365 Campaign Member records with the corresponding Member Status value. Undeliverable statuses are stored in a custom field cio_delivery_status__c on the Campaign Member to preserve the full delivery state without overwriting the standard status field. Compliance and audit records from Customer.io message logs are flagged for the customer's legal team to review against their data retention policy.

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

Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales gotchas

High

Professional tier 15-table custom table limit blocks migrations

High

October 2024 pricing increase applies at renewal for all customers

Medium

Custom fields must be created in the UI before API writes

Medium

Power Platform request limits apply to bulk migrations

Medium

Activity records orphaned to inactive owners fail silently

Pair-specific challenges

  • Microsoft Dynamics 365 Sales has no native push notification channel

    Customer.io supports push notifications via its mobile SDK, but Microsoft Microsoft Dynamics 365 Sales does not include a push notification channel. Device tokens registered in Customer.io cannot be imported into Dynamics 365 and will not route push messages. If your Customer.io implementation includes push messaging, the channel must be rebuilt using a separate push provider (Firebase Cloud Messaging, Apple Push Notification Service) integrated via Power Apps or a custom Azure Function. We flag all device token data during scoping and exclude it from the migration scope as it cannot be used in Microsoft Dynamics 365 Sales .

  • Anonymous profiles and event-only records have no clean Lead equivalent

    Customer.io stores anonymous users identified by anonymousId with no email address and a full event history (page views, app opens, etc.). Dynamics 365 Lead requires at minimum a name or email to create a valid record. We establish a split rule during scoping: Profiles with a valid email address become Contacts (or Leads for unqualified prospects); anonymous-only Profiles with event history only are stored in a dedicated Dataverse custom entity (cio_anonymous_event) linked to a placeholder Account so that behavioral data is not lost. This is a design decision that requires customer sign-off before migration begins.

  • Customer.io Workflows and Journeys do not migrate to Dynamics 365

    Customer.io Journeys and Workflows are event-triggered, visual automation sequences with branching logic, delay steps, and multi-channel message actions. Microsoft Dynamics 365 Sales has no native equivalent Journey builder; marketing automation lives in the separate Customer Insights - Journeys SKU or Power Automate. We do not migrate Workflows or Journeys as code. We deliver a written inventory of every active Journey including trigger conditions, step sequence, channel assignments, and branch logic. The customer's admin or a Dynamics partner rebuilds them in Customer Insights - Journeys or Power Automate post-migration. Broadcasts and Segments similarly require rebuild and are delivered as documentation.

  • Event history volume can exceed standard Dynamics 365 data import tooling capacity

    Customer.io event data (track() calls) can represent millions of records for active products. Microsoft Dynamics 365 Sales data import via the UI and the standard Data Management Framework has per-job size limits. We use Dataverse bulk import with batched entity creation requests, exponential backoff on throttling responses, and parent-record lookup resolution to ensure events attach to the correct Contact or Account. Events are imported after Contacts and Accounts so that the lookup resolution is satisfied at import time. We scope event history retention with the customer (e.g., last 12 months) to keep the import within manageable time and cost bounds.

  • Customer.io profile pricing model has no direct Dynamics 365 analog

    Customer.io pricing is based on total stored Profiles including inactive and recently deleted records. Microsoft Dynamics 365 Sales pricing is per-user named license. When migrating from Customer.io to Dynamics 365, the customer may be moving from a per-contact pricing model to a per-user model. We flag the active-to-inactive ratio during scoping so the customer understands whether their Dynamics 365 per-user cost will be higher or lower than their Customer.io profile billing. This analysis is part of the pre-migration business case, not a migration configuration decision.

Migration approach

Six steps for a successful Customer.io to Microsoft Dynamics 365 Sales data migration

  1. Discovery and source audit

    We audit the Customer.io workspace across object types (People, Companies, Custom Objects), event schemas (all track() call names and top property keys), active Journeys and Workflows, Broadcast history, and delivery log scope. We pair this with a Dynamics 365 environment audit: existing entities, custom fields, security roles, and whether Customer Insights - Journeys is licensed. The discovery output is a written migration scope covering record counts per object, event history volume, a preliminary object mapping, and a Lead-Contact split rule proposal based on the customer's email capture rate.

  2. Schema design and custom entity provisioning

    We design the destination Dynamics 365 schema on Dataverse. This includes pre-creating custom entities for Customer.io event history (cio_event), anonymous event records (cio_anonymous_event), and any Custom Object namespaces that have no standard Dynamics 365 equivalent. We define custom fields on Contact and Account to carry Customer.io identifiers (cio_user_id__c, cio_company_id__c) and to preserve original Lifecycle Stage values. Schema is deployed into a Dynamics 365 Sandbox environment first for validation before any data moves.

  3. Sandbox migration and reconciliation

    We run a full migration into the Dynamics 365 Sandbox using representative data volume. The customer's RevOps or IT lead reconciles record counts (Contacts in, Leads in, Accounts in, event records in), spot-checks 25-50 records against the Customer.io source, and reviews the anonymous-profile handling decision. Schema corrections, field type adjustments, and split rule refinements happen here. No production data moves until the sandbox sign-off is received from the customer's project owner.

  4. Event schema profiling and audience mapping

    We analyze the full Customer.io event schema to identify the most common property keys across all track() events. Properties appearing in more than 10 percent of events are mapped to named columns on the custom event entity; less common properties are serialized into a JSON properties column. We also export segment rule sets as structured JSON documents for the customer's admin to implement as Power Automate flows or Advanced Find views post-migration.

  5. Production migration in dependency order

    We run production migration in record-dependency order: Accounts (from Customer.io Companies), Contacts and Leads (with the anonymous split applied and AccountId resolved), custom entities (event history, Custom Objects), then message delivery history as Campaign Member records. Each phase emits a row-count reconciliation report. We use Dataverse bulk import with batch chunking and exponential backoff on throttling responses. During cutover we freeze Customer.io writes, run a final delta migration of any records modified during the migration window, then hand off Dynamics 365 as the system of record.

  6. Cutover, validation, and rebuild handoff

    We freeze the Customer.io integration during cutover, validate record counts in Dynamics 365 against the source, and confirm the anonymous-profile handling matches the signed-off split rule. We deliver the Journey and Workflow inventory document, the segment rule documentation, and the transactional template content export. We support a one-week hypercare window for reconciliation issues raised by the customer's team. We do not rebuild Customer.io Workflows or Journeys as Power Automate flows inside the migration scope; that work is documented and handed off as a separate rebuild task.

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.
Microsoft Dynamics 365 Sales  logo

Microsoft Dynamics 365 Sales

Destination

Strengths

  • Native integration with Microsoft 365, Teams, Outlook, and SharePoint for unified productivity workflow
  • Unlimited custom tables and complex workflows on Enterprise tier enable deep customization for complex sales processes
  • AI-driven predictive analytics and deal intelligence on Enterprise and Premium tiers help sales teams prioritize pipeline
  • Dataverse unified data layer provides a consistent API and data model across all Dynamics 365 and Power Platform apps
  • Strong security model with Field-Level Security and Record Ownership rules for governance-conscious enterprises

Weaknesses

  • Sales Professional tier caps custom tables at 15, creating a migration ceiling for highly customized SMB environments
  • October 2024 pricing increases of $15 per user across all tiers apply to existing customers upon renewal
  • Implementation typically requires costly certified partners, adding 30–50% to total project cost
  • Updates and platform releases can disrupt customizations and plugins, requiring regression testing after each wave
  • Non-Microsoft integrations require additional configuration or middleware, limiting flexibility for heterogeneous tech stacks

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 Microsoft Dynamics 365 Sales .

  • 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 Microsoft Dynamics 365 Sales 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 Microsoft Dynamics 365 Sales data migrations

Answers to the questions buyers ask most during Customer.io to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Customer.io to Microsoft Dynamics 365 Sales migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Migrations under 10,000 active Profiles with no event history preservation land between three and five weeks and complete in the sandbox-validate-then-migrate pattern. Migrations with full event timeline preservation (over 100,000 event records), multiple Custom Object types, large Company objects, or a complex anonymous-profile split decision move to eight to twelve weeks because of Dataverse custom entity setup, event schema profiling, and bulk import batching with parent-record lookup resolution.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Customer.io.
Land in Microsoft Dynamics 365 Sales , 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