CRM migration
Field-level mapping, validation, and rollback between Handyman and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Handyman
Source
Twenty CRM
Destination
Compatibility
12 of 12
objects map 1:1 between Handyman and Twenty CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Handyman is a field service management platform focused on job scheduling, dispatch, and service delivery for tradespeople and small service businesses. Its data model centers on Customers (contacts with service addresses), Jobs (work orders with line items and status), Invoices (billing records), and custom fields for service types, territories, and equipment. Twenty CRM is a modern open-source CRM with standard People, Companies, Opportunities, Notes, and Tasks objects plus unlimited custom objects created through its metadata API at Settings → Data Model. The migration from Handyman to Twenty requires translating a field service data model into a CRM data model: customers map to People (with service-address data stored in custom fields or a custom Service Location object), jobs map to a custom WorkOrder object or Opportunities with a custom status pick-list, and invoices map to custom Invoice objects linked to People. FlitStack AI extracts Handyman data via its export API, builds a custom WorkOrder schema in Twenty before import, resolves owner relationships by email match against Twenty workspace members, and runs a sample migration with field-level diff before committing the full dataset. Workflows, scheduling rules, and dispatch logic in Handyman do not migrate — those must be rebuilt in Twenty's workflow builder. Attachments and files re-upload to Twenty's file storage and are linked back to the parent record by ID. The migration runs against Twenty's REST and GraphQL APIs at up to 200 calls per minute (Organization tier), with bulk CSV import as a fallback for large record sets. A 24–48 hour delta-pickup window captures any Handyman records modified during cutover so Twenty reflects the final operational state at go-live.
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 Handyman 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.
Handyman
Customer
Twenty CRM
People
1:1Handyman customers (contact records with name, email, phone, and service address) map directly to Twenty's People object. Service address fields that don't exist as standard Twenty fields are stored in custom fields on the People record. If a customer has multiple service locations, each location becomes a separate People record with a custom ServiceLocation custom field to differentiate them.
Handyman
Company (business customer)
Twenty CRM
Company
1:1Handyman business accounts (commercial customers with company name, industry, and billing address) map directly to Twenty's Company object. Company records are imported first because Twenty's People object links to Company via the companyId relation field — the 'one' side of the relationship must exist before the 'many' side is loaded.
Handyman
Job
Twenty CRM
WorkOrder (custom object)
1:1Handyman jobs are work orders with status (scheduled, in-progress, completed, cancelled), assigned technician, service type, service address, scheduled date, and completion notes. Twenty has no native work-order object. We create a WorkOrder custom object via Twenty's metadata API at Settings → Data Model before migration, with fields for jobId, status, technicianOwnerId, serviceTypeId, scheduledDate, completedDate, and completionNotes. The WorkOrder links to the People record representing the customer.
Handyman
LineItem (job materials and labor)
Twenty CRM
WorkOrderLineItem (custom object)
1:1Handyman job line items (labor hours, material costs, and service codes) translate to a WorkOrderLineItem custom object linked to the WorkOrder by a relation field. Each line item includes description, quantity, unit price, total, and lineType (labor vs. material). This custom object is created alongside the WorkOrder object in Twenty's data model setup phase.
Handyman
Invoice
Twenty CRM
Invoice (custom object)
1:1Handyman invoices map to a custom Invoice object in Twenty, linked to the People record (customer) and optionally to the related WorkOrder. The custom Invoice object holds invoiceNumber, invoiceDate, dueDate, totalAmount, status (draft, sent, paid, overdue), and paymentMethod. Invoice line items are stored in a related InvoiceLineItem custom object.
Handyman
ServiceType
Twenty CRM
ServiceType (custom object) or custom pick-list
1:1Handyman service types (e.g., plumbing repair, electrical, HVAC maintenance) with their pricing rules become a custom ServiceType object in Twenty linked to WorkOrder records. Alternatively, for simpler setups, a custom pick-list field on WorkOrder (Service_Type__c) is used. Which approach is chosen depends on whether service types have additional metadata (descriptions, default pricing) that warrants a full object.
Handyman
Asset (customer equipment)
Twenty CRM
Asset (custom object) or Opportunity
1:1Handyman tracks customer equipment (HVAC units, water heaters, appliances) as Assets linked to the customer record. In Twenty, we create a custom Asset object with fields for assetId, name, equipmentType, manufacturer, model, serialNumber, installDate, and linkedPeopleId (relation to the People record). If the business only tracks equipment on closed deals, Opportunity records can store this in a custom field instead.
Handyman
User (technician / office staff)
Twenty CRM
WorkspaceMember
1:1Handyman users (technicians and office staff) are matched to Twenty Workspace Members by email address. Twenty requires all workspace members to be invited and to accept their invitation before user lookups on records can resolve. We flag any Handyman users without a matching Twenty member and assign their records to a fallback member or leave the owner field blank for manual assignment after migration.
Handyman
Attachment (job photo, signed form)
Twenty CRM
File (Twenty file storage)
1:1Handyman file attachments (photos, signed forms, inspection reports) are downloaded and re-uploaded to Twenty's file storage, then linked back to the parent People, WorkOrder, or Invoice record by ID. Handyman does not expose attachments via a public API in all tiers, so the export method (direct download vs. manual export) is confirmed in the data audit phase before the migration plan is finalized.
Handyman
Note (job notes, internal comments)
Twenty CRM
Note
1:1Handyman job notes and internal comments map to Twenty's standard Note object. Notes are linked to the parent record (People or WorkOrder) via the noteTargetId relation. Original timestamps and note authors are preserved. Rich-text formatting in Handyman notes is flattened to plain text during migration to ensure compatibility with Twenty's Note field type.
Handyman
Task (follow-up, reminder)
Twenty CRM
Task
1:1Handyman follow-up tasks and reminders map to Twenty's standard Task object. Tasks are linked to the parent People or WorkOrder record via the taskTargetId relation. Status (open, completed), due date, and assignee are preserved. Completed tasks retain their completion timestamp for historical completeness in Twenty's activity view.
Handyman
Tag / Label (customer or job tag)
Twenty CRM
Custom Tag field or custom Select field
1:1Handyman tags on customers and jobs are mapped to a custom Tag__c multi-select field on the relevant Twenty object. Each unique Handyman tag value is created as an option in the pick-list. If there are more than 50 unique tags, a custom Tag object with a many-to-many relation to People and WorkOrder is created instead to avoid pick-list overflow.
| Handyman | Twenty CRM | Compatibility | |
|---|---|---|---|
| Customer | People1:1 | Fully supported | |
| Company (business customer) | Company1:1 | Fully supported | |
| Job | WorkOrder (custom object)1:1 | Fully supported | |
| LineItem (job materials and labor) | WorkOrderLineItem (custom object)1:1 | Fully supported | |
| Invoice | Invoice (custom object)1:1 | Fully supported | |
| ServiceType | ServiceType (custom object) or custom pick-list1:1 | Fully supported | |
| Asset (customer equipment) | Asset (custom object) or Opportunity1:1 | Fully supported | |
| User (technician / office staff) | WorkspaceMember1:1 | Fully supported | |
| Attachment (job photo, signed form) | File (Twenty file storage)1:1 | Fully supported | |
| Note (job notes, internal comments) | Note1:1 | Fully supported | |
| Task (follow-up, reminder) | Task1:1 | Fully supported | |
| Tag / Label (customer or job tag) | Custom Tag field or custom Select field1: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.
Handyman gotchas
Pricing model terminology varies across destinations
Service history chunking for accounts with large job counts
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 Handyman data export and build Twenty custom object schema
FlitStack AI exports a full data snapshot from Handyman covering all objects identified in the mapping plan: Customers, Companies, Jobs, LineItems, Invoices, Users, Attachments, Tags, and any custom fields. Simultaneously, we build the custom object schema in Twenty via the metadata API — creating WorkOrder, WorkOrderLineItem, Invoice, InvoiceLineItem, Asset, and ServiceLocation objects with all required fields, pick-list values, and relation definitions. The schema plan is reviewed and approved by your Twenty admin before any data is loaded. This step also identifies any Handyman records that cannot be exported via API and flags manual extraction requirements.
Invite and verify all Handyman users as Twenty Workspace Members
Twenty requires workspace members to exist before owner lookups on migrated records can resolve. FlitStack AI generates the list of all Handyman users and matches them to Twenty Workspace Members by email. Any Handyman users without a matching Twenty account are flagged for your team to invite before the migration run. Records owned by unmatched users are temporarily assigned to a fallback member and re-assigned post-migration. This step eliminates the most common cause of null owner fields in Twenty after migration.
Load Companies, then People, then custom objects in dependency order
FlitStack AI runs the migration in the correct Twenty import order: Companies first (the 'one' side of the company→people relationship), then People (linked to Companies via companyId), then WorkOrders (linked to People via PeopleId), then WorkOrderLineItems (linked to WorkOrders), then Invoices (linked to People), then Assets and Tags. Between each stage, a record-count validation confirms all parent records exist before child records are loaded, preventing orphan foreign-key references. All timestamps, owner IDs, and source system IDs are preserved as custom fields during this phase.
Run a sample migration with field-level diff on a representative record slice
A representative slice of 100–500 records — spanning Customers, Jobs, Invoices, and attachments — migrates first. FlitStack AI generates a field-level diff showing the source value in Handyman and the destination value in Twenty for every mapped field, including custom fields on WorkOrder and Invoice objects. You review the diff to verify status mapping, owner resolution, date formatting, and attachment re-upload. Any field mapping corrections are applied before the full migration run commits.
Execute full migration with delta-pickup window and one-click rollback
The full Handyman dataset migrates into Twenty across all objects in the sequenced load order. A delta-pickup window of 24–48 hours captures any records created or modified in Handyman during the cutover. All migration operations are logged to an audit record (source ID, target ID, timestamp, operation type). If reconciliation reveals missing records or data quality issues, FlitStack AI executes a one-click rollback that removes migrated records and restores the pre-migration state in Twenty, then re-runs with corrected mappings.
Platform deep dives
Handyman
Source
Strengths
Weaknesses
Twenty CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Handyman and Twenty CRM.
Object compatibility
2 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
Handyman: Not publicly documented.
Data volume sensitivity
Handyman 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 Handyman to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Handyman 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 Handyman
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.