CRM migration
Field-level mapping, validation, and rollback between Phreesia and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Phreesia
Source
Odoo CRM
Destination
Compatibility
10 of 10
objects map 1:1 between Phreesia and Odoo CRM.
Complexity
BStandard
Timeline
5–10 business days
Overview
Phreesia is a healthcare-dedicated patient intake and activation platform built around digital registration pads, insurance eligibility checks, and clinical screening forms. It does not expose a conventional CRM object model — data lives as patient records, intake form submissions, insurance captures, and appointment timestamps. Odoo CRM uses crm.lead for both leads and opportunities, res.partner as the unified contact/company record, and stores custom fields directly on those models. The migration challenge is that Phreesia's form-driven, healthcare-specific data types have no native Odoo equivalents: intake answers, clinical screening results, and appointment references must be mapped to custom fields on crm.lead or res.partner, and patient records that represent only demographic containers need to be evaluated against Odoo's partner model to avoid creating duplicate entries. FlitStack AI sequences the export from Phreesia's API as structured records, transforms intake form fields into Odoo custom fields, resolves owner email addresses against Odoo system users, and performs a test migration of 50–200 records with a field-level diff before committing the full dataset. Automations and intake workflows that govern Phreesia's patient experience do not migrate — they must be rebuilt using Odoo's activity scheduling and automation rules.
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 Phreesia 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.
Phreesia
Patient Record
Odoo CRM
res.partner
1:1Phreesia patient records map to Odoo res.partner as the primary contact record. The res.partner record stores name, email, phone, address, and custom fields for all intake and clinical data. If the patient record contains both individual and guarantor information, the guarantor maps to a separate res.partner record linked via the parent_id field.
Phreesia
Insurance Capture
Odoo CRM
res.partner (custom fields)
1:1Phreesia stores insurance carrier name, plan type, group number, subscriber ID, and coverage effective date on the patient record. These map to custom Char, Char, Char, Char, and Date fields on res.partner created in Odoo before migration. Each payer type requires its own field mapping row in the migration plan.
Phreesia
Intake Form Submission
Odoo CRM
res.partner (custom fields) + ir.attachment
1:1Structured intake answers (responses to custom clinical and demographic questions) migrate to custom fields on res.partner keyed by question ID. Free-text or signature-based form responses migrate as PDF attachments linked via ir.attachment to the res.partner record, preserving the original submission timestamp and provider context.
Phreesia
Clinical Screening Result
Odoo CRM
crm.lead (custom fields)
1:1Phreesia's clinical screening module captures patient-reported health data (PHQ-9, screenings for social needs, vitals, etc.) organized by screening type and result value. These migrate to custom fields on crm.lead because Odoo uses lead records to track the initial outreach context before a patient becomes an active partner record.
Phreesia
Appointment / Visit Record
Odoo CRM
crm.lead + mail.message
1:1Phreesia appointment dates, appointment types, provider names, and visit outcomes map to custom Date, Char, and Selection fields on crm.lead. Visit notes and clinical outcome summaries migrate as mail.message records attached to the lead, preserving the original timestamp so Odoo's activity timeline shows the full patient interaction history.
Phreesia
Referral Source
Odoo CRM
crm.lead.source_id
1:1Phreesia tracks how patients arrived, including physician referral, self-referral, urgent care transfer, and marketing campaign attribution. Referral source maps to crm.lead.source_id using a value-by-value mapping between Phreesia's source taxonomy and Odoo's utm.source records. Any referral sources that do not have an existing utm.source counterpart automatically create new utm.source entries during the migration process to ensure complete source attribution.
Phreesia
Payment / Collection Record
Odoo CRM
account.move (custom link)
1:1Phreesia processes payments at time of service and tracks collection history as part of its revenue cycle module. Odoo accounting (account.move) handles invoicing separately. Payment transaction IDs and amounts migrate as a custom Char field on res.partner for reference, but the full financial transaction history requires Odoo's accounting module installation and configuration to reconstruct.
Phreesia
User / Owner
Odoo CRM
res.users
1:1Phreesia staff assignments (provider, care coordinator, front-desk user) map to res.users by email address resolution. Unmatched owners are flagged before migration and either assigned to a fallback Odoo user or left as custom Char fields on the record until admin resolution. Odoo's multi-company model requires company_id assignment alongside user assignment.
Phreesia
Consent Record
Odoo CRM
ir.attachment + crm.lead (custom fields)
1:1Phreesia captures electronic consent signatures for HIPAA, treatment consent, and financial policy as part of intake. Signed consent documents migrate as PDF attachments linked to res.partner. Consent type and capture timestamp migrate as custom Selection and Date fields for quick filtering in Odoo without opening each attachment.
Phreesia
Custom Intake Fields
Odoo CRM
res.partner / crm.lead custom fields
1:1Any Phreesia custom intake fields unique to an organization's registration workflow migrate as Odoo custom fields on the appropriate model (res.partner for patient demographics, crm.lead for outreach context). Field type mapping follows: text answers to Char/Text, numeric answers to Float/Integer, yes/no to Boolean, and multi-select to Selection fields in Odoo.
| Phreesia | Odoo CRM | Compatibility | |
|---|---|---|---|
| Patient Record | res.partner1:1 | Fully supported | |
| Insurance Capture | res.partner (custom fields)1:1 | Fully supported | |
| Intake Form Submission | res.partner (custom fields) + ir.attachment1:1 | Fully supported | |
| Clinical Screening Result | crm.lead (custom fields)1:1 | Fully supported | |
| Appointment / Visit Record | crm.lead + mail.message1:1 | Fully supported | |
| Referral Source | crm.lead.source_id1:1 | Fully supported | |
| Payment / Collection Record | account.move (custom link)1:1 | Fully supported | |
| User / Owner | res.users1:1 | Fully supported | |
| Consent Record | ir.attachment + crm.lead (custom fields)1:1 | Fully supported | |
| Custom Intake Fields | res.partner / crm.lead custom fields1: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.
Phreesia gotchas
PM/EHR integration configuration must be validated before patient data import
Custom intake forms lack a standard schema export
Phreesia is an intake platform, not a longitudinal patient database
Patient secure authentication links are time-limited and non-migratable
Payment plan configurations require manual reconciliation
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
Discover Phreesia data inventory and define Odoo custom field schema
FlitStack AI inventories all Phreesia record types — patient records, insurance captures, intake form submissions, clinical screening results, appointment records, and consent documents — and catalogs every distinct field and field type present in the export. We then generate an Odoo custom field specification: field names (using Odoo's naming convention), field types (Char, Selection, Float, Date, Boolean, Text), and target model (res.partner for demographics and insurance, crm.lead for outreach and clinical context). The Odoo administrator creates these fields before the migration run. This step also identifies multi-location Phreesia accounts and sequences separate export jobs per location.
Export Phreesia records via API and stage for transformation
Using Phreesia's REST API with read-only credentials, FlitStack AI extracts patient records, insurance captures, intake form submissions, and appointment data as structured JSON. The export respects Phreesia's pagination and rate limits with exponential backoff to avoid throttling. Each record is tagged with its source location ID and original Phreesia record identifier (stored as phreesia_record_id__c on the destination record). Consent PDFs are downloaded as binary blobs and staged for re-upload as Odoo ir.attachment records. Insurance records are linked to their parent patient record by Phreesia relationship ID before transformation begins.
Transform data to Odoo schema and resolve owner assignments by email
FlitStack AI transforms each Phreesia record into Odoo XML-RPC payloads for res.partner and crm.lead. Patient records write to res.partner first (required for foreign-key resolution on crm.lead). Owner resolution matches Phreesia staff email addresses against res.users.login in Odoo; unmatched owners are flagged in a pre-flight report and assigned to a fallback Odoo user or left as a custom Char field pending admin resolution. Insurance carrier names are resolved against a reference table of common payer names to enable future eligibility integration. Referral sources are mapped to utm.source records by value; unmapped sources create new utm.source entries during this step.
Run test migration with field-level diff on 50–200 representative records
A representative slice of records — covering each intake form variant, multiple insurance carrier types, clinical screening records, and records from each Phreesia location — is migrated to a staging Odoo database. FlitStack AI generates a field-level diff report comparing every source field value against its destination field value. The report highlights: custom fields that did not write (type mismatch or missing field in Odoo), truncated text values (Odoo Char limits), unmapped pick-list values that defaulted to 'unknown', and records where owner resolution failed. The Odoo administrator reviews the diff and FlitStack AI applies corrections before the full run.
Execute full migration with delta-pickup window and audit log
The full Phreesia dataset migrates to the production Odoo instance via XML-RPC in batches of 100–500 records per API call, with Odoo's xmlrpc_import hook used for bulk operations where available. A delta-pickup window of 24–48 hours captures any records created or modified in Phreesia during the migration run. All operations — create, link, attach — are logged to FlitStack AI's audit trail with source record ID, destination record ID, timestamp, and operator. One-click rollback reverts all records created during the migration run if the Odoo administrator rejects the result. After rollback window closes, the FlitStack team delivers a migration summary report showing record counts, attachment counts, owner resolution rate, and any unmapped fields requiring manual follow-up.
Platform deep dives
Phreesia
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Phreesia and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Phreesia and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Phreesia 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
Phreesia: Not publicly documented.
Data volume sensitivity
Phreesia 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 Phreesia to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Phreesia 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 Phreesia
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.