CRM migration
Field-level mapping, validation, and rollback between Snapforce CRM and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Snapforce CRM
Source
Odoo CRM
Destination
Compatibility
12 of 13
objects map 1:1 between Snapforce CRM and Odoo CRM.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from Snapforce CRM to Odoo CRM is an SMB-to-ERP migration, not a record copy. Snapforce organizes data around Accounts, Contacts, Leads, and Opportunities with native VoIP call logging. Odoo CRM uses the crm.lead model for both lead and opportunity records in a unified pipeline view, and stores Contact records as related res.partner entries rather than standalone objects. We resolve this structural difference by mapping Snapforce Opportunities to Odoo Opportunities view, Contacts to res.partner with company_type set to 'contact', and call recordings plus voicemail audio files as ir.attachment records re-linked to the target Contact. Snapforce Workflow Automations fire on record events but have no exportable schema; we deliver a written inventory of every automation for Odoo server action and automated action rebuild. Odoo's permission model uses access groups and record rules rather than per-owner assignment, so data access must be reconfigured after migration.
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 Snapforce CRM 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.
Snapforce CRM
Account
Odoo CRM
res.partner (company)
1:1Snapforce Account records map to Odoo res.partner with company_type set to 'company'. The Account Name maps to the partner name, and address fields (street, city, state, zip, country) map to standard Odoo address fields. Website from Snapforce becomes website field on the Odoo partner. Parent record linkage is not applicable on the company side. Accounts are created before any Contact import so that the Contact-to-Account lookup is satisfied at the moment of Contact insert.
Snapforce CRM
Contact
Odoo CRM
res.partner (contact)
1:1Snapforce Contact records map to Odoo res.partner with company_type set to 'contact' and parent_id pointing to the mapped Account partner. Email, phone, mobile, job title, department, and custom fields migrate directly. The 2-way mail sync relationship in Snapforce is replaced by Odoo's mail.thread on the partner record — imported email history is attached via mail.message records with message_type='email'. Contact-account linkage is resolved at migration time via the pre-created Account partner records.
Snapforce CRM
Lead
Odoo CRM
crm.lead
1:1Snapforce Lead records map to Odoo crm.lead with type='lead'. The lead's lifecycle stage and lead status properties from Snapforce map to Odoo's stage_id on the CRM pipeline. Any lead scoring or custom lead fields migrate to custom fields on crm.lead. Leads are imported before Opportunities so that the opportunity create-from-lead flow can reference the original lead record if the customer wants to preserve the conversion chain.
Snapforce CRM
Opportunity
Odoo CRM
crm.lead (opportunity view)
1:1Snapforce Opportunities map to Odoo crm.lead with type='opportunity'. The Opportunity name maps to the lead name, amount maps to expected_revenue, probability maps to probability (with Snapforce stage probability transferred to Odoo's stage probability values), and close date maps to date_deadline. Snapforce pipeline stages map to Odoo CRM stages — we configure the Odoo pipeline stages before migration to match the exact stage names and probability assignments from Snapforce. The linked Account is resolved via the Account-to-res.partner mapping done in the first migration phase.
Snapforce CRM
Call Log (VoIP)
Odoo CRM
ir.attachment + crm.lead note
1:1Snapforce VoIP call logs write duration, timestamp, and disposition to the Contact record, but the actual call recording audio and voicemail files are separate file objects stored on the Snapforce platform. We extract call metadata and audio files during discovery, preserve the Contact linkage by filename and contact email, and re-attach them to the corresponding Odoo res.partner record as ir.attachment documents. Call disposition and duration are written as a mail.message note on the Contact record for timeline visibility. This is a manual per-file association step scoped explicitly before migration begins.
Snapforce CRM
Voicemail
Odoo CRM
ir.attachment (linked to res.partner)
1:1Snapforce voicemails are stored per-user mailbox (500-voicemail cap per mailbox) and linked to Contact records by filename. We extract voicemail metadata and audio files, preserve the contact linkage by filename, and re-attach them to the target Odoo res.partner as ir.attachment records with res_model='res.partner' and res_id set to the migrated Contact partner ID. This requires the Contact migration to complete before voicemail re-association so that the target partner ID is known.
Snapforce CRM
Activity: Task
Odoo CRM
note.message or mail.activity
1:1Snapforce Tasks map to Odoo mail.activity records linked to the parent crm.lead or res.partner. Task subject becomes activity summary, description becomes note content, due date maps to date_deadline, and task status maps to activity state (overdue, today, planned, done). Assigned owner resolution follows the User mapping phase. Tasks that were marked done in Snapforce appear as completed activities in Odoo's activity timeline.
Snapforce CRM
Activity: Meeting
Odoo CRM
calendar.event
1:1Snapforce meeting records map to Odoo calendar.event entries. Meeting title, start time, end time, location, and attendee list transfer directly. Attendee resolution uses the User-to-partner mapping so that employee attendees appear as calendar.event attendee records linked to Odoo User partners. External attendee emails are preserved as email addresses on the event.
Snapforce CRM
Email (Snapforce Mailbox thread)
Odoo CRM
mail.message (message_type=email)
1:1Snapforce Mailbox email threads auto-sync to Contact records and contain the full message content, headers, and thread linkage. We migrate each email as a mail.message with message_type='email' on the target res.partner record (for Contact emails) or crm.lead record (for lead emails). The from/to/cc fields map to mail.message email_from, email_to, and email_cc fields. Thread continuity is preserved by setting parent_id on subsequent messages in the same thread.
Snapforce CRM
Campaign
Odoo CRM
utm.campaign + crm.tracking.metric
1:1Snapforce Campaigns (available as an $8/user/month add-on) map to Odoo's utm.campaign for campaign tracking and crm.tracking.metric for email campaign performance data. Campaign membership (Leads and Contacts targeted by the campaign) maps to crm.lead line records with the campaign reference set. We verify during scoping that the customer has the Snapforce Campaigns add-on active before including this object — if not, the mapping is omitted from scope.
Snapforce CRM
Document
Odoo CRM
ir.attachment
1:1Snapforce Documents uploaded to Deals, Contacts, and Organizations migrate to Odoo ir.attachment records with res_model set to the corresponding Odoo model (crm.lead for Opportunities, res.partner for Contacts and Accounts) and res_id set to the migrated record ID. The document name, file content, and file type are preserved. Documents that were shared via Google Drive sync in Snapforce are exported to local storage first, then re-attached to Odoo records.
Snapforce CRM
Custom Field
Odoo CRM
ir.model.fields (custom)
lossySnapforce custom fields are defined per-module and carry field labels, data types, and required/unique flags. We capture the full custom field schema during discovery for each module (Account, Contact, Lead, Opportunity). Custom fields are recreated in Odoo as ir.model.fields with matching labels and type-mapped field definitions — text fields become char or text, numeric fields become float or integer, date fields become date, etc. Snapforce field IDs are organization-scoped and non-portable; Odoo field IDs are generated at creation time and cannot be pre-specified. Any workflow rules or reports referencing Snapforce custom fields are documented separately for Odoo rebuild.
Snapforce CRM
User (Owner)
Odoo CRM
res.users + res.partner
1:1Snapforce User records carry role assignments and are tied to data ownership across all modules. We export the full user list and map each Snapforce Owner to an Odoo res.users record by email match. Owner-to-record linkage (OwnerId on Snapforce records) resolves to Odoo res.users id via this mapping. Any Snapforce Owner without a matching Odoo User is placed in a reconciliation queue — the customer provisions the Odoo user before record import resumes. In Odoo, data access is managed through access groups and record rules rather than per-owner assignment, so post-migration access configuration is required.
| Snapforce CRM | Odoo CRM | Compatibility | |
|---|---|---|---|
| Account | res.partner (company)1:1 | Fully supported | |
| Contact | res.partner (contact)1:1 | Fully supported | |
| Lead | crm.lead1:1 | Fully supported | |
| Opportunity | crm.lead (opportunity view)1:1 | Fully supported | |
| Call Log (VoIP) | ir.attachment + crm.lead note1:1 | Fully supported | |
| Voicemail | ir.attachment (linked to res.partner)1:1 | Fully supported | |
| Activity: Task | note.message or mail.activity1:1 | Fully supported | |
| Activity: Meeting | calendar.event1:1 | Fully supported | |
| Email (Snapforce Mailbox thread) | mail.message (message_type=email)1:1 | Fully supported | |
| Campaign | utm.campaign + crm.tracking.metric1:1 | Fully supported | |
| Document | ir.attachment1:1 | Fully supported | |
| Custom Field | ir.model.fields (custom)lossy | Fully supported | |
| User (Owner) | res.users + res.partner1: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.
Snapforce CRM gotchas
Per-owner CSV import requirement forces multiple upload passes
Call logs and voicemail are audio files, not structured data
Campaign module is an add-on above base CRM pricing
Duplicate prevention settings can silently reject migrated records
Custom field IDs are not portable across organizations
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
Discovery and data audit
We export Snapforce data module by module — Accounts, Contacts, Leads, Opportunities, Activities, Campaigns, Documents — using the platform's CSV export. We run a data quality audit covering duplicate records, null required fields, custom field usage, owner distribution across records, and voicemail and call recording file inventory. We also review custom field definitions per module, duplicate prevention settings, and active workflow rules. The discovery output is a written migration scope, a custom field mapping table, and a voicemail/call recording inventory with file count and total size.
Odoo environment preparation and schema design
We provision the Odoo CRM environment — either on Odoo.sh or on-premise — and install the CRM app plus any dependent apps (Email Marketing for campaign data, Documents for attachments, Calendar for meeting history). We recreate Snapforce custom fields as Odoo ir.model.fields with matching labels and type-mapped definitions. We configure the CRM pipeline stages to match the exact Snapforce pipeline stage names and probability assignments. If the customer uses Odoo Enterprise, we configure access groups and record rules at this stage; Community edition uses a simpler permission model.
Per-owner CSV sequencing and owner mapping
We split the exported Snapforce CSV files into per-owner files based on the owner distribution audit. Each owner file is formatted for Odoo import with field names matching the Odoo column headers. We build the User-to-partner lookup table from the owner email list, mapping each Snapforce Owner to a corresponding Odoo res.users record. Owners without a matching Odoo user are flagged for the customer's admin to provision before the next phase begins.
Voicemail and call recording file extraction
We extract all voicemail audio files and call recording files from the Snapforce platform, matching each file to its target Contact record using the filename convention and contact email preserved in the file metadata. We prepare the file set for Odoo ir.attachment import with res_model='res.partner' and res_id pointing to the migrated Contact partner ID. This step runs in parallel with schema design and does not block the data migration phases that depend on the schema being finalized.
Production migration in dependency order
We run the production migration in record-dependency order: res.partner (companies from Accounts first, contacts from Contacts second with parent_id resolved to the Account partner), crm.lead (Leads then Opportunities with stage_id and partner_id resolved), mail.activity and calendar.event (Tasks and Meetings with owner resolved), mail.message (Email history threaded by parent_id), ir.attachment (Documents and voicemail/call recording files with res_model and res_id resolved to the correct Odoo model and record ID). Each phase emits a row-count reconciliation report. We run delta migration for any records created or modified during the migration window before final cutover.
Cutover, validation, and workflow handoff
We freeze Snapforce writes during the cutover window and run a final delta migration of records modified after the initial production export. We enable Odoo as the system of record and validate record counts, spot-check 25-50 records against the Snapforce source for data accuracy, and confirm that voicemail and call recording files are correctly attached to Contact records. We deliver a written inventory of every Snapforce workflow automation rule with its trigger, conditions, and a recommended Odoo server action or automated action equivalent. The customer's admin rebuilds automations in Odoo using this inventory as a guide. We do not rebuild Snapforce Workflows as Odoo automations inside the migration scope.
Platform deep dives
Snapforce CRM
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 Snapforce CRM 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
Snapforce CRM: No published rate limit — Snapforce states unlimited API usage.
Data volume sensitivity
Snapforce CRM 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 Snapforce CRM to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Snapforce CRM 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 Snapforce CRM
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.