CRM migration

Migrate from XSale to Twenty CRM

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

XSale logo

XSale

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

73%

8 of 11

objects map 1:1 between XSale and Twenty CRM.

Complexity

CModerate

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

XSale stores data around Reps, Routes, Visits, and Orders in a schema that optimizes for mobile-first field data capture rather than relational completeness between customer records and sales outcomes. Twenty CRM is a self-hosted, open-source relational CRM that uses Contacts linked to Companies with Opportunities and a full Activity timeline. We bridge this schema gap by decomposing XSales Visit and Order records into Contact, Company, and Opportunity objects in Twenty, and by using Twenty's custom objects for Route and Visit data that does not fit the standard Contact-Account-Opportunity model. Because XSales data is heavily oriented toward field execution rather than relationship management, we flag the enrichment step explicitly and surface any custom fields the customer has added to the Order and Visit objects so nothing gets orphaned in transit. We do not migrate automations or workflow rules from XSale; we deliver a written inventory of any configured rules for the customer's admin to rebuild in Twenty's workflow builder.

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

XSale logo

XSale

What's pushing teams away

  • Sales-led pricing with no public tier table — total cost of ownership not transparent without vendor engagement.
  • Catalog website (xsalescrm.com) does not match actual product website (xsalesmobility.com and xsalessfa.com). The actual product brand is XSales Mobility.
  • DSD/route-sales specialty means firms wanting general-purpose CRM with marketing automation find the data model narrow.
  • API documentation is not publicly published; integration to non-SAP back-end systems requires vendor engagement.
  • Mobile fleet management add-ons (XSales Store) add complexity and cost for firms that only want sales automation.

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

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

XSale

Rep

maps to

Twenty CRM

User

1:1
Fully supported

XSales Rep records map to Twenty User accounts. We match by email address and map Rep display name to User displayName. Active Reps with open Route assignments become active Twenty Users; inactive Reps migrate as inactive Users so that historical records remain linked. If XSales stores rep-specific fields (territory, team, sales target), these migrate as custom User fields in Twenty.

XSale

Company (from Order or Visit)

maps to

Twenty CRM

Company

1:1
Fully supported

XSales Order and Visit records contain a reference to the store or outlet visited or delivered to. We extract these as distinct Company records in Twenty using the outlet name, address, and any custom fields as Company fields. The XSales company identifier becomes the Twenty Company externalId for dedupe. Companies are imported first so that Contacts can be linked at insert time.

XSale

Contact (from Order or Visit)

maps to

Twenty CRM

Contact

1:1
Fully supported

XSales Visit records may contain a contact name (store manager, buyer) alongside the company reference. We extract these as Twenty Contact records with a lookup to the parent Company. The contact name, phone, email, and title from XSales migrate to the corresponding Twenty Contact fields. If XSales stores contact-level notes from the visit, these become Note records linked to the Contact.

XSale

Route

maps to

Twenty CRM

Custom Object: Route

1:1
Fully supported

XSales Route records (sequence of stops, assigned rep, date, status) do not map to any standard Twenty CRM object. We create a Twenty custom object named Route with fields for routeName, assignedRep (User lookup), routeDate, and status. Route is linked to the parent User via a lookup relationship. Stop-level detail (which visits compose a route) is preserved as a related list on the Route object.

XSale

Visit

maps to

Twenty CRM

Custom Object: Visit

1:1
Fully supported

XSales Visit records capture the rep's arrival at an outlet: check-in time, GPS coordinates, visit outcome, and any notes. We create a Twenty custom object named Visit with fields for visitDate, checkInTime, checkOutTime, outcome, location (latitude/longitude), and notes. Visit links to the Company record (the outlet) and to the Contact (the person seen) via lookups, and to the parent Route if the visit is route-assigned. Custom fields on XSales Visit records (for example, shelf compliance score or audit result) migrate as custom fields on the Visit object.

XSale

Order

maps to

Twenty CRM

Opportunity

1:1
Fully supported

XSales pre-order and delivery Order records map to Twenty Opportunity. The order amount maps to Opportunity.amount, order date maps to Opportunity.closeDate, and the order status (pending, confirmed, fulfilled) maps to Opportunity.stageName with a configured stage value set. The Company lookup links the Opportunity to the outlet. If XSales stores line items (SKUs, quantities, unit prices), these migrate as OpportunityLineItem records in Twenty. We set Opportunity.wonLostReason from XSales order cancellation reason if present.

XSale

Order Custom Fields

