CRM migration
Field-level mapping, validation, and rollback between WennSoft and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
WennSoft
Source
Odoo CRM
Destination
Compatibility
10 of 10
objects map 1:1 between WennSoft and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
WennSoft is a field service and construction software suite built on Microsoft Dynamics GP, designed for commercial skilled trades. Its core objects — Service Calls, Customer Locations, Equipment, Employees, Time Entries, Job Costs, and Billing Rates — reflect a job-costing and dispatch-oriented data model. Odoo CRM is a modular open-source ERP where field service data must be mapped into crm.lead (opportunities), project (work orders), stock.production.lot (equipment), and res.partner (contacts and companies) models. We map WennSoft Service Calls to project.task records with custom stage labels, Equipment to Odoo's lot/serial model or a custom field_service.equipment model, Employees to Odoo res.users, and Job Cost entries to analytic.account.line records with the project_id set to the corresponding work order. Billing rate matrices and markup structures from WennSoft require Odoo product pricelist rules or custom fields because Odoo has no native cost-plus billing matrix. We migrate all standard objects, custom fields, attachments, and activity history via Odoo's XML-RPC API, respecting rate limits and preserving original creation timestamps. Workflows, dispatch board automations, and trigger-based field updates do not migrate — we document them as a rebuild reference for Odoo Studio or server actions. The migration runs in a staged sequence: Customers and Locations first, then Equipment, then Employees, then Service Calls, then Time and Job Cost entries, so foreign-key dependencies resolve correctly in Odoo's PostgreSQL-backed relational schema.
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 Odoo 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 / Location
Odoo CRM
res.partner
1:1WennSoft customers map to Odoo res.partner records. A Customer record with multiple Locations becomes the parent res.partner with each Location added as a child contact (address type = 'contact') so Odoo's address model handles multi-location correctly. Primary contact person within the location becomes the contact's name fields. Phone, email, and notes carry over directly.
WennSoft
Service Call
Odoo CRM
project.task
1:1Service Calls are the core WennSoft object and map to Odoo project.task records. Each Service Call becomes a task linked to a project record representing the customer location. Call status (Open, Dispatched, In Progress, Complete, On Hold) maps to custom task stage IDs configured in Odoo before migration. Original dispatch timestamps, problem type, and call type are stored in custom fields on the task.
WennSoft
Equipment
Odoo CRM
stock.production.lot / maintenance.equipment
1:1Odoo has no native customer-linked equipment model that mirrors WennSoft's Equipment Manager. We recommend creating a custom field_service.equipment model inheriting from stock.production.lot with fields for customer_id, location_id, serial_number, equipment_type, problem_type, and last_service_date. Equipment history is stored as task records linked to the equipment. If Odoo's maintenance module is installed, equipment records are also registered there for preventive maintenance scheduling.
WennSoft
Employee / Technician
Odoo CRM
res.users + hr.employee
1:1WennSoft employee records map to Odoo res.users (for system login) paired with hr.employee (for HR and timesheet context). Email, name, and department carry over directly. Technician skill certifications and dispatch-enabled flags map to hr.employee fields and tags. Active/inactive status on the WennSoft employee record controls the res.users active flag.
WennSoft
Time Entry
Odoo CRM
account.analytic.line
1:1WennSoft TimeTrack entries migrate as Odoo account.analytic.line records linked to the project (work order) and the hr.employee (technician). Billable flag, labor type, and billing rate carry over as custom fields — Odoo timesheet lines do not natively support WennSoft's per-call-type billing rate lookup, so we store the rate as a computed field on the analytic line. Timesheet entries are created via Odoo's hr_timesheet module.
WennSoft
Job Cost Entry
Odoo CRM
account.analytic.line
1:1WennSoft Job Cost lines (labor, materials, subcontractors) map to Odoo analytic lines with the appropriate product category. Cost codes map to Odoo's analytic account structure — each Job in WennSoft becomes an analytic account in Odoo, and the cost lines become child analytic lines under it. Actual cost and budgeted cost are stored as amount and planned_amount respectively on the analytic line.
WennSoft
Unbilled Cost Line
Odoo CRM
account.move.line
1:1WennSoft's Unbilled Costs report lists all labor and material costs on unposted service calls. Odoo has no native unbilled cost register equivalent — we preserve the unbilled total and per-call cost breakdown as custom fields on the project.task and as analytic line records with a flag unbilled=True. This lets your Odoo admin generate an unbilled cost report in a spreadsheet without a native equivalent.
WennSoft
Billing Rate Matrix
Odoo CRM
product.pricelist.rule
1:1WennSoft's Extended Pricing Matrix sets billing amounts by call type, problem type, and equipment type per contract. Odoo product pricelists handle volume-based and rule-based pricing but not the multi-axis cost-plus matrix. We map the matrix to a combination of product.pricelist.item records and custom fields on the service call task. Each pricing rule references the product (labor type or service part) and the pricelist scoped to the customer or contract.
WennSoft
Attachment / Document
Odoo CRM
ir.attachment
1:1WennSoft documents attached to service calls, equipment records, and customers migrate to Odoo ir.attachment records linked to the corresponding task, equipment model, or partner. The original filename, mimetype, and binary content are preserved. Inline images in notes are rehosted in Odoo's filestore under the project's directory.
WennSoft
Trigger / Workflow Rule
Odoo CRM
N/A — not migratable
1:1WennSoft's Signature platform supports custom triggers and workflow rules tied to call status changes, technician assignments, and billing events. These run inside the Dynamics GP extension layer and have no Odoo equivalent. We export all trigger definitions and logic as a human-readable rebuild guide mapped to Odoo Studio actions, server actions, and action rules so your Odoo admin can reconstruct the automation logic post-migration.
| WennSoft | Odoo CRM | Compatibility | |
|---|---|---|---|
| Customer / Location | res.partner1:1 | Fully supported | |
| Service Call | project.task1:1 | Fully supported | |
| Equipment | stock.production.lot / maintenance.equipment1:1 | Fully supported | |
| Employee / Technician | res.users + hr.employee1:1 | Fully supported | |
| Time Entry | account.analytic.line1:1 | Fully supported | |
| Job Cost Entry | account.analytic.line1:1 | Fully supported | |
| Unbilled Cost Line | account.move.line1:1 | Fully supported | |
| Billing Rate Matrix | product.pricelist.rule1:1 | Fully supported | |
| Attachment / Document | ir.attachment1:1 | Fully supported | |
| Trigger / Workflow Rule | N/A — not migratable1: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
Odoo CRM gotchas
Odoo.sh version gating blocks assisted migrations from trial
Enterprise modules fail to install on Community after database restore
Custom module view inheritance breaks between Odoo major versions
Custom fields risk losing their application context on Community
API access for Community is gated behind the Custom Plan
Pair-specific challenges
Migration approach
Audit WennSoft data and plan the Odoo schema
FlitStack AI exports all WennSoft records via the Signature API and SQL views into a staging environment. We inventory every object — service calls, equipment, employees, time entries, job cost lines, and attachments — and count records per type. We then deliver a schema setup plan for Odoo: which modules to install (CRM, Project, Timesheet, Maintenance, Inventory), which custom model to create for field service equipment, which custom fields to add to project.task, and what analytic account structure to create before migration data lands. Your Odoo admin creates the schema in a sandbox; we validate the structure before the sample run.
Resolve technicians and customers by email and name
Odoo requires a res.users record before a task can be assigned to a technician. We match WennSoft employee records to Odoo res.users by email address. Unmatched employees are flagged before migration — your team creates the Odoo user accounts first, or assigns those technicians to a fallback user. Customers and locations resolve to res.partner records by name; duplicate partner names are flagged for Odoo deduplication before contacts are created.
Create analytic accounts and equipment records before service calls
Odoo's relational integrity requires project records to exist before tasks can link to them, and analytic accounts to exist before analytic lines can reference them. We sequence the migration so res.partner records are created first, then equipment (lot/custom model), then analytic accounts (one per WennSoft job), then project records, then project.task records for service calls, then analytic lines for time entries and job costs. This order ensures that every many2one foreign key resolves on first write, preventing orphaned records.
Run a sample migration with field-level validation
A representative slice of 100–500 records migrates first — spanning customers, locations, equipment, service calls, time entries, and job cost lines. We generate a field-level diff between the source WennSoft records and the destination Odoo records so you can verify stage mapping, technician assignment, analytic line amounts, and billing rate preservation. Any mapping gaps or value-mapping mismatches are corrected before the full run. Custom field names and analytic account structure are validated against Odoo's field API at this stage.
Execute full migration with delta pickup and audit logging
The full migration runs against Odoo via XML-RPC API, respecting Odoo's rate limits on batched create operations. A delta-pickup window (typically 24–48 hours) captures any WennSoft service calls, time entries, or job cost records modified during the cutover window. Every operation is logged to an audit table with source record ID, destination record ID, operation type, and timestamp. If reconciliation fails, one-click rollback reverts the Odoo database to the pre-migration snapshot. The audit log is delivered as a CSV alongside the migrated database.
Platform deep dives
WennSoft
Source
Strengths
Weaknesses
Odoo 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 WennSoft and Odoo 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
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 Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your WennSoft to Odoo 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 Odoo 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.