CRM migration

Migrate from PHP CRM to HubSpot

Field-level mapping, validation, and rollback between PHP CRM and HubSpot. We move data and schema; workflows are rebuilt natively in HubSpot.

PHP CRM logo

PHP CRM

Source

HubSpot

Destination

HubSpot logo

Compatibility

100%

15 of 15

objects map 1:1 between PHP CRM and HubSpot.

Complexity

BStandard

Timeline

48–96 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

PHP CRM logo

PHP CRM

What's pushing teams away

  • Extremely limited online presence with very few user reviews makes it difficult to assess long-term reliability and support quality.
  • Advanced feature setup complexity frustrates less technical users despite the interface being described as user-friendly for basic navigation.
  • Performance issues reported in G2 reviews suggest the platform may struggle under heavier data volumes or concurrent user loads.
  • Lack of transparent API documentation and community resources makes integrations and custom development high-effort for internal teams.

Choosing

HubSpot logo

HubSpot

What's pulling them in

  • Lowest barrier to entry of any major CRM — the free tier with unlimited contacts lets teams validate fit before committing to a paid plan, according to G2 and Capterra reviewers.
  • Native integration between the CRM and sales engagement tools (sequences, email tracking, dialer) means no separate sync configuration, a theme across G2 Sales Hub reviews.
  • Pipeline visualization, deal tracking, and automated workflows are consistently praised as intuitive and easy to set up without developer involvement.
  • Strong onboarding for new team members — reviewers on Capterra and G2 highlight how quickly new reps become productive without formal training.
  • The HubSpot platform ecosystem (Marketing, Sales, Service, CMS hubs) allows growing companies to consolidate tools without building new integrations.

Object mapping

How PHP CRM objects map to HubSpot

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

maps to

HubSpot

Contact

1:1
Fully supported

php-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

maps to

HubSpot

Contact

1:1
Fully supported

php-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)

maps to

HubSpot

Contact

1:1
Fully supported

php-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

maps to

HubSpot

Company

1:1
Fully supported

php-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)

maps to

HubSpot

Company

1:1
Fully supported

php-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

maps to

HubSpot

Deal

1:1
Fully supported

php-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

maps to

HubSpot

Deal

1:1
Fully supported

php-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

maps to

HubSpot

Deal

1:1
Fully supported

php-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)

maps to

HubSpot

Call engagement

1:1
Fully supported

php-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)

maps to

HubSpot

Email engagement

1:1
Fully supported

php-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)

maps to

HubSpot

Meeting engagement

1:1
Fully supported

php-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)

maps to

HubSpot

Note

1:1
Fully supported

php-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

maps to

HubSpot

File

1:1
Fully supported

php-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

maps to

HubSpot

Owner

1:1
Fully supported

php-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

maps to

HubSpot

Not migrated

1:1
Fully supported

php-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.

Gotchas + challenges

What specifically takes care here

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 logo

PHP CRM gotchas

High

No publicly documented API rate limits or endpoints

High

Attachment and file storage not accessible via API

Medium

Custom field taxonomy varies per deployment

Medium

Workflows and automations are not portable

Low

Limited review corpus for accurate benchmarking

HubSpot logo

HubSpot gotchas

High

Marketing Contacts billing model is migration-critical

High

Feature tier gating is not visible until onboarding

Medium

Mandatory onboarding fees inflate year-one cost

Medium

HubSpot CSV importer cannot migrate engagements or attachments

Medium

Custom objects require Enterprise and a pre-existing schema

