CRM migration
Field-level mapping, validation, and rollback between Sales Snap and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Sales Snap
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between Sales Snap and Odoo CRM.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Sales Snap has no public REST API or bulk export endpoint, which means the migration from Sales Snap to Odoo CRM begins with a manual, coordinated CSV extraction step rather than an automated API pull. We work with the customer to export all visible contact, company, task, and activity records from the Sales Snap UI before any Odoo provisioning begins. Odoo receives data through its XML-RPC API using the standard partner, lead, and project models. The primary structural challenge is flattening Sales Snap's contact-centric model into Odoo's partner hierarchy where company records are res.partner with is_company=True and individual contacts are separate res.partner records linked by parent_id. Sales Snap sequence campaign data has no native Odoo equivalent, so we preserve it as CRM lead tags with step-level reference data in a written handoff document. We do not migrate automations, workflows, or attachment binaries from Sales Snap. The timeline and cost are dominated by the manual export phase and any data cleansing required before Odoo import.
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 Sales Snap 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.
Sales Snap
Contact
Odoo CRM
res.partner (is_company=False)
1:1Sales Snap Contact records map to Odoo res.partner with is_company=False. Name, email, phone, and custom fields migrate directly from CSV. The parent company is resolved by matching Sales Snap company_name against the Odoo partner created from the Companies export (deduped by name). Lifecycle stage from Sales Snap maps to a custom Char field x_lifecycle_stage on res.partner because Odoo has no native equivalent. Contacts without a matched company parent are created as standalone partners and flagged for manual review.
Sales Snap
Company
Odoo CRM
res.partner (is_company=True)
1:manySales Snap company records map to Odoo res.partner with is_company=True. Multiple Sales Snap contact rows referencing the same company name are deduplicated on company name during the transform phase and merged into a single Odoo partner record with is_company=True. All individual contact records are then linked to this parent partner via parent_id. Company-level fields (domain, industry, employee count if present in the export) migrate as custom fields on the res.partner record.
Sales Snap
Owner
Odoo CRM
res.users
1:1Sales Snap Owner records are matched to Odoo res.users by email address during import. Any Owner without a matching Odoo user is held in a reconciliation queue. The customer's Odoo admin provisions missing users before the record import phase resumes. Sales Snap does not export owner records as a standalone object; owner is a field on each contact, company, and task row, so we extract distinct owner emails first.
Sales Snap
Sequence / Outbound Campaign
Odoo CRM
crm.lead (tag_ids)
lossySales Snap sequence campaign data has no native Odoo CRM equivalent. We map sequence name and step order to crm.lead tag_ids using the sequence campaign name as the tag value, with step order stored in the lead description field as a reference string. The full sequence template (email subject, body, personalization tokens, delay rules) is documented in a written handoff inventory and delivered to the customer for manual rebuild in Odoo's CRM automations. This is a reference-data migration, not an automation migration.
Sales Snap
Task
Odoo CRM
project.task
1:1Sales Snap follow-up tasks map to Odoo project.task records. Task type, due date, completion status, and linked contact migrate directly. Orphaned tasks (no linked contact in the Sales Snap export) are imported as standalone tasks with a note flagging the missing parent. We create a default project in Odoo (CRM Tasks) to host all imported tasks; if the customer uses the Project module, tasks are routed to the appropriate project during scoping.
Sales Snap
Engagement: Email
Odoo CRM
mail.message
1:1Sales Snap email engagement logs (opens, clicks, replies) aggregate per contact as metrics in the CSV export. We map these to Odoo mail.message records with mail_activity_type=False and a custom body field carrying the engagement summary. The original email content (subject, body) is not separately exported from Sales Snap; if the customer has exported email templates separately, those are noted as reference files for manual re-upload to Odoo.
Sales Snap
Engagement: Call
Odoo CRM
project.task (TaskSubtype=Call)
1:1Sales Snap call logs migrate to Odoo project.task with the display_name prefixed by Call:, duration stored in x_call_duration (seconds), and call outcome stored in x_call_disposition. The linked contact is resolved via the res.partner parent record. Call recording URLs in Sales Snap are not exported in the standard CSV; we flag any record containing a recording URL as a separate line item for manual retrieval.
Sales Snap
Engagement: Meeting
Odoo CRM
calendar.event
1:1Sales Snap meeting engagements map to Odoo calendar.event. Start datetime, end datetime, location, and meeting title migrate. Attendee resolution uses the res.partner records linked to the meeting contact. Sales Snap meeting notes migrate to the event description field. If multiple contacts attended a single meeting in Sales Snap (as separate rows), we create one calendar.event per contact to preserve individual attendance records.
Sales Snap
Pipeline Stage
Odoo CRM
crm.stage
lossySales Snap lifecycle stage values (new, active, churned, etc.) from the contact export are mapped to Odoo crm.stage records per CRM team. We create stage records in Odoo before any lead import and map each Sales Snap lifecycle value to a corresponding Odoo stage. The stage sequence order and probability percentages are set during Odoo CRM configuration. If Sales Snap exposes additional pipeline metadata in exports, we extend the mapping to crm.lead.stage_id and x_original_lifecycle_stage.
Sales Snap
Custom Field
Odoo CRM
ir.model.fields (custom)
lossySales Snap custom fields visible in the CSV export are mapped 1:1 to Odoo custom fields on the res.partner model. We pre-create the custom fields in Odoo using field types that match the Sales Snap export column type: text columns become Char or Text, date columns become Date, picklist values become Selection fields. Any field requiring type conversion (for example, a Sales Snap datetime column importing into an Odoo Date field) is flagged for explicit customer approval before the transform runs.
Sales Snap
Company / Multi-company setup
Odoo CRM
res.company
1:1If the customer's Odoo instance runs multiple companies, we map Sales Snap data to the appropriate res.company by matching a company identifier in the Sales Snap export against the destination Odoo company records. Single-company Odoo setups ignore this mapping. We confirm the multi-company configuration during scoping because it affects the company_id field on every partner and lead record.
Sales Snap
Activity Metrics (opens, clicks, replies, sentiment)
Odoo CRM
mail.message + custom fields on res.partner
1:1Sales Snap engagement metrics per contact (total opens, total clicks, total replies, last contact date) are not native Odoo fields. We store the aggregate counts as custom fields on res.partner: x_total_email_opens, x_total_email_clicks, x_total_replies, and x_last_engagement_date. Individual engagement events (per-email opens) are not available in the standard Sales Snap export and are noted as a data gap in the scoping document.
| Sales Snap | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | res.partner (is_company=False)1:1 | Fully supported | |
| Company | res.partner (is_company=True)1:many | Fully supported | |
| Owner | res.users1:1 | Fully supported | |
| Sequence / Outbound Campaign | crm.lead (tag_ids)lossy | Fully supported | |
| Task | project.task1:1 | Fully supported | |
| Engagement: Email | mail.message1:1 | Fully supported | |
| Engagement: Call | project.task (TaskSubtype=Call)1:1 | Fully supported | |
| Engagement: Meeting | calendar.event1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| Custom Field | ir.model.fields (custom)lossy | Fully supported | |
| Company / Multi-company setup | res.company1:1 | Fully supported | |
| Activity Metrics (opens, clicks, replies, sentiment) | mail.message + custom fields on 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.
Sales Snap gotchas
No public API for automated migration
Attachment binaries not exported in standard CSV
No documented rate limits or API quotas
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 call and manual export coordination
We schedule a structured discovery call with the customer to identify every object present in their Sales Snap account: contacts, companies, tasks, and engagement logs. We provide a written export guide specifying how to export each object from the Sales Snap UI, including pagination settings and file naming conventions. The customer completes all exports before the migration kickoff. We validate received CSV files for column headers, row counts, and encoding within 24 hours of receipt. Any missing exports or pagination gaps are flagged for re-export before the mapping phase begins.
Odoo provisioning and CRM module activation
We provision the destination Odoo environment (Odoo.sh cloud or customer-hosted) and activate the CRM, project management, and email marketing modules required for the migration scope. We confirm the Odoo edition (Community or Enterprise) and note any feature restrictions. We create the initial schema including custom fields on res.partner, custom fields on crm.lead, and crm.stage records per CRM team. The Odoo admin credentials are provided by the customer; we require editor-level API access via XML-RPC to proceed.
Transform design and company-contact hierarchy resolution
We design the transform logic that flattens the Sales Snap contact export into Odoo's partner hierarchy. The first pass deduplicates company names and creates res.partner records with is_company=True. The second pass creates res.partner records with is_company=False for each contact, resolving parent_id against the company partner created in the first pass. Lifecycle stage from Sales Snap maps to the custom x_lifecycle_stage field. Owner emails are matched against the Odoo res.users table and held in a reconciliation queue for any unmatched owners. We deliver a written transform specification to the customer for approval before any import begins.
Staging Odoo import and reconciliation
We run a full import into a staging Odoo database using production-like data volume. The customer reviews 25-50 randomly sampled partner records, contact records, and task records against the original Sales Snap CSV exports. We verify that parent_id links are correct, lifecycle stage values are preserved, and task assignments are resolved. Any mapping corrections are made to the transform specification and the staging import is re-run. The customer signs off on the staging results before we schedule the production migration window.
Production migration in dependency order
We run production migration in record-dependency order: res.company (deduplicated from company_name), res.partner (companies as is_company=True), res.partner (contacts as is_company=False with parent_id), res.users (owner reconciliation queue resolved), crm.stage (lifecycle stage values), crm.lead (sequences as tagged leads with reference data in description), project.task (tasks linked to partner), calendar.event (meetings linked to partner and attendee), mail.message (engagement summaries linked to partner). Each phase emits a row-count reconciliation report before the next phase begins. Sales Snap writes are frozen by the customer during the migration window.
Cutover, final validation, and automation rebuild handoff
We run a final delta migration for any records modified during the cutover window, then confirm the Odoo database as the system of record. We deliver a written sequence and campaign inventory document listing every Sales Snap sequence with its step count, template names, delay rules, and a recommended Odoo CRM automation equivalent. We deliver a written workflow inventory listing every Sales Snap automation with its trigger and action summary and a recommended Odoo Studio action equivalent. The customer's admin team rebuilds sequences and automations in Odoo post-migration. We offer a one-week hypercare window for reconciliation issues raised by the sales team during the first week of live use.
Platform deep dives
Sales Snap
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 Sales Snap 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
Sales Snap: No public API.
Data volume sensitivity
Sales Snap 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 Sales Snap to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Sales Snap 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 Sales Snap
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.