CRM migration

Migrate from Salesforce Field Service to Twenty CRM

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

Salesforce Field Service logo

Salesforce Field Service

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

100%

12 of 12

objects map 1:1 between Salesforce Field Service and Twenty CRM.

Complexity

BStandard

Timeline

48–72 hours

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Salesforce Field Service runs on a managed package that wraps standard Salesforce objects (Account, Contact, Asset) with field-service-specific objects: WorkOrder, ServiceAppointment, Skill, WorkOrderLineItem, ServiceContract, and Entitlement. The dispatcher console, Gantt scheduling view, and mobile technician app are Salesforce Lightning components that have no direct counterpart in Twenty CRM. Twenty's standard object model covers People (contacts), Companies, Opportunities, Notes, and Tasks, but it has no native field-service scheduling or work-order management objects — these have to be built as custom objects. We map Salesforce WorkOrder to a custom Work_Order__c object in Twenty, ServiceAppointment to custom Service_Appointment__c, and Skills to custom Skill__c. Assets and Entitlements migrate to custom objects with type-aware field mapping. Salesforce's owner-based assignment (technician as User) maps to Twenty's workspace-member relation. The migration runs against Salesforce's Bulk API for high-volume record extraction, transforms to Twenty's REST or CSV import format, and uses a 24–48 hour delta pickup window to capture in-flight changes during cutover. All automations, Flow triggers, and scheduling recipes must be rebuilt in Twenty's workflow builder — we export those definitions as reference documents.

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

Salesforce Field Service logo

Salesforce Field Service

What's pushing teams away

  • Pricing model accumulates hidden costs—storage overages at $125/GB, API throttling during high-volume periods, and $2 per Agentforce conversation add up beyond the base seat license.
  • Complexity of inherited implementations makes configuration tangles difficult to unwind, and lack of clear documentation makes it hard for new teams to understand what the system is actually doing.
  • Scheduling limits create friction at scale—250 records per Enhanced Scheduling optimization batch is insufficient for large service operations without additional tooling.
  • Integration depth becomes a dependency trap—organizations deeply embedded in Salesforce Field Service find switching costs prohibitively high even when frustrated with cost or complexity.

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 Salesforce Field Service objects map to Twenty CRM

Each row shows how a Salesforce Field Service 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.

Salesforce Field Service

Account

maps to

Twenty CRM

Company

1:1
Fully supported

Salesforce Account maps directly to Twenty Company. Account.Name becomes Company.name, Account.Website maps to domainUrl, and Account.Industry maps to industry. Multi-address accounts collapse to one primary address in Twenty's single address field, with secondary addresses preserved as custom fields if needed. Parent Account hierarchies map via Company.parentId where available.

Salesforce Field Service

Contact

maps to

Twenty CRM

People

1:1
Fully supported

Salesforce Contact maps to Twenty People with direct field-name equivalents for firstName, lastName, email, and phone. Contact.Title maps to jobTitle. The Contact's primary AccountId becomes People.companyId — the company must be imported before the contact so the foreign key resolves. N:N contact-to-account relationships in Salesforce are not represented in Twenty's standard People model; secondary company links require a custom junction object.

Salesforce Field Service

WorkOrder

maps to

Twenty CRM

Work_Order__c (custom object)

1:1
Fully supported

Salesforce WorkOrder has no native equivalent in Twenty — we create a custom Work_Order__c object in Twenty's Settings → Data Model. Fields map: WorkOrder.Status to Work_Order__c.status (value mapping: In Progress→In Progress, Completed→Closed, etc.), WorkOrder.Priority to priority picklist, WorkOrder.Description to description, WorkOrder.SlaStartDate/WoDate to scheduledDate. OwnerId (technician User) resolves to Twenty workspace member by email match.

Salesforce Field Service

ServiceAppointment

maps to

Twenty CRM

Service_Appointment__c (custom object)

1:1
Fully supported

ServiceAppointment maps to a custom Service_Appointment__c object linked to Work_Order__c. Appointment status (FSM states: Scheduled, Dispatched, In Progress, Completed, Cancelled) maps to a custom status__c pick-list. Schedules and FSL window times migrate to scheduledStartDate__c and scheduledEndDate__c datetime fields. The parent WorkOrderId becomes a relation field in Twenty's custom object.

