CRM migration

Migrate from WennSoft to Twenty CRM

Field-level mapping, validation, and rollback between WennSoft and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.

WennSoft logo

WennSoft

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

83%

10 of 12

objects map 1:1 between WennSoft and Twenty CRM.

Complexity

BStandard

Timeline

3–10 business days

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

WennSoft logo

WennSoft

What's pushing teams away

  • Integration projects take longer than expected with frequent glitches, and Capterra reviewers flag customer support responsiveness as a pain point during implementation and troubleshooting.
  • The product is described as very inflexible: billing rates cannot be changed once an invoice is posted, and cost-plus job billing amounts have limited adjustability after posting.
  • The CRM component (Key2Act legacy product) is considered underpowered compared to modern CRMs, pushing sales-focused teams toward Salesforce or HubSpot.
  • Onboarding new users requires significant training due to the dense, ERP-style UI rather than modern SaaS conventions, increasing total cost of ownership.
  • Companies outgrowing Dynamics GP as their ERP find the tight WennSoft–GP coupling a liability and migrate the whole stack together to Business Central or a cloud-native FSM.

Choosing

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How WennSoft objects map to Twenty CRM

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

maps to

Twenty CRM

Person (People)

1:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Company

1:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Company (secondary address)

many:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Custom Object (Equipment)

1:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Task

1:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Task

1:1
Fully supported

Work 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

maps to

Twenty CRM

Task (linked note or custom field)

many:1
Fully supported

Work 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

maps to

Twenty CRM

Person (People) + Workspace Member

1:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

WennSoft 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

maps to

Twenty CRM

Note (on Opportunity or Company)

1:1
Fully supported

Twenty 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

maps to

Twenty CRM

Note (on Task)

1:1
Fully supported

Time 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)

maps to

Twenty CRM

Custom fields on relevant object

1:1
Fully supported

WennSoft 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.

Gotchas + challenges

What specifically takes care here

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 logo

WennSoft gotchas

High

Invoice posting locks billing rates permanently

High

Unposted Costs and Unbilled Costs require separate extraction

Medium

Integration complexity and frequent glitches slow migrations

Medium

No public bulk export API documented

Low

Dynamics GP edition gating may block migration paths

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Twenty enforces strict CSV import dependency order — Companies must precede People

    Twenty's CSV import function resolves foreign-key relationships at import time: a Person record with a companyId must reference an existing Company record. WennSoft stores Customers with embedded location and company data in a single record, but Twenty separates People and Companies into distinct objects. We must export, transform, and import Companies first, then resolve the companyId on each Person record before importing People. Circular references (WennSoft locations pointing back to the parent customer as a company) are flagged and resolved by assigning the primary location as the Company and storing additional locations as a custom field or secondary address on the Person.

  • Twenty validates unique field values against soft-deleted records — duplicates may restore deleted data

    Twenty's uniqueness validation checks both active and soft-deleted records. WennSoft does not enforce uniqueness at the field level across the GP database — duplicate Customer IDs or Equipment Numbers can coexist in separate tables. During migration, importing a record with the same unique value as a soft-deleted Twenty record will restore that deleted record instead of creating a new one. We audit WennSoft for duplicate identifiers before export and prepend a prefix (e.g., WS-) to WennSoft IDs during import to avoid unintended record restoration while preserving traceability to the original WennSoft system ID.

  • Equipment Records have no direct Twenty CRM equivalent — custom object creation is required before import

    Twenty's standard CRM objects (People, Companies, Opportunities, Tasks) do not include an Equipment entity. WennSoft Equipment Records (with manufacturer model, serial number, install date, and service contract status) must be mapped to a custom object created in Twenty's Data Model before any import runs. The custom object requires Fields to be created first via Settings → Data Model, and the import sequence must account for the new Equipment object appearing last in the dependency chain. If the Equipment custom object is not created before the migration sample run, Tasks linked to equipment records via ID will fail to resolve and land in an error state.

  • Workflows, triggers, and GP-integrated automations do not migrate — rebuild is required in Twenty's workflow builder

    WennSoft Signature stores workflow logic in GP triggers, SmartList-based automations, and billing rate matrices that execute within the Dynamics GP event model. Twenty's workflow builder operates on CRM objects with a different trigger/action paradigm — it listens to record create/update events on People, Companies, Opportunities, and Tasks and executes actions scoped to those objects. GP table events, posting routines, and extended pricing matrix logic have no equivalent in Twenty's workflow engine. We export WennSoft workflow definitions as a reference document for your Twenty admin to rebuild in Settings → Data Model → Workflows, but the migration itself carries no automation logic.

  • Twenty's CSV export is capped at 20,000 records per file — large WennSoft datasets require batched API pulls

    Twenty's UI-based export (⋮ → Export view) is limited to 20,000 records per CSV. WennSoft customers with large equipment fleets or high service-call volumes can exceed this ceiling. We pull WennSoft data via API (or GP database direct query for on-premises instances) in batched queries using offset pagination or date-range filters, then compose the CSV files in chunks of 18,000 records to stay within the limit with margin for validation errors. This approach also allows us to parallelize the migration pipeline and reduce total migration time for large datasets.

Migration approach

Six steps for a successful WennSoft to Twenty CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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

Context on both ends of the pair

WennSoft logo

WennSoft

Source

Strengths

  • Purpose-built for skilled trades—service calls, job cost, equipment, and scheduling all in one ERP-native suite.
  • Tight integration with Microsoft Dynamics GP and Business Central for finance and accounting continuity.
  • Equipment Manager module provides detailed asset records tied to customer locations and service history.
  • MobileTech gives field technicians offline-capable mobile access to dispatch and time entry.
  • 12,000+ skilled trade professionals actively using MobileTech, indicating production-scale field deployment maturity.

Weaknesses

  • Very limited public API documentation—bulk export requires direct SQL or WennSoft-assisted data pull.
  • Billing rates locked after invoice posting with no retroactive adjustment, creating rigidity in cost-plus billing scenarios.
  • ERP-style UI with a steep learning curve compared to modern cloud FSM products.
  • Customer support responsiveness is cited as a pain point in Capterra reviews, particularly during integration troubleshooting.
  • No native migration tooling; organizations moving off WennSoft must build custom export paths or rely on third-party migration services.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across WennSoft and Twenty CRM.

  • Object compatibility

    B

    2 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    WennSoft: Not publicly documented.

  • Data volume sensitivity

    B

    WennSoft doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your WennSoft to Twenty CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about WennSoft to Twenty CRM data migrations

Answers to the questions buyers ask most during WennSoft to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

A WennSoft to Twenty CRM migration typically runs 3–10 business days for datasets under 25,000 records (customers, service calls, work orders, equipment). Complex migrations with 25,000–100,000 records, multiple custom fields, and WennSoft custom modules extend to 2–4 weeks. The longest planning step is mapping WennSoft's equipment records and GP-integrated field structures to Twenty's custom object schema before import can begin.

Adjacent paths

Related migrations to explore

Ready when you are

Move from WennSoft.
Land in Twenty CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day