Helpdesk migration
Field-level mapping, validation, and rollback between Odoo Help Desk and Intercom. We move data and schema; workflows are rebuilt natively in Intercom.
Odoo Help Desk
Source
Intercom
Destination
Compatibility
9 of 12
objects map 1:1 between Odoo Help Desk and Intercom.
Complexity
CModerate
Timeline
3-5 weeks
Overview
Moving from Odoo Help Desk to Intercom is a shift from an ERP-embedded ticketing module to a purpose-built customer messaging platform. Odoo Help Desk stores tickets, team assignments, SLA policies, and ratings inside the res.partner model, which means any migration must extract Customers as a separate cross-module pass before tickets can be imported. We use Odoo's XML-RPC External API (confirmed available on the customer's Custom plan tier) and chunk large ticket reads into batches of 500 to avoid the database timeout errors documented in Odoo's own export limitations. Intercom's conversation model replaces Odoo's stage-based pipeline with a state machine (open, closed, snoozed), so we map Odoo stage names to Intercom conversation states during transformation. SLA policies and customer satisfaction ratings have no native Intercom equivalent; we preserve them as custom conversation attributes and contact notes respectively. We do not migrate Odoo workflows, automated actions, or helpdesk alias configurations—these require rebuild in Intercom's Operator rules or inbox settings after cutover.
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 Odoo Help Desk object lands in Intercom, 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)
Intercom
Conversation
1:1Odoo helpdesk.ticket records map to Intercom conversations. The ticket subject becomes the conversation title, description becomes the initial conversation body, and ticket priority (low/normal/high/urgent) maps to a custom priority attribute on the Intercom conversation. Odoo stage_id resolves to Intercom conversation state (open, closed) using a stage-is_close flag: stages with is_close=True map to Intercom closed; is_close=False maps to open. Ticket team_id resolves to Intercom team_id via the Team mapping pass. Historical SLA status (met/violated) migrates as a custom conversation attribute sla_status__c.
Odoo Help Desk
Conversation / Mail Message (mail.message)
Intercom
Conversation Part
1:1Odoo ticket conversations live in mail.message linked to helpdesk.ticket by res_id. Each mail.message maps to an Intercom conversation part. The message body (html field) becomes the part body; message author (res.partner) resolves to the Intercom contact by email match; message date becomes the part created_at timestamp. Large message threads on high-volume tickets are the primary cause of Odoo database timeouts during export, so we batch-fetch mail.message by ticket_id in groups of 50 threads at a time and resume on timeout from the last processed ticket_id offset.
Odoo Help Desk
Customer (res.partner)
Intercom
Contact
1:1Odoo res.partner records referenced by helpdesk.ticket (partner_id) map to Intercom Contacts. Email is the dedupe key. We extract partner name, email, phone, and street/city/country address fields and map them to Intercom Contact standard attributes. Since res.partner is shared across Odoo's CRM, Sales, and Accounting modules, we scope the migration export to only partners that have at least one helpdesk.ticket reference, avoiding a full company-wide partner export that would exceed migration scope.
Odoo Help Desk
Helpdesk Team (helpdesk.team)
Intercom
Team
1:1Odoo helpdesk.team records map to Intercom Teams. The team name and alias email address migrate. Odoo team-level pipeline settings (stage definitions and SLA policies scoped per team) are preserved as configuration metadata in a migration-notes document for the customer's Intercom admin to re-implement as Operator rules and inbox settings. Intercom Teams are available from the Starter plan onward.
Odoo Help Desk
Team Member (res.users via helpdesk.team member_ids)
Intercom
Admin
1:1Odoo users linked to helpdesk.team via the member_ids many2many field are resolved by email and mapped to Intercom Admins. The destination Admin must already exist in Intercom (provisioned before migration). We match by email and flag any Odoo user without a corresponding Intercom Admin as a reconciliation item. Active and inactive Odoo user status is preserved in a custom attribute original_odoo_active__c for audit purposes.
Odoo Help Desk
SLA Policy (helpdesk.sla)
Intercom
Custom Conversation Attribute (sla_status__c)
lossyOdoo SLA policies (helpdesk.sla) define response and resolution deadlines by ticket priority or team. Intercom has no native SLA policy object, so we export SLA policy names, deadline intervals, and applicable priority/team rules as a configuration inventory document. At migration time, we flag tickets that were in breach of their SLA as a custom conversation attribute sla_violated__c with a boolean value, and set sla_policy_name__c as a string attribute for reporting in Intercom's analytics.
Odoo Help Desk
Tag (ir.model.data for helpdesk.ticket)
Intercom
Conversation Tag
1:1Odoo ticket tags are string labels stored in a shared tag pool (helpdesk.tag) linked to helpdesk.ticket via many2many. Tag names migrate directly as Intercom conversation tags. We export all distinct tag names across the ticket set and map them as-is, preserving the label without transformation. Tags used to categorize ticket type or channel are not remapped to Intercom's topic or section taxonomy; the customer chooses whether to align taxonomy during scoping.
Odoo Help Desk
Rating (helpdesk.rating)
Intercom
Contact Note / Custom Attribute
1:1Odoo Help Desk ratings are tied to res.partner (customer) and res.users (rater) and linked to helpdesk.ticket. Intercom has no native CSAT rating model. We migrate rating values (numerical 0-5 or text rating) as a custom contact attribute rating_value__c on the Intercom Contact record, and the rating text (if present) as a contact note. The original Odoo ticket reference is preserved in a custom attribute original_ticket_id__c for cross-referencing.
Odoo Help Desk
Pipeline Stage (helpdesk.stage)
Intercom
Conversation State
lossyOdoo helpdesk.stage records are scoped per team_id and include name, sequence, is_close, and fold status. Stages with is_close=True map to Intercom closed conversations; is_close=False maps to open or snoozed. Stage sequence order is preserved as a custom attribute stage_sequence__c for reporting purposes. The customer chooses which Intercom inbox or team receives tickets from each Odoo stage during scoping.
Odoo Help Desk
Attachment (ir.attachment)
Intercom
Conversation Attachment
1:1Odoo ticket attachments stored in ir.attachment (res_model=helpdesk.ticket) are exported via /web/binary/base64 per ticket and uploaded to Intercom as conversation attachments. We flag unsupported file types (.exe, .sys, .scr, .shb, .wsf, and others on Intercom's security blocklist) during pre-migration discovery and advise the customer to configure Intercom's Attachment Settings (Settings > Security > Attachment settings > Allow more file types) before migration begins, or to exclude those attachments from scope. Binary blobs over 20 MB per file exceed Intercom's attachment limit and require separate handling.
Odoo Help Desk
Custom Field (ir.model.fields, x_studio_ prefix)
Intercom
Custom Conversation Attribute
lossyOdoo Studio custom fields on helpdesk.ticket carry the x_studio_ technical prefix. Fields created via ir.model.fields directly use the x_ prefix. We surface all x_* fields during schema discovery with their human-readable labels and present them to the customer to confirm migration scope. Custom fields migrate as Intercom custom conversation attributes with appropriate types: string fields become text attributes, numeric fields become number attributes, and boolean fields become boolean attributes. Date fields become date attributes. The customer confirms the Intercom attribute names before import.
Odoo Help Desk
User (res.users)
Intercom
Admin
1:1Odoo res.users records referenced as ticket assignees (user_id on helpdesk.ticket) are resolved by email against Intercom Admins. Inactive Odoo users are included in the export so that historical assignment records remain intact in Intercom's conversation history; active status is preserved in a custom attribute. Owner resolution must complete before ticket import because Intercom conversation assignment requires a valid Admin reference.
| Odoo Help Desk | Intercom | Compatibility | |
|---|---|---|---|
| Ticket (helpdesk.ticket) | Conversation1:1 | Fully supported | |
| Conversation / Mail Message (mail.message) | Conversation Part1:1 | Fully supported | |
| Customer (res.partner) | Contact1:1 | Fully supported | |
| Helpdesk Team (helpdesk.team) | Team1:1 | Fully supported | |
| Team Member (res.users via helpdesk.team member_ids) | Admin1:1 | Fully supported | |
| SLA Policy (helpdesk.sla) | Custom Conversation Attribute (sla_status__c)lossy | Fully supported | |
| Tag (ir.model.data for helpdesk.ticket) | Conversation Tag1:1 | Fully supported | |
| Rating (helpdesk.rating) | Contact Note / Custom Attribute1:1 | Fully supported | |
| Pipeline Stage (helpdesk.stage) | Conversation Statelossy | Fully supported | |
| Attachment (ir.attachment) | Conversation Attachment1:1 | Fully supported | |
| Custom Field (ir.model.fields, x_studio_ prefix) | Custom Conversation Attributelossy | Fully supported | |
| User (res.users) | Admin1: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
Intercom gotchas
S3 JSON export omits conversation transcripts
Workspace isolation prevents workflow migration
Fin AI resolution fees compound with automation success
Two-year conversation history limit on historical export
Private app rate limits share workspace quota
Pair-specific challenges
Migration approach
Plan tier and API access verification
We verify the customer's Odoo plan tier (must be Custom to access XML-RPC API) and confirm they have active API credentials. If the customer is on Standard, we pause and advise on the upgrade path before proceeding. We also confirm the Intercom plan tier to verify Team and Admin provisioning availability. The discovery output is a written scope document listing all Odoo modules in use, the estimated ticket and contact record counts, and the confirmed plan tiers on both sides.
Schema discovery and Intercom attribute design
We run a schema discovery pass over the Odoo database using XML-RPC to enumerate all helpdesk.ticket fields, helpdesk.team records, x_* custom fields, SLA policy definitions, tag names, and rating field configurations. We present the x_* field list with human-readable labels to the customer for confirmation. We design the Intercom custom conversation attributes and contact attributes to receive SLA and rating data, and configure the Intercom Teams and Admin roster to match the Odoo helpdesk.team and res.users structure. All Intercom schema changes are validated in Intercom's sandbox before production migration.
Batched XML-RPC export with timeout recovery
We export Odoo records in dependency order: res.partner (Customers), res.users (Users/Admins), helpdesk.team (Teams), helpdesk.tag (Tags), helpdesk.sla (SLA inventory), helpdesk.rating (Ratings), helpdesk.ticket (Tickets), mail.message (Conversation parts), and ir.attachment (Attachments). Each object type is read in chunks of 500 records with offset pagination. On any timeout, we log the last successful offset and resume from that point. Mail.message and ir.attachment are fetched per-ticket after ticket records are confirmed to isolate timeout blast radius. Intercom's attachment file-type restrictions are verified before each attachment batch upload.
Contact and Admin reconciliation
We resolve Odoo res.partner records to Intercom Contacts by email as the dedupe key. Any Odoo partner without an email address is flagged for manual review. We match Odoo res.users to existing Intercom Admins by email. Any Odoo user without a corresponding Intercom Admin goes to a reconciliation queue for the customer to provision before record import resumes. This step is a hard dependency: Intercom conversation assignment requires a valid Admin reference, and Intercom Contacts require an email address.
Production migration in record-dependency order
We run the production migration in this order: Contacts (res.partner mapped to Intercom Contact), Admins (res.users mapped to Intercom Admin), Teams (helpdesk.team), Tags, SLA inventory document (delivered as configuration inventory, not imported), Custom attributes (created in Intercom before tickets), Tickets mapped to Conversations (with stage-to-state mapping applied), Conversation parts (mail.message mapped to conversation parts in timestamp order), and Attachments (ir.attachment uploaded per conversation). Each phase emits a row-count reconciliation report before the next phase begins. Batched XML-RPC reads with offset pagination handle timeouts without restarting from zero.
Cutover, validation, and SLA/rating handoff
We freeze Odoo Help Desk writes during the cutover window, run a final delta pass for any tickets modified during migration, then confirm Intercom as the system of record. We deliver the SLA policy inventory document (with Intercom Operator rebuild recommendations) and the CSAT rating mapping notes to the customer's Intercom admin. We support a one-week hypercare window for reconciliation issues. We do not rebuild Odoo Automated Actions, Studio workflows, or helpdesk alias routing as Intercom Operator rules; those are documented and delivered to the customer's admin for rebuild as a separate task.
Platform deep dives
Odoo Help Desk
Source
Strengths
Weaknesses
Intercom
Destination
Strengths
Weaknesses
Complexity grading
Moderate Helpdesk migration. 4 of 7 objects need a mapping; the rest are 1:1.
Overall complexity
Moderate migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo Help Desk and Intercom.
Object compatibility
4 of 7 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
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 Intercom migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Help Desk to Intercom 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 Intercom
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.