Salesforce Field Service

WorkOrderLineItem

maps to

Twenty CRM

Line_Item__c (custom object, child of Work_Order__c)

1:1
Fully supported

WorkOrderLineItem (parts and labor on a work order) maps to a custom Line_Item__c object with a relation to Work_Order__c. LineItem.Quantity maps to quantity__c, UnitCost to unitCost__c, and LineItem.TotalPrice to totalPrice__c. Product2 reference in Salesforce becomes a text Product__c field or a custom Product relation in Twenty, depending on whether a Products custom object is created.

Salesforce Field Service

Asset

maps to

Twenty CRM

Asset__c (custom object)

1:1
Fully supported

Salesforce Asset (installed products linked to accounts and contacts) maps to a custom Asset__c object in Twenty. Asset.Name, SerialNumber, InstallDate, Status, and Product2 reference all migrate to corresponding fields. Asset.AccountId becomes Asset__c.accountId relation. Asset.ContactId becomes an optional Asset__c.contactId relation. The asset's relationship to WorkOrderLineItem requires a custom junction design in Twenty since there is no native many-to-many link.

Salesforce Field Service

Skill

maps to

Twenty CRM

Skill__c (custom object)

1:1
Fully supported

Salesforce Skill (technician certifications and proficiency levels) maps to a custom Skill__c object in Twenty. Skill.SkillName maps to name__c. If Salesforce stores skill levels as separate pick-list values, these migrate to a proficiency__c pick-list on the custom object. Linking Skills to People (technicians) requires a custom Skill_Assignment__c junction object in Twenty, since Twenty's standard relation model does not support many-to-many person-to-skill links natively.

Salesforce Field Service

ServiceContract

maps to

Twenty CRM

Service_Contract__c (custom object)

1:1
Fully supported

Salesforce ServiceContract (warranty and SLA terms) maps to a custom Service_Contract__c object linked to Account and Asset. Contract.StartDate, EndDate, and Status migrate to contractStartDate__c, contractEndDate__c, and status__c. Line items (ContractLineItem) on the contract migrate to separate contractLineItem__c records linked to the contract, capturing covered products and pricing terms.

Salesforce Field Service

Entitlement

maps to

Twenty CRM

Entitlement__c (custom object)

1:1
Fully supported

Salesforce Entitlement (service entitlement linked to contact/account with business hours) maps to a custom Entitlement__c object in Twenty. Entitlement.Name, Status, StartDate, and EndDate migrate to corresponding fields. The BusinessHours reference migrates as businessHours__c text. Entitlement.IsPerIncident and remaining service credits migrate to a custom remainingIncidents__c number field. Since Twenty has no native BusinessHours object, service-level response windows are stored as text or recreated as workflow triggers.

Salesforce Field Service

User (technician/dispatcher)

maps to

Twenty CRM

WorkspaceMember

1:1
Fully supported

Salesforce Users who own WorkOrders or ServiceAppointments are resolved by email match against Twenty workspace members. Unmatched owners are flagged before migration — your team either invites them to Twenty first or assigns records to a fallback member. Active/Inactive Salesforce User status does not translate to Twenty directly; inactive users in Salesforce are preserved as name/email in an ownerAudit__c field on migrated records but do not become active Twenty members.

Salesforce Field Service

WorkOrder (activity history)

maps to

Twenty CRM

Task / Note

1:1
Fully supported

Work Order StatusHistory (stage-transition audit log) is not a standard child object in Salesforce Field Service — it is queryable via WorkOrderHistory. We extract the most recent status transitions and load them as Task records in Twenty linked to the Work_Order__c custom object, preserving original transition timestamps and the prior/new status values as task description content.

Salesforce Field Service

Attachment / Salesforce Files

maps to

Twenty CRM

Note / File (manual re-upload)

1:1
Fully supported

Salesforce Files attached to WorkOrders, ServiceAppointments, and Assets (photos, signed forms, PDFs) do not migrate automatically. We export them to a ZIP archive and provide a file re-upload guide for your team — Twenty's UI supports file attachment on records but requires manual re-upload or API reconstruction. Attachments on standard Salesforce objects (Contact, Account) are similarly preserved as a downloadable archive with filename-to-record mapping.

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.

Salesforce Field Service logo

Salesforce Field Service gotchas

