CRM migration
Field-level mapping, validation, and rollback between OptimoRoute and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
OptimoRoute
Source
Odoo CRM
Destination
Compatibility
11 of 11
objects map 1:1 between OptimoRoute and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
OptimoRoute is a route-optimization and field-service scheduling platform — it manages orders with time windows, driver assignments, vehicle constraints, and proof-of-delivery but does not function as a CRM. Odoo CRM stores leads and opportunities in crm.lead, contacts in res.partner, and fleet data in fleet.vehicle, with a full ERP suite available for inventory, accounting, and project management. The migration challenge is structural: OptimoRoute's operational records (Orders, Customers, Addresses, Drivers, Vehicles) must be translated into Odoo's object model without losing delivery-constraint metadata that has no native Odoo equivalent. FlitStack AI pulls data through the OptimoRoute JSON API using authenticated HTTP GET requests, respecting the 5-concurrent-request rate limit. We map Orders to crm.lead records, Customers to res.partner entries, and Drivers to a dedicated res.partner category with custom fields for driver-license and skill data. Custom order fields (text, number, single-select) migrate as Odoo custom fields on crm.lead. Proof-of-delivery events (signatures, photos, timestamps) attach to the crm.lead as mail.message records. Routing constraints — time windows, skills, vehicle features — are preserved as custom fields because Odoo CRM has no native route-constraint model. We do not migrate OptimoRoute route-optimization rules, dispatch configurations, or driver-app workflow settings; those are platform-specific scheduling logic that must be reconfigured in Odoo's fleet and project modules.
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 OptimoRoute 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.
OptimoRoute
Order
Odoo CRM
crm.lead
1:1OptimoRoute Orders map to Odoo crm.lead records. Orders contain delivery address, time windows, skill requirements, and custom fields that have no native Odoo equivalent — these are preserved as custom fields (x_time_window_start, x_time_window_end, x_skills_required) on crm.lead. The order name becomes the lead name; order status maps to crm.lead stage values.
OptimoRoute
Customer
Odoo CRM
res.partner
1:1OptimoRoute Customer maps directly to Odoo res.partner. The customer name populates res.partner.name, and OptimoRoute's linked Address records are imported as multiple res.partner address records (res.partner's 'Contacts & Addresses' tab supports N addresses per partner). Email and phone from OptimoRoute map to partner.email and partner.phone.
OptimoRoute
Address
Odoo CRM
res.partner (address fields)
1:1OptimoRoute Address records (street, city, state, zip, country, latitude, longitude) become address fields on the corresponding res.partner record. The geocoordinates migrate to res.partner.partner_latitude and res.partner.partner_longitude so Odoo can display the delivery location on its map widget. Multiple addresses per customer are handled via res.partner's contact/address sub-records.
OptimoRoute
Driver
Odoo CRM
res.partner (category=Driver)
1:1OptimoRoute Drivers are created as res.partner records with the 'Driver' partner category applied for filtering. Driver-specific fields — work_hours, phone, email, skills — migrate as custom fields x_driver_work_hours, x_driver_skills, and x_driver_phone. Odoo's fleet.driver model is a separate entity for vehicle licensing and is linked via many2one on fleet.vehicle.
OptimoRoute
Vehicle
Odoo CRM
fleet.vehicle
1:1OptimoRoute Vehicle records map to Odoo fleet.vehicle entries. Vehicle plate, model, capacity_kg, capacity_volume, and features (refrigeration, ramp) migrate to fleet.vehicle.license_plate, vehicle_model_id, capacity and custom fields. Vehicles are linked to driver partners via fleet.vehicle.driver_id to preserve the OptimoRoute driver-vehicle assignment. Vehicle acquisition date and status (active/inactive) are also migrated when available in the source data.
OptimoRoute
Route
Odoo CRM
crm.lead (grouped by date + driver)
1:1OptimoRoute Route records represent the optimizer's output — an ordered list of orders assigned to a driver on a date. Odoo CRM has no native Route object. We preserve route membership by storing the route name and sequence number as custom fields on each crm.lead (x_route_name, x_route_sequence, x_route_date). Route-level metadata (total distance, total duration) is stored as fields on the first lead in the route group.
OptimoRoute
ProofOfDelivery
Odoo CRM
mail.message + ir.attachment
1:1OptimoRoute POD events (signature image, photo, customer note, timestamp, capture_method) attach to the related Odoo crm.lead as mail.message records with mail.activity subtypes. Signature images and photos are stored as ir.attachment records linked to the message. The original POD timestamp is preserved in mail.message.date for audit continuity.
OptimoRoute
Order Custom Field
Odoo CRM
ir.model.fields (custom, on crm.lead)
1:1OptimoRoute custom order fields (text, number, single-select) are created as Odoo custom fields on crm.lead before migration. Text fields become fields.char or fields.text; number fields become fields.float or fields.integer; single-select fields become fields.selection with explicit key-value pairs migrated from OptimoRoute's pick-list options. The custom field name in Odoo matches the OptimoRoute field label for admin clarity.
OptimoRoute
Area/Zone
Odoo CRM
res.country.state or custom field
1:1OptimoRoute Areas (delivery zones) map to Odoo res.country.state records if they correspond to real geographic subdivisions. Custom zone names that have no geographic equivalent are stored as a custom selection field (x_delivery_zone) on crm.lead with value-by-value mapping from OptimoRoute's zone list to Odoo options.
OptimoRoute
Order Activity Log
Odoo CRM
mail.message (note)
1:1OptimoRoute order history events (status changes, dispatcher notes, customer updates) migrate as mail.message records of type 'note' attached to the corresponding crm.lead. The original event timestamp and actor email are preserved in message.date and message.author_id so the full order activity timeline is visible in Odoo's chatter.
OptimoRoute
ScheduleConstraint
Odoo CRM
crm.lead custom fields
1:1OptimoRoute schedule constraints — time_window_start, time_window_end, max_job_duration, service_duration — have no Odoo CRM equivalent and are stored as custom datetime and float fields on crm.lead. These fields are informational in Odoo; the actual scheduling logic must be rebuilt in Odoo's project.task scheduling module or via a third-party integration.
| OptimoRoute | Odoo CRM | Compatibility | |
|---|---|---|---|
| Order | crm.lead1:1 | Fully supported | |
| Customer | res.partner1:1 | Fully supported | |
| Address | res.partner (address fields)1:1 | Fully supported | |
| Driver | res.partner (category=Driver)1:1 | Fully supported | |
| Vehicle | fleet.vehicle1:1 | Fully supported | |
| Route | crm.lead (grouped by date + driver)1:1 | Fully supported | |
| ProofOfDelivery | mail.message + ir.attachment1:1 | Fully supported | |
| Order Custom Field | ir.model.fields (custom, on crm.lead)1:1 | Fully supported | |
| Area/Zone | res.country.state or custom field1:1 | Fully supported | |
| Order Activity Log | mail.message (note)1:1 | Fully supported | |
| ScheduleConstraint | crm.lead custom fields1: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.
OptimoRoute gotchas
API rate limit of 5 concurrent requests is migration-critical
Custom order fields are restricted to three types only
Proof of delivery assets require separate extraction and upload
Multi-day route plans must be deconstructed before migration
Driver activation codes are not returned by the API after creation
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 OptimoRoute data via API and enumerate all custom field definitions
FlitStack AI authenticates to the OptimoRoute WS API using your account authentication key and performs a read-only schema survey. We pull all active Orders, Customers, Addresses, Drivers, Vehicles, Areas, and Routes, and enumerate every custom order field defined in Administration → Settings → Orders → Custom Fields. This audit produces a migration inventory spreadsheet and flags data quality issues (duplicate customers, orphaned addresses, missing required fields) before any migration begins. We also capture the OptimoRoute API rate-limit status to calibrate the migration throttle.
Create Odoo custom fields and partner categories before data is imported
Before data is written to Odoo, we create all required custom fields on crm.lead, res.partner, and fleet.vehicle using Odoo's ir.model.fields API (or Odoo Studio in the UI). Selection-type custom fields are pre-populated with the exact option values from OptimoRoute so the migration can write validated pick-list values rather than raw strings. We also create the 'Driver' partner category in res.partner.category so driver partners can be filtered without a custom field. This step requires Odoo admin credentials with write access to Settings → Technical → Fields.
Migrate Customers and Addresses, then Drivers, Vehicles, and Areas
The migration runs in dependency order: Customers (res.partner) first, then Addresses as child partners with parent_id set to the customer, then Drivers as partners with the Driver category, then Vehicles (fleet.vehicle) linked to driver partners, then Areas/zones as res.country.state records or custom selection values. We resolve OptimoRoute IDs to Odoo IDs during writing and store the original OptimoRoute ID in a custom traceability field (x_optimoroute_id) on every record. The 5-concurrent-request API limit is enforced with a backoff-and-retry queue.
Migrate Orders to crm.lead with full custom field and constraint mapping
Orders are the most complex migration step. Each OptimoRoute Order becomes a crm.lead with the order name as lead name, customer mapped to partner_id, and all constraint fields (time window, skills, vehicle features, service duration) written to their custom field counterparts. The proof-of-delivery records are written as mail.message entries with ir.attachment records for photos and signatures. Route membership is stored on each lead via x_route_name, x_route_sequence, and x_route_date custom fields. We use Odoo's create() method with _context to bypass automatic lead-scoring and assignment rules during migration.
Run sample migration with field-level diff and 48–72h delta-pickup window
We execute a representative sample migration — typically 200–500 records spanning the full record type spectrum — and generate a field-level diff comparing source OptimoRoute values to destination Odoo values. You review the diff to verify custom field mapping, address sub-record creation, driver-vehicle linking, and POD attachment integrity. After sign-off, the full migration runs with a 48–72h delta-pickup window after cutover to capture any OptimoRoute records modified during the final hours of the migration. An audit log records every write operation; one-click rollback reverts the Odoo database to the pre-migration state if reconciliation fails.
Platform deep dives
OptimoRoute
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between OptimoRoute and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across OptimoRoute and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between OptimoRoute and Odoo CRM.
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
OptimoRoute: 5 concurrent requests per account or per IP address; requests exceeding this return ERR_TOO_MANY_CONNECTIONS.
Data volume sensitivity
OptimoRoute 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 OptimoRoute to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your OptimoRoute 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 OptimoRoute
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.