CRM migration

Migrate from Ascora to Twenty CRM

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

Ascora logo

Ascora

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between Ascora and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Ascora is a field-service management platform built for trade businesses (electricians, plumbers, HVAC, landscaping) — it bundles job scheduling, quoting, invoicing, and mobile field forms into one tool. Twenty CRM is a general-purpose open-source CRM that stores People, Companies, Opportunities, Notes, and Tasks with full custom-object and custom-field support. The migration challenge is translating Ascora's job-centric data model (Jobs linked to Customers and Sites, with custom form fields capturing site details, equipment specs, and sign-off data) into Twenty's relationship-oriented schema. We map Ascora Customers to Twenty People, Ascora Sites to Company relations or a custom Site object, and Ascora Jobs to Twenty Opportunities with a custom pick-list field for job status. Custom form fields from Ascora become Twenty custom fields created in Settings → Data Model before import. The migration runs via Twenty's CSV import with companies loaded first, people second, and opportunities third to satisfy foreign-key ordering. A delta-pickup window captures any jobs created or updated during the cutover window. Workflows, scheduling rules, and invoicing logic in Ascora do not migrate — those must be rebuilt in Twenty or outside the CRM.

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

Ascora logo

Ascora

What's pushing teams away

  • Absence of a fully documented public REST API limits automation and makes migration to other platforms technically complex without Ascora support involvement.
  • Limited reporting depth means some trade businesses feel they lack the analytical visibility needed to make data-driven scheduling and pricing decisions.
  • Smaller ecosystem and fewer third-party integrations compared to platforms like Simpro or Salesforce, restricting extensibility for complex operations.
  • Customer support responsiveness can be inconsistent, with some users noting delays on non-critical issues during business hours.
  • No transparent public pricing page means prospective customers must contact sales, creating friction for small operators comparing options quickly.

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

Each row shows how a Ascora 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.

Ascora

Customer

maps to

Twenty CRM

People

1:1
Fully supported

Ascora Customers map directly to Twenty People. Each Customer record carries name, email, phone, and address fields that translate to Twenty People fields without transformation. The Customer's internal ID is stored as Source_System_ID__c for delta-run de-duplication. This cross-reference enables the migration pipeline to detect and skip duplicate records during subsequent import runs, maintaining data integrity across the migration timeline.

Ascora

Customer (company-type)

maps to

Twenty CRM

Company

1:1
Fully supported

When an Ascora Customer record represents a business entity (rather than an individual), it maps to a Twenty Company. This requires flagging at audit time — Ascora does not enforce a Company/Individual split, so business-type customers are identified by domain name presence or explicit business-type flag if configured.

Ascora

Site

maps to

Twenty CRM

Custom Object: Site__c

1:1
Fully supported

Ascora Sites are service-location records linked to Customers — address, site name, site contact, equipment list. Twenty has no native Site object. We create a custom Site__c object with fields for address, site contact name/phone, and a relation to the Company representing the Customer. Each Job in Ascora links to a Site; this relation migrates as a lookup field on the Opportunity.

Ascora

Job

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Ascora Jobs map to Twenty Opportunities — the job name becomes the Opportunity name, job amount maps to Opportunity amount, and the job's close date maps to the Opportunity close date. The job status value (Quoted, In Progress, Completed, Invoiced) maps to a custom Stage__c pick-list field on the Opportunity, not Twenty's native stage, because Twenty's stage is pipeline-specific.

Ascora

Job Status

maps to

Twenty CRM

Custom field: Job_Status__c (pick-list on Opportunity)

1:1
Fully supported

Ascora job status values are mapped one-by-one to custom pick-list values in Twenty. Quoted maps to a prospecting stage, In Progress maps to a mid-pipeline stage, Completed maps to a closed-won value, Invoiced maps to a post-close stage. The mapping is documented and applied during CSV import transformation.

Ascora

Quote / Quotation

maps to

Twenty CRM

Custom field: Quote_Amount__c on Opportunity

1:1
Fully supported

Ascora Quotations are separate records linked to Jobs. The quoted value migrates as a custom currency field on the Opportunity. Quote status (Sent, Accepted, Declined) becomes a separate custom pick-list field. Full quotation line items require a custom Quote_Line_Items__c custom object with a relation to Opportunity if line-item detail must be preserved.

Ascora

Invoice

maps to

Twenty CRM

No equivalent in Twenty CRM

1:1
Fully supported

