CRM migration
Field-level mapping, validation, and rollback between Dynamics 365 Marketing and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Dynamics 365 Marketing
Source
Twenty CRM
Destination
Compatibility
7 of 11
objects map 1:1 between Dynamics 365 Marketing and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Dynamics 365 Marketing to Twenty CRM is driven by two pressures: cost and complexity. Dynamics 365 Marketing starts at $1,500 per tenant per month on top of CRM user licenses, and implementation timelines routinely stretch to six to twelve weeks. Twenty CRM is free and open-source with a web-based UI that does not require a Microsoft stack. We handle the migration by exporting Dataverse-backed records via the Dynamics 365 API, resolving the Contact-to-Account parent lookups, applying the marketing contact billing suppression flag to prevent post-import billing exposure, and sequencing Activity imports after the parent record population is confirmed. Customer Journeys, Customer Insights segments, and marketing asset configurations are not migrated as functional code; we deliver a written inventory of these assets for the customer's admin to rebuild in Twenty CRM or a dedicated marketing automation tool.
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 Dynamics 365 Marketing 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.
Dynamics 365 Marketing
Contact (msdyn_contact / Dataverse Contact)
Twenty CRM
Person
1:1Dynamics 365 Contact records map directly to Twenty CRM Person records. Standard fields (fullname, emailaddress1, telephone1, address) map to Twenty CRM's name, email, phone, and address fields. The Contact-to-Account lookup resolves to a Twenty CRM Organization record that we import first. We apply a marketing contact suppression flag at import time by setting a custom field or tag to prevent any unintended billing exposure from contacts that qualified as marketing contacts in Dynamics 365. The msdy_contacttype property, if used, maps to a custom Person field for reporting.
Dynamics 365 Marketing
Account (Dataverse Account)
Twenty CRM
Organization
1:1Dynamics 365 Account records map to Twenty CRM Organization. The Account.Name field maps to Organization.name, Account.industry maps to Organization.industry, and address fields map directly. Account hierarchies (parent account references) are preserved where Twenty CRM's organization model supports hierarchical relationships. We import Organizations before Persons so that the Contact-to-Account lookup resolves at the moment of Person insert.
Dynamics 365 Marketing
Lead (Dataverse Lead)
Twenty CRM
Person (with lifecycle context)
1:manyDynamics 365 Lead records do not have a direct Twenty CRM equivalent because Twenty CRM uses a unified Person model rather than a separate Lead object. We import Leads as Twenty CRM Person records and preserve the Lead.Status property as a custom Person field (lead_status__c) and Lead.LeadSource as lead_source__c. The customer's admin decides whether to re-engage migrated Leads in Twenty CRM or mark them for follow-up in a separate campaign tool.
Dynamics 365 Marketing
Opportunity (msdyn_opportunity / Dataverse Opportunity)
Twenty CRM
Opportunity
1:1Dynamics 365 Opportunity records map to Twenty CRM Opportunity. Fields map as follows: Opportunity.Name to Opportunity.name, Opportunity.EstimatedCloseDate to Opportunity.closeDate, Opportunity.EstimatedValue to Opportunity.amount, Opportunity.StatusCode to Opportunity.stage, and Opportunity.OwnerId to Opportunity.accountId via user lookup resolution. Pipeline stages map to Twenty CRM stage values configured before migration.
Dynamics 365 Marketing
ActivityPointer (Email, Task, PhoneCall, Appointment)
Twenty CRM
Activity (email, task, meeting, call)
1:1Dynamics 365 activities stored in ActivityPointer and its type-specific child tables (Email, Task, PhoneCall, Appointment) map to Twenty CRM Activity records. We preserve the regarding object lookup (objectid and objecttypecode) to re-associate each activity with the correct Person or Organization in Twenty CRM. The activity timestamp (ScheduledStart) maps to Activity.date. Call dispositions and durations migrate as custom activity fields. Email body content migrates as the activity description.
Dynamics 365 Marketing
Note / Annotation (file attachments)
Twenty CRM
Attachment
1:1Dynamics 365 Annotations (notes with file attachments) are exported individually. We handle them in a separate pass after parent records (Person, Organization, Opportunity) are confirmed in Twenty CRM. The objectid and objecttypecode from Dynamics map to the target Twenty CRM record ID so attachments re-associate correctly with their parent record. Large binary attachments (>10 MB) require chunked upload handling via the Twenty CRM API.
Dynamics 365 Marketing
Campaign (Dataverse Campaign)
Twenty CRM
Target List (documented)
lossyDynamics 365 Campaigns and Campaign Activities are part of the legacy marketing model and have no direct Twenty CRM equivalent. We extract campaign structure (campaign name, status, dates, budgeted cost) as a structured data export. The association between campaigns and Marketing List members is preserved as a written target list inventory that the customer's admin recreates in their chosen marketing automation tool. Campaign Activities are not migrated as functional records.
Dynamics 365 Marketing
Marketing List (msdynmkt_marketinglist)
Twenty CRM
Target List (documented)
lossyMarketing List membership records are exported as a static list of Person and Organization IDs. Because Marketing Lists in Dynamics 365 reference Campaigns and contain members of a single entity type (Contacts, Accounts, or Leads), we export the list membership and member IDs and deliver a written target list inventory mapping each Dynamics 365 Marketing List to a recommended Twenty CRM target list name. The customer's admin recreates these lists in their marketing automation tool of choice.
Dynamics 365 Marketing
Customer Insights Segment (Customer Insights - Data)
Twenty CRM
Static List (documented)
lossyCustomer Insights segment definitions live in the Customer Insights - Data service, which is separate from the core CRM Dataverse database. A CRM-only export will leave segment memberships behind. We execute a separate export pass for segment memberships, mapping each segment's member Person IDs to a static list in the delivery document. Segments are not recreated as functional automation logic in Twenty CRM; we document the segment criteria and member count for the customer's marketing team to rebuild in their chosen marketing automation platform.
Dynamics 365 Marketing
User / Owner (Dataverse SystemUser)
Twenty CRM
User
1:1Dynamics 365 Owner assignments on Contact, Account, Opportunity, and Activity records are migrated as user lookups in Twenty CRM. We resolve owners by email match against the Twenty CRM User table. Any Dynamics 365 Owner without a matching Twenty CRM User goes to a reconciliation queue for the customer's admin to provision before record import resumes. Inactive Dynamics 365 users are mapped to inactive Twenty CRM users with the original OwnerId preserved in a custom field for audit.
Dynamics 365 Marketing
Custom Entity (Dataverse solution-defined)
Twenty CRM
Custom Field / Related Object
1:1Custom entities created within a Dataverse managed solution are supported but require a pre-migration schema export (the solution ZIP or Configuration Migration Tool schema file). We do not infer custom entity structure from Dynamics 365 UI exports. The customer must provide the managed solution schema before we can accurately map custom entity imports. Custom fields on standard entities (Contact, Account, Opportunity) are created as Twenty CRM custom fields before data import begins. Custom entities with lookup relationships to standard entities are imported after the parent standard entity is confirmed in Twenty CRM.
| Dynamics 365 Marketing | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact (msdyn_contact / Dataverse Contact) | Person1:1 | Fully supported | |
| Account (Dataverse Account) | Organization1:1 | Fully supported | |
| Lead (Dataverse Lead) | Person (with lifecycle context)1:many | Fully supported | |
| Opportunity (msdyn_opportunity / Dataverse Opportunity) | Opportunity1:1 | Fully supported | |
| ActivityPointer (Email, Task, PhoneCall, Appointment) | Activity (email, task, meeting, call)1:1 | Fully supported | |
| Note / Annotation (file attachments) | Attachment1:1 | Fully supported | |
| Campaign (Dataverse Campaign) | Target List (documented)lossy | Fully supported | |
| Marketing List (msdynmkt_marketinglist) | Target List (documented)lossy | Fully supported | |
| Customer Insights Segment (Customer Insights - Data) | Static List (documented)lossy | Fully supported | |
| User / Owner (Dataverse SystemUser) | User1:1 | Fully supported | |
| Custom Entity (Dataverse solution-defined) | Custom Field / Related Object1: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.
Dynamics 365 Marketing gotchas
Marketing Contact billing triggers on record import
Configuration Migration Tool does not migrate high-volume transactional data
Customer Insights segments are stored separately from Dataverse CRM records
Marketing Lists and Campaign Activities have legacy schema dependencies
Custom entities require a managed solution schema, not a UI export
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
Discovery and schema audit
We audit the source Dynamics 365 Marketing environment across the Dataverse CRM schema and Customer Insights - Data service. This includes enumerating standard entities (Contact, Account, Opportunity, Lead, ActivityPointer), custom entities from the managed solution, Customer Insights segment definitions, Marketing List memberships, and owner assignments. We pair this with a Twenty CRM environment scan to confirm custom field availability, user provisioning, and stage configuration. The discovery output is a written migration scope with entity counts, a preliminary object mapping, and the marketing contact flag strategy.
Schema design and marketing contact flag planning
We design the destination schema in Twenty CRM. This includes creating custom fields (matching Dynamics 365 field types to Twenty CRM field types), configuring Opportunity stage values to align with the Dynamics 365 pipeline stages, and defining the Person field that will carry the original Lead status for audit. We also define the marketing contact suppression tag that will be applied to contacts at import time. Schema is validated in a Twenty CRM sandbox environment before production migration begins.
Customer Insights segment export pass
We execute a separate export pass for Customer Insights segment memberships from the Customer Insights - Data service. This runs in parallel with the Dataverse CRM audit. Segment membership exports produce a list of Person ID pairs (segment ID, person ID) that we import into Twenty CRM as static list records after Person records are confirmed. Segment criteria logic is captured in the written handoff document for the customer's marketing team to recreate in their chosen marketing automation platform.
Sandbox migration and reconciliation
We run a full migration into a Twenty CRM sandbox using production-like data volume. The customer's RevOps or marketing operations lead reconciles record counts (Persons in, Organizations in, Opportunities in, Activities in), spot-checks 25-50 random records against the Dynamics 365 source, and signs off the schema and mapping before production migration begins. Any mapping corrections happen here, not in production.
Production migration in dependency order
We run production migration in record-dependency order: Organizations first (from Dynamics 365 Accounts), then Persons (from Dynamics 365 Contacts and Leads with the lifecycle context preserved), then Opportunities (with OrganizationId and OwnerId resolved), then Activity history (via Dataverse API with chunking and rate-limit handling), then Attachments (after parent records confirmed), then Custom Entities (last, because they often have lookups to standard entities), then Customer Insights segment memberships. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and written handoff
We freeze Dynamics 365 writes 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 covering Customer Journey definitions (documented only, not migrated), Customer Insights segments (criteria and member count), Marketing List memberships, Campaign structure, and active workflow or automation inventory for the customer's admin to rebuild in their chosen marketing automation tool. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team.
Platform deep dives
Dynamics 365 Marketing
Source
Strengths
Weaknesses
Twenty 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 Dynamics 365 Marketing and Twenty 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
Dynamics 365 Marketing: Dataverse Web API enforces organization-level throttling; specific limits vary by workload and are not publicly documented at fixed thresholds.
Data volume sensitivity
Dynamics 365 Marketing 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 Dynamics 365 Marketing to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Dynamics 365 Marketing to Twenty 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 Dynamics 365 Marketing
Other ways to arrive at Twenty 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.