CRM migration
Field-level mapping, validation, and rollback between Formitize and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Formitize
Source
Odoo CRM
Destination
Compatibility
15 of 15
objects map 1:1 between Formitize and Odoo CRM.
Complexity
BStandard
Timeline
24–48 hours
Overview
Formitize organizes data across four primary objects: Clients (companies), Contacts (associated to clients), Jobs (service or project records), and a Sales Pipeline (deals tied to clients or contacts). Odoo CRM uses a unified res.partner model that covers both companies and individuals, with crm.lead handling leads and opportunities. The migration challenge lies in collapsing Formitize's four-object model into Odoo's two-object model while preserving the relationship links between contacts and their parent companies, job histories tied to deals, and the pipeline stage progression on each opportunity. FlitStack AI extracts Formitize data via the Platform API using paginated requests, resolving API rate limits by batching exports in 500-record windows. We map Formitize Clients to res.partner records with partner_type='company', Contacts to res.partner with partner_type='contact' and parent_id pointing to the company partner, Jobs to crm.lead records with stage_id mapped from Formitize pipeline stages, and Formitize Deals to crm.lead.planned_revenue. Custom fields on each Formitize object become Odoo custom fields (x_fieldname) on the corresponding model. Owner resolution uses email matching against res.users. We preserve original create_date and write_date on every record as custom datetime fields for reporting continuity. Workflows, automations, Zapier integrations, and multi-step job sequences are not migrated — they are Formitize-specific constructs with no Odoo equivalent. We export Formitize workflow definitions as JSON for your Odoo admin to reference when rebuilding automation logic in Odoo Studio. QuoteAccept quotations and PayNow payment records map to sale.order and account.payment respectively, where Odoo's accounting module is installed. Assets are exported as product.product or stock.production.lot records based on whether the asset is tracked as inventory or a service item.
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 Formitize 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.
Formitize
Client
Odoo CRM
res.partner (partner_type=company)
1:1Formitize Clients map directly to Odoo res.partner records with partner_type set to 'company'. Client name, address, phone, email, website, and industry fields map to their Odoo equivalents. Custom fields on the Client object become x_fieldname custom fields on res.partner. The Formitize client_id is preserved as x_formitize_client_id for traceability, and the original create_date is stored as x_original_create_date for historical continuity in Odoo reporting.
Formitize
Contact
Odoo CRM
res.partner (partner_type=contact)
1:1Formitize Contacts map to res.partner with partner_type='contact'. The parent_id field links each Contact to the Odoo res.partner record representing the Contact's parent Client, preserving the account hierarchy. Formitize contact-level custom fields become x_fieldname custom fields on the partner record. Email, phone, mobile, and job title map directly to their Odoo equivalents. The Formitize contact_id is preserved as x_formitize_contact_id for traceability and delta-run de-duplication.
Formitize
Sales Pipeline / Deal
Odoo CRM
crm.lead
1:1Formitize Deals in the Sales Pipeline map to Odoo crm.lead records. Deal name becomes crm.lead.name, deal value (amount) maps to crm.lead.planned_revenue, close date maps to crm.lead.date_deadline, and Formitize stage name maps to crm.stage.name (stage creation in Odoo required before import).
Formitize
Pipeline Stage
Odoo CRM
crm.stage
1:1Each Formitize pipeline stage requires a pre-created Odoo crm.stage record within the target crm.team. Stage names are matched value-by-value. Stage sequence (stage_number or sequence field) must match Formitize's stage order for correct Kanban display. Probability values on Odoo stages should be set to match Formitize stage probabilities.
Formitize
Job
Odoo CRM
crm.lead (or project.task if Project installed)
1:1Formitize Jobs are a distinct object with no Odoo equivalent. We map Jobs to crm.lead records with a custom field (x_job_origin='formitize') to distinguish them from pipeline Deals. Job type, priority, and location custom fields carry over as Odoo custom fields on crm.lead. If the Project module is active, Jobs with sub-tasks may become project.task records.
Formitize
Job Stage / Status
Odoo CRM
crm.stage (separate stage group)
1:1Formitize Job statuses (e.g., Quoted, In Progress, Completed, On Hold) are mapped to a separate set of crm.stage records scoped to a dedicated Odoo team for Jobs. This prevents Job stages and Deal stages from mixing in the same pipeline view. Each status name is matched to a pre-created Odoo stage.
Formitize
Asset / Asset Type
Odoo CRM
product.product / stock.production.lot
1:1Formitize Assets with serializable tracking map to stock.production.lot records in Odoo (linked to a product.product template). Service-only assets with no inventory tracking become product.product records with type='service'. Asset custom fields (zones, location, GPS) map to custom fields on the Odoo model.
Formitize
QuoteAccept (Quotation)
Odoo CRM
sale.order
1:1Formitize QuoteAccept quotations map to Odoo sale.order records. Quote status (Sent, Accepted, Declined) maps to sale.order.state and state transitions. Line items from the quote become sale.order.line records. This mapping requires the Odoo Sales module to be installed in the target database.
Formitize
PayNow (Payment)
Odoo CRM
account.payment
1:1Formitize PayNow payment records map to Odoo account.payment records linked to the corresponding sale.order (if paid against a quote) or account.move (if paid against an invoice). Payment method (Credit Card, Apple Pay, Google Pay) is stored as a custom field or journal_id selection in Odoo.
Formitize
Attachment / Document
Odoo CRM
ir.attachment
1:1Formitize file attachments on Jobs, Clients, Contacts, and Deals are exported and re-uploaded as Odoo ir.attachment records. Each attachment is linked to its parent record (res.partner, crm.lead, or project.task) via res_model and res_id. Inline images in notes are downloaded and re-hosted in Odoo's filestore.
Formitize
Formitize User / Owner
Odoo CRM
res.users
1:1Formitize user records are matched to Odoo res.users by email address. Owner ID on Jobs and Deals becomes crm.lead.user_id in Odoo. Users without a matching email are flagged in the pre-migration audit; records can be assigned to a fallback user or held pending Odoo user creation.
Formitize
Formitize Custom Field (all objects)
Odoo CRM
ir.model.fields (custom, x_)
1:1Every Formitize custom field requires an Odoo custom field (x_fieldname) created on the target model before migration. Text, number, date, and email types map to corresponding Odoo field types. Picklist fields require Odoo selection values to be pre-created; multi-select fields may require a custom widget or relational field depending on the Odoo version.
Formitize
Workflow / Automation Rule
Odoo CRM
No equivalent (export-for-rebuild only)
1:1Formitize workflow rules have no Odoo equivalent. FlitStack exports the full workflow definition as a JSON file (workflow name, trigger conditions, action sequence, notification rules) for your Odoo admin to reference when rebuilding in Studio. No workflow data is imported into Odoo automatically.
Formitize
Zapier / Third-party Integration
Odoo CRM
No equivalent (must be rebuilt)
1:1Formitize Zapier integrations connecting to Google Sheets, Slack, Calendly, or Wave cannot be migrated. Each integration must be re-created in Odoo using Odoo's native integrations, webhook modules, or a middleware platform. We provide an inventory of active Zapier zaps as part of the pre-migration audit.
Formitize
Location Zone
Odoo CRM
res.partner (custom field) or stock.location
1:1Formitize Location Zones attached to addresses are evaluated for their intended use. If zones are informational labels (e.g., building names, territory tags), they map to a custom Char field (x_location_zone) on res.partner. If zone tracking is operationally significant for warehouse management or field routing, zones become stock.location records in Odoo Inventory, linked to the partner's address for location hierarchy purposes.
| Formitize | Odoo CRM | Compatibility | |
|---|---|---|---|
| Client | res.partner (partner_type=company)1:1 | Fully supported | |
| Contact | res.partner (partner_type=contact)1:1 | Fully supported | |
| Sales Pipeline / Deal | crm.lead1:1 | Fully supported | |
| Pipeline Stage | crm.stage1:1 | Fully supported | |
| Job | crm.lead (or project.task if Project installed)1:1 | Fully supported | |
| Job Stage / Status | crm.stage (separate stage group)1:1 | Fully supported | |
| Asset / Asset Type | product.product / stock.production.lot1:1 | Fully supported | |
| QuoteAccept (Quotation) | sale.order1:1 | Fully supported | |
| PayNow (Payment) | account.payment1:1 | Fully supported | |
| Attachment / Document | ir.attachment1:1 | Fully supported | |
| Formitize User / Owner | res.users1:1 | Fully supported | |
| Formitize Custom Field (all objects) | ir.model.fields (custom, x_)1:1 | Fully supported | |
| Workflow / Automation Rule | No equivalent (export-for-rebuild only)1:1 | Fully supported | |
| Zapier / Third-party Integration | No equivalent (must be rebuilt)1:1 | Fully supported | |
| Location Zone | res.partner (custom field) or stock.location1: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.
Formitize gotchas
Limited bulk export mechanism complicates migration scoping
Custom field schemas are per-account, not organizational templates
Workflow definitions do not transfer between platforms
Asset zone and GPS data requires explicit extraction
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
Pre-migration audit and Odoo schema scaffolding
FlitStack AI runs a read-only audit against your Formitize API, exporting all object schemas, picklist values, custom field definitions, pipeline stage names, and workflow rules. We produce a Migration Readiness Report identifying orphaned contacts, picklist fields needing Odoo selection creation, unmapped owner emails, and the full Zapier integration inventory. Based on this report, your Odoo admin creates the required crm.team records, crm.stage records for each pipeline and job status, and custom fields (x_fieldname) on res.partner and crm.lead before data migration begins.
Paginated Formitize API extraction with staged batching
We extract Formitize data in object-specific batches (Clients, Contacts, Deals, Jobs, Assets, Attachments) using OAuth2-authenticated API calls with offset/limit pagination. Rate limits are respected via exponential backoff. Owner and user records are exported separately for email-matching against Odoo res.users. Custom field values for each object are extracted and normalized. The extraction output is validated for referential integrity — client_id references on Contacts, deal-to-client linkages, and job-to-client associations are verified before transformation.
Schema transformation and field-level mapping
Each exported Formitize record is transformed to its Odoo schema representation. Clients become res.partner with partner_type='company'. Contacts become res.partner with partner_type='contact' and parent_id set to the mapped company partner. Jobs and Deals become crm.lead records with stage_id mapped to pre-created Odoo stages. Custom fields are written to x_fieldname columns on the corresponding model. Original create dates are written to custom datetime fields (x_original_create_date). Formitize internal IDs are preserved as x_formitize_<object>_id for traceability.
Sample migration with field-level diff and reconciliation
A representative sample (200–500 records across all object types and every Formitize pipeline stage) is migrated first. We generate a field-level diff comparing source values to destination field values, including custom field preservation, stage name matching, owner resolution, and parent_id linkage. You review the diff and approve before the full migration runs. Any mapping errors, missing picklist values, or stage mismatches are corrected before proceeding. This step typically takes 4–8 hours for standard setups.
Full migration with delta-pickup and rollback availability
The full migration runs against your Odoo database. A delta-pickup window (24–48 hours) captures any records created or modified in Formitize during the migration run. Every operation is logged to an audit table including source record ID, destination record ID, field mappings applied, and timestamp. If reconciliation fails (record counts mismatch, field values out of tolerance), one-click rollback reverts all migrated records. Attachments are re-uploaded as ir.attachment records with correct res_model and res_id linkage.
Post-migration handoff and workflow rebuild reference package
We deliver a Migration Completion Report summarizing record counts by object, any unmigrated records with reasons, owner resolution results, and attachment re-upload status. The workflow JSON export and Zapier inventory are handed off for your Odoo admin to begin the automation rebuild in Odoo Studio. FlitStack provides 30 days of post-migration support for data correction requests related to the migration itself.
Platform deep dives
Formitize
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 Formitize 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
Formitize: Not publicly documented.
Data volume sensitivity
Formitize 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 Formitize to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Formitize 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 Formitize
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.