CRM migration
Field-level mapping, validation, and rollback between PHP CRM and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.
PHP CRM
Source
HubSpot
Destination
Compatibility
15 of 15
objects map 1:1 between PHP CRM and HubSpot.
Complexity
BStandard
Timeline
48–96 hours
Overview
php-crm is a self-hosted or cloud-hosted PHP CRM that stores contacts, companies, and deals in a flexible MySQL-backed schema with support for custom fields via an EAV (Entity-Attribute-Value) pattern. Teams running php-crm typically have under 50 users and use it primarily for contact and deal tracking without heavy automation dependencies. HubSpot CRM stores the same core objects — Contacts, Companies, Deals — but uses a property-based data model where every field is a named property on an object, and lifecycle stages (subscriber, lead, MQL, SQL, customer, evangelist) act as a unidirectional contact property that governs marketing contact billing and lead routing. We migrate php-crm contacts and companies as direct maps into HubSpot Contacts and Companies, with php-crm custom fields translated into HubSpot custom properties. Deals map to HubSpot Deals tied to HubSpot's pipeline model. Activity history (calls, emails, meetings, notes) migrates via HubSpot's Engagements API, preserving original timestamps and owner assignments. php-crm workflows and automations do not migrate — those are self-hosted logic constructs with no HubSpot equivalent and must be rebuilt as HubSpot workflows post-migration. Our migration engine sequences the load order to preserve foreign-key relationships: companies first, then contacts with their primary-company associations, then deals with contact and company lookups, then activity records. We run a sample migration with field-level diff before committing to the full run, and a 24–48 hour delta-pickup window captures any records modified during cutover.
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 PHP CRM object lands in HubSpot, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
PHP CRM
contacts
HubSpot
Contact
1:1php-crm contacts map directly to HubSpot Contacts, preserving firstname, lastname, email, phone, mobilephone, jobtitle, and address fields. The primary_company_id foreign key is resolved to a HubSpot Company association after the companies load. Original created_at and updated_at timestamps are retained for audit, and we store the php-crm record ID as source_system_id for delta-run de‑duplication.
PHP CRM
contacts
HubSpot
Contact
1:1php-crm stores owner_id as a user reference. We resolve owner_id to HubSpot owner by matching php-crm user email against HubSpot user email. Unmatched owners are flagged before migration so your team can create HubSpot users first or assign to a fallback owner.
PHP CRM
contacts (custom fields)
HubSpot
Contact
1:1php-crm custom fields on contacts (beyond standard fields) map to HubSpot custom properties on the Contact object. We create each custom property in HubSpot with the matching field type: text for strings, number for integers, checkbox for booleans, date for dates, and picklist for enumerated values with value-by-value mapping.
PHP CRM
companies
HubSpot
Company
1:1php-crm companies map directly to HubSpot Companies. Standard fields — name, domain, industry, phone, address, employee count, annual revenue — map to HubSpot Company properties with the same names or close equivalents. php-crm stores parent_company_id for company hierarchies; we map this to HubSpot's parent_company_id property.
PHP CRM
companies (custom fields)
HubSpot
Company
1:1php-crm company custom fields migrate to HubSpot Company custom properties. We extract field definitions from php-crm's database schema (for flat-column custom fields) or EAV tables (for EAV-stored custom fields), then create HubSpot properties with the matching type before loading data.
PHP CRM
deals
HubSpot
Deal
1:1php-crm deals map to HubSpot Deals. Fields including dealname, amount, closedate, and pipeline_id migrate directly. php-crm stores pipeline_id as a reference to php-crm's pipeline table; we map this to HubSpot's pipeline by matching pipeline names or IDs from your php-crm configuration export.
PHP CRM
deals
HubSpot
Deal
1:1php-crm deal stage_id maps to HubSpot Deal stage via value mapping. Each php-crm stage_name becomes a HubSpot pipeline stage name. We preserve stage order, probability, and forecast category from HubSpot's stage configuration if available, or use the order from php-crm's stage table.
PHP CRM
deals
HubSpot
Deal
1:1php-crm deals may have custom fields beyond the standard set. These migrate to HubSpot Deal custom properties following the same custom field translation process as contacts and companies. Deal-level custom fields often include product references, win/loss reasons, or billing terms.
PHP CRM
activities (calls)
HubSpot
Call engagement
1:1php-crm call logs are migrated to HubSpot Call engagements via the HubSpot Engagements API, preserving call direction (inbound/outbound), duration in seconds, outcome disposition, and any notes attached. The original call timestamp is stored in hs_timestamp, and we link each Call engagement to its associated HubSpot Contact and Deal records using the associations API. Owner information is carried over from php-crm user records.
PHP CRM
activities (emails)
HubSpot
Email engagement
1:1php-crm email logs are pushed into HubSpot Email engagements via the HubSpot Engagements API, copying the subject line, body (plain text or HTML), direction, and original email timestamp into hs_timestamp. Each Email engagement is associated with the corresponding HubSpot Contact and Deal records using the associations API, preserving the original sender and recipient details for full conversation continuity.
PHP CRM
activities (meetings)
HubSpot
Meeting engagement
1:1php-crm meeting records are imported as HubSpot Meeting engagements using the HubSpot Engagements API, retaining the meeting title, start and end timestamps, location or conference link, and outcome status. The original meeting datetime is stored in hs_timestamp, and each Meeting engagement is linked to its related HubSpot Contact and Deal records via the associations API, ensuring the meeting appears in the appropriate timeline.
PHP CRM
activities (notes)
HubSpot
Note
1:1php-crm notes map to HubSpot Notes attached to the relevant CRM records (Contact, Company, or Deal). We preserve note body, created datetime, and the associated record IDs. HubSpot notes display in the timeline of the associated record with the original author information.
PHP CRM
attachments
HubSpot
File
1:1php-crm file attachments are downloaded from the source storage (local filesystem for self-hosted, or cloud storage for php-crm cloud), then re-uploaded to HubSpot Files. Each file is associated with the relevant HubSpot record (contact, company, or deal) via the Files API. File size limits from HubSpot apply.
PHP CRM
users / owners
HubSpot
Owner
1:1php-crm users are mapped to HubSpot Owners by email address. If a php-crm user email matches a HubSpot user email, we assign ownership directly. If no match exists, we flag the record and your team either creates the HubSpot user first or assigns records to a fallback owner before migration.
PHP CRM
workflows / automations
HubSpot
Not migrated
1:1php-crm workflows and automation rules do not migrate. php-crm stores workflow definitions in its own database schema with different logic constructs than HubSpot Workflows. We export php-crm workflow definitions as a reference document so your HubSpot admin can rebuild them manually in HubSpot's Workflows tool post-migration.
| PHP CRM | HubSpot | Compatibility | |
|---|---|---|---|
| contacts | Contact1:1 | Fully supported | |
| contacts | Contact1:1 | Fully supported | |
| contacts (custom fields) | Contact1:1 | Fully supported | |
| companies | Company1:1 | Fully supported | |
| companies (custom fields) | Company1:1 | Fully supported | |
| deals | Deal1:1 | Fully supported | |
| deals | Deal1:1 | Fully supported | |
| deals | Deal1:1 | Fully supported | |
| activities (calls) | Call engagement1:1 | Fully supported | |
| activities (emails) | Email engagement1:1 | Fully supported | |
| activities (meetings) | Meeting engagement1:1 | Fully supported | |
| activities (notes) | Note1:1 | Fully supported | |
| attachments | File1:1 | Fully supported | |
| users / owners | Owner1:1 | Fully supported | |
| workflows / automations | Not migrated1: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
HubSpot gotchas
Marketing Contacts billing model is migration-critical
Feature tier gating is not visible until onboarding
Mandatory onboarding fees inflate year-one cost
HubSpot CSV importer cannot migrate engagements or attachments
Custom objects require Enterprise and a pre-existing schema
Pair-specific challenges
Migration approach
Extract php-crm schema and data via MySQL or REST API
We connect to php-crm's MySQL database (self-hosted) or authenticate to the REST API (cloud-hosted) and extract the full object graph: contacts, companies, deals, activity records (calls, emails, meetings, notes), custom field definitions, user accounts, pipeline configurations, and stage definitions. For EAV-backed custom fields, we run a pre-extraction query to enumerate all unique attribute names and infer their data types from sample values. We export workflow definitions as a written reference document for your HubSpot admin. This step produces a php-crm data dictionary and a migration readiness report that identifies any schema anomalies before field mapping begins.
Create HubSpot custom properties and pipelines
Before any data loads, we create HubSpot custom properties for every php-crm custom field that has no direct HubSpot equivalent. This includes custom contact properties (e.g., source_system_id to store php-crm record IDs for traceability), company properties, and deal properties. We also verify or create HubSpot pipelines and stages that match php-crm's pipeline configuration — stage names, order, probability, and forecast category are mapped value-by-value. If HubSpot pipelines don't exist yet, we create them in HubSpot's pipeline settings before migration. This step requires HubSpot Super Admin credentials.
Run sample migration with field-level diff on 100–500 records
We run a sample migration using a representative slice of php-crm data: contacts across multiple lifecycle stages, companies with parent-child hierarchies, deals in various pipeline stages, and a sample of each activity type. The sample loads into a HubSpot sandbox or test account, and we generate a field-level diff report comparing source values to destination values for every mapped field. You review the diff to verify lifecyclestage mapping, association links (contact-to-company, deal-to-contact), owner resolution, and custom field population. We iterate on the field mapping until you sign off before running the full migration.
Migrate companies first, then contacts, then deals, then activities
We sequence the migration to preserve foreign-key relationships. Companies load first and receive their HubSpot IDs, which are then used to resolve contact-to-company associations. Contacts load second with their primary-company association established via HubSpot's associations API. Deals load third with their contact and company associations resolved. Activity records (calls, emails, meetings, notes) load last, with each engagement linked to its parent contact and deal records via HubSpot's Engagements API. This load order prevents orphaned records — a deal without a valid contact or company association would be invisible in HubSpot's pipeline views.
Cut over with delta-pickup window and one-click rollback
After the full migration loads, we open a delta-pickup window (24–48 hours) during which any php-crm records created or modified while the migration was running are captured and loaded into HubSpot. Your team continues working in php-crm during this window. At the agreed cutover time, we run the delta load and you begin using HubSpot as the system of record. FlitStack AI maintains a full audit log of every migration operation. If reconciliation reveals missing records or incorrect associations, one-click rollback reverts HubSpot to its pre-migration state. We conduct a post-migration validation comparing record counts, association integrity, and field population against the php-crm source.
Platform deep dives
PHP CRM
Source
Strengths
Weaknesses
HubSpot
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 PHP CRM and HubSpot.
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
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 HubSpot migration scoping. Not seeing yours? Book a call.
Walk through your PHP CRM to HubSpot 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 HubSpot
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.