CRM migration

Migrate from XMPie to Twenty CRM

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

XMPie logo

XMPie

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

62%

8 of 13

objects map 1:1 between XMPie and Twenty CRM.

Complexity

BStandard

Timeline

3-5 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

Moving from XMPie to Twenty CRM is a structural collapse, not a like-for-like migration. XMPie's PersonalEffect suite is a Customer Communication Management platform whose core data model centers on Audiences, Segments, Campaigns, and Touchpoints inside Circle. Twenty CRM is a sales-focused open-source CRM with four standard objects: Company, People, Opportunity, and Task or Note. We flatten the XMPie hierarchy at migration time, mapping Audience members to Twenty People, the parent customer or organization to Company, active marketing programs to Opportunity, and the Touchpoint history (printed pieces sent, email sends, SMS sends, web personalization events) to Notes attached to the People record. Variables, Content Objects, and InDesign document logic do not migrate; we deliver a written inventory of the personalization rule set for the customer to rebuild as Twenty custom fields or as logic in the downstream marketing tool that will replace XMPie's production layer.

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

XMPie logo

XMPie

What's pushing teams away

  • Steep learning curve for complex personalization rules and content object logic requires significant training investment and specialized technical staff.
  • Limited public API documentation makes automation and integration with modern cloud-native systems difficult to implement and maintain.
  • Windows server-only deployment requirement creates infrastructure constraints for organizations with Linux or cloud-native environments.
  • Per-seat or tiered pricing model becomes cost-prohibitive as teams scale, particularly when adding Adobe Creative Suite licensing on top.

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

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

XMPie

Audience

maps to

Twenty CRM

Custom object: Audience (parent of People)

lossy
Fully supported

Each XMPie Audience becomes a row in a Twenty custom object named Audience, created in Settings > Data Model before any data import. We capture the Audience name, the original data source identifier, and the Circle workspace as fields. Twenty has no native segment hierarchy, so we model Audience-to-People as a one-to-many relation, with each migrated recipient pointing back to its source Audience via a lookup field. The Audience custom object preserves the historical grouping for reporting without forcing the team to reuse Circle's segment-precedence logic in Twenty.

XMPie

Audience Member (recipient row)

maps to

Twenty CRM

People

1:1
Fully supported

Each unique recipient row from the XMPie data sources becomes a Twenty People record. We dedupe across multiple Audiences by email address (primary), then by combined first name, last name, and postal code (fallback) before insert. The original XMPie data source primary key migrates to a custom xmpie_recipient_id field on People for audit. Standard XMPie variables (firstName, lastName, email, phone, address1, city, state, postalCode, country) map to the corresponding Twenty People fields. Anyone present in multiple Audiences is collapsed to a single People record with the Audience lookup repeated through the custom relation.

XMPie

Segment

maps to

Twenty CRM

Twenty View filter or Tag

lossy
Fully supported

