CRM migration

Migrate from PHP CRM to Twenty CRM

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

PHP CRM logo

PHP CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

73%

8 of 11

objects map 1:1 between PHP CRM and Twenty CRM.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from PHP CRM to Twenty CRM is a modernization path for teams on a self-hosted PHP stack that has not kept pace with active development or API documentation investment. PHP CRM exposes a REST API without published rate limits and stores file attachments on the local filesystem with no programmatic export path. Twenty CRM, built on TypeScript, Next.js, and NestJS, has over 40,000 GitHub stars, an actively developed REST and GraphQL API, and supports custom objects, field-level permissions, and workflow filters from its standard data model. We migrate by enumerating the source schema during discovery (PHP CRM allows user-defined field names per deployment), building the matching Twenty workspace schema, then loading records in dependency order with parent-record ID resolution. Attachments do not migrate programmatically; we export them to local storage for manual re-upload. Workflows and automations do not migrate as code; we deliver a written inventory for the customer admin to rebuild in Twenty's Workflow builder.

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

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How PHP CRM objects map to Twenty CRM

Each row shows how a PHP CRM object lands in Twenty CRM, 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

maps to

Twenty CRM

People

1:1
Fully supported

PHP CRM Contact records map to Twenty People. We map standard contact fields (name, email, phone, address) directly and enumerate every active custom field present on the Contact object during discovery before writing any field mapping. The Twenty People object uses a flat address structure; PHP CRM address sub-fields (street, city, state, postal code, country) concatenate into the Twenty address fields. PHP CRM contacts linked to Companies receive a CompanyId lookup resolution after the Companies phase completes.

PHP CRM

Company

maps to

Twenty CRM

Company

1:1
Fully supported

PHP CRM Company records map directly to Twenty Company. Company is migrated before People so that the Company relationship (WorkSpaces in Twenty) is available for resolution during People import. The Twenty Company object supports industry, employee count, annual revenue, website, and address fields mapped from equivalent PHP CRM fields. Custom fields on Company are enumerated during discovery and mapped field by field.

PHP CRM

Deal

maps to

Twenty CRM

Opportunity

1:1
Fully supported

PHP CRM Deal records map to Twenty Opportunity. The deal name, value, expected close date, and owner assignment transfer directly. Deal stage names in PHP CRM map to Twenty pipeline stages, which we pre-create in the destination workspace before the Opportunity import phase. If PHP CRM has multiple pipelines, each becomes a separate Twenty pipeline.

PHP CRM

Pipeline

maps to

Twenty CRM

Pipeline

lossy
Fully supported

PHP CRM pipeline definitions map to Twenty pipeline containers. We extract the pipeline list from the source instance during discovery and create matching Twenty pipelines with the same pipeline names. Pipeline creation in Twenty happens before any Opportunity records are imported so that stage assignment is valid at insert time.

PHP CRM

Pipeline Stage

maps to

Twenty CRM

Stage

lossy
Fully supported

PHP CRM stage names and order map to Twenty Stage records under each Pipeline. We extract the actual stage list from the source instance, preserving the sequence order and probability percentages where present. Any stages with no matching Twenty stage name are flagged as unmapped and held for the customer admin to resolve before Opportunity import.

PHP CRM

Task

maps to

Twenty CRM

Task

1:1
Fully supported

PHP CRM Task records map to Twenty Task. Due date, assignee, status, and linked entity (Contact, Company, Deal) transfer directly. We resolve the assignee by matching PHP CRM owner email to Twenty User during the Users phase. The linked entity reference (Contact, Company, or Deal) resolves after parent record IDs are established in the destination system.

PHP CRM

Note

maps to

Twenty CRM

Note

1:1
Fully supported

PHP CRM Notes attach free-text content to any entity (Contact, Company, Deal). Notes migrate as Twenty Note records linked to the target entity (People, Company, or Opportunity) via the computed relationship mapping after parent records are established. Note body transfers as rich text where PHP CRM stores it; plain text note bodies migrate as-is.

PHP CRM

Activity

maps to

Twenty CRM

Task or Note

1:1
Fully supported

PHP CRM Activity records track interactions (calls, emails, meetings) with timestamps and outcome data. Activity schemas vary by PHP CRM deployment. We enumerate the actual activity fields present in the source instance during discovery and map call activities to Twenty Task with TaskSubtype=Call, meeting activities to Twenty Event or Task, and email activities to Twenty Note or Task depending on whether the email body is substantive. We flag any activity fields with no Twenty equivalent during discovery for customer decision on retention or exclusion.

PHP CRM

Custom Field

maps to

Twenty CRM

Custom Field

lossy
Fully supported

PHP CRM custom fields on standard objects map to Twenty custom fields on the equivalent standard objects (People, Company, Opportunity, Task). Each PHP CRM deployment has a unique custom field inventory; we run a mandatory discovery phase enumerating every custom field on every standard object before writing any field mapping. Custom field types (text, number, date, picklist, checkbox) map to typed Twenty fields, and any unsupported field types are flagged for the customer admin to address before migration.

PHP CRM

User / Owner

maps to

Twenty CRM

User

1:1
Fully supported

PHP CRM user records map to Twenty User by email matching. Owners assigned to Deals and Tasks are resolved via the User mapping. Any PHP CRM owner without a matching Twenty User (inactive or deleted source users) is flagged in a reconciliation queue for the customer admin to provision before record import resumes.

PHP CRM

Tag / Label

maps to

Twenty CRM

Tag or Custom Field

1:1
Fully supported