High

250-record batch limit for Enhanced Scheduling optimization

High

Process Builder workflows do not migrate—must be rebuilt in Flow Builder

High

API rate limits vary by edition and are easy to exhaust during bulk migration

Medium

Storage overages at $125/GB inflate migration data costs

Medium

Custom fields and lookups require explicit field-level mapping

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

  • Salesforce FSL scheduling policies have no native Twenty equivalent

    Salesforce Field Service scheduling policies define appointment windows, travel time buffers, optimization objectives, and work rule constraints via the SchedulingPolicy, SchedulingPolicyObjective, and SchedulingPolicyWorkRule objects. Twenty CRM has no scheduling engine — the closest construct is a custom workflow trigger that sets appointment status based on a datetime field. FSL teams with multi-day routing optimization running Enhanced Scheduling (capped at 250 appointments per run) need to document their scheduling rules as a workflow rebuild specification before migration. FlitStack exports the SchedulingPolicy records as human-readable JSON so your Twenty admin can reconstruct the logic.

  • Work Order Line Items and Service Appointments require custom object design before import

    Salesforce Field Service stores parts, labor, and sub-tasks as WorkOrderLineItem — a child object with its own quantity, unit cost, and total price fields. Twenty CRM has no child-object equivalent; WorkOrderLineItem must become a separate custom Line_Item__c object with a relation field back to the Work_Order__c record. Similarly, ServiceAppointment is not a standard Twenty object. If your Salesforce org uses multi-line work orders with parts tracking, the custom object design step must complete in Twenty's Settings → Data Model before any data imports. FlitStack delivers the schema design as part of the migration plan and pre-creates the objects in your Twenty workspace.

  • Twenty's 20,000-record CSV export limit affects large asset and work order migrations

    Twenty's export function is capped at 20,000 records per CSV file. For Salesforce Field Service orgs with thousands of Assets, WorkOrders, or ServiceAppointments, this limit means that migration planning must account for multiple export batches. FlitStack handles this by querying Salesforce in paginated Bulk API batches and reassembling the data into Twenty-compatible import files — but the target Twenty workspace must have the custom objects and fields fully configured before the first import batch runs. We surface the batch boundaries in the migration plan.

  • FSL technician mobile app data does not migrate — photos, signatures, and parts used

    The Salesforce Field Service Mobile app stores on-site photos, customer signatures, and parts-usage confirmations as ContentDocument/ContentVersion records linked to ServiceAppointments or WorkOrderLineItems. Twenty CRM has no native Content management system — files attached to records require a separate extraction step (FlitStack exports them as a ZIP archive with record-id metadata) followed by manual re-upload to Twenty's file attachment feature. Teams relying on photo-based job documentation or e-signature workflows from the FSL mobile app should plan a 1–2 day manual re-upload process after initial data migration.

  • Salesforce storage overage billing does not transfer — asset and work order volumes inflate new CRM data

    Salesforce Field Service orgs frequently accumulate large data volumes — WorkOrders, ServiceAppointments, Asset records, and their associated activity history can total tens of gigabytes under Salesforce's storage model. When migrating to Twenty, that same volume becomes visible as actual record counts in your Twenty workspace. We flag record counts above 50,000 per object during the data audit and advise on archival strategy: inactive closed WorkOrders older than 24 months can be exported to a separate archive rather than loaded into the live Twenty workspace, reducing workspace size and keeping query performance optimal.

Migration approach