XMPie Segments are parameter-based rules with a precedence order inside an Audience. Twenty has no segment object, so each Segment becomes either a saved View on the People object (filter expressed in Twenty's native filter syntax) or a Tag on the People record. We re-express the rule logic where the underlying field exists in Twenty, and deliver a written inventory of any segment rule that depended on an XMPie-only computed variable that did not migrate. Precedence order is not enforced by Twenty; the customer applies the segment logic at query time.

XMPie

Campaign

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Each XMPie Campaign (the Circle orchestration container) maps to a Twenty Opportunity, with the Campaign name, start date, and status preserved. The Opportunity's Company lookup is set to the owning brand or business unit if multiple are present in the source. Active Campaigns map to open-stage Opportunities; completed Campaigns map to a Won or Closed stage that the team designates in scoping. Campaign-level scheduling and automation settings do not migrate; we deliver a written inventory for rebuild in the downstream marketing tool.

XMPie

Touchpoint

maps to

Twenty CRM

Note on People (and Opportunity)

1:many
Fully supported

A Touchpoint is a one-to-many fan-out: one Touchpoint in Circle sends a piece to many recipients in the linked Audience. We migrate each Touchpoint send event as a Note record in Twenty, attached to the relevant People record, with a second Note copy linked to the parent Opportunity (the Campaign) so the timeline shows on both sides. The Note title carries the Touchpoint name, channel (print, email, SMS, web), and send timestamp. Delivery status (sent, bounced, delivered) and recipient-specific personalization variables are captured in the Note body as plain text.

XMPie

Touchpoint (channel = print)

maps to

Twenty CRM

Note (Touchpoint Type = Print)

1:1
Fully supported

Print Touchpoint sends carry the printed-piece SKU, the InDesign template name, and the production date. We preserve these as structured fields inside a Twenty Note record, with the proof URL or PDF attachment (if exported from the XMPie package) uploaded as a Twenty Attachment on the Note. We do not migrate the rendered per-recipient PDF unless the customer explicitly scopes it; sample proofs are migrated instead to keep storage manageable.

XMPie

Touchpoint (channel = email)

maps to

Twenty CRM

Note (Touchpoint Type = Email)

1:1
Fully supported

Email Touchpoint events migrate as Notes with subject line, send timestamp, and delivery status preserved. The email HTML body is not migrated; we deliver a written inventory of the email templates referenced by each Touchpoint so the team can rebuild them in the downstream email tool. Tracking pixel and click event data, if present in the XMPie Circle reports export, are summarized to the Note body rather than re-created as individual Twenty activity records.

XMPie

Variable (uCreate Print)

maps to

Twenty CRM

People custom field

lossy
Fully supported

Each XMPie Variable that resolves to a recipient-level data point (computed expressions tied to a data source column) becomes a custom field on Twenty People. We create the custom field in Settings > Data Model before import, with the field type matched to the Twenty equivalent (Text, Number, Date, Select). Variables that compute from server-side logic (Qlingo expressions, multi-source joins) do not migrate as live computations; we materialize the last-evaluated value as a static field and document the underlying rule for rebuild.

XMPie

Data Source

maps to

Twenty CRM

Twenty People + Companies (via CSV import)

lossy
Fully supported

XMPie Data Sources (Excel, CSV, database exports linked to Campaigns) are the actual source of truth for recipient data. We export each Data Source to CSV, normalize columns to match the Twenty schema we built in step 8, and run the import through Twenty's CSV import flow. Connection configuration to the original database does not migrate; the customer must reconnect the source database to the downstream marketing tool if ongoing sync is needed.

XMPie

Product (uStore)

maps to

Twenty CRM

Custom object: Product (catalog reference only)

1:1
Fully supported

uStore Products (static, kit, upload-driven, dynamic product types from XMPie) become rows in a Twenty custom Product object, with the SKU, product name, and product type preserved. Pricing and delivery settings are not exported by XMPie's package export, so we capture the SKU-level configuration where it exists in the data source extract and flag the rest as requiring manual reconfiguration. The Product custom object is read-only catalog reference inside Twenty, not a transactional inventory.

XMPie

Store (uStore)

maps to

Twenty CRM

Custom object: Store

1:1
Fully supported

Each uStore storefront becomes a row in a Twenty custom Store object so the team can attach Products and Audiences to the correct storefront context. Storefront design assets, payment integrations, and order routing rules do not migrate. We deliver the Store package export (.dpkg) as an attachment on the Store record for archival, but the destination team must rebuild storefront ordering in a different tool because Twenty does not run web-to-print.

XMPie

Owner (Circle workspace user)

maps to

Twenty CRM

Twenty Workspace Member

1:1
Fully supported

Each Circle workspace user with admin or campaign-management privileges becomes a Twenty Workspace Member, provisioned in Settings > Members. We resolve owners by email match. Per Twenty's documented migration warning, users must be invited and accept their invitation before record import runs, otherwise the owner reference on People and Opportunity records cannot be resolved and falls back to the migration service account.

XMPie

Content Object (rule logic)

maps to

Twenty CRM

Written inventory (no destination)

1:1
Fully supported

Content Objects in uCreate Print (Text, Graphic, Table, Visibility, Style, Link, Multi-Page PDF Table) encode the per-recipient rendering logic that XMPie applies to InDesign documents. These rules do not migrate to Twenty because Twenty has no rendering engine. We deliver a written inventory of each Content Object's rule expression, the variables it references, and the visibility conditions, so the team can rebuild equivalent logic in the downstream design or email tool that replaces the XMPie production layer.

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.

XMPie logo

XMPie gotchas

High

Excel 95 data source format is unsupported

Medium

Delivery and pricing not exported in uStore product packages

Medium

3D products and uEdit settings excluded from dynamic product exports

Low

Custom Qlingo extensions require recompilation between major versions

Low

Circle Free tier has no Connected Servers and limited users

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

  • Custom fields must exist before CSV import

    Twenty's documented migration guide is explicit: the CSV import creates records, not fields. If a custom field for an XMPie variable (xmpie_recipient_id, segment_tag, source_audience) is not created in Settings > Data Model before the import job runs, that column is silently dropped during import. We pre-build the full Twenty schema (all custom objects, all custom fields, all relations) and run a validation sweep before the bulk import starts. The same constraint applies to Workspace Members: we provision and confirm acceptance for all owner-reference users before any data load runs.

  • Audience-Segment hierarchy collapses

    XMPie supports ordered Segments with precedence rules inside an Audience, and the same recipient can match multiple Segments with a defined priority. Twenty does not have a native segment object or precedence engine. We collapse this hierarchy into a single Audience lookup plus Tags or saved Views for downstream filtering, which means the recipient row no longer carries the same Segment priority logic the team relied on in Circle. We capture the rule expressions in a written inventory so the team can re-express priority logic at query time using Twenty's view filters.

  • Touchpoint history is summarized, not replayed

    Each XMPie Campaign can contain hundreds of historical Touchpoint sends, each with thousands of recipients. Replaying every send event as an individual Twenty Activity record will bloat the workspace and slow performance (Twenty users on Discord have reported slowness past 600 leads in single workspaces, and per-record activity counts in the thousands compound the problem). We default to summarizing Touchpoint sends as one Note per Touchpoint per recipient, not one Note per opens-and-clicks event. Detailed engagement-level data is delivered as a separate CSV archive for analytics, not as live Twenty records.

  • Package exports exclude critical configuration

    XMPie's documented package export explicitly excludes delivery settings, pricing configuration, 3D product configurations, and uEdit settings. Dynamic product recipient list options may also have system-specific settings that are not portable. None of this configuration is rebuildable in Twenty because Twenty is not a production tool; we extract whatever the package export does include, deliver the remainder as a written inventory, and flag that the destination team needs a separate plan for storefront ordering, fulfillment, and rendering when XMPie is decommissioned.

  • Qlingo extensions and InDesign logic do not transfer

    Custom Qlingo extensions and InDesign-side rule logic (computed expressions, conditional visibility, server-side joins) are tied to the XMPie uProduce runtime. Twenty has no equivalent rendering or expression engine. We document each Qlingo expression and InDesign-tagged rule during discovery and deliver a written inventory of what the rule was doing, the variables it referenced, and what the last-evaluated value was for each recipient. The team uses that inventory to rebuild equivalent logic in the downstream design or marketing tool, not inside Twenty.

Migration approach

Six steps for a successful XMPie to Twenty CRM data migration

  1. Discovery and Circle workspace audit

    We log in to Circle (or work from an exported workspace dump if direct access is not available) and inventory every Audience, Segment, Campaign, Touchpoint, Variable, Content Object, Product, and Store. We pull the recipient count per Audience, the active Campaign list, the historical Campaign list with Touchpoint counts, and the Data Source connection details. We catalog every custom Variable and the rule expressions inside each Content Object. The output of this step is a written discovery document that lists exactly what will migrate to Twenty, what will collapse, what will be preserved as an attachment or inventory file, and what will not move at all. This document is the basis for scope and price confirmation before any extraction begins.

  2. Twenty workspace schema build

    We pre-build the destination Twenty workspace before any data moves. In Settings > Data Model we create the custom objects (Audience, Product, Store), every custom field on People for migrated Variables (xmpie_recipient_id, source_audience, segment_tags, plus the personalization fields), every custom field on Opportunity for Campaign metadata, and every custom field on Note for Touchpoint type, send timestamp, and delivery status. We define the relations (Audience to People, Campaign Opportunity to Notes, Store to Products). We provision Workspace Members for every Circle owner who needs to appear as a record owner, and confirm each accepts the invitation before we proceed.

  3. Data Source extraction and normalization

    We extract the raw recipient data from every XMPie Data Source linked to in-scope Campaigns. Excel files (XLSX), CSV files, and any database exports get pulled into a staging area. We dedupe recipients across multiple Audiences using email as the primary key and first name plus last name plus postal code as the fallback. We normalize columns to match the Twenty schema built in step 2: standard People fields, custom People fields for each migrated Variable, the source Audience reference, and the segment tag list. The staging output is one CSV per Twenty object (People, Companies, Opportunities, Audiences) ready for import.

  4. Test migration with a sample workspace

    We run the full migration into a sandbox Twenty workspace with a representative slice (typically one Audience and one Campaign covering 1-3 percent of total volume). We validate that custom fields populate correctly, the Audience-to-People lookup resolves, the Campaign Opportunity links to the right Notes, and Workspace Member owner references resolve without falling back to the service account. We share the sandbox with the customer for sign-off on record structure, field naming, and the level of Touchpoint history detail before any production import runs. Issues found in the sandbox feed back into a schema or normalization fix, and we re-test.

  5. Production import in dependency order

    We run the production import in strict dependency order. First, Companies (any business-unit or brand parents of Audiences) and Workspace Members. Second, the Audience custom object rows. Third, People records with the Audience lookup populated at insert time, with the import chunked to keep Twenty workspace response time stable. Fourth, Opportunity records for Campaigns. Fifth, Notes for Touchpoint history, attached to People and to the parent Campaign Opportunity. We monitor Twenty's API responses for any record-level failure, capture failed rows to a reconciliation file, and retry with corrections. The import runs in off-hours to avoid contention with any active workspace users.

  6. Validation, view rebuild, and handoff

    We reconcile total counts between source Audiences and destination People per Audience, between Circle Campaigns and Twenty Opportunities, and between Touchpoint send counts and Notes. We rebuild the saved Views for each former Segment using Twenty's filter syntax, with the rule logic from the discovery inventory. We rebuild any reporting views the customer relied on (per-Campaign recipient counts, per-Audience send history) using Twenty's table and kanban views. We hand off the written inventory of items that did not migrate (Qlingo extensions, InDesign rules, Content Object logic, Store fulfillment configuration) plus the rebuild plan for the downstream design or marketing tool, and we close out the engagement.

Platform deep dives

Context on both ends of the pair

XMPie logo

XMPie

Source

Strengths

  • Native InDesign integration eliminates conversion steps and preserves design intent through variable data production.
  • Multi-channel campaign management from a single interface, including print, email, SMS, web, and social channels.
  • Scalable from single-designer desktop to enterprise multi-server cluster with no platform migration required.
  • Open technology stack using standard web technologies for custom development and third-party integrations.

Weaknesses

  • Windows-only server deployment limits infrastructure flexibility for cloud-native or mixed-OS environments.
  • Public REST API surface is not fully documented, making programmatic automation and migration challenging.
  • Adobe Creative Suite subscription required in addition to XMPie licensing, adding to total cost of ownership.
  • Limited self-service migration tooling; package exports are functional but require manual reconstruction at the destination.
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 XMPie 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

    XMPie: Not publicly documented.

  • Data volume sensitivity

    B

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

Estimator

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

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

Can't find your answer?

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

Book a free 30 minute consultation

XMPie's PersonalEffect houses the canonical recipient list, the segment logic, and the campaign history that the broader business uses for outreach. When the team decides to wind down the print-centric production layer or to move marketing operations into a leaner stack, the recipient and engagement history needs to land somewhere queryable. Twenty CRM is a common destination because it is open source, AGPL-3.0 licensed, low-cost to host, and exposes a GraphQL and REST API on every object. We do not migrate the rendering pipeline or the InDesign-tagged logic; we migrate the data that makes the audience usable for sales and follow-up motions inside Twenty.

Adjacent paths

Related migrations to explore

Ready when you are

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