CRM migration
Field-level mapping, validation, and rollback between OPEX 365 CRM and HighLevel. We move data and schema; workflows are rebuilt natively in HighLevel.
OPEX 365 CRM
Source
HighLevel
Destination
Compatibility
10 of 11
objects map 1:1 between OPEX 365 CRM and HighLevel.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from OPEX 365 CRM to GoHighLevel is a structural migration across two fundamentally different data models. OPEX 365 CRM stores records on Microsoft Dataverse with polymorphic activityparty references, base64-encoded annotations for attachments, and tiered licensing that governs API rate limits. GoHighLevel uses a flat Contact object with tag-based segmentation, a Deal pipeline model, and workflow automations built on trigger-action logic. We resolve the activityparty polymorphic partyid to typed GoHighLevel contact or company lookups during transformation, extract annotation bodies from the Dataverse RetrieveContentStream API into staging blob storage, then remap file references to GoHighLevel attachments on the correct record. Pipeline stages from OPEX 365 CRM become GoHighLevel pipeline stages configured in the destination before any Deal import begins. Custom entities in Dataverse require schema enumeration via EntityDefinitions before mapping to GoHighLevel Custom Objects, which are available at all GoHighLevel tiers. We do not migrate Dataverse workflows, plugins, security roles, or Power Platform configurations; these require rebuild in GoHighLevel's automation builder 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.
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 HighLevel, 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
HighLevel
Contact
1:1OPEX 365 CRM Contact records map to GoHighLevel Contact. Standard fields including firstname, lastname, emailaddress1, telephone1, address1_line1, address1_city, address1_stateprovince, and address1_postalcode migrate directly. The Dataverse ownerid resolves to a GoHighLevel user by email match. Contact status (statecode) maps to GoHighLevel Contact active/inactive status.
OPEX 365 CRM
Account
HighLevel
Company
1:1OPEX 365 CRM Account records map to GoHighLevel Company. Account name becomes company name, website maps to website, industry maps to industry dropdown, and annual revenue maps to a numeric custom field if GoHighLevel's default fields do not cover it. Parent-child account hierarchies are preserved as Company hierarchy relationships in GoHighLevel where supported.
OPEX 365 CRM
Opportunity
HighLevel
Deal
1:1OPEX 365 CRM Opportunities map to GoHighLevel Deals. The opportunity name becomes Deal name, estimatedclosekby becomes close date, and amount becomes monetary value. Pipeline and stage assignments from the source map to GoHighLevel pipeline stages configured in the destination before migration. Closed-won and closed-lost status from OPEX 365 CRM map to corresponding GoHighLevel Deal status values.
OPEX 365 CRM
Lead
HighLevel
Contact or Lead
1:manyOPEX 365 CRM Lead records may be imported as GoHighLevel Contacts with a lead_status tag or as GoHighLevel Lead objects depending on the customer's GoHighLevel configuration preference. We document both options during scoping. The source lead score (hs_lead_score or custom field) migrates as a GoHighLevel tag or custom number field. If the destination GoHighLevel sub-account uses Leads, we import unqualified prospects as Leads and qualified ones as Contacts.
OPEX 365 CRM
Activity (Email)
HighLevel
Contact Activity / Task
1:1OPEX 365 CRM email activities (activitypointer with activitytypecode = email) map to GoHighLevel Contact activity records. The polymorphic activityparty entity requires resolution: each email's from and to parties are resolved to GoHighLevel Contact IDs or email addresses. Email subject, body (plain text or HTML), and timestamp migrate. GoHighLevel does not have a native EmailMessage equivalent, so email content attaches as Contact activity notes.
OPEX 365 CRM
Activity (Phone Call)
HighLevel
Contact Activity (Call)
1:1OPEX 365 CRM phone call activities map to GoHighLevel Contact call activities. Call duration, direction (inbound/outbound), subject, and disposition migrate as typed fields. The activityparty from field resolves to the calling Contact. Activity timestamp preserves the original call date.
OPEX 365 CRM
Activity (Appointment)
HighLevel
Contact Activity / Calendar Event
1:1OPEX 365 CRM appointment activities map to GoHighLevel Calendar Events linked to the relevant Contact or Deal. Start time, end time, location, and subject migrate. Attendees are resolved via activityparty and linked as GoHighLevel Contact associations where supported.
OPEX 365 CRM
Activity (Task)
HighLevel
Contact Activity / Task
1:1OPEX 365 CRM task activities map to GoHighLevel tasks attached to Contact records. Task subject, description, priority, due date, and status migrate. The activityparty assigned party resolves to a GoHighLevel user by email. Completed-on date maps to GoHighLevel task completion timestamp.
OPEX 365 CRM
Annotation (Note)
HighLevel
Contact Note / Attachment
1:1OPEX 365 CRM Notes stored as Dataverse annotation entities with base64-encoded body content require extraction via the Dataverse RetrieveContentStream API. We extract note text content and binary attachments into staging blob storage, then import them as GoHighLevel Contact notes or file attachments linked to the correct Contact, Company, or Deal record. Annotation createdon and modifiedon timestamps preserve note chronology.
OPEX 365 CRM
Custom Dataverse Entity
HighLevel
Custom Object
1:1Custom entities created in the OPEX 365 CRM Dataverse environment are enumerated via the EntityDefinitions API during discovery. Each custom entity's attributes are mapped to GoHighLevel Custom Object fields with type conversion (Dataverse string to text, integer to number, datetime to date, option set to dropdown). Custom entity relationships to Contact, Account, or Opportunity become Custom Object lookup fields. GoHighLevel Custom Objects are available on all plans without additional cost.
OPEX 365 CRM
User / Owner
HighLevel
User
1:1OPEX 365 CRM User records map to GoHighLevel users by email address match. The customer's GoHighLevel admin provisions the destination users before migration. Owner assignments on Contact, Account, Opportunity, and Activity records resolve via the email-to-user lookup. Any OPEX 365 CRM owner without a matching GoHighLevel user goes to a reconciliation queue for admin action before record import.
| OPEX 365 CRM | HighLevel | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Account | Company1:1 | Fully supported | |
| Opportunity | Deal1:1 | Fully supported | |
| Lead | Contact or Lead1:many | Fully supported | |
| Activity (Email) | Contact Activity / Task1:1 | Fully supported | |
| Activity (Phone Call) | Contact Activity (Call)1:1 | Fully supported | |
| Activity (Appointment) | Contact Activity / Calendar Event1:1 | Fully supported | |
| Activity (Task) | Contact Activity / Task1:1 | Fully supported | |
| Annotation (Note) | Contact Note / Attachment1:1 | Fully supported | |
| Custom Dataverse Entity | Custom Object1:1 | 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
HighLevel gotchas
Sub-account architecture creates isolated data silos per client
Usage-based telecom and AI costs are not in the subscription price
Workflows have no native equivalent in most destination CRMs
API rate limits cap bulk migration throughput at 100 requests per 10 seconds per sub-account
White-label configuration and branding assets do not export via API
Pair-specific challenges
Migration approach
Discovery and Dataverse schema enumeration
We audit the source OPEX 365 CRM environment including license tier (which determines Dataverse API rate limits), standard entity volumes, custom entity count, pipeline and stage configurations, active workflow and plugin count, and annotation volume. We run the EntityDefinitions API scan to enumerate all custom entities and their attributes before designing any mappings. The discovery output is a written migration scope with record counts per object, custom entity inventory, and a pipeline/stage mapping document.
GoHighLevel environment setup and pipeline configuration
We work with the customer's GoHighLevel admin to configure the destination environment before any data import. This includes setting up pipeline stages mapped from OPEX 365 CRM opportunity stages, creating Custom Objects for any source custom entities, provisioning GoHighLevel users matched to OPEX 365 CRM owners by email, and configuring any required custom fields not covered by GoHighLevel's standard Contact, Company, and Deal schemas. Pipeline configuration happens in GoHighLevel first because Deal import references stage values that must exist in the destination.
ActivityParty referential integrity pass
We extract all activitypointer and activityparty records from Dataverse and resolve every polymorphic partyid GUID to its entity type and destination GoHighLevel record ID. This produces a resolved activity lookup table linking each activity to its GoHighLevel Contact or Company. Any activityparty referencing a Contact that has not yet been imported is held pending; we create placeholder Contact records for unreferenced targets to prevent orphaning. This step is complete before activity import begins.
Record migration in dependency order
We import data in dependency order: GoHighLevel users (validated, not migrated), Companies (from Accounts), Contacts (with owner resolved), Leads (per split rule), Deals (with pipeline stage and Company lookup resolved), then Custom Objects (with lookups to standard objects satisfied). Each phase emits a row-count reconciliation report before the next phase begins. Activities import after Contacts and Deals exist in the destination so that the resolved activity lookup table has valid targets.
Annotation extraction and attachment remapping
We extract annotation bodies from the Dataverse RetrieveContentStream API, store binary content in staging blob storage, and import file references to GoHighLevel as Contact, Company, or Deal attachments. The objectid and objecttypecode from the annotation record map to the corresponding GoHighLevel record ID and type. Annotation createdon timestamps preserve file upload chronology. This phase runs after record import is complete to ensure target records exist.
Cutover, delta sync, and automation handoff
We freeze OPEX 365 CRM writes during cutover, run a final delta migration of records modified during the migration window, then enable GoHighLevel as the system of record. We deliver the workflow and automation inventory document to the customer's GoHighLevel admin team with recommended rebuild steps. We support a one-week hypercare window for reconciliation issues. We do not rebuild OPEX 365 CRM workflows or Power Automate flows inside the migration scope; that is a separate engagement or an internal admin task.
Platform deep dives
OPEX 365 CRM
Source
Strengths
Weaknesses
HighLevel
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 OPEX 365 CRM and HighLevel.
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
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 HighLevel migration scoping. Not seeing yours? Book a call.
Walk through your OPEX 365 CRM to HighLevel 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 HighLevel
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.