CRM migration
Field-level mapping, validation, and rollback between OPEX 365 CRM and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
OPEX 365 CRM
Source
Freshsales
Destination
Compatibility
8 of 9
objects map 1:1 between OPEX 365 CRM and Freshsales.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from OPEX 365 CRM to Freshsales is a migration from a Dataverse-backed Microsoft-centric platform to a Freshworks SaaS CRM with AI-powered sales tools and built-in telephony. OPEX 365 CRM stores data on a unified Dataverse schema that supports custom entities, polymorphic activityparty relationships, and base64-encoded attachment blobs; Freshsales uses a conventional object model with Contacts, Accounts, Deals, Leads, Tasks, and Notes. We extract via the Dataverse API with schema discovery to enumerate all custom entities, resolve polymorphic activityparty references before importing Activities into Freshsales Tasks and Events, and separate attachment extraction from Notes so file content lands in Freshsales as proper attachments. Owner resolution uses email-based matching against Freshsales User records. Workflows, Power Automate flows, and Dataverse plugin assemblies do not migrate; we deliver a written inventory for the customer's admin to rebuild in Freshsales workflows.
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 OPEX 365 CRM object lands in Freshsales, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
OPEX 365 CRM
Contact
Freshsales
Contact
1:1OPEX 365 CRM Contact records map directly to Freshsales Contact. The Dataverse contactid is preserved in a custom field src_contactid__c for audit. Email, phone, address, lifecycle stage, and owner assignments transfer to Freshsales equivalent fields. Owner resolution uses email matching against Freshsales User records.
OPEX 365 CRM
Account
Freshsales
Account
1:1OPEX 365 CRM Account records map to Freshsales Account. The Account record is imported before any Contact import so that the parent Account lookup is satisfied at Contact insert time. Industry, annual revenue, website, and address fields transfer directly. Account is the parent entity for Contact in both systems.
OPEX 365 CRM
Opportunity
Freshsales
Deal
1:1OPEX 365 CRM Opportunity records map to Freshsales Deal. Pipeline stage names and probabilities vary across OPEX 365 CRM implementations, so we capture the source stage label, probability percentage, estimated close date, and amount during discovery and map them to Freshsales Deal stages. The customer configures the target pipeline structure in Freshsales before migration.
OPEX 365 CRM
Lead
Freshsales
Lead
1:1OPEX 365 CRM Lead records map to Freshsales Lead. Lead status, lead source, and any lead scoring fields transfer to Freshsales equivalent fields. Freshsales Lead conversion creates a corresponding Contact and Account. We preserve lead_status in a custom field src_lead_status__c for audit after conversion.
OPEX 365 CRM
Opportunity Product
Freshsales
Deal Product
1:1OPEX 365 CRM opportunity product records (linked via productpricelevel entities) map to Freshsales Deal Products. Product name, SKU, quantity, and unit price transfer. Bundle structures may require reassembly in Freshsales after migration.
OPEX 365 CRM
Activitypointer + activityparty
Freshsales
Task + Event
1:1OPEX 365 CRM activities use the activitypointer entity with polymorphic activityparty records whose partyid can reference Contacts, Accounts, Leads, or Users. We run a referential integrity pass that resolves each activityparty record to its correct target type and Freshsales record ID before importing. Unresolved party references create placeholder Contact records so activity assignments are not orphaned. Emails become Tasks with type email; calls become Tasks with subtype call; meetings become Events.
OPEX 365 CRM
Annotation (Notes + Attachments)
Freshsales
Note + Attachment
1:1OPEX 365 CRM Notes are annotation entities with base64-encoded file content. We extract annotation records using the Dataverse RetrieveContent discharge API and store binary content in staging blob storage, then remap file references to Freshsales Attachments linked to the corresponding Contact, Account, Deal, or Lead record. Notes without attachments migrate as Freshsales Note records. This is a distinct extraction step because standard API exports do not include attachment bodies.
OPEX 365 CRM
Custom Entities (Dataverse)
Freshsales
Custom Fields on Standard Objects
lossyCustom Dataverse entities are enumerated via the EntityDefinitions API during pre-migration discovery. Each custom entity's attributes are mapped to Freshsales custom fields on the nearest standard object (Contact, Account, or Deal). On Growth plan, only custom fields on standard objects are available; Pro and Enterprise support additional custom object configuration. We deploy the custom field schema to the target Freshsales instance before data import begins.
OPEX 365 CRM
User (Owner)
Freshsales
User
1:1OPEX 365 CRM Users map to Freshsales Users by email address. Owner references on Contact, Account, Deal, and Activity records are resolved to Freshsales User IDs at migration time. Any OPEX 365 CRM Owner without a matching Freshsales User goes to a reconciliation queue for the customer's admin to provision before record import resumes.
| OPEX 365 CRM | Freshsales | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Account | Account1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Lead | Lead1:1 | Fully supported | |
| Opportunity Product | Deal Product1:1 | Fully supported | |
| Activitypointer + activityparty | Task + Event1:1 | Fully supported | |
| Annotation (Notes + Attachments) | Note + Attachment1:1 | Fully supported | |
| Custom Entities (Dataverse) | Custom Fields on Standard Objectslossy | Fully supported | |
| 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.
OPEX 365 CRM gotchas
Dataverse API rate limits vary by license tier
Custom entity schemas require manual enumeration
Activity Party relationships are polymorphic and fragile
Legacy attachment storage requires separate extraction
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
Schema discovery and custom entity enumeration
We connect to the OPEX 365 CRM Dataverse API and run a schema discovery scan using the EntityDefinitions endpoint to enumerate all standard and custom entities, their attributes, attribute types, and relationships. This output drives the complete field mapping spreadsheet. We simultaneously inventory the pipeline and stage configurations, owner assignments, and any custom option set values used for picklists.
Freshsales target schema setup
We configure the Freshsales target environment before importing data. This includes provisioning custom fields on Contact, Account, Deal, and Lead to receive the mapped custom Dataverse attributes, configuring Deal stages and pipelines to match the source pipeline structure, and setting up Freshsales Users mapped by email from the OPEX 365 CRM owner list. The customer configures the Freshsales pipeline stages during this phase.
Attachment extraction from annotation entities
We extract annotation records with base64-encoded file content using the Dataverse API and store binary blobs in our staging environment. We tag each blob with its parent object type, parent record ID, and original filename. This step runs in parallel with the main data extraction to avoid extending the critical path.
Owner reconciliation
We extract every distinct OPEX 365 CRM User referenced as an owner on Contact, Account, Deal, and Activity record and match by email against the Freshsales User table. Owners without a matching Freshsales User are held in a reconciliation queue for the customer's admin to provision before record import resumes. Owner references are required on most standard object imports.
Production migration in dependency order
We run production migration in record-dependency order: Accounts first, then Contacts with AccountId resolved, then Leads, then Deals with AccountId and OwnerId resolved, then Tasks and Events via resolved activityparty references, then Notes and Attachments. Each phase emits a row-count reconciliation report before the next phase begins. Attachment blobs are uploaded to Freshsales via the attachment API after the parent record has been confirmed in the system.
Cutover, validation, and workflow handoff
We freeze OPEX 365 CRM writes during cutover, run a final delta migration of any records modified during the migration window, then enable Freshsales as the system of record. We deliver a written inventory of every OPEX 365 CRM workflow, Power Automate flow, and Dataverse plugin for the customer's admin to rebuild in Freshsales workflow automation. We support a one-week hypercare window for reconciliation issues. We do not rebuild workflows or automations as part of the migration scope.
Platform deep dives
OPEX 365 CRM
Source
Strengths
Weaknesses
Freshsales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 4 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 OPEX 365 CRM and Freshsales.
Object compatibility
4 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
OPEX 365 CRM: Varies by license tier and environment; not publicly documented for all tiers.
Data volume sensitivity
OPEX 365 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 OPEX 365 CRM to Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your OPEX 365 CRM to Freshsales migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave OPEX 365 CRM
Other ways to arrive at Freshsales
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.