Ascora invoices have no direct equivalent in Twenty CRM — Twenty has no native invoicing module. Invoice number, amount, and status migrate as custom fields on the Opportunity for historical reference. Ongoing invoicing must continue in the accounting integration (Xero, QuickBooks, or MYOB) outside Twenty.

Ascora

Custom Form Fields (Job Custom Details)

maps to

Twenty CRM

Custom fields on Opportunity

1:1
Fully supported

Ascora custom forms capture field data (site sign-off name, equipment model, job notes) via field codes embedded in Word templates. Each field code becomes a Twenty custom field on the Opportunity object. Fields must be pre-created in Twenty Settings → Data Model before the CSV import runs — CSV import creates records, not fields.

Ascora

Job Notes / Activity Log

maps to

Twenty CRM

Note

1:1
Fully supported

Ascora job notes and activity log entries migrate as Twenty Notes attached to the corresponding Opportunity record. Original timestamps and author names are preserved. Activity type (call, site visit, etc.) is stored as a custom type field on the Note for filtering in Twenty's view.

Ascora

Attachment / File

maps to

Twenty CRM

Salesforce Files-style re-upload

1:1
Fully supported

Ascora file attachments on jobs (photos, signed forms, equipment receipts) cannot be carried via CSV import into Twenty. We export files from Ascora and re-upload them to Twenty manually or via API after go-live. File-to-record linking is rebuilt using Twenty's attachment model.

Ascora

Owner / Assigned Technician

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

Ascora jobs are assigned to technicians or staff members. Twenty requires all Workspace Members to accept an invitation before user references can map. We resolve Ascora owner emails against Twenty Workspace Members — unmatched owners are flagged before migration and assigned to a fallback user.

Ascora

Integration references (Xero, QuickBooks, MYOB)

maps to

Twenty CRM

No equivalent

1:1
Fully supported

Ascora integration links to Xero, QuickBooks, or MYOB are configuration-level connections that do not carry over. We document which accounting tool was connected per Customer and per Invoice so the team can reconnect the accounting integration in Twenty after go-live.

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.

Ascora logo

Ascora gotchas

High

No documented public REST API with published rate limits

Medium

Custom Forms use Word template field codes with no structured schema export

Medium

Xero two-way sync creates reconciliation risk during migration

Medium

Excel export is the primary bulk data extraction mechanism

Low

No pricing transparency — plan tiers are not publicly documented

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 CSV imports in strict object order — Companies before People, People before Opportunities

    Twenty's CSV import enforces a foreign-key ordering rule: the 'one' side of any relation must exist before the 'many' side can reference it. This means Ascora Companies must migrate as Twenty Companies first (so Site lookups resolve), then People (so Opportunity lookups to People resolve), then Opportunities last. If you import Opportunities before their linked Sites and People, Twenty rejects the rows silently or maps them with null relations. We build a sequenced migration plan and execute imports in the correct order, flagging any Ascora Customer with a missing site link before the People import runs.

  • Twenty CSV import creates records, not fields — custom form fields must exist before import

    Ascora custom form field codes embedded in Word templates capture site sign-off data, equipment details, and job-specific notes. Twenty's CSV import only populates fields that already exist in Settings → Data Model. If a Twenty custom field has not been created before the CSV upload, the import will skip that column silently or create a new text field with a mangled name. We pre-create every Ascora custom field as a named Twenty custom field (text, pick-list, number, or date type matched to the source data type) before any CSV file is uploaded. This is the most common point of failure in Ascora-to-Twenty migrations and requires a full field-inventory audit of the Ascora custom form setup.

  • Ascora's job status values must map to a custom pick-list, not Twenty's native Opportunity Stage

    Twenty's Opportunity Stage is a native pick-list that drives the kanban pipeline view and probability weighting. Ascora job statuses (Quoted, In Progress, Completed, Invoiced) do not map cleanly to a single Stage pipeline because the same job can have both a 'Quoted' stage and an 'In Progress' stage simultaneously in Ascora. We create a custom Job_Status__c pick-list on the Opportunity object that maps exactly to Ascora's status values, preserving the original status label. If the team wants Ascora's multi-status behavior visible in Twenty's pipeline view, a custom Site_Specific__c pick-list on the Site__c object is the recommended secondary approach.

  • Ascora file attachments cannot be carried via CSV import into Twenty

    Ascora stores job photos, signed field forms, and equipment receipts as file attachments on Job records. Twenty's CSV import mechanism does not support file attachment imports — files must be re-uploaded manually or migrated via the Twenty GraphQL API. For migrations with hundreds of attachments, this adds significant post-import work. We extract all Ascora attachment URLs during the data audit, package them with their linked Job ID for reference, and provide a re-upload checklist organized by Opportunity so the team can restore files to the correct Twenty records without manual searching.

  • Ascora Site-to-Customer relationships require a custom Site__c object in Twenty

    Ascora Sites are first-class records linked to Customers with their own address, contact, and equipment list. Twenty has no native Site or Location object — every Site in Ascora must map to either a custom Site__c object with a Company relation, or to the Company record itself if the site address is treated as the company's primary address. We recommend a custom Site__c object for teams with multiple service locations per customer, and a Company address update for single-location customers. The decision must be made during the audit phase because it affects how Opportunity-to-Site relations are built during migration.