maps to

Twenty CRM

Custom Opportunity Fields

lossy
Fully supported

XSales Order objects frequently carry customer-configured fields beyond the standard order data: delivery method, payment terms, special instructions, route stop number, pre-order cut-off time. We surface these fields during discovery, create corresponding custom fields on the Opportunity object in Twenty, and map each field during the Order-to-Opportunity migration step. Any field that does not fit Opportunity (for example, multi-select delivery method) is placed on the custom Visit object instead and linked via a lookup.

XSale

Visit Outcome

maps to

Twenty CRM

Activity: Task

1:1
Fully supported

XSales Visit records with an outcome (order placed, no order, follow-up required) map to Twenty Task records linked to the Company and Contact. The visit timestamp becomes the Task ActivityDate; the outcome text becomes the Task description. This allows the activity timeline in Twenty to show the visit history alongside other activities without requiring the customer to navigate to a separate custom object.

XSale

Historical Timestamps

maps to

Twenty CRM

Activity: Task + Field Migration Audit

1:1
Fully supported

XSales records carry createdAt and updatedAt timestamps on Rep, Route, Visit, and Order. We preserve these as custom fields on each migrated record (xsrc_created_at__c, xsrc_updated_at__c) and use them to order the migration sequence so that parent records exist before child records. In Twenty's activity-adjacent context, visit dates and order dates are preserved as the primary timeline references.

XSale

Attachment / Photo

maps to

Twenty CRM

Attachment + Note

lossy
Fully supported

XSales Visit records may include photos (shelf compliance, store condition, delivery confirmation). We extract these as binary attachments and migrate them to Twenty as Note records with the photo embedded or linked via ContentDocument. The Note is linked to the parent Visit custom object record. Photo filenames preserve the XSales original naming convention for traceability.

XSale

Tag / Label (on Order or Visit)

maps to

Twenty CRM

Custom Field or Relation

lossy
Fully supported

XSales may use tags or labels on Orders and Visits (for example, priority flag, seasonal label, route group). We map these based on usage frequency: tags used for filtering migrate to a multi-select custom field on the relevant object; tags used for grouping migrate to a separate custom object with a many-to-many relationship to the primary object. The customer chooses the tag strategy during discovery.

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.

XSale logo

XSale gotchas

High

SAP integration metadata is critical for ongoing operations

High

Mobile-captured data syncs from rugged devices

Medium

GPS tracking data volume is high

Medium

Catalog and brand naming inconsistency

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

  • XSales field-execution schema lacks native relationship links

    XSales stores Visit and Order records with an implicit reference to the store or outlet but does not enforce referential integrity between Visit, Order, Contact, and Company in the way a relational CRM does. When migrating, we must reconstruct these relationships by parsing address fields, outlet identifiers, and rep assignments from XSales JSON records. Inconsistent outlet naming (different spellings, abbreviations, or missing addresses) causes duplicate Company records in Twenty if not deduplicated during the transform step. We run a fuzzy-dedupe pass on Company records before insert using outlet name and address proximity.

  • Custom fields on XSales Visit and Order objects are discovered late

    XSale allows customers to add custom fields to the Visit and Order objects, but these are not always surfaced in the standard API documentation or visible in the API response schema without explicit field-level queries. We ask the customer directly during discovery whether they have added custom fields, and we run a schema introspection query against the XSales API to enumerate all fields including those not returned by default. Skipping this step orphans any customer-added fields because the default export omits them.

  • Twenty does not have a native Route or Visit object

    Twenty CRM is built as a general-purpose CRM around the Contact-Account-Opportunity model. It does not have a native Route or Visit object. We create these as Twenty custom objects during migration, but the customer should be aware that standard Twenty views, reports, and workflow triggers do not include Route and Visit by default. The customer needs to add these objects to their table views manually via Settings, and any dashboard widgets referencing Route or Visit need to be configured post-migration.

  • Twenty v2.0 workflow builder has different trigger model than XSales automations

    XSales workflow rules for route assignment and visit scheduling do not migrate to Twenty's workflow builder. Twenty v2.0's workflow builder supports record-triggered, time-based, and manual triggers via the UI, with the v2.0 SDK handling custom logic. We deliver a written inventory of every active XSales automation rule with its trigger conditions, actions, and a recommended Twenty workflow equivalent. The customer's admin rebuilds these in Twenty post-migration.

  • Twenty self-hosted requires infrastructure and maintenance

    If the customer chooses the self-hosted deployment option for Twenty, they assume responsibility for Docker container management, database backups, and upgrade deployment. We do not manage the Twenty infrastructure post-migration. We document the upgrade procedure and the database backup requirements during the handoff, but ongoing server maintenance is outside the migration scope. If the customer prefers not to self-host, Twenty Cloud is available as a hosted alternative with a separate subscription.

