CRM migration
Field-level mapping, validation, and rollback between Perfect Portal and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Perfect Portal
Source
Odoo CRM
Destination
Compatibility
10 of 10
objects map 1:1 between Perfect Portal and Odoo CRM.
Complexity
BStandard
Timeline
48–72 hours
Overview
Perfect Portal is a client-portal and matter-tracking tool that manages stage-based workflows for professional services and legal firms — it tracks matter progress, sends SMS notifications to clients, and allows third-party access for referrers like real estate agents. It does not have a native lead management or sales pipeline model. Odoo CRM uses crm.lead as its unified object for both inbound leads and sales opportunities, with stage_id controlling pipeline kanban positioning, probability fields, and forecast categories. The migration must translate Perfect Portal's matter-and-client structure into Odoo's lead-opportunity architecture. We map Perfect Portal contacts to res.partner records, matter records to crm.lead opportunities, and Perfect Portal's custom stage names to Odoo pipeline stage definitions. Workflows, SMS notification rules, and third-party portal access links have no equivalent in Odoo CRM — these must be rebuilt using Odoo's automation rules and portal module. Our migration reads from Perfect Portal's API export or database snapshot, transforms the matter-and-client relationship graph into Odoo's partner-lead model via XML-RPC, and delivers a field-level diff before committing the full run. A 24–48 hour delta window captures any matter updates during 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 Perfect Portal 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.
Perfect Portal
Perfect Portal Client / Contact
Odoo CRM
res.partner
1:1Perfect Portal contact records map directly to Odoo res.partner. The partner serves as the client record in Odoo CRM — name, email, phone, address, and company name transfer as standard res.partner fields. Partner type (individual vs. company) is set based on the source contact type field.
Perfect Portal
Perfect Portal Matter
Odoo CRM
crm.lead
1:1Perfect Portal matters have no direct CRM equivalent. Each matter becomes a crm.lead record in Odoo CRM with type='opportunity'. The crm.lead.name field carries the matter title, and the partner_id field links to the res.partner client record created from the corresponding Perfect Portal contact.
Perfect Portal
Perfect Portal Stage
Odoo CRM
crm.stage
1:1Perfect Portal's custom stage names (e.g., Intake, Under Review, Settlement, Closed) are mapped to Odoo pipeline stages one-by-one. The Odoo crm.stage records must be pre-created in the target pipeline before migration. Stage probability values are assigned per Odoo's stage configuration based on the nearest equivalent pipeline position.
Perfect Portal
Perfect Portal Stage History
Odoo CRM
crm.lead / mail.message
1:1Perfect Portal records the timestamp when each stage transition occurred. Odoo CRM does not store native stage-history timestamps on crm.lead. We preserve stage-entry dates as custom datetime fields (Stage_Entered_Date__c) and surface the full stage sequence as mail.message records attached to the opportunity for audit traceability.
Perfect Portal
Perfect Portal Third-Party Access (Referrer)
Odoo CRM
res.partner / crm.lead
1:1Perfect Portal allows external parties (real estate agents, mortgage brokers) to access a matter. These third-party contacts migrate as res.partner records with a custom Third_Party_Referrer__c boolean flag. Their access to a specific matter is stored as a custom m2m field on the crm.lead linking to the referrer partner record.
Perfect Portal
Perfect Portal Matter Owner / Assigned User
Odoo CRM
res.users / crm.lead
1:1Perfect Portal matter owners are resolved by email match against Odoo res.users. Unmatched owners are flagged before migration — the matter is assigned to a fallback user or the matter is held pending Odoo user provisioning. Owner history is preserved as a custom text field on crm.lead for audit purposes.
Perfect Portal
Perfect Portal Client Portal Login
Odoo CRM
res.partner / Odoo Portal
1:1Perfect Portal client portal credentials and access records have no direct Odoo equivalent. Client portal access in Odoo requires installing the Odoo Portal module and inviting partners individually. We preserve the Perfect Portal portal access status as a custom field (PP_Portal_Access__c) for reference during Odoo Portal onboarding.
Perfect Portal
Perfect Portal Matter Notes
Odoo CRM
mail.message
1:1Matter notes from Perfect Portal migrate as Odoo mail.message records attached to the crm.lead. Original author, create date, and body content are preserved. Rich-text formatting is converted to Odoo's mail template format. Notes that contain internal-vs-confidential flags are stored as message subtypes in Odoo.
Perfect Portal
Perfect Portal SMS / Notification Log
Odoo CRM
mail.message / ir.config_parameter
1:1Perfect Portal's stage-triggered SMS notifications to clients have no native Odoo equivalent. These notification records are exported as a reference file and can be used to configure Odoo SMS gateways (Odoo's Twilio or Sinch integration) post-migration. The notification log is not recreated as individual Odoo records but is preserved for rebuild reference.
Perfect Portal
Perfect Portal Custom Matter Fields
Odoo CRM
crm.lead (custom ir.model.fields)
1:1Any custom fields on Perfect Portal matters (e.g., Practice Area, Case Reference Number, Opposing Counsel) are created as custom ir.model.fields on crm.lead before migration. Field type is inferred from the source data format — text, date, selection, or float values get equivalent Odoo field types with appropriate column_index=True for search performance.
| Perfect Portal | Odoo CRM | Compatibility | |
|---|---|---|---|
| Perfect Portal Client / Contact | res.partner1:1 | Fully supported | |
| Perfect Portal Matter | crm.lead1:1 | Fully supported | |
| Perfect Portal Stage | crm.stage1:1 | Fully supported | |
| Perfect Portal Stage History | crm.lead / mail.message1:1 | Fully supported | |
| Perfect Portal Third-Party Access (Referrer) | res.partner / crm.lead1:1 | Fully supported | |
| Perfect Portal Matter Owner / Assigned User | res.users / crm.lead1:1 | Fully supported | |
| Perfect Portal Client Portal Login | res.partner / Odoo Portal1:1 | Fully supported | |
| Perfect Portal Matter Notes | mail.message1:1 | Fully supported | |
| Perfect Portal SMS / Notification Log | mail.message / ir.config_parameter1:1 | Fully supported | |
| Perfect Portal Custom Matter Fields | crm.lead (custom ir.model.fields)1: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.
Perfect Portal gotchas
No public API or documented export endpoint
Third-party access complicates data residency and privilege
Matter stages are defined per-firm and non-standardised
SMS notification logs are not independent records
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
Extract Perfect Portal data and audit relationship graph
We connect to Perfect Portal via your provided API credentials or database snapshot export. The extraction pulls all matter records, client contacts, stage history entries, third-party access records, and custom matter fields. We run a relationship audit to identify orphaned matters (no client linked), duplicate contacts, and custom field data types. This audit output becomes the field-mapping specification for Odoo.
Pre-create Odoo pipeline stages and custom fields
Before any data moves, we deliver a stage-mapping plan listing every Perfect Portal stage name mapped to the Odoo crm.stage records your Odoo admin must create. We also generate the custom field definitions (ir.model.fields) for all custom matter properties and audit fields (PP_Source_ID__c, Stage_Entered_Date__c, etc.) so they can be created in Odoo's Settings > Technical > Models area before migration validation runs.
Resolve owner and contact identity by email match
Perfect Portal matter owners are matched to Odoo res.users by email address. Unmatched owners are flagged in a pre-flight report — your team either provisions Odoo user accounts or assigns those matters to a fallback owner before the migration runs. Simultaneously, Perfect Portal client contacts are deduplicated by email and matched against existing Odoo res.partner records if any already exist in the target system.
Run sample migration with field-level diff
First we migrate a representative sample of typically 200–500 matter records, covering diverse stages and practice areas. For each sampled record we produce a field-level diff that pairs each source field value with the corresponding destination crm.lead or res.partner field. This diff lets you validate stage_id mapping, partner_id linkage, third‑party referrer assignment, and custom field population before the full dataset runs. Any mismatches are corrected in the mapping spec before committing.
Execute full migration with delta-pickup window
The full migration runs in sequence: res.partner contacts first, then crm.lead opportunities with stage_id resolution, then mail.message audit trail records. A 24–48 hour delta-pickup window opens after the bulk run, capturing any matter updates made in Perfect Portal during cutover. An audit log records every record created, updated, or skipped. One-click rollback is available if reconciliation reveals data integrity issues.
Platform deep dives
Perfect Portal
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Perfect Portal and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Perfect Portal and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Perfect Portal and Odoo CRM.
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
Perfect Portal: Not publicly documented.
Data volume sensitivity
Perfect Portal 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 Perfect Portal to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Perfect Portal 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 Perfect Portal
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.