CRM migration
Field-level mapping, validation, and rollback between Mautic and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Mautic
Source
Twenty CRM
Destination
Compatibility
6 of 10
objects map 1:1 between Mautic and Twenty CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Mautic to Twenty CRM is a structural migration that separates your marketing automation data from your CRM record layer. Mautic's Contact and Company objects map cleanly to Twenty's People and Company objects, and Mautic's Campaigns translate to Opportunities when the campaign had associated deal records. However, Mautic's marketing automation-native features — Segments, Stages, Points, Campaigns, Forms, and Assets — have no direct Twenty equivalents. We export these as written inventories and configuration documentation for your admin to rebuild inside Twenty's custom objects and workflows. The most technically complex migration step is preserving engagement history: Mautic stores call, email, meeting, and note records in its MySQL/MariaDB database with relationships in junction tables, while Twenty's timeline events require a parent record to attach to, and the Timeline Events API does not yet support standalone entries without a note or task wrapper. We handle this by mapping Mautic engagements to Twenty Tasks and Notes with the original timestamp preserved, and by bypassing Mautic v6's CSV export queue entirely since it fails silently without logging errors.
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 Mautic 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.
Mautic
Contact
Twenty CRM
People
1:1Mautic Contacts map directly to Twenty People. Standard fields (email, firstname, lastname, phone, title, city, country) migrate to their Twenty equivalents. Mautic custom contact fields migrate to Twenty custom fields on People — but the Twenty custom field must be created in Settings → Data Model BEFORE the CSV import runs, per Twenty's documentation. We create all custom fields in the destination schema first, then map Mautic field values during import. Mautic's point score migrates to a numeric custom field on People, and Mautic's stage value migrates to either a custom picklist field or a tag-based indicator in Twenty.
Mautic
Company
Twenty CRM
Company
1:1Mautic Company records map directly to Twenty Company. Domain name from Mautic becomes the Company website field and serves as the dedupe key during import. Mautic's industry, annual_revenue, and number_of_employees fields migrate to their Twenty equivalents. Company is imported before People so that the company link on People is satisfied at insert time. Multi-company associations from Mautic (a Contact can belong to multiple Companies) are handled as a 1:N People-to-Company relationship in Twenty, with the primary company designated first.
Mautic
Campaign
Twenty CRM
Opportunity
1:1Mautic Campaigns with associated financial records (campaign revenue fields or linked deals) map to Twenty Opportunities where the campaign name becomes the Opportunity name and the campaign type becomes a custom picklist. Campaigns without deal associations are exported as written configuration documentation: campaign logic, step sequences, and contact membership criteria. Twenty does not have a native Campaign object equivalent; the campaign is represented as an Opportunity if it had a revenue target, or as a written handoff note for the customer's admin to rebuild inside Twenty's workflow builder.
Mautic
Segment
Twenty CRM
Custom Object or written inventory
lossyMautic Segments (dynamic contact lists filtered by field values, tags, or behaviors) have no direct Twenty equivalent. We export the segment filter definitions — the field names, operators, and values that define each segment — as a written inventory document. The customer's admin rebuilds these inside Twenty as filtered views or custom objects. Segment membership itself is not migrated because Twenty recalculates list membership based on its own data.
Mautic
Stage
Twenty CRM
Opportunity Stage or custom picklist
lossyMautic Stages (contact lifecycle positions such as Lead, MQL, Customer) map to Twenty Opportunity Stage values if they apply to the sales pipeline, or to a custom picklist field on People if they track contact lifecycle. We work with the customer during scoping to determine which Stages represent deal progression (mapped to Opportunity Stage) and which represent contact status (mapped to a custom People field). Stage transition timestamps from Mautic migrate as custom date fields on the target object.
Mautic
Points and Point Groups
Twenty CRM
Custom numeric field on People
lossyMautic's points-based lead scoring system migrates as a numeric custom field on Twenty People. Point groups (named score buckets) migrate as named value pairs or tags on the People record. The scoring logic itself — the rules that assign points for behaviors — does not migrate and is documented as a written handoff for the customer's admin to implement inside Twenty's workflow builder.
Mautic
Tag
Twenty CRM
Multi-select picklist or tag field
lossyMautic tags (flat string labels) migrate to Twenty as a multi-select picklist on People if the tag count is under 100, or as tag values stored in a custom text field if the tag vocabulary is larger. Tags are preserved exactly as strings from Mautic; no tag consolidation or synonym mapping is applied unless the customer requests it during scoping.
Mautic
Custom Object
Twenty CRM
Custom Object
1:1Mautic Custom Objects migrate to Twenty Custom Objects with the same API-name-style naming convention. The destination schema (custom object name, custom fields, field types, picklist values) must be created in Twenty Settings → Data Model before data import begins. Mautic's Custom Object Relationships are accessed via the MySQL database junction tables because the Mautic REST API endpoint for relationship creation is documented as non-functional (2022 community report). We map junction table records to Twenty's native lookup relationships between custom objects, preserving the parent-child structure. Relationship cardinality is preserved as documented in the source schema.
Mautic
Engagement: Email, Call, Meeting, Note
Twenty CRM
Task and Note
1:1Mautic engagement records (calls, emails, meetings, notes) migrate to Twenty Task and Note objects. The engagement timestamp migrates as the ActivityDate on Task; engagement body and subject migrate as fields on Note. The primary contact lookup on each engagement migrates to the linked People record in Twenty. Note: Twenty's Timeline Events API does not support standalone timeline entries without an attached note or task — a known limitation documented in Twenty's GitHub discussions (discussion #8948). We work around this by migrating engagements as Note records with the original Mautic engagement type stored as a custom field, preserving the full activity history in a queryable format.
Mautic
User
Twenty CRM
Workspace Member
1:1Mautic Users map to Twenty workspace Members. We match by email address. Critical constraint: Twenty requires users to be invited and to accept their invitation BEFORE any data import that references an Owner or assignee. We extract all owner and assignee references from Mautic records, resolve them against the Twenty Member list, and flag any owner without a matching Twenty user as a reconciliation item. The customer's admin provisions missing users before the record import phase begins.
| Mautic | Twenty CRM | Compatibility | |
|---|---|---|---|
| Contact | People1:1 | Fully supported | |
| Company | Company1:1 | Fully supported | |
| Campaign | Opportunity1:1 | Fully supported | |
| Segment | Custom Object or written inventorylossy | Fully supported | |
| Stage | Opportunity Stage or custom picklistlossy | Fully supported | |
| Points and Point Groups | Custom numeric field on Peoplelossy | Mapping required | |
| Tag | Multi-select picklist or tag fieldlossy | Fully supported | |
| Custom Object | Custom Object1:1 | Fully supported | |
| Engagement: Email, Call, Meeting, Note | Task and Note1:1 | Fully supported | |
| User | Workspace Member1: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.
Mautic gotchas
Mautic v6 CSV export silently fails to deliver files
Mautic 4 to 5 upgrade breaks plugins without warning
MySQL/MariaDB index limits throttle large contact databases
Custom Object Relationships API is non-functional
Mautic 5 to 6 migration logs no errors on failure
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 data audit
We audit the source Mautic instance across version (v4, v5, or v6), deployment type (self-hosted or Mautic Cloud), custom field count, custom object schemas, engagement volume, and campaign count. We specifically profile the database for large tables approaching MySQL index limits and identify any custom plugin configurations that affect data schema. We pair this with a scoping call to confirm the Twenty destination (cloud Pro at $9/user, cloud Organization at $19/user, or self-hosted free) and agree on the scope of engagement history migration.
Schema provisioning in Twenty
We create the destination schema in Twenty before any data moves. This includes creating all custom fields on People and Company (matched to Mautic custom contact fields), creating any Custom Objects (matched to Mautic Custom Objects), configuring Opportunity Stage values (matched to Mautic Stages or Campaign types), and provisioning Twenty workspace Members for every Mautic user. We run this in Twenty's Settings → Data Model and Settings → Members. This phase is sequenced first because Twenty's CSV import fails if referenced custom fields do not exist at import time.
Data extraction bypassing Mautic v6 export failure
We extract all record data directly from Mautic's MySQL/MariaDB database using authenticated read access, bypassing Mautic's built-in CSV export which fails silently in v6. For Mautic instances running v5 or earlier, we use the REST API with batched requests and exponential backoff. We extract Contacts (leads table plus custom field values from the join table), Companies (companies table), Custom Objects and their junction table relationships (custom_object table and relationship junction tables), and engagement records (from the lead_events and related tables). We emit a row-count reconciliation report against the source database before any transformation begins.
Transformation and field mapping
We apply the transformation rules designed during scoping: Mautic contact fields map to Twenty People fields, Mautic company fields map to Twenty Company fields, Mautic Stages map to Opportunity Stage values, Mautic point scores map to a custom numeric field on People, and Mautic tags map to a multi-select picklist. Custom Object relationships are resolved by joining the junction table records against the migrated custom object IDs. Engagement records are mapped to Twenty Note records with the original Mautic engagement type and timestamp preserved as fields. We run deduplication against the email field as the primary key. Any Mautic Owner without a matching Twenty Member goes to a reconciliation queue for the customer's admin to provision.
Sandbox validation
If the customer is using Twenty cloud (Pro or Organization tier), we run the first import into a test workspace or a dry-run import to validate field mapping, confirm that custom field types are correct (text vs number vs picklist), verify relationship resolution, and measure API rate limit behavior. The customer reconciles record counts and spot-checks 20-30 records against the Mautic source before we proceed to production import. If self-hosted Twenty is the destination, we validate the import using a local PostgreSQL instance before the production cutover.
Production migration in dependency order
We run the production migration in record dependency order: Twenty Members (validated, not imported), Companies (from Mautic Companies), People (from Mautic Contacts, with AccountId resolved to the Company), Opportunities (from Mautic Campaigns with deal data or standalone deal records), Custom Objects (with lookups to People and Companies resolved), then Notes and Tasks (from Mautic engagements). Each phase emits a row-count reconciliation report. We use Twenty's REST API at up to 100 requests per minute (Pro) or 200 requests per minute (Organization) with exponential backoff on 429 responses.
Cutover and handoff documentation
We freeze writes in Mautic during cutover, run a final delta import of any records modified during the migration window, then mark Twenty as the system of record. We deliver the complete migration handoff package: a field mapping spreadsheet, a written inventory of Mautic Segments and Campaigns requiring rebuild in Twenty's workflow builder, a written inventory of Mautic Forms and Landing Pages with recommendations for replacement (Twenty native or external tool), and a point-and-stage scoring logic document. We support a 72-hour hypercare window for reconciliation issues. We do not rebuild Mautic workflows, sequences, or campaigns as Twenty workflows as part of this migration scope.
Platform deep dives
Mautic
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 Mautic 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
Mautic: Not publicly documented — enforced at the server level, not within Mautic software.
Data volume sensitivity
Mautic 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 Mautic to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Mautic 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 Mautic
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.