CRM migration
Field-level mapping, validation, and rollback between Pega Platform and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Pega Platform
Source
Odoo CRM
Destination
Compatibility
12 of 14
objects map 1:1 between Pega Platform and Odoo CRM.
Complexity
BStandard
Timeline
72–120 hours
Overview
Pega Platform structures data around cases (work objects) with assignments, data pages, and process stages managed through a low-code BPM engine. Odoo CRM uses a conventional CRM model: leads that convert to opportunities, tracked in pipeline stages with Kanban views and activity logging. These architectural differences make a direct one-to-one migration impossible — Pega's entire case hierarchy has no native Odoo equivalent and must be deliberately mapped into Odoo's object model. We export Pega data via the Pega REST API (Data Object endpoints, Data Page reads, and case export), then map every case type, data page field, and assignment into the corresponding Odoo lead, opportunity, or partner record. Pega workflows, automations, and process rules do not migrate — they must be rebuilt in Odoo using Odoo's action rules and automation tools. Custom data objects defined in Pega's App Studio become custom fields on Odoo leads or opportunities. During migration we run a scoped-read session on Pega, capture all records, and run a delta-pickup window to catch in-flight cases before cutover so Odoo CRM reflects the final state of your Pega work queue at go-live.
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 Pega Platform 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.
Pega Platform
Pega Case (Work-Object)
Odoo CRM
Odoo crm.lead (Lead)
1:1Each Pega case maps to one Odoo lead. The Pega case pxInsCachedKey is stored in a custom field (Source_Case_ID__c) for traceability. pyID (human case number) maps to a reference custom field. Case creation timestamp becomes lead create_date. If the Pega case type corresponds to a sales opportunity, the Odoo lead can be converted to a crm.lead opportunity via Odoo's lead-conversion action.
Pega Platform
Pega Case
Odoo CRM
Odoo crm.lead converted to opportunity
1:manyCases where pyStatusWork indicates a won or active deal split to an Odoo opportunity (crm.lead with type='opportunity'). Cases where pyStatusWork indicates a prospect, new, or pending status map to an Odoo lead with type='lead'. The split rule is configurable per case type — your migration plan defines the threshold rule for when a Pega case becomes an Odoo opportunity versus a lead.
Pega Platform
Pega Data Page (scalar property)
Odoo CRM
Odoo custom field on crm.lead
1:1Pega Data Pages with scalar properties (string, integer, boolean) become Odoo Char, Integer, or Boolean custom fields on the crm.lead model. The field name in Odoo is derived from the Data Page name (lowercased, underscores replacing spaces). For pick-list type Data Pages, an Odoo Selection field is created and value-by-value mapping is applied. Each custom field is created before migration runs so the ETL can write values on first pass.
Pega Platform
Pega Data Page (page group / embedded)
Odoo CRM
Odoo custom field + related record
many:1Pega Data Pages that contain embedded sub-pages (page group mode) require flattening: each scalar sub-property maps to a separate Odoo custom field on the lead. Where a sub-page represents a related entity (e.g., a contact embedded in the case), the embedded data is normalized into a separate res.partner record and linked via a many2one custom field on the lead. This prevents data duplication and preserves the relationship in Odoo's relational model.
Pega Platform
Pega Assignment (pyAssignment)
Odoo CRM
Odoo mail.activity
1:1Each Pega assignment maps to an Odoo mail.activity record attached to the corresponding lead. The activity type (call, meeting, email, upload) is inferred from the Pega assignment action label (e.g., 'Review' → note; 'Phone Call' → phone call). The Pega operator assigned to the assignment is resolved by email match to an Odoo res.users record. If no match is found, the activity is assigned to a fallback Odoo user and flagged in the migration report.
Pega Platform
Pega Workbasket / Worklist
Odoo CRM
Odoo crm.team
1:1Pega workbaskets (Data-Admin-Work-Basket) map to Odoo crm.team records. The Pega workbasket name becomes the team name; operators assigned to the workbasket map to crm.team.member records linked to the corresponding Odoo sales rep. Note that Pega's workbasket is a shared queue — Odoo's team model assigns a lead to one sales rep at a time. If the Pega case was in a shared basket (not individually assigned), the Odoo lead is assigned to the team with a null user_id, and Odoo's lead assignment rules handle routing.
Pega Platform
Pega Case Attachment
Odoo CRM
Odoo ir.attachment
1:1Pega file attachments (pyAttachments) are downloaded from Pega's document storage and re-uploaded to Odoo's ir.attachment table linked to the corresponding crm.lead record. The original filename, MIME type, and create date are preserved. Large file handling follows Odoo's attachment storage configuration (file system or external storage). Inline images embedded in Pega case notes are extracted, saved as files, and the HTML note in Odoo is updated to reference the re-hosted image URL.
Pega Platform
Pega Case Note (pyNote)
Odoo CRM
Odoo mail.message
1:1Pega case notes (pyNote, case-wide notes, assignment notes) map to Odoo mail.message records with note subtype. The message body carries the original note text; author is resolved by operator email to Odoo res.users. Timestamps are preserved. HTML-formatted Pega notes are stripped to plain text unless the target Odoo instance has the mail extension installed, in which case basic HTML is preserved.
Pega Platform
Pega Operator / Work Group
Odoo CRM
Odoo res.users + crm.team
1:1Pega operators (Data-Admin-Operator-ID) are matched to Odoo res.users by email address. Unmatched operators are flagged and can be invited to Odoo before migration or assigned to a placeholder user. Pega Work Groups map to crm.team: the group name becomes the team name, and group members (operators) are added as team members linked to their Odoo user accounts.
Pega Platform
Pega SLA (pySLAName, pySLADeadline)
Odoo CRM
Odoo custom field on crm.lead
1:1Pega SLA metadata stored on assignments (pySLAName, pySLADeadline, pySLARemaining) has no Odoo native equivalent. These values are migrated as custom Char and Datetime fields on crm.lead. Odoo's native SLA tracking requires the Discuss SLA module (Enterprise) or a third-party app from the Odoo Apps store — we document the recommended app and configuration for post-migration SLA setup.
Pega Platform
Pega pyStatusWork (case status)
Odoo CRM
Odoo stage_id + custom status field
1:1Pega pyStatusWork values (e.g., New, Open, Pending-Approval, Resolved-Completed, Resolved-Cancelled) are mapped to Odoo CRM stage_id values by a value-mapping table. The mapping is defined in the migration plan: Odoo stages are pre-created to correspond to Pega status values. If a Pega status has no equivalent Odoo stage, it maps to the nearest stage and the original Pega status value is preserved in a custom Char field (Source_Status__c).
Pega Platform
Pega Custom Data Object (App Studio)
Odoo CRM
Odoo custom field or related model
1:1Pega custom Data Objects created in App Studio (not standard case types) map to either Odoo custom fields on the lead (if the object is a property bag attached to the case) or a separate Odoo model (ir.model) if the object is a first-class entity with its own lifecycle. The mapping decision is made during the migration planning phase based on whether the Pega Data Object has independent records or only exists as case-embedded data.
Pega Platform
Pega Customer Data (pyCustomerID)
Odoo CRM
Odoo res.partner
1:1Where a Pega case references a customer identifier (pyCustomerID) that corresponds to an external party record, we look up the Pega Data Page for that customer and map the record to an Odoo res.partner. If the Pega case embeds contact details (name, email, phone) directly in the case, those fields are extracted and used to create or match an Odoo partner record. The res.partner.id is then linked to the crm.lead via the partner_id field.
Pega Platform
Pega Case Priority (pyPriority)
Odoo CRM
Odoo priority field + custom
1:1Pega pyPriority values (integer 1–5 scale or label-based priority) map to Odoo's priority field (stars: 1–5 on crm.lead) using a value-mapping table. If Pega uses a named priority (Critical, High, Medium, Low), we create a custom selection field on crm.lead with the same labels. The mapping preserves the relative ordering so that high-priority Pega cases land as high-priority Odoo leads.
| Pega Platform | Odoo CRM | Compatibility | |
|---|---|---|---|
| Pega Case (Work-Object) | Odoo crm.lead (Lead)1:1 | Fully supported | |
| Pega Case | Odoo crm.lead converted to opportunity1:many | Fully supported | |
| Pega Data Page (scalar property) | Odoo custom field on crm.lead1:1 | Fully supported | |
| Pega Data Page (page group / embedded) | Odoo custom field + related recordmany:1 | Fully supported | |
| Pega Assignment (pyAssignment) | Odoo mail.activity1:1 | Fully supported | |
| Pega Workbasket / Worklist | Odoo crm.team1:1 | Fully supported | |
| Pega Case Attachment | Odoo ir.attachment1:1 | Fully supported | |
| Pega Case Note (pyNote) | Odoo mail.message1:1 | Fully supported | |
| Pega Operator / Work Group | Odoo res.users + crm.team1:1 | Fully supported | |
| Pega SLA (pySLAName, pySLADeadline) | Odoo custom field on crm.lead1:1 | Fully supported | |
| Pega pyStatusWork (case status) | Odoo stage_id + custom status field1:1 | Fully supported | |
| Pega Custom Data Object (App Studio) | Odoo custom field or related model1:1 | Fully supported | |
| Pega Customer Data (pyCustomerID) | Odoo res.partner1:1 | Fully supported | |
| Pega Case Priority (pyPriority) | Odoo priority field + custom1: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.
Pega Platform gotchas
Version upgrades deprecate rules and break existing applications
Constellation UI migration requires explicit rule rewrites
Pega Robotics requires separate export tooling
Data Set exports require chunked reads for large volumes
Decision Rule logic does not port automatically to non-Pega destinations
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
Analyze Pega case types, data pages, and data objects via API
We connect to your Pega environment via the Pega REST API using operator credentials with case read and data page access permissions. We enumerate all case types, retrieve Data Object schemas from App Studio, and capture Data Page property definitions (scalar vs. page-group mode). The output is a migration schema document listing every Pega case type, its data pages, assignment history depth, attachment count, and the workbasket/workgroup structure. This document drives the Odoo custom field creation plan and the value-mapping table for pyStatusWork and pyPriority.
Create Odoo custom fields and configure pipeline stages
Before data moves, your Odoo administrator (or our team) creates the custom fields on crm.lead and res.partner identified in the schema analysis. SLA fields (SLA_Name__c, SLA_Deadline__c), source traceability fields (Source_Case_ID__c, Source_Status__c, Source_Priority__c), and urgency fields are added as Char, Datetime, Float, or Selection types per the mapping plan. Pipeline stages are pre-created to correspond to Pega pyStatusWork values so the value-mapping table has target stages to write to on first pass. If Pega case types need separate pipelines, separate Odoo CRM teams and stage sequences are configured.
Match Pega operators to Odoo users by email and configure sales teams
Pega operator IDs are resolved against Odoo res.users records by matching the operator email address to the Odoo user's login email. Unmatched operators are listed in a pre-flight report: your team either creates Odoo user accounts for them before migration or assigns their cases to a fallback Odoo user. Pega Work Groups are mapped to Odoo crm.team records: the group name becomes the team name, and matched operators are added as team members. This step ensures every Pega case assignment has a target user_id or team_id in Odoo before the migration run begins.
Run a sample migration of 200–500 Pega cases with field-level diff
A representative sample of Pega cases (spanning different case types, status values, priority levels, and attachment sizes) is migrated to Odoo in a test run. We generate a field-level diff report comparing source Pega field values against the migrated Odoo record values. You verify pyStatusWork-to-stage_id mapping, pyPriority-to-priority mapping, operator-to-user resolution, and SLA field population. The diff report surfaces any value-mapping gaps or data-page field misses so the mapping plan can be corrected before the full migration commits.
Execute full migration with delta-pickup and audit log
The full Pega case export runs via the Pega REST API, processing cases in dependency order (data pages first, then cases, then assignments, then attachments). An audit log records every record written to Odoo with source record reference. After the initial run, a delta-pickup window (typically 24 hours) captures any Pega cases modified or created during the cutover. The delta records are merged into the Odoo dataset. One-click rollback reverts all migrated records if reconciliation fails. After rollback is confirmed clear, the migration is marked complete and your team has read access to both Pega and Odoo during the handover period.
Platform deep dives
Pega Platform
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 Pega Platform 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
Pega Platform: Not publicly documented; rate limits are enforced per API plan and vary by Pega Cloud environment.
Data volume sensitivity
Pega Platform exposes a bulk API — large-volume migrations stream efficiently.
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 Pega Platform to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Pega Platform 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 Pega Platform
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.