CRM migration
Field-level mapping, validation, and rollback between PHP CRM and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
PHP CRM
Source
Freshsales
Destination
Compatibility
9 of 11
objects map 1:1 between PHP CRM and Freshsales.
Complexity
BStandard
Timeline
1-2 weeks
Overview
Moving from PHP CRM to Freshsales is a platform-level migration from a self-hosted open-source system to a cloud-native SaaS CRM with published REST APIs and a documented migration tooling path. PHP CRM exposes a REST API with no publicly documented rate limits and stores file attachments on the local filesystem rather than through an API, which means we handle extraction conservatively and fall back to CSV export from the admin panel when credentials are not available. We enumerate every custom field present in the source PHP CRM deployment during a mandatory discovery phase, because PHP CRM allows user-defined field names with no standardized taxonomy and each deployment carries a unique schema. Freshsales imports data via CSV with strict date-format validation and a Sales Owner field that requires login email rather than username. Workflows, automations, and email templates in PHP CRM are application-layer logic not exposed via API, so we do not migrate them; we deliver a written inventory of every automation for the customer's admin to rebuild in Freshsales Workflows and Sales Sequences 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 PHP CRM object lands in Freshsales, 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
Freshsales
Contact
1:1PHP CRM contact records map directly to Freshsales Contact. The primary email address serves as the unique identifier and dedupe key during import. We resolve any parent Company relationship by looking up the Account created from the PHP CRM Company record and setting the Contact's target_account_id accordingly. Name, phone, address, and custom fields migrate field-by-field based on the discovery enumeration. Source Owner maps to Freshsales sales_owner_id by email matching.
PHP CRM
Company
Freshsales
Account
1:1PHP CRM Company records map to Freshsales Account. The Company domain or website URL becomes the Account's website field and is used as the dedupe key. Account is imported first, before any Contact, so that the target_account_id relationship is satisfied at Contact insert time. Industry, address, phone, and custom fields migrate per the discovery field map.
PHP CRM
Deal
Freshsales
Deal
1:1PHP CRM Deal records map directly to Freshsales Deal. Deal value, stage name, expected close date, owner assignment, and associated Contact and Company links migrate. We extract the actual stage names from the source PHP CRM instance and map them to Freshsales pipeline stage names, flagging any stages with no Freshsales match for customer decision. The deal's associated Contact and Company IDs resolve to the migrated Freshsales contact_id and target_account_id through our lookup tables.
PHP CRM
Task
Freshsales
Task
1:1PHP CRM Task records map to Freshsales Task with title, due date, status, priority, and description preserved. Task assignment migrates by resolving the PHP CRM owner ID to the Freshsales User via email match. Tasks linked to a Contact or Deal carry the resolved contact_id or deal_id reference from our parent-record lookup tables.
PHP CRM
Note
Freshsales
Note
1:1PHP CRM Note records migrate as Freshsales Note entries linked to the target entity (Contact, Account, or Deal) by resolved ID mapping. Note body and timestamp migrate; linked file attachments are extracted separately and handed to the customer for manual re-upload since PHP CRM stores attachments on the filesystem and not via API.
PHP CRM
Activity (calls, emails, meetings)
Freshsales
Task / Event
1:1PHP CRM activity records (calls, emails, meetings) have schema variations per deployment. We enumerate the actual activity fields present in the source instance during discovery and map them to Freshsales Task (with TaskSubtype = Call for phone logs) and Event objects. Activity timestamp migrates as ActivityDate for Tasks and StartDateTime for Events. Email content migrates as a Note on the associated Contact if Freshsales does not have an email logging integration active.
PHP CRM
Pipeline
Freshsales
Pipeline
lossyPHP CRM allows custom pipeline definitions. We extract the pipeline names from the source instance and create matching Freshsales Pipelines during migration scoping. If multiple pipelines exist in PHP CRM, each becomes a separate Freshsales Pipeline with its own stage sequence.
PHP CRM
Pipeline Stage
Freshsales
Pipeline Stage
lossyStage names and order vary by PHP CRM configuration. We extract the actual stage list from the source instance, map stage names 1:1 to Freshsales pipeline stages, and flag any stages with no destination match for customer approval before writing the migration mapping.
PHP CRM
Custom Field
Freshsales
Custom Field
1:1PHP CRM supports user-defined custom fields on standard objects with per-deployment uniqueness. We run a mandatory discovery phase enumerating every custom field present in the source instance, mapping each to a Freshsales custom field of equivalent type (text, number, date, picklist, checkbox). Freshsales custom fields are created in the target account before any data import begins. This enumeration step is non-optional because silent field drops during import are the most common migration error for PHP CRM sources.
PHP CRM
User / Owner
Freshsales
User
1:1PHP CRM User records map to Freshsales User by email match. We extract every distinct owner referenced on Contacts, Companies, Deals, and Tasks and match by email against the Freshsales User table. Owners without a matching Freshsales User go to a reconciliation queue; the customer's Freshsales admin provisions missing users before record import resumes.
PHP CRM
Tag / Label
Freshsales
Tag
1:1PHP CRM tags stored on records migrate to Freshsales Tags. Tag vocabulary is per-instance, so we extract the full tag taxonomy from the source and create matching tags in Freshsales before record import. Tags with no Freshsales equivalent are flagged for customer decision.
| PHP CRM | Freshsales | Compatibility | |
|---|---|---|---|
| Contact | Contact1:1 | Fully supported | |
| Company | Account1:1 | Fully supported | |
| Deal | Deal1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Note | Note1:1 | Fully supported | |
| Activity (calls, emails, meetings) | Task / Event1:1 | Fully supported | |
| Pipeline | Pipelinelossy | Fully supported | |
| Pipeline Stage | Pipeline Stagelossy | Fully supported | |
| Custom Field | Custom Field1:1 | Fully supported | |
| User / Owner | User1:1 | Fully supported | |
| Tag / Label | Tag1: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
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
Discovery and API access assessment
We audit the source PHP CRM instance for API availability and credentials. If API access is available, we test connection, enumerate available endpoints, and observe rate-limit behavior by making a series of test requests and measuring response headers and 429 responses. If API access is unavailable or unreliable, we prepare for CSV-only extraction via the PHP CRM admin panel. We enumerate all custom fields on every standard object, extract pipeline and stage names, list owner records, and inventory tag vocabulary. The discovery output is a written scope document with record counts per object, a custom field inventory, and a recommended extraction path (API or CSV). Freshsales account settings are reviewed for date format, currency, and time zone to prepare the transform layer.
Custom field enumeration and mapping design
We create every required Freshsales custom field before any data import begins. Custom field names in PHP CRM are mapped to Freshsales custom field names, with data types matched (text field to text, number to number, picklist to picklist, checkbox to checkbox). Any PHP CRM custom fields that have no Freshsales equivalent are flagged for customer decision: drop, map to a text field, or create a new Freshsales field. The custom field mapping document is customer-signed before extraction begins. We also create Freshsales Pipelines and Stages to match the source PHP CRM pipeline structure at this stage.
Data extraction and transform
We extract data from PHP CRM in dependency order: Companies first (as parent entities), then Contacts, then Deals, then Tasks, Notes, and Activity records. For API extraction, we use conservative request pacing to avoid triggering undocumented throttling. For CSV extraction, we pull each object from the PHP CRM admin panel export function, normalize date formats to match the Freshsales account date format, map owner references to email addresses, and format the output as UTF-8 encoded CSV ready for Freshsales import. Every extract includes the source record's PHP CRM ID for lookup resolution during import.
Owner reconciliation and User provisioning
We extract every distinct PHP CRM owner referenced on Contacts, Companies, Deals, and Tasks and match by email against the Freshsales destination account's User table. Owners without a matching Freshsales User go to a reconciliation queue. The customer's Freshsales admin provisions any missing Users (active or inactive depending on whether the original PHP CRM user is still active) before record import resumes. We cannot proceed past this step because Owner references are required on most standard object imports in Freshsales.
Production import in dependency order
We run production import into the Freshsales account in record-dependency order: Accounts (from PHP CRM Companies), Contacts (with target_account_id resolved from the Accounts phase), Deals (with contact_id and target_account_id resolved), Tasks, Notes, and Activity records. Each phase emits a row-count reconciliation report showing source count versus destination count. Date format validation runs on a sample batch before each phase. Any records rejected during import are logged with error reasons, corrected in the source transform file, and re-imported before the phase is marked complete.
Cutover, validation, and workflow inventory handoff
We freeze PHP CRM writes during the cutover window, run a final delta migration of any records modified during the migration, then enable Freshsales as the system of record. We validate record counts, spot-check 25-50 random records against the PHP CRM source, and confirm that parent-child relationships (Contact to Account, Deal to Contact and Account) are intact. File attachments are handed off as a file manifest for manual re-upload. We deliver a written inventory of every PHP CRM automation (workflow rules and business logic in application code) for the customer's Freshsales admin to rebuild in Freshsales Workflows and Sales Sequences post-migration. We support a one-week post-cutover window for reconciliation issues raised by the customer's team.
Platform deep dives
PHP CRM
Source
Strengths
Weaknesses
Freshsales
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 Freshsales.
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 Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your PHP CRM to Freshsales 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 Freshsales
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.