PHP CRM tags stored as multi-checkbox properties migrate to Twenty custom multi-select picklist fields on the equivalent standard object. Tag vocabulary is per-instance; we extract the full tag taxonomy from the source and map each distinct tag value to a Twenty picklist value or a separate Tag entity depending on how the customer intends to use tags 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

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • PHP CRM API lacks published rate limits and endpoint documentation

    PHP CRM exposes a developer tools page but does not publish rate limits, endpoint schemas, or authentication details publicly. During scoping, we request direct API credentials and test throttling behavior. For source instances where API access is unavailable or unreliable, we fall back to CSV export via the admin panel. Without published limits, we pace imports conservatively to avoid triggering undocumented throttling rules that could interrupt a live migration. Twenty's API, by contrast, has configurable rate limits on self-hosted instances and documented limits on the cloud deployment.

  • File attachments are not accessible via PHP CRM API

    PHP CRM stores file attachments on the local filesystem (self-hosted) or cloud storage path, not through a documented API endpoint. We cannot programmatically extract attachments. We export the attachment directory path and file inventory to a local directory for customer review and advise re-uploading manually or using Twenty's bulk file import tools post-migration. Attachments do not migrate as part of the standard data migration scope.

  • Custom field taxonomy requires mandatory discovery enumeration

    PHP CRM allows user-defined custom fields on all standard objects without a standardized field schema. Each deployment has a unique custom field inventory. We run a mandatory discovery phase enumerating every custom field present in the source instance before writing any field mapping, preventing silent field drops during import. Custom field names, types, and picklist values must all be enumerated before the migration script is written.

  • Workflows and automations are not exposed via PHP CRM API

    Automated workflows and business logic in PHP CRM live in application code or admin-configured rules that are not exposed via API. We do not migrate automations. Every migration plan includes a written inventory of active PHP CRM workflows and a time estimate in hours for manual recreation in Twenty's Workflow builder. Twenty supports filter conditions on workflows, which may require the customer admin to rethink the logic design during the rebuild phase.

  • Twenty's Docker dependency may require hosting reconfiguration

    Twenty CRM requires Docker for self-hosted deployment. PHP CRM users who were running on traditional shared hosting or lightweight VPS configurations may need to migrate their hosting setup to a Docker-capable environment (such as PikaPods, Coolify, or a self-managed VPS with Docker Engine). We do not handle hosting migration but flag the Docker dependency during scoping so the customer can provision the environment before the data migration begins.

Migration approach

Six steps for a successful PHP CRM to Twenty CRM data migration

  1. Discovery and API access assessment

    We audit the source PHP CRM instance by connecting to its REST API with provided credentials and enumerating the object schema, custom field inventory, pipeline definitions, stage lists, and user list. If API access is unavailable or unreliable, we fall back to CSV export via the admin panel. We document every custom field name, type, and picklist value; every pipeline and stage name; and every user with their email and active/inactive status. The discovery output is a written migration scope and a PHP CRM API accessibility report.

  2. Twenty workspace schema provisioning

    We provision the Twenty workspace schema before any data import. This includes creating Twenty Pipelines matching the source pipeline names, creating Stage records under each Pipeline with names and sequence order matching the source, creating any custom fields on standard objects (People, Company, Opportunity, Task) matching the enumerated PHP CRM custom field inventory, and setting field types (text, number, date, picklist, checkbox) to match the source data. Schema is provisioned via the Twenty API or admin interface into a staging environment first for validation.

  3. Twenty User provisioning and owner reconciliation

    We extract every distinct PHP CRM owner referenced on Deals, Tasks, and Activities and attempt to match by email against the Twenty destination workspace's User list. Owners without a matching Twenty User go to a reconciliation queue. The customer provisions any missing Twenty Users (active or inactive depending on whether the original PHP CRM user is still active). Owner resolution must complete before Deal and Task import can proceed because OwnerId is a required reference on both objects.

  4. Sandbox migration and reconciliation

    We run a full migration into the Twenty staging environment using production-like data volume. The customer's admin spot-checks 25-50 random records against the PHP CRM source, validates that parent-child relationships (Company to People, Company to Opportunity) are preserved, and signs off the schema and mapping before production migration begins. Any field mapping corrections, stage name adjustments, or custom field additions happen at this stage, not in production.

  5. Production migration in dependency order

    We run production migration in strict record-dependency order: Companies (parent entity), People (with CompanyId lookup resolved), Pipelines and Stages (created before Opportunities), Opportunities (with PipelineId, StageId, CompanyId, and OwnerId resolved), Tasks (with assignee and linked entity resolved), Notes (linked to People, Company, or Opportunity), and Activities (mapped to Task or Note depending on type). Each phase emits a row-count reconciliation report before the next phase begins. Attachments are exported to local storage for manual re-upload post-migration.

  6. Cutover, validation, and workflow rebuild handoff

    We freeze PHP CRM writes during cutover and run a final delta migration of any records modified during the migration window. We deliver the workflow inventory document listing every active PHP CRM automation with its trigger, conditions, and actions, plus an estimated rebuild time in hours for the Twenty Workflow builder. We support a one-week hypercare window where we resolve any reconciliation issues raised by the customer's team. We do not rebuild PHP CRM workflows as Twenty Workflows inside the standard migration scope; that is a separate engagement.

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.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 Twenty CRM.

  • 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 Twenty CRM 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 Twenty CRM data migrations

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

Can't find your answer?

Walk through your PHP CRM to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.

Book a free 30 minute consultation

Most migrations land between two and four weeks for accounts under 10,000 Contacts and 2,000 Deals with no custom objects and clean source data. Migrations with extensive custom field taxonomies, multiple custom objects, large activity histories (over 200,000 records), or source instances requiring CSV fallback due to undocumented API access move to six to ten weeks. The timeline includes discovery, schema provisioning, sandbox validation, and production migration execution, but not the workflow rebuild phase which happens separately.

Adjacent paths

Related migrations to explore

Ready when you are

Move from PHP CRM.
Land in Twenty CRM, 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