Migration approach

Six steps for a successful Ascora to Twenty CRM data migration

  1. Audit Ascora data export and inventory all custom form fields

    FlitStack AI exports every object from Ascora — Customers, Sites, Jobs, Quotes, Invoices, and any custom form field configurations. We build a field inventory listing every Ascora field code, its data type, and the custom form it belongs to. This inventory drives the Twenty custom field pre-creation checklist. Any Ascora field that has no Twenty equivalent is flagged for a custom field creation decision before the migration plan is finalized.

  2. Create Twenty custom fields and custom Site__c object before import

    We create all required custom fields in Twenty Settings → Data Model before any CSV import runs. This includes the Site__c custom object (with CompanyId relation, Address__c, Contact_Name__c, Contact_Phone__c, and Equipment_List__c fields), Job_Status__c pick-list on Opportunity, Quote fields (Quote_Number__c, Quote_Amount__c, Quote_Status__c), and Invoice fields (Invoice_Number__c, Invoice_Amount__c, Invoice_Status__c). We also create every Ascora custom form field as a named custom field on Opportunity. Workspace Members are invited and verified before this step to allow owner email resolution during import.

  3. Migrate in Twenty's required object order: Companies → People → Opportunities

    We execute the migration in the order Twenty enforces: Companies first (as the 'one' side of site and person relations), then People (linked to Companies via companyId), then Opportunities (linked to People via personId and to Site__c via Site__cId). Owner emails are resolved against Twenty Workspace Members during the People import. Any unmatched owner is flagged and assigned to a fallback user before Opportunities import. Each batch is validated against the Ascora record count before proceeding to the next object.

  4. Run sample migration with field-level diff across all object types

    A representative slice — typically 200–500 records spanning Customers, Sites, Jobs, and Quotes — migrates first. We generate a field-level diff comparing source values in Ascora to their corresponding Twenty fields post-import. The diff verifies custom pick-list value mapping for job status, Site-to-Company relation resolution, Quote amount preservation, and owner email matching. You review the diff and sign off before the full migration commits.

  5. Execute full migration with delta-pickup window and file attachment plan

    Full migration runs against Twenty with all objects. A 24–48 hour delta-pickup window captures any Jobs created or updated in Ascora during the cutover. All Ascora file attachment URLs are extracted and packaged with their linked Job ID into a re-upload guide. FlitStack AI generates an audit log of every record migrated, its source ID, and destination record ID. One-click rollback is available if reconciliation against the Ascora export count fails.

Platform deep dives

Context on both ends of the pair

Ascora logo

Ascora

Source

Strengths

  • Integrated quoting, scheduling, job tracking, inventory, and invoicing in one platform for trade businesses
  • Native two-way sync with Xero, MYOB, and QuickBooks accounting software
  • Built-in mobile app for field technicians with real-time schedule updates
  • Custom Forms via Word templates allow flexible field data capture without code changes
  • Active development with regular updates and bug fixes reported by long-term users

Weaknesses

  • No publicly documented REST API with published rate limits, constraining automation and migration tooling
  • Limited third-party ecosystem and integrations compared to Simpro or Salesforce FSM
  • No transparent public pricing — requires sales contact to get a quote
  • Smaller company size (revenue under $5M) may raise long-term viability concerns for some buyers
  • Reporting and analytics depth lags behind enterprise-grade FSM platforms
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. 1 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 Ascora and Twenty CRM.

  • Object compatibility

    B

    1 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

    Ascora: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

Most Ascora-to-Twenty migrations complete in 48–72 hours for under 50,000 records. The longest phase is the pre-import step — creating Twenty custom fields in Settings → Data Model to match every Ascora custom form field — which typically takes 1–2 days of setup before any data moves. Complex migrations with 50+ custom fields, a custom Site__c object, and 50,000+ records extend to 5–10 days. The delta-pickup window adds 24–48 hours at the end regardless of size.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Ascora.
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