Helpdesk migration
Field-level mapping, validation, and rollback between Odoo Help Desk and Salesforce Service Cloud. We move data and schema; workflows are rebuilt natively in Salesforce Service Cloud.
Odoo Help Desk
Source
Salesforce Service Cloud
Destination
Compatibility
6 of 12
objects map 1:1 between Odoo Help Desk and Salesforce Service Cloud.
Complexity
CModerate
Timeline
3-5 weeks
Overview
Moving from Odoo Help Desk to Salesforce Service Cloud is a migration from a module embedded inside an ERP suite to a purpose-built customer service platform. Odoo Help Desk is gated behind the Enterprise plan and requires the Custom plan for API access, making automated export a billing-tier gate before any data can move. Salesforce Service Cloud brings deep CRM context to every support interaction, omnichannel routing, Einstein AI case handling, and an AppExchange ecosystem that extends Service Cloud without the multi-module entanglement Odoo creates. We sequence the migration by first exporting Customers (res.partner), then Tickets, then Conversation threads and Attachments, because the res.partner IDs are foreign keys inside ticket records and resolving them to Salesforce Account or Contact IDs is a prerequisite for attaching message history to the correct Case. Workflows, SLA computation rules, and Helpdesk Team routing automations do not migrate as code; we deliver a written inventory of these for the customer's admin to rebuild in Service Cloud.
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.
Source platform
Odoo Help Desk platform overview
Scorecard, SWOT, gotchas, and pricing for Odoo Help Desk.
Destination platform
Salesforce Service Cloud platform overview
Scorecard, SWOT, gotchas, and pricing for Salesforce Service Cloud.
Data migration guide
The complete Salesforce Service Cloud migration guide
Data model, import mechanisms, field mapping strategy, pitfalls, and cutover — by the engineers running it.
Destination checklist
Salesforce Service Cloud migration checklist
Pre- and post-cutover tasks for moving onto Salesforce Service Cloud.
Why teams make this switch
Leaving
What's pushing teams away
Choosing
What's pulling them in
Object mapping
Each row shows how a Odoo Help Desk object lands in Salesforce Service Cloud, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Odoo Help Desk
Ticket (helpdesk.ticket)
Salesforce Service Cloud
Case
1:1Odoo Tickets map to Salesforce Case. We export subject, description, stage, priority, assignee (res.users), partner (res.partner), team (helpdesk.team), tags, creation date, and write date. The res.partner customer reference is the critical dependency: we export all referenced res.partner records first and resolve them to Salesforce Account or Contact IDs before inserting Cases so that the WhoId and AccountId foreign keys are satisfied at insert time. Custom fields on helpdesk.ticket (detected as x_studio_ or x_ fields in ir.model.fields) are exported as explicit column mappings and created as custom fields on Case before the migration run.
Odoo Help Desk
Customer (res.partner)
Salesforce Service Cloud
Account and Contact
1:manyOdoo res.partner records that are companies (is_company=True) map to Salesforce Account; individual contacts (is_company=False) map to Salesforce Contact attached to the corresponding Account. The Odoo partner record may be referenced across multiple helpdesk.ticket rows, so we deduplicate by partner ID during export and use the Salesforce upsert semantics to avoid duplicate Account or Contact creation. Email, phone, street, city, country, and website migrate to the standard Account or Contact fields. Any partner without an email is flagged for manual review because Salesforce Cases without a Contact or Account require a Known Contact configuration to route correctly.
Odoo Help Desk
Helpdesk Team (helpdesk.team)
Salesforce Service Cloud
Queue or Public Group
lossyOdoo Helpdesk Teams define pipeline settings, member assignments, and alias emails. We export team definitions and map them to Salesforce Queue records, which control case assignment routing. Teams that use Odoo's email alias routing map to Salesforce Email-to-Case routing rules. If the customer uses Odoo's multi-company feature, team-to-company linkage is preserved as a custom text field on the Queue because Salesforce Queues are org-wide rather than company-scoped. The team configuration is documented separately so the admin rebuilds routing rules in Service Cloud Omni-Channel.
Odoo Help Desk
Team Member (res.users in team m2m)
Salesforce Service Cloud
User
1:1Team membership is a many2many link between res.users and helpdesk.team. We resolve the user records (login, name, active status) and map them to Salesforce User records by email match. Inactive Odoo users are included in the export so that historical assignment records remain intact on closed tickets; they are mapped to inactive Salesforce Users. Name collisions (two Odoo users with the same email as two Salesforce Users) are flagged in the reconciliation queue for the admin to disambiguate before migration resumes.
Odoo Help Desk
Pipeline Stages (helpdesk.stage)
Salesforce Service Cloud
Case Status and Case Record Type
lossyOdoo helpdesk stages are team-scoped records with name, sequence, is_close flag, and fold status. We export all stage definitions, sort them by sequence order, and map them to Salesforce Case Status values within a Case Record Type. The is_close flag maps to a Case Status value where IsClosed=True on the Salesforce Status field. If Odoo stages use fold (collapsed view in the kanban), we document that behavior as a Salesforce List View configuration note rather than a direct field migration.
Odoo Help Desk
Conversations (mail.message)
Salesforce Service Cloud
EmailMessage
1:1Ticket conversations live in mail.message and mail.tracking_value linked to helpdesk.ticket by res_id. We export message body (HTML), author (res.partner ID mapped to Contact), creation date, and message type (email, comment, notification). Messages are inserted as Salesforce EmailMessage records linked to the parent Case. Large message threads on high-volume tickets are batch-fetched separately per ticket to isolate the blast radius of an Odoo database timeout. We set the EmailMessage.parentId to the migrated Case ID and Incoming=true or false based on the Odoo author type. Internal notes in Odoo (message_type=notification) map to Case Comments with IsPublished=false.
Odoo Help Desk
Attachments (ir.attachment)
Salesforce Service Cloud
ContentVersion and ContentDocumentLink
1:1Attachments on tickets are stored in ir.attachment linked by res_model='helpdesk.ticket' and res_id=ticket_id. We export file binaries via Odoo's /web/binary/base64 endpoint, create ContentVersion records in Salesforce, and link them to the parent Case via ContentDocumentLink. Large attachment blobs (>10 MB per file) are flagged for separate handling because Salesforce ContentDocument limits and Odoo's memory threshold both require chunked transfer. We preserve original filename, file extension, and mime type as ContentVersion metadata fields.
Odoo Help Desk
Tags (ir.model.data tag pool)
Salesforce Service Cloud
Case Tags or Multi-Select Picklist
lossyOdoo helpdesk tags are ir.records in a shared tag pool linked to helpdesk.ticket via many2many. They are plain string labels. We export tag names and link them back to migrated tickets. The destination strategy is chosen during scoping: either Salesforce native Case Tags (Text field with tags comma-separated) or a custom multi-select picklist if the customer wants tag-based reporting in Salesforce. We do not assume all tags are support-specific; some may have been repurposed for internal categorization and we surface them for the admin to confirm the mapping intent.
Odoo Help Desk
SLA Policy (helpdesk.sla)
Salesforce Service Cloud
Entitlement Process and Milestone
lossyOdoo SLA policies define response and resolution deadlines tied to ticket priority or team. We export SLA definitions (name, stage_target, time_days, time_hours, priority) as a documented configuration record rather than a direct API object import, because Salesforce SLA enforcement uses Entitlement Processes and Business Hours which require the admin to configure the Entitlement record first. We map the Odoo SLA priority levels to Salesforce Case Priority and note which Entitlement Process each ticket team should be assigned to. The admin activates business hours in Service Cloud before the Entitlement Process is usable.
Odoo Help Desk
Ratings (helpdesk.rating)
Salesforce Service Cloud
Custom Field on Case (CSAT Score)
lossyOdoo Help Desk ratings are linked to ticket resolution with a rating/subrating value (1-5 stars) and a rater reference to res.partner. Salesforce Service Cloud standard objects do not have a native CSAT field on Case. We map the rating value to a custom numeric field rating_score__c on Case and the rater partner to the Case Contact. If the customer used Odoo's rating with comments, the comment text migrates to a custom long-text field rating_comment__c. We note that Salesforce Survey (former Surveyforce) or a connected product like Qualtrics is the native path for ongoing CSAT collection after migration.
Odoo Help Desk
Custom Fields (ir.model.fields state=manual)
Salesforce Service Cloud
Custom Field (__c)
1:1Custom fields on helpdesk.ticket registered in ir.model.fields with state='manual' are detected during schema discovery and exported as explicit column mappings. Both x_studio_ and x_ prefixed fields are surfaced with their human-readable string labels so the customer confirms which ones to migrate. We create equivalent custom fields on the Case object in Salesforce (with __c suffix, matching the original field type where possible) before the migration run. Fields that use Odoo selection fields map to Salesforce picklists, which requires the admin to replicate the picklist value set in Salesforce before migration proceeds.
Odoo Help Desk
Users (res.users for agent assignment)
Salesforce Service Cloud
User
1:1Agent assignment on helpdesk.ticket (user_ids many2many) maps to the Salesforce User assigned as Case Owner. We export user login, name, email, and active status. Inactive Odoo users are exported so that historical assignment records on closed tickets remain intact and point to the correct User ID. The mapping is resolved by email match against the destination Salesforce org's User table. Any Odoo user with no matching Salesforce User is placed in a reconciliation queue; the admin provisions the User in Salesforce before migration resumes.
| Odoo Help Desk | Salesforce Service Cloud | Compatibility | |
|---|---|---|---|
| Ticket (helpdesk.ticket) | Case1:1 | Fully supported | |
| Customer (res.partner) | Account and Contact1:many | Fully supported | |
| Helpdesk Team (helpdesk.team) | Queue or Public Grouplossy | Fully supported | |
| Team Member (res.users in team m2m) | User1:1 | Fully supported | |
| Pipeline Stages (helpdesk.stage) | Case Status and Case Record Typelossy | Fully supported | |
| Conversations (mail.message) | EmailMessage1:1 | Fully supported | |
| Attachments (ir.attachment) | ContentVersion and ContentDocumentLink1:1 | Fully supported | |
| Tags (ir.model.data tag pool) | Case Tags or Multi-Select Picklistlossy | Fully supported | |
| SLA Policy (helpdesk.sla) | Entitlement Process and Milestonelossy | Fully supported | |
| Ratings (helpdesk.rating) | Custom Field on Case (CSAT Score)lossy | Fully supported | |
| Custom Fields (ir.model.fields state=manual) | Custom Field (__c)1:1 | Fully supported | |
| Users (res.users for agent assignment) | User1: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.
Odoo Help Desk gotchas
Help Desk module is Enterprise-only
External API requires Custom plan
Large exports hit database timeout
Studio custom fields use x_studio_ prefix
Odoo.sh database migration differs from standard API export
Salesforce Service Cloud gotchas
Data Export 512MB file size cap breaks large org exports
API Daily Request Limits vary by license edition
No automatic data backup in base Salesforce
Picklist dependencies silently break records when unmapped
Workflow rules fire unexpectedly during data load
Pair-specific challenges
Migration approach
Plan tier confirmation and API access gate
We confirm the source Odoo instance is on the Custom plan or higher, because XML-RPC API access is required for automated export. If the customer is on Standard, we document the upgrade path and pause migration scope until the plan is upgraded. We also confirm the Help Desk module is present (Enterprise-gated) and identify any Community workaround modules that may be in use. The output is a signed scoping document with the confirmed data model, record counts by object, and a decision on date-range filtering for historical tickets.
Schema discovery and destination field mapping
We run a schema discovery pass against the Odoo XML-RPC API to enumerate all helpdesk.ticket fields, mail.message records, ir.attachment references, helpdesk.team definitions, helpdesk.stage records, and ir.model.fields custom fields. We compare this against the Salesforce Case object schema in the destination org and design the field mapping: standard Odoo fields to standard Salesforce Case fields, custom Odoo fields to Salesforce custom fields (__c) created before migration, and any fields with no Salesforce equivalent flagged for the admin decision. SLA policies, team routing rules, and after-sales service links (repair orders, field service tasks) are documented as configuration-only records for the admin to rebuild in Service Cloud.
Customer record pre-export and Salesforce ID resolution
We export all res.partner records referenced by helpdesk.ticket rows before the ticket export begins. Each res.partner is mapped to a Salesforce Account (if is_company=True) or Contact (if is_company=False). We build an Odoo-ID-to-Salesforce-ID lookup table that is used to resolve WhoId and AccountId foreign keys during the ticket import. Any res.partner without an email address is flagged for manual review because Salesforce Cases require a contact or account association to route through Omni-Channel.
Sandbox migration and reconciliation
We run a full migration into a Salesforce Sandbox (Developer or Full Copy) using production-equivalent data volume to validate the field map, batch sizes, and timeout handling. The customer reconciles record counts (Cases in, Accounts in, Contacts in, EmailMessages in), spot-checks 25-50 random Cases against the Odoo source, and confirms conversation threading and attachment filenames. We correct any mapping errors in the sandbox before the production migration run. Sandbox migration typically takes one to two weeks for mid-market datasets.
Production migration in dependency order
We run production migration in dependency order: Salesforce Users (provisioned by admin, validated), Accounts and Contacts (from res.partner), Case Record Types and Status values (from helpdesk.team and helpdesk.stage), Cases (with AccountId and OwnerId resolved via the lookup table), EmailMessages and Case Comments (from mail.message with message-type separation), ContentVersion files (from ir.attachment), Custom Field data (from ir.model.fields). Each phase emits a reconciliation report (row counts, error counts, error log) before the next phase begins. We use Salesforce Bulk API 2.0 with chunking and exponential backoff on rate-limit responses for all phases touching more than 10,000 records.
Cutover, delta sync, and workflow inventory handoff
We freeze Odoo Help Desk writes during cutover, run a delta migration of records modified during the migration window (typically within a 24-48 hour delta), and enable Salesforce Service Cloud as the system of record. We deliver a written inventory of Odoo Helpdesk Team routing rules, SLA policy definitions, after-sales service linkages, and custom Studio automations with recommended Salesforce equivalents (Omni-Channel Routing, Entitlement Processes, Flow, or Apex). We do not rebuild automations as code inside the migration scope. We offer a one-week hypercare window to resolve post-cutover reconciliation issues raised by the support team.
Platform deep dives
Odoo Help Desk
Source
Strengths
Weaknesses
Salesforce Service Cloud
Destination
Strengths
Weaknesses
Complexity grading
Moderate Helpdesk migration. 1 of 7 objects need a manual workaround.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo Help Desk and Salesforce Service Cloud.
Object compatibility
1 of 7 objects need a manual workaround.
Field mapping clarity
Field mapping is derived from defaults — final spec confirmed during the sample migration.
Timeline complexity
7-object category — typical timelines run 2–7 days end-to-end.
API constraints
Odoo Help Desk: Not publicly documented.
Data volume sensitivity
Odoo Help Desk 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 Odoo Help Desk to Salesforce Service Cloud migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Help Desk to Salesforce Service Cloud migration with a real engineer — 30 minutes, free, written quote within 24 hours.
Book a free 30 minute consultationAdjacent paths
Other ways to leave Odoo Help Desk
Other ways to arrive at Salesforce Service Cloud
Same-Helpdesk migrations
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.