CRM migration
Field-level mapping, validation, and rollback between XMPie and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
XMPie
Source
Twenty CRM
Destination
Compatibility
8 of 13
objects map 1:1 between XMPie and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
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.
Every standard and custom field arrives verified.
AI proposes the map; you confirm before any record moves.
Parent–child, lookups, and ownership stay linked.
Calls, emails, meetings — with original timestamps.
Documents, uploads, and inline notes move with the record.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
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
Twenty CRM
Custom object: Audience (parent of People)
lossyEach 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)
Twenty CRM
People
1:1Each 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
Twenty CRM
Twenty View filter or Tag
lossyXMPie 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
Twenty CRM
Opportunity
1:1Each 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
Twenty CRM
Note on People (and Opportunity)
1:manyA 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)
Twenty CRM
Note (Touchpoint Type = Print)
1:1Print 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)
Twenty CRM
Note (Touchpoint Type = Email)
1:1Email 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)
Twenty CRM
People custom field
lossyEach 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
Twenty CRM
Twenty People + Companies (via CSV import)
lossyXMPie 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)
Twenty CRM
Custom object: Product (catalog reference only)
1:1uStore 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)
Twenty CRM
Custom object: Store
1:1Each 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)
Twenty CRM
Twenty Workspace Member
1:1Each 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)
Twenty CRM
Written inventory (no destination)
1:1Content 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.
| XMPie | Twenty CRM | Compatibility | |
|---|---|---|---|
| Audience | Custom object: Audience (parent of People)lossy | Fully supported | |
| Audience Member (recipient row) | People1:1 | Fully supported | |
| Segment | Twenty View filter or Taglossy | Fully supported | |
| Campaign | Opportunity1:1 | Fully supported | |
| Touchpoint | Note on People (and Opportunity)1:many | Fully supported | |
| Touchpoint (channel = print) | Note (Touchpoint Type = Print)1:1 | Fully supported | |
| Touchpoint (channel = email) | Note (Touchpoint Type = Email)1:1 | Fully supported | |
| Variable (uCreate Print) | People custom fieldlossy | Fully supported | |
| Data Source | Twenty People + Companies (via CSV import)lossy | Fully supported | |
| Product (uStore) | Custom object: Product (catalog reference only)1:1 | Fully supported | |
| Store (uStore) | Custom object: Store1:1 | Fully supported | |
| Owner (Circle workspace user) | Twenty Workspace Member1:1 | Fully supported | |
| Content Object (rule logic) | Written inventory (no destination)1:1 | Fully supported |
Gotchas + challenges
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 gotchas
Excel 95 data source format is unsupported
Delivery and pricing not exported in uStore product packages
3D products and uEdit settings excluded from dynamic product exports
Custom Qlingo extensions require recompilation between major versions
Circle Free tier has no Connected Servers and limited users
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
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.
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.
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.
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.
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.
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
XMPie
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across XMPie and Twenty CRM.
Object compatibility
1 of 8 objects need a mapping; the rest are 1:1.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
8-object category — typical timelines run 2–7 days end-to-end.
API constraints
XMPie: Not publicly documented.
Data volume sensitivity
XMPie doesn't expose a bulk API — REST + parallelization used for high-volume runs.
Estimator
Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.
Step 1
Pick a category, then your source and destination platforms.
Category
FAQ
Answers to the questions buyers ask most during XMPie to Twenty CRM migration scoping. Not seeing yours? Book a call.
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 consultationAdjacent paths
Other ways to leave XMPie
Other ways to arrive at Twenty CRM
Ready when you are
Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.