CRM migration

Migrate from Firmao CRM to Twenty CRM

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 logo

Firmao CRM

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

60%

6 of 10

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

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Firmao CRM logo

Firmao CRM

What's pushing teams away

  • Customization requires technical knowledge — configuring the system to fit unique business workflows is cited as a barrier for non-technical administrators.
  • Basic tier feels feature-limited; users report needing to upgrade to Professional or Enterprise to access custom fields, deal tracking, and Gantt/Kanban diagrams.
  • No publicly documented rate limits means migration tooling must handle undocumented throttling conservatively, which can slow large data transfers.
  • The platform's heavy ERP-adjacent feature set creates complexity for teams that only need a straightforward CRM, leading to feature-overload frustration.

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 Firmao CRM objects map to Twenty CRM

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

maps to

Twenty CRM

Company

1:1
Fully supported

Firmao 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

maps to

Twenty CRM

Person

1:1
Fully supported

Firmao 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Deals 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

maps to

Twenty CRM

Task

1:1
Fully supported

Firmao 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

maps to

Twenty CRM

Product

1:1
Fully supported

Firmao 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

maps to

Twenty CRM

Custom Object (Invoice)

1:many
Fully supported

Firmao 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

maps to

Twenty CRM

User

1:1
Fully supported

Firmao 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

maps to

Twenty CRM

Custom field (multi-select)

lossy
Fully supported

Firmao 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

maps to

Twenty CRM

Custom Fields

lossy
Mapping required

Firmao 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

maps to

Twenty CRM

Opportunity Stage

lossy
Mapping required

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

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.

Firmao CRM logo

Firmao CRM gotchas

High

Tier-gated objects cause silent import failures

Medium

Custom field keys are dynamic and not self-documenting

Medium

Parent-child object import order is mandatory

Low

Warehouse stock state is subClass-embedded, not top-level

Low

API login is auto-generated and tied to company ID

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

  • Twenty requires custom fields created before import

    Twenty's CSV import creates records, not fields. Custom fields must be defined in Settings → Data Model before any data import begins. Firmao's dynamic custom field keys (customFields.custom5 through customFields.customN) have no human-readable labels in the API response, so we retrieve a sample record via GET to enumerate which keys are populated, then pre-create matching fields in Twenty with appropriate types. Failing to pre-create fields results in custom field values being silently dropped during import.

  • Firmao Deal import fails silently on Standard plan

    Deals are accessible via Firmao's API only on Professional and above. If the customer's active plan is Standard, API calls for Deals return either empty results or permission-denied responses that can appear as successful but empty imports in tooling logs. We confirm the customer's active plan tier during scoping, verify Deal accessibility via a test GET, and ask the customer to upgrade before Deal migration begins if Deals are in scope and the plan is Standard.

  • Import order is mandatory due to parent-child lookups

    Firmao's flat JSON API does not expose internal IDs in GET responses. Contacts reference Companies via companyName, and Tasks reference Deals via dealName. Twenty's relational model requires parent records to exist before child records are inserted. We sequence migration as: Companies first, then People (Contacts), then Opportunities (Deals), then Tasks. Skipping or reordering this sequence results in null foreign keys and broken association in Twenty's UI. We provide a sequencing manifest before migration begins.

  • No bulk API means large Firmo exports are slow

    Firmao has no bulk export endpoint. Large migrations require repeated single-record GET and POST requests. Rate limits are not publicly documented, so we probe-and-backoff conservatively, which extends timelines for accounts with more than 5,000 records. We request the customer's current API credentials at migration start and avoid password rotation during the transfer to prevent interrupted connections.

  • Warehouse stock is subClass-embedded, not top-level

    Firmao tracks product inventory per warehouse as subClass=warehouse entries within the product modification log rather than as a standalone warehouse object. A single GET on /product returns the base product; warehouse-level netPriceInStore and currentStoreState appear as separate subId entries. We extract all subId variants per product and flatten them into individual warehouse records in Twenty or into a consolidated stock notes field, depending on the customer's use of Twenty's warehouse model.

Migration approach

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

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

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

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

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

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

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

Context on both ends of the pair

Firmao CRM logo

Firmao CRM

Source

Strengths

  • Generous free trial (14 days) with full feature access lets teams validate fit before committing to a paid tier.
  • Per-seat pricing with no per-contact billing means unlimited contacts on any plan — ideal for high-contact-volume SMBs.
  • Cloud storage included in every tier (2–10GB) reduces the need for a separate document management tool.
  • Multi-language and multi-currency support makes it viable for teams operating across European markets.
  • Android and iOS mobile apps provide field access for sales teams working outside the office.

Weaknesses

  • Rate limits are not publicly documented, which forces migration tooling to probe-and-backoff cautiously and slows large data transfers.
  • ERP-adjacent complexity (production, courier integrations, warehouse stock) is overkill for teams seeking a pure CRM tool.
  • Custom fields require a Professional or higher tier, gating basic users from one of the most common CRM customization needs.
  • No bulk API endpoint means large migrations must be executed via repeated single-record POST requests, extending transfer timelines.
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 Firmao 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

    Firmao CRM: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

Estimate your Firmao 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 Firmao CRM to Twenty CRM data migrations

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

Can't find your answer?

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 consultation

Most migrations land between two and four weeks for accounts under 10,000 records with no Deals on a Standard plan and fewer than 20 custom fields. Migrations with active Deals (Professional or above), Products with per-warehouse stock, or 20+ custom fields move to five to eight weeks because of single-record API throttling, custom field enumeration, and parent-child lookup resolution per record. Large account migrations (50,000+ records) require additional staging cycles and can extend beyond eight weeks.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Firmao 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