CRM migration
Field-level mapping, validation, and rollback between InStream and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
InStream
Source
Odoo CRM
Destination
Compatibility
8 of 12
objects map 1:1 between InStream and Odoo CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from InStream to Odoo CRM is a structural migration from a simple contact-and-deal tool into an ERP-adjacent CRM that handles Leads, Opportunities, and a full activity log per record. InStream stores Contacts and Companies as separate objects with social profile enrichment pulled live from LinkedIn, Twitter, and Facebook; Odoo CRM separates company contacts (stored as Addresses on a res.partner) from individual Leads that convert to Opportunities. We extract all InStream contact fields explicitly to avoid silently dropping social data that is linked rather than stored, then map them to Odoo's crm.lead and res.partner fields with type-aware transformations. Pipeline stages migrate as Odoo CRM stage records with explicit probability percentages derived from the InStream stage order, since InStream allows free-text stage naming without enforced taxonomy. Custom fields require discovery-based field extraction from the InStream UI export because InStream does not publish its custom field schema via a public API reference. Workflows, list-segmentation automations, and integration configurations do not migrate; we deliver a written inventory of each for the customer's admin to rebuild in Odoo Studio.
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 InStream 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.
InStream
Contact
Odoo CRM
crm.lead or res.partner
1:manyInStream Contacts map to Odoo CRM crm.lead for unqualified prospects and res.partner for known companies and individuals. We evaluate each Contact's company association and activity history during migration: Contacts with an associated Company record that have not entered a pipeline stage become Odoo crm.lead records; Contacts associated with active Deals or that represent known company representatives become res.partner records. The original InStream contact ID is preserved in a custom field x_instream_id on both the lead and partner for audit trail. Email, phone, social profile URLs, notes, and all standard InStream contact fields map to typed Odoo fields.
InStream
Company
Odoo CRM
res.partner
1:1InStream Company records map directly to Odoo res.partner with partner_type set to 'company'. The InStream company name becomes res.partner.name, website maps to website, and any phone or address fields map to Odoo's address fields. The company record is created before any related Contact import so that the partner_id lookup is satisfied at insert time. InStream's free-text company industry and employee count fields map to custom fields x_instream_industry and x_instream_employee_count on res.partner.
InStream
Deal
Odoo CRM
crm.lead
1:1InStream Deals map to Odoo crm.lead with type='opportunity'. The deal value maps to expected_revenue on the Odoo opportunity. The InStream contact association becomes crm.lead.partner_id (a res.partner lookup). We resolve the partner_id reference during migration by matching the InStream contact email to the migrated res.partner record. Any InStream Deal without a linked Contact is flagged for manual review before import.
InStream
Pipeline Stage
Odoo CRM
crm.stage
lossyInStream pipeline stages are free-text and not normalized across accounts. We capture the stage name-to-order mapping during discovery and create corresponding crm.stage records in Odoo CRM with the same display name, sequence order, and probability percentage. Probability is derived from the InStream stage's historical close rate if data is available, or assigned by the customer during scoping. Each stage is created in Odoo before Deals are imported so that stage_id references are satisfied at insert time.
InStream
List
Odoo CRM
crm.tag
lossyInStream Lists are Contact groupings for segmentation. We migrate each List as an Odoo CRM Tag (ir.model.data / crm.tag). List membership maps to crm.lead.tag_ids and res.partner.category_id so that the original segmentation is preserved in the destination. Customers on InStream's paid tiers who use multiple Lists per Contact will see all original List memberships reflected as separate tag entries in Odoo. We extract the full List membership matrix during discovery to ensure no membership is silently dropped.
InStream
Activity: Email
Odoo CRM
mail.message
1:1InStream email history attached to Contacts migrates to Odoo's mail.message records on the crm.lead or res.partner chatter thread. Email body content, sender, recipient, and timestamp migrate to mail.message fields body, email_from, email_to, and date. We resolve the parent record (crm.lead or res.partner) by matching the InStream contact email to the migrated record's email field before inserting messages.
InStream
Activity: Call
Odoo CRM
mail.message (Call subtype)
1:1InStream call engagements map to Odoo mail.message records with subtype set to 'crm.mt_lead_create' or a custom call subtype, with the call duration and disposition stored in custom fields on the message. Activity timestamp maps to mail.message.date to preserve the original call ordering in the record's chatter.
InStream
Activity: Meeting
Odoo CRM
calendar.event
1:1InStream meeting records (with title, start time, end time, location, and attendees) map to Odoo calendar.event. We resolve the attendee list by matching attendee email addresses against the migrated crm.lead and res.partner records to create calendar.attendee records linked to the event. Meeting body or notes migrate as a mail.message on the related crm.lead or res.partner.
InStream
Activity: Note
Odoo CRM
mail.message
1:1InStream notes attached to Contacts and Companies migrate as Odoo mail.message records with message_type='comment' on the related crm.lead or res.partner. The note body migrates as plain text in mail.message.body. Notes without a parent record are attached to the related Company partner record.
InStream
Tag
Odoo CRM
crm.tag
1:1InStream tags on Contact records migrate to Odoo crm.tag entries on crm.lead and res.partner. We extract the full tag vocabulary during discovery, deduplicate any synonyms (a tag called 'Enterprise' and another called 'enterprise' are treated as the same tag in Odoo), and create the tag records before the Contact-to-lead migration phase.
InStream
Custom Fields
Odoo CRM
Custom Fields on crm.lead and res.partner
lossyInStream custom fields have no publicly documented schema via API. We extract available field definitions from the InStream UI export during discovery, cross-reference them against Odoo's field types (char, text, integer, float, date, datetime, selection, many2one, many2many), and create equivalent custom fields on the crm.lead model via Odoo Studio before migration begins. Any fields that cannot be typed from the UI export are flagged in the discovery report for manual definition by the customer's admin.
InStream
Owner
Odoo CRM
res.users
1:1InStream Owner references on Contact, Company, and Deal records map to Odoo res.users by email match. We extract every distinct Owner email during discovery and match against the destination Odoo instance's user table. Owners without a matching Odoo User go to a reconciliation queue for the customer's admin to provision before record import resumes. User provisioning is outside migration scope.
| InStream | Odoo CRM | Compatibility | |
|---|---|---|---|
| Contact | crm.lead or res.partner1:many | Fully supported | |
| Company | res.partner1:1 | Fully supported | |
| Deal | crm.lead1:1 | Fully supported | |
| Pipeline Stage | crm.stagelossy | Fully supported | |
| List | crm.taglossy | Fully supported | |
| Activity: Email | mail.message1:1 | Fully supported | |
| Activity: Call | mail.message (Call subtype)1:1 | Fully supported | |
| Activity: Meeting | calendar.event1:1 | Fully supported | |
| Activity: Note | mail.message1:1 | Fully supported | |
| Tag | crm.tag1:1 | Fully supported | |
| Custom Fields | Custom Fields on crm.lead and res.partnerlossy | Mapping required | |
| Owner | res.users1: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.
InStream gotchas
Free plan 100-contact cap applies to total contacts, not just active ones
Social profile enrichment does not migrate as raw data
Pipeline stage names are free-text and not normalized
Custom fields schema is not publicly documented
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
Discovery and export preparation
We audit the InStream account across plan tier, contact count, company count, deal count, pipeline stage list, list membership matrix, engagement volume (emails, calls, meetings, notes), tag vocabulary, and any custom fields visible in the UI export. We confirm the plan tier and contact count to identify whether the free plan cap affects scope. We extract data via InStream's CSV export and API where available, handling the API's pagination and the UI export's field limitations. The discovery output is a written migration scope, field mapping draft, and a list of any custom fields that require admin definition in Odoo Studio.
Odoo environment readiness
We confirm the destination Odoo instance version, edition (Community or Enterprise), and whether it is cloud-hosted or self-hosted. We verify access to the Odoo CRM module, confirm the xmlrpc API endpoint and applicable rate limits, and validate that the migration user has sufficient write access to crm.lead, res.partner, crm.stage, crm.tag, mail.message, and calendar.event models. If the Odoo instance is self-hosted, we coordinate with the customer's server admin to confirm network access and any IP allowlisting requirements.
Schema configuration in Odoo
We configure the destination Odoo CRM schema before data import. This includes creating crm.stage records matching the InStream pipeline stage names and order, creating crm.tag records from the InStream list and tag vocabulary, creating custom fields on crm.lead and res.partner for any InStream native fields not covered by Odoo's standard field names, and creating custom fields for social profile URL storage and the InStream record ID audit field. Configuration is done via Odoo Studio or direct xmlrpc metadata calls into a Sandbox environment first for validation.
Sandbox migration and reconciliation
We run a full migration into an Odoo Sandbox or test database using production-like data volume. The customer's admin reconciles record counts (Contacts in, Leads in, Partners in, Deals in, Activities in), spot-checks 20-40 random records against the InStream source export, and validates that tag membership and stage assignments match the original. Any field mapping corrections, stage probability adjustments, or custom field type changes happen in this phase and are validated again before production migration begins.
Production migration in dependency order
We run production migration in record-dependency order: crm.stage and crm.tag configuration records first (so all foreign keys are satisfied), then res.partner for Companies, then res.partner for Contacts (with partner_id resolved for company-linked contacts), then crm.lead for Deals (with partner_id resolved and stage_id mapped), then mail.message activity history (with parent record resolved by email match), then calendar.event meetings (with attendee resolution), and finally tag assignments on crm.lead and res.partner. Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and workflow rebuild handoff
We freeze InStream writes during cutover, run a final delta migration of any records modified during the migration window, then enable Odoo CRM as the system of record. We deliver a written inventory of every InStream List and Tag with its Odoo equivalent, every pipeline stage mapping with probability, and every custom field created in Odoo with its source field name from InStream. We do not rebuild InStream automations or list-segmentation workflows as Odoo server actions; those are documented for the customer's admin to configure in Odoo Studio post-migration.
Platform deep dives
InStream
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 InStream 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
InStream: Not publicly documented..
Data volume sensitivity
InStream 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 InStream to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your InStream 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 InStream
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.