Migration approach

Six steps for a successful XSale to Twenty CRM data migration

  1. Discovery and XSales schema audit

    We audit the XSales API across all visible objects (Reps, Routes, Visits, Orders) and run a field-level introspection query to enumerate every custom field including those not returned by default. We extract a sample of 50-100 records per object to verify data quality: outlet name consistency, order status completeness, timestamp presence, and attachment availability. We pair this with a discovery call to understand which XSales features are actively used versus configured but unused. The discovery output is a written migration scope and a list of custom fields requiring mapping.

  2. Twenty schema design and custom object creation

    We design the destination schema in Twenty. This includes creating the Route and Visit custom objects with the fields surfaced during discovery, configuring the Company and Contact lookups on Visit, setting up Opportunity with the Order-mapped fields plus any custom fields from XSales, and creating the relationship between Route and Visit. We use Twenty's Settings > Data Model UI to add fields, then use the Twenty API to verify the custom object schema before data migration begins. Schema is deployed into the customer's Twenty instance before any data moves.

  3. Company and Contact deduplication pass

    We extract all distinct outlet identifiers from XSales Visit and Order records, normalize the names and addresses (removing trailing whitespace, standardizing abbreviations), and run a fuzzy-dedupe pass to consolidate duplicates before Company insert. This step is critical because XSales does not enforce unique outlet records. We present the dedupe output to the customer for approval before proceeding to import. The approved Company set is inserted first, then Contact records are linked to the matching Company.

  4. Record migration in dependency order

    We run migration in dependency order: User records (from Reps), Company records (from normalized outlet data), Contact records (linked to Companies), Route custom objects (linked to Users), Visit custom objects (linked to Route, Company, and Contact), Opportunities (from Orders, linked to Company), and OpportunityLineItems (from Order line items, linked to Opportunity). Each phase emits a row-count reconciliation report showing source count versus destination insert count before the next phase begins.

  5. Activity and note reconstruction

    Visit outcomes, notes, and any binary attachments from XSales migrate as Twenty Task records (linked to the Visit custom object) and Note records (linked to Visit, Contact, and Company). Photos attached to Visits migrate as ContentDocument records with a Note wrapper in Twenty for display in the UI. Timestamps from XSales (createdAt, updatedAt) are preserved as custom fields on each migrated record for audit.

  6. Cutover, validation, and automation inventory handoff

    We run a final reconciliation comparing XSales record counts against Twenty insert counts across all objects, then present a spot-check sample of 25-50 records to the customer's admin for sign-off. We deliver the automation inventory document listing every active XSales workflow and its recommended Twenty equivalent. We support a one-week hypercare window for reconciliation issues. We do not rebuild XSales automations in Twenty's workflow builder inside the migration scope.

Platform deep dives

Context on both ends of the pair

XSale logo

XSale

Source

Strengths

  • Deep SAP integration (ECC, DSD, S/4HANA, SDD LMD).
  • DSD workflows including route sequence, suggested orders, credits.
  • XSales Maps real-time GPS tracking.
  • XSales Store mobile device fleet management.
  • Offline-capable mobile-first design.

Weaknesses

  • Sales-led pricing with no public tiers.
  • Catalog website mismatch with actual product URL.
  • Narrow DSD/route-sales specialty.
  • No public API documentation.
  • Mobile fleet add-ons add complexity for sales-only buyers.
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?

Moderate CRM migration. 1 of 8 objects need a manual workaround.

C

Overall complexity

Moderate migration

Derived from compatibility, mapping clarity, API constraints, and data volume across XSale and Twenty CRM.

  • Object compatibility

    C

    1 of 8 objects need a manual workaround.

  • 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

    XSale: Not publicly documented — typical SaaS limits assumed and confirmed during scoping..

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

Walk through your XSale 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 three and five weeks for accounts under 10,000 Orders and 2,000 Rep records with no custom Visit fields. Migrations with large Visit histories (over 100,000 records), multiple custom Order fields, or customers with inconsistent outlet naming requiring manual deduplication move to six to ten weeks because of the enrichment step and the custom object creation in Twenty.

Adjacent paths

Related migrations to explore

Ready when you are

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