CRM migration

Migrate from Dynamics 365 Marketing to Twenty CRM

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 logo

Dynamics 365 Marketing

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

64%

7 of 11

objects map 1:1 between Dynamics 365 Marketing and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Dynamics 365 Marketing logo

Dynamics 365 Marketing

What's pushing teams away

  • Users without prior Microsoft stack experience report the interface as complex and overwhelming, with menu navigation described as clunky and feature locations hard to remember across sessions.
  • Performance degrades noticeably when handling large contact databases or running complex Journey logic, leading to slow load times that disrupt marketing team workflows.
  • Licensing costs are prohibitive for small to mid-market teams; the per-tenant Marketing price point starts at $1,500/month before user-level CRM seats are added.
  • Implementation timelines commonly stretch to 6-12 weeks for full deployments, and organizations underestimate the hidden costs of training, integration, and data migration that are not included in licensing quotes.
  • Power Apps and Power Automate are marketed as low-code but require technical resources to extend; business users hit barriers quickly when documentation assumes IT-level familiarity.

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 Dynamics 365 Marketing objects map to Twenty CRM

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)

maps to

Twenty CRM

Person

1:1
Fully supported

Dynamics 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)

maps to

Twenty CRM

Organization

1:1
Fully supported

Dynamics 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)

maps to

Twenty CRM

Person (with lifecycle context)

1:many
Fully supported

Dynamics 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)

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Dynamics 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)

maps to

Twenty CRM

Activity (email, task, meeting, call)

1:1
Fully supported

Dynamics 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)

maps to

Twenty CRM

Attachment

1:1
Fully supported

Dynamics 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)

maps to

Twenty CRM

Target List (documented)

lossy
Fully supported

Dynamics 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)

maps to

Twenty CRM

Target List (documented)

lossy
Fully supported

Marketing 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)

maps to

Twenty CRM

Static List (documented)

lossy
Fully supported

Customer 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)

maps to

Twenty CRM

User

1:1
Fully supported

Dynamics 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)

maps to

Twenty CRM

Custom Field / Related Object

1:1
Fully supported

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

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.

Dynamics 365 Marketing logo

Dynamics 365 Marketing gotchas

High

Marketing Contact billing triggers on record import

High

Configuration Migration Tool does not migrate high-volume transactional data

Medium

Customer Insights segments are stored separately from Dataverse CRM records

Medium

Marketing Lists and Campaign Activities have legacy schema dependencies

Low

Custom entities require a managed solution schema, not a UI export

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

  • Marketing contact billing flag has no Twenty CRM equivalent

    When contacts are imported into Dynamics 365 Marketing, any record qualifying as a Marketing Contact is billed at the tenant level. There is no silent flag at import time to demote records to non-marketing status. We flag which source records should land as non-marketing during the scoping call and apply a custom suppression tag at import time. This requires advance planning before any contact import begins. After migration, the customer should verify that Dynamics 365 Marketing's billing portal reflects only the intended marketing contact count to avoid continued charges on records that have been migrated away.

  • Customer Insights segments are not in the Dataverse CRM export

    Segment definitions and membership data live in the Customer Insights - Data service, not the core CRM Dataverse database. An export that only pulls CRM records will leave segment memberships behind entirely. We execute a separate export pass for Customer Insights segment data and handle dependency ordering so that Person records exist in Twenty CRM before segment memberships are imported as static list records. Segment criteria (the logic defining who belongs in a segment) are documented in the written handoff, not migrated as functional automation.

  • Configuration Migration Tool cannot move high-volume transactional data

    The Configuration Migration Tool is designed for reference data and marketing asset schema, not large-volume transactional records like contact history or activity timelines. We use the Dataverse API directly with batch chunking and rate-limit handling for high-volume record migration. This avoids the timeouts and record count limits that teams encounter when attempting to route production data through the Configuration Migration Tool.

  • Marketing Lists and Campaigns have legacy schema dependency ordering

    Marketing Lists reference Campaigns, which in turn reference activity records. Importing these out of order breaks the relationship chain. We sequence the import as: Organizations and Persons first, then Campaigns, then Marketing List memberships, then Campaign Activities. This ensures all lookups resolve before dependent records are written. The written handoff documents the full dependency tree for the customer's admin to reference when rebuilding campaign logic in a marketing automation tool.

  • Custom Dataverse entities require a managed solution schema export

    Extracting custom entity definitions from the Dynamics 365 UI does not capture relationship metadata, field security profiles, or managed property settings. We require the customer to export the managed solution ZIP or provide the schema file from the Configuration Migration Tool before we can accurately map custom entity imports. UI-based exports are used only for data verification, not schema definition. If the customer cannot provide a solution export, custom entity support is limited to fields visible in the standard Dynamics 365 UI export.

Migration approach

Six steps for a successful Dynamics 365 Marketing to Twenty CRM data migration

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

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

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

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

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

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

Context on both ends of the pair

Dynamics 365 Marketing logo

Dynamics 365 Marketing

Source

Strengths

  • Native integration with Microsoft 365, Teams, and SharePoint eliminates separate identity and document management overhead.
  • Dataverse provides a unified data layer across CRM, Customer Service, and Marketing, enabling single-customer-record views without ETL synchronization.
  • Customer Insights - Journeys includes AI-assisted content generation and predictive lead scoring as part of the Marketing tier.
  • Per-tenant pricing covers unlimited marketing contacts beyond the base tenant fee, which benefits large database marketers.
  • Configuration Migration Tool supports movement of marketing assets between environments for Dev-Test-Prod promotion.

Weaknesses

  • Per-tenant marketing pricing at $1,500/month plus user-level CRM seats creates significant cost for organizations not already committed to the Microsoft stack.
  • Steep learning curve and complex UI navigation mean implementation projects routinely require 6-12 weeks with dedicated admin resources.
  • Performance issues arise with large datasets and complex Journey logic, particularly when the marketing environment shares Dataverse capacity with other applications.
  • The split between outbound marketing (Customer Insights - Journeys) and transactional CRM data introduces schema complexity that simpler standalone marketing tools do not have.
  • Configuration Migration Tool cannot handle high-volume transactional data; large record migrations require Power Automate flows or custom plugins instead.
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 Dynamics 365 Marketing 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

    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

    A

    Dynamics 365 Marketing exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Dynamics 365 Marketing 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 Dynamics 365 Marketing to Twenty CRM data migrations

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

Can't find your answer?

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 consultation

Most migrations land between three and five weeks for accounts under 15,000 contacts and no custom Dataverse entities. Migrations with custom entities, large activity histories (over 200,000 records), or Customer Insights segment exports requiring a separate data pass move to eight to twelve weeks because of schema resolution, API chunking, and dependency ordering. The primary time variable is always the cleanliness and completeness of the source data export.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Dynamics 365 Marketing.
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