CRM migration
Field-level mapping, validation, and rollback between Firmao CRM and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Firmao CRM
Source
Twenty CRM
Destination
Compatibility
6 of 10
objects map 1:1 between Firmao CRM and Twenty CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Firmao CRM to Twenty CRM is a migration from an ERP-adjacent SMB platform with tier-gated features and an undocumented-rate-limit API to a modern open-source CRM with full REST and GraphQL access and no per-contact billing. Firmao uses a flat JSON API with subClass and subId envelopes for object relationships; Twenty uses a standard relational model with Companies, People, and Opportunities. We extract Contacts, Companies, Deals, Tasks, Products, and Custom Fields from Firmao via its /svc/v1/ endpoints using single-record POST requests (no bulk endpoint exists), map parent-child relationships via companyName and dealName matching, and import in strict dependency order. Firmao's tier-gated objects — Deals, Projects, Gantt/Kanban — require verification of the customer's active plan before migration. Workflows, automations, sequences, email history, and attachments do not migrate; we deliver a written inventory of every active automation for the customer's admin to rebuild in Twenty.
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 Firmao 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.
Firmao CRM
Company
Twenty CRM
Company
1:1Firmao Company records map directly to Twenty Company records. Firmao exposes Companies via /svc/v1/company with no internal ID in the GET response — we use companyName as the dedupe key. Twenty requires Companies to exist before importing related People (Contacts), so this is always the first object migrated. Address, industry, and website fields map 1:1 where present.
Firmao CRM
Contact
Twenty CRM
Person
1:1Firmao Contact records map to Twenty Person records. We resolve the parent Company via companyName matching (since Firmao does not expose companyId in the GET response) and link the Person to the Company after Companies are imported. Standard contact properties (name, email, phone, job title) map directly. Custom contact fields (customFields.customN) require pre-creation in Twenty Settings → Data Model before migration.
Firmao CRM
Deal
Twenty CRM
Opportunity
1:1Deals migrate to Twenty Opportunity only if the customer is on Firmao Professional or above — Deals are not accessible via API on the Standard plan. If the account is on Standard, we flag the absence and ask the customer to upgrade before Deal import. On Professional and above, dealName, dealValue, dealstage, and ownerId map to Opportunity name, amount, stage, and assignee respectively. Pipeline stages are organization-defined in Firmao and migrate as Twenty stage values after confirmation from the customer.
Firmao CRM
Task
Twenty CRM
Task
1:1Firmao Tasks map to Twenty Tasks with assignee, due date, status, and description preserved. The parent Deal association is resolved via dealName matching against imported Opportunities since Firmao does not expose dealId in the GET response. Tasks without a resolvable parent Deal are imported as standalone tasks and flagged for manual link review.
Firmao CRM
Product
Twenty CRM
Product
1:1Firmao Products map to Twenty Product records. The base product fields (name, SKU, description, base price) migrate directly. Per-warehouse stock state — stored in Firmao as subClass=warehouse subId entries on the product — is extracted and flattened into individual warehouse records in Twenty if Twenty's warehouse model is in use, or consolidated into product-level stock notes if not.
Firmao CRM
Invoice
Twenty CRM
Custom Object (Invoice)
1:manyFirmao Invoice records (VAT invoices, bills, receipts, accounting notes with line items and tax codes) do not have a native equivalent in Twenty's standard object set. We create a custom object named Invoice in Twenty's Data Model before migration and map invoice header fields and line items as detail rows linked to the Invoice custom object. If the customer does not require invoice history in Twenty, we recommend archiving the full invoice dataset as a CSV export rather than importing into a custom object.
Firmao CRM
User
Twenty CRM
User
1:1Firmao Users (name, email, role) are exported via /svc/v1/user and mapped to Twenty Users by email match. Owner assignments on Deals and Tasks are resolved by cross-referencing the Firmao owner email against the migrated User list. Users without a matching Twenty User are placed in a reconciliation queue for the customer's admin to provision before record import resumes.
Firmao CRM
Tag
Twenty CRM
Custom field (multi-select)
lossyFirmao stores tags as comma-separated values on Contact and Company records. We extract the unique tag values, create a multi-select custom field in Twenty's Data Model (one field per object: Contact Tags, Company Tags), populate the values, and flag any tag with more than 20 unique values for a separate discussion on normalization strategy.
Firmao CRM
Custom Fields
Twenty CRM
Custom Fields
lossyFirmao custom fields (customFields.custom5 through customFields.customN) require enumeration from a sample GET response before migration. We retrieve a representative record to identify which custom field keys are populated, cross-reference against any import documentation the customer provides, and pre-create matching custom fields in Twenty's Data Model with appropriate types (text, number, date, select). Empty custom fields in the sample are excluded from migration. This step is mandatory because Twenty requires fields to exist before CSV import.
Firmao CRM
Pipeline Stages
Twenty CRM
Opportunity Stage
lossyFirmao pipeline stages are a property on the Deal object, not a standalone API entity. We extract all unique stage values from Deal records and ask the customer to confirm stage names and order during scoping. These become Twenty Opportunity stage values. Stage probability percentages are migrated as custom fields on the Opportunity if the customer tracks them in Firmao, since Twenty does not expose per-stage probability at the standard object level.
| Firmao CRM | Twenty CRM | Compatibility | |
|---|---|---|---|
| Company | Company1:1 | Fully supported | |
| Contact | Person1:1 | Fully supported | |
| Deal | Opportunity1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Product | Product1:1 | Fully supported | |
| Invoice | Custom Object (Invoice)1:many | Fully supported | |
| User | User1:1 | Fully supported | |
| Tag | Custom field (multi-select)lossy | Fully supported | |
| Custom Fields | Custom Fieldslossy | Mapping required | |
| Pipeline Stages | Opportunity Stagelossy | Mapping required |
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.
Firmao CRM gotchas
Tier-gated objects cause silent import failures
Custom field keys are dynamic and not self-documenting
Parent-child object import order is mandatory
Warehouse stock state is subClass-embedded, not top-level
API login is auto-generated and tied to company ID
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
Discovery and plan verification
We audit the Firmao account across plan tier (Standard, Professional, Enterprise, Supreme), object population counts (Companies, Contacts, Deals, Tasks, Products, Invoices), active custom fields via a sample GET, and any active ERP features in use (warehouse stock, production, courier). We verify Deal accessibility via a test API call to confirm the plan tier, identify which custom field keys are populated, and extract the unique pipeline stage values from Deal records. The discovery output is a written migration scope, a custom field enumeration list, and a plan-upgrade recommendation if Deals are in scope on a Standard plan.
Twenty data model design
We create all custom fields in Twenty's Settings → Data Model before any import begins, matching each Firmao customFields.customN key to a typed Twenty field (text, number, date, select). We create pipeline stage values in Twenty's Opportunities settings confirmed against the customer's unique stage list from discovery. For invoice migration, we create the Invoice custom object and its line item relationship if the customer requires invoice history in Twenty. Schema is reviewed with the customer before any data moves.
Test migration in Twenty staging
We run a full migration into Twenty using a staging environment against production-like data volume. The customer reconciles record counts (Companies in, People in, Opportunities in, Tasks in), spot-checks 20-30 random records against the Firmao source, and confirms custom field values landed correctly. Relationship integrity (Person-to-Company, Task-to-Opportunity) is validated. Mapping corrections identified during staging are applied before the production migration begins.
Owner and user reconciliation
We extract every distinct Firmao User referenced on Deals and Tasks and match by email against Twenty's User table. Users without a matching Twenty User are placed in a reconciliation queue for the customer's admin to provision before record import resumes. Owner assignments on Deals and Tasks resolve against this User map. Migration cannot complete this step until all active owner references have a corresponding Twenty User.
Production migration in dependency order
We run production migration in strict record-dependency order: Companies first (the parent side of all relationships), then People (Contacts linked to imported Companies via companyName matching), then Products, then Opportunities (Deals linked to imported Opportunities via dealName matching), then Tasks. Each phase emits a row-count reconciliation report before the next phase begins. Custom field values are imported as part of each phase's CSV load against the pre-created Twenty fields.
Cutover, validation, and automation inventory handoff
We freeze Firmao writes during cutover, run a final delta migration of any records modified during the migration window, then enable Twenty as the system of record. We deliver a written inventory of every active Firmao automation, workflow rule, and sequence with its trigger, conditions, and actions, plus a recommended Twenty equivalent. We do not rebuild Firmo workflows as Twenty workflows inside the migration scope. We support a brief post-migration validation window to resolve record-level issues raised by the customer's team.
Platform deep dives
Firmao CRM
Source
Strengths
Weaknesses
Twenty CRM
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 Firmao CRM and Twenty CRM.
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
Firmao CRM: Not publicly documented.
Data volume sensitivity
Firmao 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 Firmao CRM to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Firmao CRM to Twenty CRM migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Firmao CRM
Other ways to arrive at Twenty CRM
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.