CRM migration
Field-level mapping, validation, and rollback between Atomic CRM and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
Atomic CRM
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
5 of 8
objects map 1:1 between Atomic CRM and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
2-4 weeks
Overview
Atomic CRM ships as a MIT-licensed React developer template on Supabase with no REST or GraphQL API surface — every migration reads directly from the Postgres database via Supabase table APIs. The schema audit phase is critical because custom fields in Atomic CRM are Postgres column additions via Supabase Studio, not UI-configured properties, and deal categories and task types live in TypeScript props passed to the CRM root component rather than in any database table. We capture both during scoping. We also check for Supabase Storage buckets used for file attachments, as binary blob storage does not migrate under standard scope. On the destination side, Microsoft Microsoft Dynamics 365 Sales uses Dataverse as its data layer with a typed column model, so every migrated Postgres column requires a type-mapped Dataverse column created before any data loads. We resolve source users by email lookup against the destination User table and raise a reconciliation queue for any owner that has no matching account. Workflows, automations, and any informal business logic encoded in CRM component props do not migrate; we deliver a written specification of the props-defined enum values and any stage-transition rules for the customer's admin to rebuild in Power Automate or model-driven app business rules post-migration.
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
Atomic CRM platform overview
Scorecard, SWOT, gotchas, and pricing for Atomic CRM.
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 Atomic CRM 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.
Atomic CRM
Contact
Microsoft Dynamics 365 Sales
Lead or Contact (split required)
1:manyAtomic CRM stores all person records in a single Contacts table with no distinction between prospect and customer. We split at migration time using an active-deal association heuristic: Contacts with at least one associated open Deal map to Salesforce Contact; Contacts with no Deal association and no explicit customer flag map to Salesforce Lead. We preserve the original Contact record ID in a custom field atomic_crm_id__c on both Lead and Contact for audit traceability.
Atomic CRM
Company
Microsoft Dynamics 365 Sales
Account
1:1Atomic CRM Company records map directly to Dynamics 365 Account. We use the Company domain_name or website column as the dedupe key during import to prevent duplicate Account creation. Account must be inserted before Contact to satisfy the AccountId lookup reference on the Contact record.
Atomic CRM
Deal
Microsoft Dynamics 365 Sales
Opportunity
1:1Atomic CRM Deals map to Microsoft Dynamics 365 Sales Opportunity. Deal value, currency, expected close date, and owner reference transfer directly. The deal category (e.g. SaaS, Consulting, eCommerce) is captured from the CRM component props file during scoping and becomes a custom picklist field dst_deal_category__c on Opportunity because Dynamics does not have an equivalent native field. We set the OwnerId by resolving the Supabase auth UUID to the destination User email lookup.
Atomic CRM
Deal Stage (props-defined)
Microsoft Dynamics 365 Sales
Stage Name + Sales Process
lossyAtomic CRM defines pipeline stages as TypeScript props in App.tsx or equivalent, not in the database. We extract the full stage enumeration from the shared CRM configuration file during scoping and replicate it as a Microsoft Dynamics 365 Sales Process with corresponding StageName values. Stage probability percentages are set per the original props definition and rounded to the nearest Dynamics-allowed integer.
Atomic CRM
Task Type (props-defined)
Microsoft Dynamics 365 Sales
custom Task Type field
lossyTask types in Atomic CRM — Call, Email, Meeting — are passed as props to the CRM component rather than stored in the database. We extract the task type enumeration from the CRM configuration file and create a custom picklist field task_type__c on the Task entity in Dataverse. All migrated Tasks receive the correct type value from this enumeration. Any task type not present in the original props is flagged during scoping so the customer can confirm the correct classification.
Atomic CRM
Note
Microsoft Dynamics 365 Sales
Annotation
1:1Atomic CRM Notes are stored as Postgres records with a polymorphic or foreign-key relationship to Contact or Deal. We map them to Microsoft Dynamics 365 Sales Annotation records with IsDocument=false and the original note body preserved as the notetext column. The Regarding (objectid) lookup is resolved to the migrated Contact or Opportunity GUID at migration time.
Atomic CRM
Custom Fields
Microsoft Dynamics 365 Sales
Custom Columns
1:1Custom fields in Atomic CRM are Postgres columns added via Supabase Studio, not UI-configured properties. We run a pre-migration schema diff against a reference Atomic CRM export to discover every column on every table that is not part of the standard schema. Each discovered column is created as a Dataverse column of the equivalent type (text, number, boolean, date) before data migration begins. Any column with a Postgres type that has no direct Dataverse equivalent is flagged for customer decision during scoping.
Atomic CRM
User (Supabase Auth)
Microsoft Dynamics 365 Sales
User (Dataverse)
1:1Owner assignment on Deals and Tasks references Supabase auth UUIDs, not email addresses. We resolve source owners by email match against the destination Dynamics 365 User table. Any Supabase owner without a matching User record is held in a reconciliation queue for the customer's admin to provision before record import proceeds. Owner-less records are held with ownerid=null and flagged in the reconciliation report rather than silently skipped.
| Atomic CRM | Microsoft Dynamics 365 Sales | Compatibility | |
|---|---|---|---|
| Contact | Lead or Contact (split required)1:many | Fully supported | |
| Company | Account1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Deal Stage (props-defined) | Stage Name + Sales Processlossy | Fully supported | |
| Task Type (props-defined) | custom Task Type fieldlossy | Fully supported | |
| Note | Annotation1:1 | Fully supported | |
| Custom Fields | Custom Columns1:1 | Mapping required | |
| User (Supabase Auth) | User (Dataverse)1: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.
Atomic CRM gotchas
No hosted SaaS version — migration target is a Postgres database
Custom fields are schema changes, not UI-configured properties
CRM component props define business logic that lives in code, not data
No native file attachment export — storage backend varies by deployment
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
Supabase schema audit and config extraction
We connect to the source Supabase Postgres instance using the service role key and export the full schema — every table, column, type, and constraint — alongside the Supabase Storage configuration. We run a schema diff against the reference Atomic CRM export to surface all non-standard columns added post-deployment. In parallel, we request the CRM configuration file (App.tsx or equivalent) to capture TypeScript enum values for deal categories and task types. The output is a written schema audit report listing every object, column, data type, and enum value that must map to Dataverse.
Destination Dynamics 365 schema setup
We create the destination Dataverse columns for every source field identified in the schema audit. Custom picklist fields are created for deal categories and task types with the exact enumeration values from the CRM configuration file. We verify the Dynamics environment (Sandbox or non-production) is reachable via the Dataverse Web API and test authentication before any data load. Validation rules are reviewed and, where needed, temporarily deactivated or extended with a migration-context condition.
Owner reconciliation
We extract every distinct owner UUID from Deals and Tasks and map them to the destination Dynamics 365 User table by email. Any owner without a matching User is added to a reconciliation queue with the owner name, email, and record count. The customer's Dynamics admin provisions the missing Users before production migration begins. Migration cannot proceed with unresolved OwnerId references because Dynamics requires a valid User or Team for assignment.
Supabase data export and transform
We export all records from each Supabase table in dependency order: Companies first, then Contacts with AccountId resolved, then Deals with OwnerId and category values mapped, then Tasks with task type from the props enum, then Notes. We transform data types at export time (UUIDs to string, Postgres booleans to 1/0, custom JSON columns to text or split across multiple fields) to match Dataverse column types before loading.
Dataverse API load with reconciliation
We load data into Microsoft Dynamics 365 Sales via the Dataverse Web API (or Bulk API for large datasets over 50,000 records) in record-dependency order. Each phase — Accounts, Contacts, Opportunities, Tasks, Notes — emits a row-count reconciliation report comparing source record count to destination inserted count and listing any rejected records with the rejection reason. We resolve rejects before proceeding to the next phase.
Cutover and post-migration handoff
We freeze writes to the Supabase instance at cutover, run a final delta export for any records modified during the migration window, and complete the last Dataverse load. We deliver a written specification document for any deal-category or task-type logic that was defined in TypeScript props and must be rebuilt as Power Automate flows or Dataverse business rules by the customer's admin. We provide a one-week hypercare window to resolve any data issues reported by the sales team in the new Dynamics 365 environment.
Platform deep dives
Atomic CRM
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
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 Atomic CRM and Microsoft Dynamics 365 Sales .
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
Atomic CRM: Per Supabase rate limits applicable to your project tier.
Data volume sensitivity
Atomic CRM 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 Atomic CRM to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your Atomic CRM 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 Atomic CRM
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.