CRM migration
Field-level mapping, validation, and rollback between Zuper and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Zuper
Source
Twenty CRM
Destination
Compatibility
11 of 11
objects map 1:1 between Zuper and Twenty CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Zuper is a field-service management platform built around Jobs, Customers, Locations, and Teams — its data model reflects an operations-first worldview where records track service visits, work orders, and field-technician assignments. Twenty CRM is a modern open-source CRM built around People, Companies, Opportunities, Notes, and Tasks with a PostgreSQL-backed data model and a custom-field system under Settings → Data Model. The migration requires mapping Zuper's job-ticket paradigm (status, priority, scheduled date, assigned technician) into Twenty's Opportunity records with supplementary custom fields for service-type specifics. We map Zuper Customers to Twenty People (contact-level) and Locations to Twenty Companies (account-level), preserving service addresses as address fields on the company record. Custom fields defined in Zuper get recreated as Twenty custom fields before import. Zuper teams and technicians resolve to Twenty workspace members by email match. Because Zuper has no native opportunity object, the Job-to-Opportunity mapping is a transformed translation — the job's lifecycle stage becomes the opportunity stage, and the assigned technician becomes the opportunity owner. Workflows, job automations, and guided workflows do not migrate and must be rebuilt in Twenty's workflow builder. The migration uses Zuper's REST API for record extraction and Twenty's CSV import with API upsert for large datasets, followed by a 24–48 hour delta pickup window.
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 Zuper 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.
Zuper
Customer
Twenty CRM
People
1:1Zuper Customers (individuals requesting service) map directly to Twenty People records. Each customer's name, email, phone, and address fields transfer as standard People fields. The customer's primary location address is preserved as supplementary address data on the related Company record.
Zuper
Location
Twenty CRM
Company
1:1Zuper Locations (service addresses linked to customers) map to Twenty Company records. A Zuper customer with multiple locations generates multiple Company records in Twenty — each with its own address, industry classification, and linked People records for on-site contacts at that location.
Zuper
Job
Twenty CRM
Opportunity
1:1Zuper Jobs are the primary migrated record. Each Job becomes a Twenty Opportunity linked to the target Company (the service location). Job status (Pending/In Progress/Completed) maps to Opportunity Stage values using a configured value-mapping table. Job scheduled date maps to Opportunity Expected Close Date for work-order tracking.
Zuper
Job Status
Twenty CRM
Opportunity Stage
1:1Zuper's four-tier job status (Pending, In Progress, Completed, Cancelled) maps to a simplified Four-Stage sales pipeline in Twenty: Appointment Scheduled → Work In Progress → Closed Won (for Completed) or Closed Lost (for Cancelled). Stage probability is assigned per stage value.
Zuper
Job Priority
Twenty CRM
Custom field: Job_Priority__c
1:1Zuper job priority levels (Low, Medium, High, Urgent) have no native equivalent field type in Twenty CRM's standard Opportunity object. We create a custom select field named Job_Priority__c on the Opportunity object under Settings → Data Model to preserve priority ordering and maintain visibility into service-level agreements. Priority values are mapped verbatim from Zuper's pick-list options during the migration.
Zuper
Job Category
Twenty CRM
Custom field: Service_Type__c
1:1Zuper job categories (HVAC, Plumbing, Electrical, etc.) from the Job Category Hub have no native CRM equivalent in Twenty. A custom select field on Opportunity captures the service category. Category values are mapped from Zuper's category names to Twenty pick-list options.
Zuper
Team / Technician
Twenty CRM
WorkspaceMember (Owner)
1:1Zuper Teams and individual Technicians are resolved by email to Twenty Workspace Members. A Team in Zuper becomes a Group of individual member links in Twenty. Unresolved technicians (no matching email) are flagged and assigned to a fallback workspace member or held for manual assignment.
Zuper
Timesheet / Timelog
Twenty CRM
Custom object: Timesheet
1:1Zuper Timesheets and Timelog entries (hours logged per technician per job) are translated into a custom Timesheet object in Twenty linked to the Opportunity (Job) and the WorkspaceMember (Technician). This preserves labor history without forcing it into a standard CRM object.
Zuper
Job Notes
Twenty CRM
Note
1:1Zuper job notes and internal comments migrate as Twenty Note records attached to the corresponding Opportunity (Job). Original timestamps and author attribution are preserved. Notes with attachments (photos, signed forms) are flagged for manual re-upload since CSV import does not carry binary file references.
Zuper
Job Attachments / Photos
Twenty CRM
Manual re-upload required
1:1Zuper job attachments (before/after photos, signed forms, compliance documents) are not included in standard CSV exports. We export the attachment list and metadata, then re-upload via Twenty's API or manual file attach. This step is documented in the migration checklist and can be parallelized with the data migration.
Zuper
Custom Field (per module)
Twenty CRM
Custom Field (per object)
1:1Every Zuper custom field (created per module via Settings → Custom Fields) is audited and recreated in Twenty under Settings → Data Model before the main import. Custom field type mapping: Zuper text → Twenty text, Zuper number → Twenty number, Zuper date → Twenty date, Zuper select → Twenty select.
| Zuper | Twenty CRM | Compatibility | |
|---|---|---|---|
| Customer | People1:1 | Fully supported | |
| Location | Company1:1 | Fully supported | |
| Job | Opportunity1:1 | Fully supported | |
| Job Status | Opportunity Stage1:1 | Fully supported | |
| Job Priority | Custom field: Job_Priority__c1:1 | Fully supported | |
| Job Category | Custom field: Service_Type__c1:1 | Fully supported | |
| Team / Technician | WorkspaceMember (Owner)1:1 | Fully supported | |
| Timesheet / Timelog | Custom object: Timesheet1:1 | Fully supported | |
| Job Notes | Note1:1 | Fully supported | |
| Job Attachments / Photos | Manual re-upload required1:1 | Fully supported | |
| Custom Field (per module) | Custom Field (per object)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.
Zuper gotchas
No bulk API endpoint means large migrations are sequential
Quote object schema is shallower than Job schema
Workflow Builder automations have no export capability
Multi-custom-field filter on Properties API returns no records when multiple filters applied
Mobile app instability causes incomplete Job records in production data
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
Audit Zuper data and export via REST API
FlitStack AI connects to your Zuper account via the REST API to enumerate all modules: Jobs, Customers, Locations, Teams, Timesheets, and custom fields. We extract record counts per object, identify custom field definitions, and map the job status pick-list values. The audit report is shared with you before migration begins — it shows the exact record volumes and custom field inventory that will land in Twenty.
Create Twenty schema: custom fields and custom objects
Before any data lands, FlitStack creates the custom fields and custom objects needed in Twenty. This includes Job_Priority__c (select), Service_Type__c (select), Scheduled_Start__c (datetime), Scheduled_End__c (datetime), and the Timesheet custom object with its relation to Opportunity and WorkspaceMember. We create these under Settings → Data Model using Twenty's field type conventions, then share the completed schema checklist so your admin can verify before import begins.
Invite and resolve all Zuper technicians and team members
FlitStack extracts all technician and team member email addresses from Zuper's Teams and Jobs API responses. We cross-reference against Twenty's invited user list and flag any email with no matching Twenty account. Your team sends invitations to those users and waits for acceptance. Unresolved owners are assigned to a designated fallback Twenty WorkspaceMember. No Opportunity record lands in Twenty without a valid assignee reference.
Migrate in sequence: Companies → People → Opportunities → Timesheets
Following Twenty's import order requirements, we load Companies first (Locations from Zuper), then People (Customers), then Opportunities (Jobs linked to Companies). Each import batch is validated before the next begins. Zuper's job status values are translated to Twenty stage values via the configured value map during the Opportunities import. Custom fields on every record are populated from the Zuper custom field values extracted in Step 1. Timesheet records import last, linked to their parent Opportunities by ID.
Run sample migration with field-level diff and delta pickup
A representative sample (typically 100–500 records) migrates first. We generate a field-level diff between the Zuper source record and the Twenty destination record so you can verify that job status mapping, priority values, assigned technician resolution, and scheduled date fields are all correct. After sample approval, the full migration runs. Zuper remains fully operational during cutover — a 24–48 hour delta pickup window captures any records modified in Zuper after the initial export. Audit log records every operation, and one-click rollback is available if reconciliation identifies issues.
Platform deep dives
Zuper
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 Zuper 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
Zuper: Not publicly documented in current developer documentation.
Data volume sensitivity
Zuper 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 Zuper to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Zuper 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 Zuper
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.