Helpdesk migration
Field-level mapping, validation, and rollback between Odoo Help Desk and Zendesk. We move data and schema; workflows are rebuilt natively in Zendesk.
Odoo Help Desk
Source
Zendesk
Destination
Compatibility
7 of 11
objects map 1:1 between Odoo Help Desk and Zendesk.
Complexity
BStandard
Timeline
3-5 weeks
Overview
Moving from Odoo Help Desk to Zendesk is a migration from a module inside a general ERP to a dedicated customer service platform. Odoo Help Desk lives inside the Odoo ERP, sharing the res.partner model across CRM, Sales, and Helpdesk, while Zendesk uses a flat ticket model with separate User, Organization, and SLA Policy objects. The structural differences center on customer deduplication (Odoo's shared partner records versus Zendesk's requester-centric model), SLA policy translation (Odoo's team-scoped SLA policies have no direct Zendesk equivalent), and stage mapping (Odoo's team-scoped helpdesk.stage records must be flattened into a single Zendesk ticket status set). We sequence the migration by resolving Customers first, then Tickets, then the linked conversation history, then attachments and custom fields. We do not migrate Odoo workflows, automated actions, or SLA computation logic; we deliver a written inventory of these for the customer's admin to rebuild in Zendesk.
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 Zendesk, 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)
Zendesk
Ticket
1:1Odoo helpdesk.ticket maps to Zendesk Ticket as the primary migration object. We map subject to Ticket.subject, description to Ticket.comment.body, stage to Ticket.status, priority to Ticket.priority, assignee (user_id) to Ticket.assignee_id, partner_id to Ticket.requester_id (resolving res.partner email to a Zendesk User), team_id to Ticket.group_id, tags to Ticket.tags, and creation dates to Ticket.created_at. Odoo ticket closed dates map to Ticket.updated_at for closed tickets. Tickets are imported first so that child records (comments, attachments) can reference valid ticket IDs.
Odoo Help Desk
Customer (res.partner)
Zendesk
User or Organization
many:1Odoo's res.partner is a shared model used across CRM, Sales, and Helpdesk. Tickets reference partner_id as the customer. We export partner records with their email, name, phone, and company_name. At migration time, partners with unique emails map to individual Zendesk User records. Partners with the same company_name are optionally merged into a Zendesk Organization, with the User added as a member. Customers who appear only as ticket requesters (no CRM activity) migrate as Users; those with company linkage migrate as Users plus Organization membership.
Odoo Help Desk
Helpdesk Team (helpdesk.team)
Zendesk
Group
1:1Odoo helpdesk.team records (team name, member assignments, alias email, and SLA policy reference) map to Zendesk Groups. We create a Zendesk Group for each Odoo team and populate it with the corresponding team members resolved as Zendesk agents. Team-level SLA policy references are exported as metadata and mapped separately to Zendesk SLA Policies during the SLA configuration step.
Odoo Help Desk
Team Member (helpdesk.team member m2m)
Zendesk
Agent
1:1Odoo team membership links res.users to helpdesk.team via a many2many. We resolve each user record (login, name, active status) and map them to a Zendesk agent. Inactive Odoo users are mapped to a default Zendesk agent or held in a reconciliation queue so historical assignment records remain intact without orphaning tickets. Name collisions across Odoo and Zendesk are resolved by email match during the owner reconciliation step.
Odoo Help Desk
SLA Policy (helpdesk.sla)
Zendesk
SLA Policy
lossyOdoo SLA policies define response and resolution deadlines tied to ticket priority or team. They are configuration records without a direct Zendesk equivalent object in the same data model. We export SLA policy definitions (name, policy type, target hours) and present them as an inventory document. If the Zendesk destination is Suite Professional or above, we configure Zendesk SLA Policies with matching conditions and policies manually in the Zendesk admin panel post-migration. We flag any SLA policies that cannot be replicated in Zendesk's SLA model during scoping.
Odoo Help Desk
Pipeline Stage (helpdesk.stage)
Zendesk
Ticket Status
lossyOdoo helpdesk.stage records are scoped per team via team_id and define stage name, sequence, is_close, and fold status. We collect all distinct stage names across Odoo teams and map them to a unified Zendesk ticket status set (New, Open, Pending, Hold, Solved, Closed). The sequence order from Odoo becomes a reference document for the customer's admin to reorder Zendesk ticket statuses post-migration. For teams that require isolated stage sets, we document the team-to-stage mapping for the admin to implement via Zendesk ticket forms if needed.
Odoo Help Desk
Tag (helpdesk.tag)
Zendesk
Tag
1:1Odoo tags are plain string labels stored in a shared ir.model.fields many2many pool and linked to tickets via helpdesk.ticket.tag_ids. We export all distinct tag names and link them back to migrated tickets as Zendesk tags. Tag cardinality is preserved. Tags that represent business-critical classifications are flagged during scoping so they can be mapped to Zendesk custom ticket fields instead of plain tags if the customer prefers.
Odoo Help Desk
Conversation (mail.message)
Zendesk
Ticket Comment
1:1Ticket conversation threads live in Odoo's mail.message model linked by res_model='helpdesk.ticket' and res_id=ticket_id. We batch-fetch messages per ticket in chunks of 500 to avoid the Odoo database timeout that affects large thread exports. Each message maps to a Zendesk Ticket Comment with author (partner_id mapped to Zendesk User), body (plain text or HTML), internal flag (message.subtype='comment' vs 'notification'), and created_at timestamp. Message ordering is preserved via created_at. We flag internal notes separately so they can be mapped to Zendesk's internal comment capability if the customer admin enables it.
Odoo Help Desk
Attachment (ir.attachment)
Zendesk
Ticket Attachment
1:1Attachments on Odoo 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 per attachment. Each attachment is uploaded to Zendesk via POST /api/v2/tickets/{id}/attachments and linked to the corresponding ticket comment. Large binary blobs (over 20 MB) are flagged during scoping because Zendesk enforces a 20 MB per-attachment limit and may require the customer's admin to provision cloud storage for overflow files.
Odoo Help Desk
Custom Field (ir.model.fields, state='manual')
Zendesk
Custom Ticket Field
lossyOdoo custom fields on helpdesk.ticket are registered in ir.model.fields with state='manual'. Studio-created fields use the x_studio_ prefix; fields created via ir.model.fields use x_. Both are detected during schema discovery and presented to the customer with their human-readable labels. We create corresponding Zendesk custom ticket fields of matching types (text, dropdown, checkbox, date, integer) before ticket import begins. Fields without a Zendesk type equivalent are documented for manual field creation post-migration.
Odoo Help Desk
User (res.users)
Zendesk
Agent
1:1Odoo agent assignment on tickets (user_id) links to res.users. We export user login, name, and active status. Inactive users are included in the export so historical assignment records remain intact. We resolve Odoo users by email match against the Zendesk agent table during migration. Users without a matching Zendesk agent are held in a reconciliation queue for the customer's admin to provision before record import resumes.
| Odoo Help Desk | Zendesk | Compatibility | |
|---|---|---|---|
| Ticket (helpdesk.ticket) | Ticket1:1 | Fully supported | |
| Customer (res.partner) | User or Organizationmany:1 | Fully supported | |
| Helpdesk Team (helpdesk.team) | Group1:1 | Fully supported | |
| Team Member (helpdesk.team member m2m) | Agent1:1 | Fully supported | |
| SLA Policy (helpdesk.sla) | SLA Policylossy | Fully supported | |
| Pipeline Stage (helpdesk.stage) | Ticket Statuslossy | Fully supported | |
| Tag (helpdesk.tag) | Tag1:1 | Fully supported | |
| Conversation (mail.message) | Ticket Comment1:1 | Fully supported | |
| Attachment (ir.attachment) | Ticket Attachment1:1 | Fully supported | |
| Custom Field (ir.model.fields, state='manual') | Custom Ticket Fieldlossy | Fully supported | |
| User (res.users) | Agent1: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
Zendesk gotchas
Data export requires API scripting on non-Enterprise plans
Automations cap at 500 active rules and 1,000 tickets per hour
Help Center has no native export feature
Custom Objects and full data export are Enterprise-only
Pair-specific challenges
Migration approach
Discovery and plan verification
We audit the source Odoo Help Desk environment to confirm the plan tier (Enterprise required), API availability (Custom plan required for XML-RPC access), Odoo version, and module dependencies. We count distinct helpdesk.ticket records, helpdesk.team records, helpdesk.stage values, mail.message thread lengths, ir.attachment blob sizes, and custom field inventory (x_studio_ and x_ prefixes). We also clarify whether res.partner deduplication should use email as the primary key and whether partners with CRM activity should also migrate CRM data. The discovery output is a written migration scope document and a plan-tier gap analysis if the customer is on Standard.
Schema design for Zendesk
We design the Zendesk destination schema before any data moves. This includes creating custom ticket fields that map to Odoo's custom field inventory, configuring ticket status values that cover all Odoo stage names, provisioning Groups that map to Odoo helpdesk.teams, and preparing SLA Policy configurations from the exported Odoo SLA definitions. We also configure the Zendesk user's organization structure if the customer has requested Organization-based deduplication from res.partner. Schema is validated in a Zendesk sandbox or staging environment before production migration begins.
Customer and agent reconciliation
We extract all distinct res.partner records referenced on helpdesk.ticket (partner_id) and all distinct res.users records referenced on tickets and team memberships. Partners are deduplicated by email and mapped to Zendesk Users (with optional Organization membership). Users are matched by email against the Zendesk agent table. Any Odoo user or partner without a matching Zendesk account goes to a written reconciliation queue for the customer's admin to provision before record import resumes. Migration cannot proceed past this step because requester_id and assignee_id references must be valid at insert time.
Ticket and attachment migration
We migrate tickets in batches of 500, with the Odoo ticket ID preserved as an external_id field in Zendesk for cross-reference. After tickets are imported and validated (row count reconciliation), we migrate attachments per ticket via Zendesk's /api/v2/tickets/{id}/attachments endpoint. Attachments over 20 MB are flagged for the admin to handle separately via cloud storage links. We chunk attachment fetches per ticket to prevent Odoo database timeouts during large blob exports.
Conversation thread migration
We migrate ticket conversations (mail.message) as Zendesk ticket comments in batches, ordered by created_at to preserve thread chronology. Internal notes from Odoo are flagged during export and mapped to Zendesk's internal comment capability if the customer's Zendesk plan supports it. Message thread batches are reconciled against the source ticket comment count before moving to the next ticket to catch any dropped messages from Odoo timeout events.
Cutover, validation, and SLA rebuild handoff
We freeze writes to Odoo Help Desk during the cutover window, run a final delta migration of any records modified during the migration run, then enable Zendesk as the system of record. We deliver a written SLA policy inventory mapping each Odoo SLA to a Zendesk SLA Policy configuration, a stage mapping document for the customer's admin to reorder Zendesk statuses, and a workflow and automation inventory noting that Odoo automated actions and SLA computation logic do not migrate to Zendesk and require manual rebuild. We support a one-week post-cutover window for reconciliation issues raised by the customer's support team.
Platform deep dives
Odoo Help Desk
Source
Strengths
Weaknesses
Zendesk
Destination
Strengths
Weaknesses
Complexity grading
Standard Helpdesk migration. 2 of 7 objects need a mapping; the rest are 1:1.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Odoo Help Desk and Zendesk.
Object compatibility
2 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 Zendesk migration scoping. Not seeing yours? Book a call.
Walk through your Odoo Help Desk to Zendesk 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 Zendesk
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.