The problem
Dynamics 365 does not store your CRM as a set of tables you can export and re-import. It stores it as an entity model: entities with logical names that differ from their display names, option sets whose integer values carry meaning nowhere in the label, N:1 and N:N relationships expressed through lookups and intersect entities, business process flows that define what a record is allowed to do next, and an activity party model where a single email touches multiple records through participation types.
Generic importers see none of this. They see accounts, contacts and opportunities, and they flatten everything else. What you lose is the part that made Dynamics worth configuring: the connection between a quote, its opportunity, the account hierarchy above it, and the process stage that governs whether it can be approved. Mid-market organisations discover this halfway through a self-service migration, when the data is technically in Zoho and functionally unusable.
ECOSIRE builds a migration toolkit against your actual Dynamics entity metadata and your target Zoho CRM org. We read the metadata rather than guessing from screenshots, and we translate the model deliberately — including the parts of Dynamics that have no Zoho equivalent, which we handle explicitly instead of dropping.
What ECOSIRE builds
Entity metadata discovery
We extract your Dynamics entity metadata through the Dataverse Web API: entity logical names, attribute logical names and types, option set definitions with their integer values and labels, lookup targets, N:N intersect entities, and the relationship graph between them. Custom entities are read the same way as standard ones, so a heavily customised org is discovered rather than estimated.
Against that we map the Zoho CRM target. Accounts and Contacts map to the corresponding Zoho modules. Opportunities map to Deals. Leads map to Leads. Quotes, Orders and Invoices map to Zoho CRM Quotes, Sales Orders and Invoices, or to Zoho Books documents where the financial lifecycle belongs there instead — a decision we take with you, because it determines where your finance team works afterwards. Custom entities become Zoho CRM custom modules provisioned through the Metadata API.
Option sets, status reason and state code
This is where most Dynamics migrations quietly corrupt. Option set values are integers; labels can be changed independently; and statecode/statuscode pairs encode both an active/inactive state and a business reason. We build explicit translation tables from every option set integer to a named Zoho picklist value, and we map statecode and statuscode together so an opportunity closed as lost for a specific reason lands in Zoho with both the stage and the loss reason intact.
Multi-select option sets become Zoho multi-select picklists. Global option sets shared across entities are mapped once and reused, so you do not end up with four divergent copies of the same list.
Relationships and the intersect problem
N:1 lookups become Zoho CRM lookup fields, resolved by external id so a child record never points at the wrong parent. Account parent-child hierarchies become the Zoho CRM Accounts parent lookup, preserving the tree.
N:N relationships — held in Dynamics as intersect entities — have no direct Zoho equivalent. We build Zoho CRM linking modules and populate them from the intersect rows, so a many-to-many association survives instead of being flattened to a single lookup. Connections and connection roles are handled the same way where you use them.
Business process flows
A Dynamics business process flow is a stage machine attached to a record, and Zoho CRM expresses that differently. We rebuild the flow as a combination of Zoho CRM Blueprint — which enforces stage transitions, mandatory fields per stage and permitted transitions by profile — plus the Deal Stage picklist for reporting continuity. Each Dynamics stage becomes a Blueprint state with its entry criteria and required fields carried over, so the process still governs behaviour rather than merely describing it.
Where a business process flow spans entities, we say so during scoping and design the Zoho equivalent explicitly. We do not silently collapse it.
Activities and the activity party model
Dynamics activities — emails, phone calls, appointments, tasks — attach to records through activity parties with participation types (from, to, cc, required attendee, organiser). We migrate these into Zoho CRM Calls, Meetings, Tasks and Notes, resolving the regarding-object to the correct Zoho parent and preserving the primary participant relationship. Attendee lists that cannot be represented as a single Zoho field are written into the activity description in a structured, readable form rather than discarded.
Load, idempotency and reconciliation
Records load through the Zoho CRM Bulk Write API for volume, with the Record API used where per-record Deluge logic is needed. Every record carries an external id derived from its Dynamics GUID, which makes the entire migration idempotent: re-running updates in place, and a delta pass at cutover captures anything changed since the test extraction.
Every run produces a reconciliation report — record counts per entity against source, opportunity value totals per stage, activity counts per parent, and a failure log naming each rejected record with the Zoho API error responsible. Production cutover happens after you sign off on reconciliation, not before.
Who this is for
Mid-market organisations leaving Dynamics 365 Sales for Zoho One or Zoho CRM Enterprise, typically driven by licensing cost, implementation-partner dependency, or a wish to consolidate CRM, finance and operations onto one vendor. It suits orgs with a genuinely customised Dynamics deployment — custom entities, business process flows, N:N relationships — where a generic importer would produce a technically complete but operationally useless result.
How delivery works
Scoping call. We review your Dynamics entity model with your administrator: which entities are in scope, how customised they are, what business process flows govern, what integrations write into Dynamics, and how much activity history you want to carry. We confirm the target Zoho CRM edition and whether Zoho Books belongs in the picture.
Fixed quote. A written scope covering entities in and out, the option set and relationship translation approach, the Blueprint design for business process flows, reconciliation criteria and a fixed price. Work starts only after approval.
Build. ECOSIRE builds the extraction against the Dataverse Web API, the transformation layer with the option set translation tables, the Deluge functions for in-Zoho logic, the Zoho CRM schema provisioning and the reconciliation tooling. Typical build window is three to five weeks, driven by custom entity count and process flow complexity.
Install in a test org. Full migration into a Zoho CRM sandbox or dedicated test org against real data. You validate records with the people who use them, we correct mappings, and we re-run until reconciliation is clean.
Production cutover. Final run against production on an agreed window with a delta pass for anything created in Dynamics since the test extraction, followed by reconciliation sign-off.
Support. A defined post-go-live support window for defect fixes, mapping corrections and re-runs. The migration code, translation tables and documentation are yours to keep.
What this is not
There is no instant download and no trial, because the toolkit is written against your entity metadata and does not exist beforehand. It is a one-directional migration with delta support, not a live bidirectional sync. Dynamics plugins, workflows and custom .NET assemblies are not ported — their business rules are reimplemented as Zoho CRM Workflow Rules, Blueprint transitions or Deluge functions where they are in scope, and we identify those explicitly during scoping rather than discovering them at cutover.