Pair-specific challenges

  • Activity history (calls, emails, meetings) cannot be imported via CSV — API migration is required

    php-crm stores call logs, email threads, and meeting records in separate activity tables linked to contacts and deals by foreign key. HubSpot's CSV import tool does not support engagement records — calls, emails, and meetings can only be migrated via HubSpot's Engagements API. We use the Engagements API for these records, which means the migration engine needs authenticated API access with engagement write permissions. If php-crm's activity tables use non-standard column names (common in EAV-backed php-crm installations), we map them field-by-field before the API write. This adds 1–2 days to the migration timeline compared to contact and company imports.

  • php-crm EAV custom fields require schema extraction before HubSpot property creation

    php-crm supports two custom field models: flat database columns (added directly to the contacts, companies, or deals tables) and EAV rows (stored in a separate attribute-value table). The EAV model is common in php-crm installations that have been customized heavily over time. Migrating EAV-stored custom fields to HubSpot requires us to first extract all unique attribute names and their value types from php-crm's EAV tables, then create HubSpot custom properties with matching types before loading the values. This extraction step can take 2–5 days for php-crm instances with 30+ custom fields, and it must complete before any data loads begin. We flag any EAV attributes that store JSON-encoded values — these need custom parsing logic to extract individual fields before HubSpot import.

  • HubSpot lifecycle stages are unidirectional — historical stage progression is not preserved

    HubSpot's lifecyclestage property moves forward only: a contact's stage can progress from 'subscriber' to 'lead' to 'MQL' to 'SQL' to 'customer,' but HubSpot does not record stage-transition timestamps in the native field. When migrating php-crm contacts that have historical lifecycle data (e.g., a contact that was marked 'customer' six months ago and is still a customer today), we set the current lifecyclestage value but cannot reconstruct the historical progression in HubSpot's native timeline. We preserve the source php-crm lifecycle data as a custom field (e.g., original_lifecycle_source__c) for reference, but the HubSpot-native stage history view will start at migration date. If your team relies on HubSpot lifecycle stage reporting for historical cohort analysis, plan to rebuild that view post-migration with a custom date-tracking approach.

  • php-crm workflows and automation rules do not migrate and have no HubSpot equivalent

    php-crm stores workflow definitions (trigger conditions, action steps, and rule logic) in its own database schema. These constructs — such as 'when deal stage changes to Won, send SMS notification' or 'when contact is created, assign to owner based on region' — do not have a direct equivalent in HubSpot's Workflows tool. HubSpot Workflows use a different logic model (trigger → filter → action) that is purpose-built for HubSpot's object and property structure. We export php-crm workflow definitions as a written reference document so your HubSpot admin can rebuild them manually in HubSpot Workflows. Budget 2–4 hours per complex workflow for rebuilding. php-crm automations that fire on record creation or field changes will need to be replaced with HubSpot Workflows or HubSpot Actions after migration.

  • php-crm self-hosted database access requires MySQL credentials and SSH access for direct extraction

    For self-hosted php-crm instances (the most common deployment model), the most reliable data extraction is direct MySQL read access rather than the php-crm REST API, which may have rate limits, pagination constraints, or incomplete activity history endpoints. We need MySQL read-only credentials, SSH access to the database server or a database dump export, and the php-crm table schema documentation. If your php-crm instance uses a non-standard table prefix (common in shared hosting environments), we need the prefix value to build correct table names. Cloud-hosted php-crm instances expose a REST API that we can use directly, but the API may not expose all activity history records if they were stored before a specific php-crm version upgrade. We confirm the extraction method during discovery and test a sample extract before committing to the full migration scope.

Migration approach

Six steps for a successful PHP CRM to HubSpot data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Context on both ends of the pair

PHP CRM logo

PHP CRM

Source

Strengths

  • Free open-source self-hosted option with full source code access for modification and audit.
  • Managed cloud hosting from $120/year is low cost compared to per-seat SaaS alternatives.
  • REST API available for lead capture from websites and external integrations.
  • Fully customizable codebase allows adding or modifying modules without vendor constraints.
  • Self-hosted data on customer server provides complete data sovereignty and compliance flexibility.

Weaknesses

  • Very limited online reviews and community presence makes due diligence difficult.
  • API documentation is not publicly detailed, requiring direct access to the developer tools page for integration planning.
  • Small team or niche market positioning raises concerns about long-term product support and development roadmap.
  • Advanced customization requires PHP development expertise, limiting adoption to teams with technical resources.
  • Performance issues reported in reviews suggest potential scaling limitations under heavier workloads.
HubSpot logo

HubSpot

Destination

Strengths

  • Genuinely useful free CRM tier with no seat limit on contact records.
  • All-in-one sales engagement layer (sequences, email tracking, calling, dialer) embedded natively in the CRM, eliminating a separate integration.
  • Intuitive interface and fast onboarding for individual reps, per G2 and Capterra reviews.
  • Workflow automation triggers across contacts, deals, and tickets with a visual builder.
  • API coverage for all standard objects including custom objects at Enterprise tier.

Weaknesses

  • Pricing model is contact-based at the marketing layer — importing all records as marketing contacts can multiply the monthly bill by 4×.
  • Feature tier cliffs are frequent surprises: sequences, calling, advanced reporting, and quoting are all gated, often requiring plan upgrades mid-implementation.
  • Mandatory onboarding fees at Professional ($1,500) and Enterprise ($3,500) are not prominently disclosed on the pricing page.
  • API rate limits are restrictive for bulk migration — burst limits of 100-200 req/10sec and search endpoint limits of 4 req/sec require careful job queuing.
  • Custom objects, additional pipelines, and advanced forecasting are Enterprise-only, making cost projections difficult for growing teams.

Complexity grading

How hard is this migration?

Standard CRM migration. 3 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across PHP CRM and HubSpot.

  • Object compatibility

    B

    3 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    PHP CRM: Not publicly documented.

  • Data volume sensitivity

    B

    PHP CRM doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your PHP CRM to HubSpot migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about PHP CRM to HubSpot data migrations

Answers to the questions buyers ask most during PHP CRM to HubSpot migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

php-crm to HubSpot migrations complete in 48–96 hours for setups under 25,000 records with straightforward custom field configurations. Larger setups with 25,000–200,000 records, extensive custom fields (30+), and full activity history (calls, emails, meetings) extend to 7–14 days. The longest planning step is extracting php-crm's EAV custom field schema and creating the corresponding HubSpot custom properties — this adds 2–5 days before any data loads. Activity history migration via HubSpot's Engagements API (required for calls and emails) takes longer than contact and company bulk imports.

Adjacent paths

Related migrations to explore

Ready when you are

Move from PHP CRM.
Land in HubSpot, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day