Six steps for a successful Salesforce Field Service to Twenty CRM data migration

  1. Design Twenty custom object schema before extraction

    FlitStack audits your Salesforce Field Service org to inventory all WorkOrder, ServiceAppointment, WorkOrderLineItem, Asset, Skill, ServiceContract, and Entitlement records, plus any custom fields on standard objects. We then deliver a Twenty Data Model setup plan: a list of custom objects to create in Settings → Data Model, fields to add to each, and pick-list values to configure. Your Twenty admin creates these objects before we begin data extraction. This step prevents import errors caused by missing fields — Twenty's CSV import fails rows with unmapped columns.

  2. Extract Salesforce data via Bulk API with relationship sequencing

    We query Salesforce using the Bulk API, sequencing objects so foreign-key dependencies resolve correctly: Account (and Company hierarchy) first, then Contact, then parent WorkOrders, then child ServiceAppointments and WorkOrderLineItems, then Asset, Skill, ServiceContract, and Entitlement. Owner/User records are queried separately for email-match preparation. Custom FSL objects (Appointment Dependency, Optimization Request, Gantt Filter) are inventoried for custom object mapping if needed. We preserve original CreatedDate, LastModifiedDate, and system IDs in custom fields for audit trail and delta-run de-duplication.

  3. Run a sample migration with field-level diff

    A representative sample — typically 200–500 records spanning accounts, contacts, work orders, appointments, and assets — is loaded into Twenty's staging workspace. We generate a field-level diff showing source Salesforce values against destination Twenty fields for every mapped property. You verify that WorkOrder status values, appointment times, technician assignments, and asset serial numbers match the source. This step catches value-mapping gaps (e.g., a Salesforce pick-list value that has no Twenty equivalent) before the full run. Approval gate: field-level accuracy above 99% before full migration commits.

  4. Execute full migration with delta-pickup window

    The full dataset is extracted from Salesforce and loaded into Twenty in the sequenced order established in step 2. During the cutover window — typically 24–48 hours — any records created or modified in Salesforce are captured by a delta extraction. FlitStack's audit log records every operation (create, update, link) so you can trace exactly what moved and when. After the delta is applied, a second field-level diff runs on modified records to confirm accuracy. One-click rollback is available if reconciliation identifies critical discrepancies.

  5. Post-migration validation and workflow rebuild handoff

    FlitStack validates record counts per object against the source Salesforce export, spot-checks relationship integrity (WorkOrders linked to correct Accounts, ServiceAppointments linked to correct WorkOrders, Assets linked to correct Accounts), and confirms that owner-email matches resolved to Twenty workspace members. We deliver a workflow rebuild specification — exported as a structured document — listing every Salesforce Flow, Process Builder process, and FSL scheduling recipe with its trigger logic, conditions, and actions so your Twenty admin can recreate automation in Twenty's workflow builder. File attachments (photos, signed forms) are delivered as a ZIP archive with record-ID metadata for manual re-upload.

Platform deep dives

Context on both ends of the pair

Salesforce Field Service logo

Salesforce Field Service

Source

Strengths

  • Real-time technician location tracking and dispatch console with Gantt visualization for multi-technician schedule management.
  • Skill-based routing matches technician certifications to Work Order requirements automatically during scheduling optimization.
  • Deep integration with standard Salesforce CRM objects preserves context across field service, sales, and customer service teams.
  • Mobile app with offline capability lets field technicians update status, log parts, and capture signatures in low-connectivity environments.

Weaknesses

  • Per-seat licensing plus storage overages, API throttling charges, and Agentforce conversation fees create a total cost that significantly exceeds the base license price.
  • Inherited implementations with years of customizations, Process Builder flows, and AppExchange add-ons create tangled configurations that are difficult to migrate or audit.
  • API rate limits vary by edition and require careful monitoring—large data migrations can exhaust daily limits or concurrent call budgets mid-transfer.
  • Limited native export tooling means migrations typically require third-party tools, Data Loader configuration, or managed services partners to extract complete data.
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 Salesforce Field Service 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

    Salesforce Field Service: Per-org daily API limit starts at 100,000 requests / 24 hours for Enterprise Edition and scales with licenses purchased. Additional API calls can be purchased in 200-10,000 increments. Bulk API and Bulk API 2.0 share an allocation of 15,000 batch submissions per 24 hours. HTTP 429 returned when rate-limited..

  • Data volume sensitivity

    A

    Salesforce Field Service exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Salesforce Field Service 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 Salesforce Field Service to Twenty CRM data migrations

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

Can't find your answer?

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

Book a free 30 minute consultation

Most Salesforce Field Service to Twenty CRM migrations complete in 48–72 hours for setups under 50,000 records. Larger orgs with 100,000+ records or multiple custom field-service objects (WorkOrderLineItem, Skill, Entitlement, custom FSL metadata) extend to 7–14 days. The longest single step is the Twenty custom object design phase — Salesforce FSL's managed-package objects require a custom object to be built in Twenty for each field-service entity before import begins. We scope this during the data audit and your admin can pre-create the objects to compress the overall timeline.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Salesforce Field Service.
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