CRM migration
Field-level mapping, validation, and rollback between Swivl Tech and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Swivl Tech
Source
Odoo CRM
Destination
Compatibility
14 of 14
objects map 1:1 between Swivl Tech and Odoo CRM.
Complexity
BStandard
Timeline
3–5 days
Overview
Swivl Tech targets small and mid-sized field service businesses with a combined CRM and job-management tool. Its data model centers on Contact, Company, Work Order (with status, assigned technician, line items, and GPS coordinates), Activity Log, and custom properties stored as key-value attributes. Odoo CRM uses a different architecture: crm.lead as a unified object for both leads and opportunities, res.partner for contacts and companies, crm.team for groupings, and crm.stage for pipeline phases. We migrate Swivl Tech contacts and companies to res.partner, work orders to crm.lead with custom fields preserving job status and service details, activity logs to mail.message records, and all custom properties to Odoo custom fields on crm.lead via Settings → Technical → Fields. Workflows, automation rules, and notification templates cannot migrate and must be rebuilt in Odoo's Automations menu. FlitStack uses Odoo's XML-RPC API for record creation and its native CSV import for bulk attachments, sequencing parent objects before child records so foreign-key references resolve correctly. The delta-pickup window captures any Swivl records modified during the cutover, and audit logs document every migrated row for reconciliation.
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 Swivl Tech 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.
Swivl Tech
Contact
Odoo CRM
res.partner
1:1Swivl Tech Contact maps directly to Odoo res.partner. The email, phone, address, and company association fields align structurally. Swivl contacts without a company map to res.partner records with no parent_id. Multi-address contacts collapse to the primary address; secondary addresses are stored as custom fields for reference.
Swivl Tech
Company
Odoo CRM
res.partner (company type)
1:1Swivl Tech Company maps to Odoo res.partner with partner_type='company'. The company name maps to the name field, domain to website, industry to industry_id (from res.partner.industry), and employee_count to employee_count. Parent-child company hierarchies in Swivl map to parent_id on res.partner. Additional company metadata such as fiscal year information, tax identification numbers, and credit limits are preserved as custom fields to ensure complete data transfer across your organizational structure.
Swivl Tech
Work Order
Odoo CRM
crm.lead (as opportunity record)
1:1Swivl Tech work orders have no direct Odoo equivalent. We map them to crm.lead records where type='opportunity'. Job description maps to description, scheduled_date to date_deadline, and the assigned technician's email resolves to an Odoo res.user linked via a custom x_tech_id field. Job status becomes a crm.stage within the active pipeline.
Swivl Tech
Job Status
Odoo CRM
crm.stage
1:1Swivl Tech's job_status values (New Job, Scheduled, In Progress, Completed, Invoiced, Cancelled) map one-to-one to Odoo crm.stage entries in the target pipeline. Each stage gets a sequence number matching Swivl's workflow order. Probability values are applied per stage from Odoo's standard defaults.
Swivl Tech
Job Line Item
Odoo CRM
sale.order.line (requires Odoo Sale app)
1:1Swivl Tech line items (service description + amount) on a work order map to sale.order.line records when the Odoo Sale app is installed. If the Sale app is not active, line item data is preserved as a custom Char field (x_line_items) on crm.lead in a structured text format. We surface this decision before migration runs.
Swivl Tech
Service Activity Log
Odoo CRM
mail.message
1:1Swivl Tech stores job notes, GPS check-ins, and customer interactions as Activity Log entries with a timestamp and internal-user attribution. We migrate these as Odoo mail.message records linked to the crm.lead or res.partner via res_model and res_id. The Swivl create_date field maps to mail.message's date for timestamp continuity.
Swivl Tech
Scheduled Visit / Appointment
Odoo CRM
calendar.event
1:1Swivl Tech scheduled visits with technician assignment, date/time, and customer map to Odoo calendar.event records linked to the technician's res.user (user_id) and the customer's res.partner (partner_ids). Swivl's scheduled_date maps to start_datetime and stop_datetime in Odoo. Additional visit metadata such as visit purpose, location details, and any associated notes are preserved to maintain full contextual information about each scheduled customer interaction.
Swivl Tech
Before/After Photos
Odoo CRM
ir.attachment
1:1Swivl Tech photo attachments migrate as binary records in Odoo's ir.attachment table with res_model pointing to crm.lead or res.partner. The original filename and content type are preserved. Inline images embedded in job notes are downloaded and re-uploaded as ir.attachment records.
Swivl Tech
Custom Properties (Contact, Company, Work Order)
Odoo CRM
ir.model.fields (custom x_ fields on crm.lead / res.partner)
1:1Swivl Tech custom properties (e.g., x_vehicle_id, x_contract_type) are stored as arbitrary key-value pairs with no schema. We read every unique property key across all records, then create matching custom fields on crm.lead or res.partner via Settings → Technical → Fields in Odoo. Field type is inferred from the data: text values become char, numeric values become float or integer, dates become date.
Swivl Tech
Owner / Assigned Technician
Odoo CRM
res.user
1:1Swivl Tech stores the assigned technician by email in work_order.assigned_tech. We match this email against Odoo res.user records (filtered by login). Unmatched technicians are flagged before migration; the team either creates the Odoo user first or assigns the crm.lead to a fallback user chosen at migration setup.
Swivl Tech
Job Status History
Odoo CRM
mail.message (as stage-change entries)
1:1Swivl Tech maintains a timestamped history of job status changes. We represent each status transition as a mail.message with a structured body noting the old and new status values and the transition timestamp. This gives Odoo users an audit trail of the job's full lifecycle on the crm.lead record.
Swivl Tech
Work Order Invoice Reference
Odoo CRM
account.move (requires Odoo Accounting app)
1:1Swivl Tech invoices created against a work order map to Odoo account.move records when the Odoo Accounting app is installed. If Accounting is not active, the invoice number and amount are stored as custom fields on the crm.lead for reference. We surface this dependency at scoping.
Swivl Tech
Customer Signature
Odoo CRM
x_customer_signature (custom field on crm.lead)
1:1Swivl Tech captures customer signatures as base64-encoded images stored against the work order. Odoo CRM has no native signature field on crm.lead. We preserve the signature as a binary custom field (x_customer_signature) on crm.lead and attach the original image as an ir.attachment for audit visibility.
Swivl Tech
Customer Star Rating
Odoo CRM
x_swivl_rating (custom field on crm.lead)
1:1Swivl Tech records post-job star ratings as integer values. Odoo CRM has no native star-rating construct. We preserve the rating as an integer custom field (x_swivl_rating, range 1–5) on crm.lead for reporting and historical reference. This enables you to analyze customer satisfaction trends over time, evaluate technician performance based on ratings received, and identify patterns in service delivery that can inform training and process improvements.
| Swivl Tech | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner1:1 | Fully supported | |
| Company | res.partner (company type)1:1 | Fully supported | |
| Work Order | crm.lead (as opportunity record)1:1 | Fully supported | |
| Job Status | crm.stage1:1 | Fully supported | |
| Job Line Item | sale.order.line (requires Odoo Sale app)1:1 | Fully supported | |
| Service Activity Log | mail.message1:1 | Fully supported | |
| Scheduled Visit / Appointment | calendar.event1:1 | Fully supported | |
| Before/After Photos | ir.attachment1:1 | Fully supported | |
| Custom Properties (Contact, Company, Work Order) | ir.model.fields (custom x_ fields on crm.lead / res.partner)1:1 | Fully supported | |
| Owner / Assigned Technician | res.user1:1 | Fully supported | |
| Job Status History | mail.message (as stage-change entries)1:1 | Fully supported | |
| Work Order Invoice Reference | account.move (requires Odoo Accounting app)1:1 | Fully supported | |
| Customer Signature | x_customer_signature (custom field on crm.lead)1:1 | Fully supported | |
| Customer Star Rating | x_swivl_rating (custom field on crm.lead)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.
Swivl Tech gotchas
No documented REST API for automated data extraction
Attachment files are not accessible via export
Swivl brand name overlaps with unrelated products
AI estimator outputs are not a standard CRM object
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
Extract all Swivl Tech data via export tools and API
FlitStack AI pulls Swivl Tech records using your account's export capabilities and API endpoints. We extract contacts, companies, work orders, activity logs, file attachments, and all custom property values in their raw form. Each record is assigned a source-system ID (Swivl internal identifier) before any transformation begins. The extraction phase also captures the full job status history timeline so we can reconstruct stage-transition timestamps in Odoo mail.message records.
Build Odoo destination schema: custom fields, stages, and user mapping
We create the Odoo custom fields required to hold Swivl data that has no native equivalent. Using Odoo's Settings → Technical → Fields interface (or direct ir.model.fields writes via XML-RPC for bulk operations), we create x_swivl_work_order_id, x_swivl_rating, x_customer_signature, x_service_address, x_line_items, and other fields on crm.lead and res.partner. We configure crm.stage entries to match Swivl job_status labels in your target pipeline. Finally, we resolve Swivl technician emails to Odoo res.user records; unmatched technicians are flagged for your team to create accounts or assign a fallback user before migration.
Migrate parent objects before child objects with foreign-key sequencing
Odoo enforces referential integrity: res.partner records must exist before crm.lead records that reference them (via partner_id), and crm.lead records must exist before mail.message records that link via res_id. We sequence the migration in dependency order: res.partner companies, then res.partner contacts, then crm.lead work orders with stage_id and x_tech_id resolved, then mail.message activity logs, then ir.attachment photo records. Swivl's create_date timestamps are preserved as custom datetime fields in Odoo since Odoo's native create_date reflects migration-run time.
Run a sample migration with field-level diff on 50–100 representative records
A representative slice of Swivl records — spanning contacts, companies, work orders across different statuses, and a few activity logs — is migrated to your Odoo test environment first. We generate a field-level diff showing source values against destination field values for every mapped field. You can verify that Swivl job_status values resolved to the correct crm.stage records, that technician email matched to the right res.user, and that custom property values landed in the correct Odoo custom fields. No records are deleted from Swivl during this phase.
Execute full migration with delta-pickup window and one-click rollback
The full migration runs against your Odoo production environment after sample approval. A 24–48 hour delta-pickup window captures any Swivl records created or modified during the migration window. An audit log records every create, update, and skip operation with source system IDs. If reconciliation finds orphaned records, missing associations, or mapping failures, FlitStack AI rolls back the full operation with one click. After rollback, your Swivl account is fully intact and no records are overwritten in Odoo.
Platform deep dives
Swivl Tech
Source
Strengths
Weaknesses
Odoo 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 Swivl Tech and Odoo 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
Swivl Tech: Not publicly documented.
Data volume sensitivity
Swivl Tech 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 Swivl Tech to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Swivl Tech 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 Swivl Tech
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.