CRM migration
Field-level mapping, validation, and rollback between WennSoft and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
WennSoft
Source
Twenty CRM
Destination
Compatibility
10 of 12
objects map 1:1 between WennSoft and Twenty CRM.
Complexity
BStandard
Timeline
3–10 business days
Overview
WennSoft is a field service and construction management platform built on Microsoft Dynamics GP, targeting commercial HVACR, mechanical contracting, and technical services firms. Its data model centers on Customers, Locations, Equipment Records, Service Calls, Work Orders, Employees, and Time/Expense logs — with billing rates, markup matrices, and job-costing structures that reflect project-based service delivery rather than CRM-style pipeline management. WennSoft stores service history tied to GP financial records, making object relationships deeply contextual to the ERP layer. Twenty CRM is an open-source CRM built on React, Node.js, and PostgreSQL with a GraphQL API layer. Its standard objects are People, Companies, Opportunities, Notes, and Tasks — a conventional CRM model that does not natively include field-service concepts like equipment records or work orders. Twenty's Data Model is fully customizable via Settings → Data Model, where custom fields and custom objects are created before import. The CSV import function enforces a strict dependency order: Companies first, then People, then Opportunities/Tasks, then custom objects last. Twenty validates unique field values against both active and soft-deleted records. FlitStack AI maps all native WennSoft objects (customers, locations, equipment, service calls, work orders, employees, quotes, invoices) into Twenty's schema. WennSoft-specific pick-list values, service-type codes, and call-status flags migrate as custom pick-list fields in Twenty. Automations, billing rules, and GP-integrated workflows do not transfer and must be rebuilt in Twenty's workflow builder. Migration uses scoped read access against WennSoft's API, with a delta-pickup window capturing in-flight records during the cutover.
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 WennSoft 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.
WennSoft
Customer
Twenty CRM
Person (People)
1:1WennSoft Customer records map to Twenty People. Customer name becomes the person's display name, email maps directly, phone and address fields map field-for-field. WennSoft's customer type codes and industry designations are preserved as custom pick-list values on the Person record. Primary location association is maintained as a relation to the mapped Company record, ensuring the customer-to-company relationship is preserved during migration.
WennSoft
Customer
Twenty CRM
Company
1:1WennSoft also stores the company/entity name as a Company in Twenty. The Customer record's company name maps to the Twenty Company Name field, domain maps to Website, and industry can be inferred from WennSoft's customer type or service category codes.
WennSoft
Location
Twenty CRM
Company (secondary address)
many:1WennSoft Locations (service addresses linked to a Customer) are too granular for a single Company record. We merge the primary location into the Company record and store secondary service addresses as a custom multi-select text field or custom object (ServiceLocations) in Twenty, keyed by location ID.
WennSoft
Equipment Record
Twenty CRM
Custom Object (Equipment)
1:1WennSoft Equipment Records have no direct Twenty CRM equivalent. We create a custom object called Equipment in Twenty's Data Model (Settings → Data Model → + Add Object) and map equipment ID, description, model/serial, install date, and service contract status as custom fields on that object.
WennSoft
Service Call
Twenty CRM
Task
1:1WennSoft Service Calls map to Twenty Tasks. The call description becomes the Task body, call status maps to Task status (Open/In Progress/Complete), scheduled date maps to due date, and assigned technician resolves by email to a Twenty workspace member. Original call type (diagnostic, repair, maintenance) is preserved as a custom pick-list field.
WennSoft
Work Order
Twenty CRM
Task
1:1Work Orders are the detailed job records in WennSoft, carrying work description, priority, work order number, assigned technician, billing amount, and cost. All map to Twenty Task fields. Billing amount and cost are stored as custom currency fields; work order number becomes a unique identifier field on the Task.
WennSoft
Work Order Line Item
Twenty CRM
Task (linked note or custom field)
many:1Work order line items (labor, parts, miscellaneous charges) are too granular for individual CRM objects. We concatenate line-item summaries into a Task note body and store total labor hours and total parts cost as custom number fields on the parent Task record.
WennSoft
Employee / Technician
Twenty CRM
Person (People) + Workspace Member
1:1WennSoft Employee records map to Twenty People (as internal contacts) and are invited as Workspace Members so they appear in the Task assignee dropdown. Employee role (Technician, Dispatcher, Admin) is stored as a custom pick-list on the Person record. Active/inactive status is mapped to the Twenty account status.
WennSoft
Quote / Estimate
Twenty CRM
Opportunity
1:1WennSoft Quotes map to Twenty Opportunities. Quote amount maps to Opportunity amount, quotedate maps to CloseDate, and status (Pending, Accepted, Lost) maps to a custom Opportunity status field. We store the original WennSoft quote number as a unique identifier field.
WennSoft
Invoice / Billing Record
Twenty CRM
Note (on Opportunity or Company)
1:1Twenty has no native invoice or billing object. We store WennSoft Invoice records as Notes attached to the related Company or Opportunity, capturing invoice number, date, amount, and status. GP-linked financial data that cannot be recreated in a CRM is preserved as a reference note for audit purposes.
WennSoft
Time / Expense Entry
Twenty CRM
Note (on Task)
1:1Time entries linked to Work Orders are stored as Notes attached to the corresponding Twenty Task, recording hours worked, expense amount, and entry date. GP payroll integration data that cannot be replicated in Twenty is preserved as a custom field note rather than a separate object.
WennSoft
Custom Fields (Service Type, Call Priority, Billing Rate)
Twenty CRM
Custom fields on relevant object
1:1WennSoft custom fields specific to the Signature modules (call type codes, billing rate matrices, service contract flags, extended pricing) require custom field creation in Twenty's Data Model before import. We create these as pick-list, text, or currency fields on the relevant object and map values value-by-value.
| WennSoft | Twenty CRM | Compatibility | |
|---|---|---|---|
| Customer | Person (People)1:1 | Fully supported | |
| Customer | Company1:1 | Fully supported | |
| Location | Company (secondary address)many:1 | Fully supported | |
| Equipment Record | Custom Object (Equipment)1:1 | Fully supported | |
| Service Call | Task1:1 | Fully supported | |
| Work Order | Task1:1 | Fully supported | |
| Work Order Line Item | Task (linked note or custom field)many:1 | Fully supported | |
| Employee / Technician | Person (People) + Workspace Member1:1 | Fully supported | |
| Quote / Estimate | Opportunity1:1 | Fully supported | |
| Invoice / Billing Record | Note (on Opportunity or Company)1:1 | Fully supported | |
| Time / Expense Entry | Note (on Task)1:1 | Fully supported | |
| Custom Fields (Service Type, Call Priority, Billing Rate) | Custom fields on relevant object1: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.
WennSoft gotchas
Invoice posting locks billing rates permanently
Unposted Costs and Unbilled Costs require separate extraction
Integration complexity and frequent glitches slow migrations
No public bulk export API documented
Dynamics GP edition gating may block migration paths
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 WennSoft data and define preservation scope
We connect to WennSoft using scoped read access and enumerate all active objects: Customers, Locations, Equipment Records, Service Calls, Work Orders, Employees, Quotes, and Invoices. We run data quality checks (duplicate detection, missing required fields, date-range coverage) and present a preservation scope to your team — deciding which historical records to migrate, which to archive as CSV, and which WennSoft-only fields to drop. The audit output drives the mapping specification document that precedes any transformation work.
Map WennSoft objects to Twenty schema and create custom objects
We build the mapping specification document mapping each WennSoft entity to its Twenty target object, including custom field creation notes. For WennSoft Equipment Records, we create a custom object named Equipment in Twenty via Settings → Data Model before import begins. For all WennSoft-specific pick-list values (call type, work order priority, service contract status), we create matching pick-list options in Twenty. We also invite all WennSoft technicians and employees as Twenty workspace members so the assigneeId resolution works at migration time.
Sequence export and import: Companies → People → Tasks/Opportunities → Custom objects
Twenty enforces a dependency chain in its import function: Company records must exist before People (which reference companyId), and People should exist before Tasks (which may reference an assignee). We extract WennSoft data in the correct sequence: Companies first (from Customer entity), then People (from Customer entity), then Tasks (from Service Call and Work Order entities), then Opportunities (from Quote entity), then the Equipment custom object last. Each batch is validated for referential integrity and unique-field compliance before the next batch is prepared.
Run sample migration with field-level diff
A representative sample (typically 200–500 records spanning customers, service calls, work orders, equipment, and quotes) migrates first. We generate a field-level diff report comparing the WennSoft source values against the Twenty destination fields — verifying call type mapping, billing amount precision, technician email resolution, and timestamp preservation. You review the diff and approve field mappings before the full run commits. Any incorrectly mapped custom fields are corrected in the Twenty Data Model and the sample is re-run.
Execute full migration with delta-pickup window
The full migration runs against Twenty with a delta-pickup window (typically 24–48 hours) active at the time of cutover. Any WennSoft records created or modified during the window are captured and applied to Twenty before the final reconciliation check. An audit log records every record created, updated, or skipped. If reconciliation fails (record count mismatch, field validation error, or relationship break), one-click rollback reverts the Twenty workspace to the pre-migration state. Your team continues working in WennSoft throughout the migration — no downtime or access restriction on the source system.
Platform deep dives
WennSoft
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 WennSoft 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
WennSoft: Not publicly documented.
Data volume sensitivity
WennSoft 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 WennSoft to Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your WennSoft 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 WennSoft
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.