CRM migration
Field-level mapping, validation, and rollback between OpenCRM and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
OpenCRM
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
9 of 11
objects map 1:1 between OpenCRM and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from OpenCRM to Microsoft Microsoft Dynamics 365 Sales is a cross-platform migration where data extraction relies on OpenCRM's UI-based CSV export since no public bulk REST or GraphQL endpoint exists. OpenCRM stores Contacts linked to Companies via foreign key; we enforce a Companies-before-Contacts import sequence in Dynamics 365 so that every Contact lands with a resolved AccountId lookup rather than a null reference. Pipeline stages in OpenCRM are tenant-defined free text, requiring a stage-mapping table we produce and the customer confirms before Deal import begins. Activities (calls, emails, meetings, tasks) migrate as Dataverse activity records linked to the parent Contact or Account. We do not migrate OpenCRM workflows, automations, or custom scripts as code; we deliver a written inventory of these for the customer's admin to rebuild in Dynamics 365.
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.
Source platform
OpenCRM platform overview
Scorecard, SWOT, gotchas, and pricing for OpenCRM.
Destination platform
Microsoft Dynamics 365 Sales platform overview
Scorecard, SWOT, gotchas, and pricing for Microsoft Dynamics 365 Sales .
Data migration guide
The complete Microsoft Dynamics 365 Sales migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Destination checklist
Microsoft Dynamics 365 Sales migration checklist
Pre- and post-cutover tasks for moving onto Microsoft Dynamics 365 Sales .
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a OpenCRM 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.
OpenCRM
Company
Microsoft Dynamics 365 Sales
Account
1:1OpenCRM Organisation records map to Microsoft Dynamics 365 Sales Account. The Organisation Name becomes Account Name; the primary address maps to Address Line 1, City, State/Province, and Country. We use the OpenCRM record ID as an external identifier for upsert matching so that if a migration run is interrupted, subsequent runs update rather than duplicate Account records. Account must be imported before Contact because Dynamics 365 Contact requires a valid AccountId lookup at insert time.
OpenCRM
Contact
Microsoft Dynamics 365 Sales
Contact
1:1OpenCRM Contact records map to Dynamics 365 Contact. We resolve the parent Organisation reference to an AccountId using the external identifier resolved in the Account import phase. Standard fields (FirstName, LastName, Email, BusinessPhone, MobilePhone) map directly; custom contact fields map to Dataverse custom fields created during the schema phase. Orphaned Contacts without a valid parent Organisation are flagged in a reconciliation report before we commit the Contact batch.
OpenCRM
Deal
Microsoft Dynamics 365 Sales
Opportunity
1:1OpenCRM Deals map to Dynamics 365 Opportunity. Deal name becomes Opportunity Name; Deal value maps to EstimatedRevenue; expected close date maps to CloseDate; owner assignment maps to OwnerId via the User reconciliation table. The Deal's linked Organisation or Contact maps to AccountId and ContactId on Opportunity respectively.
OpenCRM
Pipeline Stages
Microsoft Dynamics 365 Sales
Opportunity Stage
lossyOpenCRM pipeline stages are tenant-defined free-text values with no enforced list. Dynamics 365 Opportunity Stage is a picklist tied to a Sales Process. We produce a stage-mapping table during scoping, presenting it to the customer for confirmation of the 1:1 or N:1 mapping between OpenCRM stage names and Dynamics 365 stage values. Probability percentages migrate from OpenCRM to StageProbability, rounded to the nearest integer allowed by Dynamics 365.
OpenCRM
Pipeline
Microsoft Dynamics 365 Sales
Record Type + Sales Process
lossyIf OpenCRM uses multiple pipelines to separate lines of business or product categories, each pipeline becomes a Dynamics 365 Opportunity Record Type with its own Sales Process that whitelists the relevant stage values. We configure Record Types and Sales Processes in the destination sandbox before migration so that Opportunity records land with the correct RecordTypeId from the first import run.
OpenCRM
Activity: Call
Microsoft Dynamics 365 Sales
PhoneCall (Task with TaskSubtype = Call in Dataverse)
1:1OpenCRM call activity records map to Dataverse PhoneCall or Task with TaskSubtype = Call. Subject, description, duration, and call outcome migrate to custom fields on the PhoneCall entity. The Parent Contact or Account reference resolves to the migrated ContactId or AccountId. We set ActualEnd to the original OpenCRM timestamp to preserve call chronology in the activity timeline.
OpenCRM
Activity: Meeting
Microsoft Dynamics 365 Sales
Appointment (Event)
1:1OpenCRM meeting records map to Dataverse Appointment. Subject, Location, Start, End, and Description migrate directly. Attendees resolve to ContactId and AccountId references via the migrated Contact and Account records. The Organizer field maps to the resolved OwnerId of the original OpenCRM meeting owner.
OpenCRM
Activity: Task
Microsoft Dynamics 365 Sales
Task
1:1OpenCRM task activities map to Dataverse Task with Status, Priority, Subject, and ActivityDate preserved. Assigned-to resolves via the User reconciliation table. Tasks linked to a specific Deal migrate with the WhatId pointing to the migrated Opportunity record.
OpenCRM
Note
Microsoft Dynamics 365 Sales
Annotation
1:1OpenCRM Notes attached to Contacts, Organisations, or Deals migrate as Dataverse Annotation records linked via the ObjectId lookup to the migrated Contact, Account, or Opportunity. Note body migrates as the Notetext field; any embedded file references migrate as separate DocumentLocation annotations pointing to the attachment file store we extract alongside the record data.
OpenCRM
Custom Fields
Microsoft Dynamics 365 Sales
Custom Fields
1:1OpenCRM custom fields on Contact, Organisation, and Deal are discovered during scoping by inspecting a sample CSV export. We create matching Dataverse custom fields in the destination environment before migration, mapping data types (text to String, number to Integer or Decimal, date to DateTime) and preserving the original OpenCRM field labels as field display names in Dynamics 365. Customer confirms custom field scope during the scoping sign-off.
OpenCRM
User / Owner
Microsoft Dynamics 365 Sales
User
1:1OpenCRM Owner assignments on Deals and Contacts are resolved by email match against the Dynamics 365 User table. Owners without a matching Dynamics 365 User are held in a reconciliation queue and the customer's admin provisions the User record before the migration resumes. OwnerId references on Opportunity, Contact, and Account are written as the resolved Dynamics 365 User ID, not the OpenCRM owner name string.
| OpenCRM | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Company | Account1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Pipeline Stages | Opportunity Stagelossy | Mapping required | |
| Pipeline | Record Type + Sales Processlossy | Fully supported | |
| Activity: Call | PhoneCall (Task with TaskSubtype = Call in Dataverse)1:1 | Fully supported | |
| Activity: Meeting | Appointment (Event)1:1 | Fully supported | |
| Activity: Task | Task1:1 | Fully supported | |
| Note | Annotation1:1 | Fully supported | |
| Custom Fields | Custom Fields1:1 | Mapping required | |
| User / Owner | User1: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.
OpenCRM gotchas
Bulk import without CRM ID or ExternalID creates duplicate records
Import ordering dependency: Companies before Contacts
No documented public REST API for programmatic export
Pipeline stage names are tenant-defined and require manual mapping
Microsoft Dynamics 365 Sales gotchas
Professional tier 15-table custom table limit blocks migrations
October 2024 pricing increase applies at renewal for all customers
Custom fields must be created in the UI before API writes
Power Platform request limits apply to bulk migrations
Activity records orphaned to inactive owners fail silently
Pair-specific challenges
Migration approach
Discovery and scoping
We audit the source OpenCRM instance by running full-column CSV exports for each primary object (Organisations, Contacts, Deals, Activities). We count records, identify custom field names and data types by inspecting the CSV headers, and inventory any active automation rules by reviewing the OpenCRM configuration with the customer's admin. We pair this with a Dynamics 365 edition check (Professional at £65/user or Enterprise at £105/user) and identify any required Dataverse custom fields, Record Types, or Sales Processes not yet present in the destination environment.
Stage-mapping table and schema preparation
We produce a pipeline stage-mapping table by extracting the distinct stage values from the OpenCRM Deal export and matching them to the nearest equivalent Dynamics 365 Opportunity Stage picklist values. The customer reviews and approves the mapping. We create the required Record Types, Sales Processes, and custom Dataverse fields in the Dynamics 365 sandbox environment, deploy, and validate that the schema supports the full OpenCRM field set before any data is loaded.
CSV extraction and data staging
We work with the customer's OpenCRM admin to run complete CSV exports for all objects, including all columns, and to export attachments separately via the OpenCRM file store. We stage the files, validate row counts against the OpenCRM record counts reported in the UI, and parse them into migration-ready transform files. Any data quality issues (duplicate email addresses, malformed dates, blank required fields) are flagged in a pre-migration data quality report for the customer to address before we begin loading.
Sandbox migration and reconciliation
We run a full migration into a Dynamics 365 sandbox using production-like data volume. The customer reconciles record counts (Accounts in, Contacts in, Opportunities in, Activities in), spot-checks 25-50 records against the OpenCRM source, and signs off the schema, mapping, and stage table before production migration begins. Any corrections to field mapping, stage mapping, or custom field creation are applied in the sandbox, not in production.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from OpenCRM Organisations), Contacts (with AccountId resolved), Opportunities (with AccountId, OwnerId, RecordTypeId, and StageName resolved via the confirmed stage map), Activities (Tasks, Appointments, PhoneCalls via Dataverse Bulk API 2.0 with chunking and exponential backoff), and Notes (as Dataverse Annotations with file reference links). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and workflow handoff
We freeze OpenCRM writes during cutover, run a final delta migration of any records created or modified during the migration window, then enable Dynamics 365 as the system of record. We deliver the OpenCRM workflow and automation inventory document to the customer's admin team with Power Automate and Dataverse workflow equivalents noted. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's sales team. Workflow rebuild, Power Automate configuration, and post-migration training are outside the migration scope and are handled by the customer's admin or a Microsoft partner separately.
Platform deep dives
OpenCRM
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 3 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 OpenCRM and Microsoft Dynamics 365 Sales .
Object compatibility
3 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
OpenCRM: Not publicly documented.
Data volume sensitivity
OpenCRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.
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 OpenCRM to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your OpenCRM to Microsoft Dynamics 365 Sales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave OpenCRM
Other ways to arrive at Microsoft Dynamics 365 Sales
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.