CRM migration
Field-level mapping, validation, and rollback between PHP CRM and Microsoft Dynamics 365 Sales . We move data and schema; workflows are rebuilt natively in Microsoft Dynamics 365 Sales .
PHP CRM
Source
Microsoft Dynamics 365 Sales
Destination
Compatibility
6 of 8
objects map 1:1 between PHP CRM and Microsoft Dynamics 365 Sales .
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from PHP CRM to Microsoft Microsoft Dynamics 365 Sales is a structural migration that requires careful schema enumeration on the PHP CRM side because the platform exposes no standardized field taxonomy. PHP CRM allows user-defined custom fields on every standard object, so no two deployments share the same schema. We begin every engagement with a mandatory discovery phase that enumerates every custom field, its data type, and its current usage before writing any field mapping. We resolve parent-record dependencies by importing Accounts (from PHP CRM Companies) before Contacts, and Opportunities (from PHP CRM Deals) after Accounts, so that every foreign-key relationship is satisfied at insert time. PHP CRM does not publish API rate limits or endpoint schemas publicly; we pace conservatively and fall back to CSV export when API access is unavailable or unreliable. File attachments stored on the PHP CRM filesystem are not accessible via any documented API endpoint; we extract them to a local directory and provide a re-upload guide using Dynamics 365's native bulk file tools. Automated workflows in PHP CRM live in application code and are not exposed via API; we deliver a written workflow inventory with Microsoft Dynamics 365 Sales equivalents for your admin to rebuild 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
PHP CRM platform overview
Scorecard, SWOT, gotchas, and pricing for PHP 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 PHP 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.
PHP CRM
Contact
Microsoft Dynamics 365 Sales
Lead or Contact (split required)
1:manyPHP CRM Contacts map to either Salesforce-style Leads or Contacts in Microsoft Dynamics 365 Sales . We use the presence of an Account (Company) association and lifecycle stage flag to determine the split: Contacts with an associated Company record map to Dynamics 365 Contact linked to the corresponding Account; Contacts without a Company association map to Lead. The original PHP CRM contact_id is preserved in a custom field php_crm_contact_id__c on both Lead and Contact for audit and reconciliation.
PHP CRM
Company
Microsoft Dynamics 365 Sales
Account
1:1PHP CRM Company records map 1:1 to Dynamics 365 Account. The Company name becomes Account Name, domain becomes Website, and industry custom fields map to the standard Industry picklist where values align. Account is the first object migrated because Contacts, Deals (Opportunities), and Tasks reference it. We extract the full company taxonomy during discovery since PHP CRM allows user-defined fields on Company with no standardized schema.
PHP CRM
Deal
Microsoft Dynamics 365 Sales
Opportunity
1:1PHP CRM Deals map to Microsoft Dynamics 365 Sales Opportunities. Deal value maps to EstimatedRevenue, expected close date maps to CloseDate, and deal stage maps to a Microsoft Dynamics 365 Sales Process stage. We resolve the parent Account (Company) reference before Opportunity insert so that the AccountId lookup is satisfied. PHP CRM pipeline and stage names are extracted from the source instance and mapped to a pre-configured Sales Process in Dynamics 365 during the schema design phase.
PHP CRM
Task
Microsoft Dynamics 365 Sales
Task
1:1PHP CRM Tasks map directly to Dynamics 365 Task records. We preserve due date, status, priority, and description fields. Entity linkage (Contact, Company, Deal) migrates by resolving the PHP CRM record IDs to their computed Dynamics 365 IDs during the migration run. The original PHP CRM task_id is stored in a custom field php_crm_task_id__c for audit traceability.
PHP CRM
Note
Microsoft Dynamics 365 Sales
Annotation (Note)
1:1PHP CRM Notes attached to any entity migrate as Dynamics 365 Annotation records (the standard Note object). Note body and title transfer as-is. We resolve the objecttypecode and objectid references to the migrated Dynamics 365 record IDs after parent record creation. Rich-text formatting in PHP CRM notes is preserved as HTML in the Annotation textbody field.
PHP CRM
Activity
Microsoft Dynamics 365 Sales
Task or EmailMessage
1:1PHP CRM Activity records (calls, emails, meetings) vary by deployment since activity schemas are not standardized. We enumerate the actual activity fields present in the source instance during discovery. Call activities map to Task with TaskSubtype=Call and call duration preserved in a custom field; email activities map to EmailMessage linked to the parent Contact or Lead; meeting activities map to Event with start/end times preserved.
PHP CRM
Pipeline
Microsoft Dynamics 365 Sales
Sales Process + Record Type
lossyPHP CRM Pipelines map to Microsoft Dynamics 365 Sales Process definitions. Each pipeline in PHP CRM becomes a Record Type on Opportunity in Microsoft Dynamics 365 Sales , with a corresponding Sales Process that scopes the available stage values to that pipeline. Pipeline stage names are extracted from the source instance and mapped to Dynamics 365 stage names, with any stages that have no clear Dynamics equivalent flagged for the customer's admin to review.
PHP CRM
User
Microsoft Dynamics 365 Sales
User
1:1PHP CRM User records (owner assignments on Deals, Tasks) map to Dynamics 365 User by email matching. We extract all owner references during discovery and match against the destination User table. Any PHP CRM owner without a corresponding Dynamics 365 User is held in a reconciliation queue for the customer's admin to provision before record import resumes. Inactive PHP CRM users map to inactive Dynamics users with their records reassigned to a designated admin owner.
| PHP 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 | |
| Task | Task1:1 | Fully supported | |
| Note | Annotation (Note)1:1 | Fully supported | |
| Activity | Task or EmailMessage1:1 | Fully supported | |
| Pipeline | Sales Process + Record Typelossy | Fully supported | |
| User | 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.
PHP CRM gotchas
No publicly documented API rate limits or endpoints
Attachment and file storage not accessible via API
Custom field taxonomy varies per deployment
Workflows and automations are not portable
Limited review corpus for accurate benchmarking
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 custom field enumeration
We audit the PHP CRM instance via admin panel and, where available, direct API access. We enumerate every active object (Contacts, Companies, Deals, Tasks, Notes, Activities), count records per object, identify all user-defined custom fields and their data types, and extract the pipeline and stage definitions. If API access is unavailable, we request CSV exports from the PHP CRM admin panel for each object. The discovery output is a written schema inventory and a migration feasibility assessment identifying any objects that cannot be extracted automatically.
Schema design and Microsoft Dynamics 365 Sales configuration
We design the destination Microsoft Dynamics 365 Sales schema based on the discovered PHP CRM field inventory. This includes creating custom fields in the target org (mapped by data type to Dynamics 365 field types), configuring Sales Processes and Record Types to match PHP CRM pipeline definitions, setting up the Lead and Contact split logic based on the customer's Company association patterns, and coordinating with the customer's Dynamics 365 admin to grant the migration user the necessary Dataverse roles. Schema is validated in a Dynamics 365 Sandbox before production migration begins.
Sandbox migration and reconciliation
We run a full migration into a Dynamics 365 Sandbox using production-like data volumes extracted from PHP CRM. The customer's CRM lead reviews record counts (Accounts, Contacts, Opportunities, Tasks, Notes), spot-checks 25-50 records against the PHP CRM source for field-level accuracy, and validates the pipeline stage mapping. Any field mapping corrections, missing picklist values, or schema gaps are resolved in the Sandbox before production migration begins. This step also confirms the attachment file inventory and flags any records with attachments that require post-migration re-attachment.
Owner reconciliation and User provisioning
We extract every distinct PHP CRM owner referenced on Deals, Tasks, and Activity records and match by email against the destination Dynamics 365 User table. Any PHP CRM owner without a matching Dynamics 365 User is added to a reconciliation queue. The customer's Dynamics 365 admin provisions missing Users (and deactivates any former employees) before record import resumes. This step is a prerequisite for all subsequent phases because OwnerId references are required on Opportunity and Task records.
Production migration in dependency order
We run production migration in record-dependency order: Accounts (from PHP CRM Companies), then Contacts and Leads (with AccountId resolved for Contacts), then Opportunities (with AccountId, OwnerId, and Sales Process resolved), then Tasks and Activities (with parent record IDs resolved via lookup), then Notes (with parent record references resolved). Each phase emits a row-count reconciliation report showing source count, destination count, and error count before the next phase begins. We use the Dynamics 365 Dataverse REST API with batch chunking and exponential backoff on throttle responses.
Cutover, validation, and workflow handoff
We freeze PHP CRM writes during cutover, run a final delta migration of records modified during the migration window, then enable Microsoft Dynamics 365 Sales as the system of record. We deliver the written workflow and automation inventory to the customer's admin team for Power Automate rebuild. We provide a 72-hour hypercare window for reconciliation issues raised by the sales team. We do not rebuild PHP CRM workflows as Power Automate flows inside the standard migration scope; that is a separate engagement.
Platform deep dives
PHP CRM
Source
Strengths
Weaknesses
Microsoft Dynamics 365 Sales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 PHP CRM and Microsoft Dynamics 365 Sales .
Object compatibility
2 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
PHP CRM: Not publicly documented.
Data volume sensitivity
PHP CRM 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 PHP CRM to Microsoft Dynamics 365 Sales migration scoping. Not seeing yours? Book a call.
Walk through your PHP 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 PHP 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.