CRM migration

Migrate from InStream to Odoo CRM

Field-level mapping, validation, and rollback between InStream and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.

InStream logo

InStream

Source

Odoo CRM

Destination

Odoo CRM logo

Compatibility

67%

8 of 12

objects map 1:1 between InStream and Odoo CRM.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

Field-level fidelity

Every standard and custom field arrives verified.

Schema-aware mapping

AI proposes the map; you confirm before any record moves.

Relationships preserved

Parent–child, lookups, and ownership stay linked.

Full activity history

Calls, emails, meetings — with original timestamps.

Attachments & notes

Documents, uploads, and inline notes move with the record.

Why teams make this switch

Two sides of the same decision

Leaving

InStream logo

InStream

What's pushing teams away

  • Feature set is too basic for growing teams — users outgrow it when they need advanced automation, custom reporting, or deeper CRM capabilities.
  • Loading performance degrades occasionally, creating friction for daily users who depend on quick access to contact and deal data.
  • Integration ecosystem is narrow; users with complex tech stacks find the Gmail-Facebook-Twitter-LinkedIn-only integrations limiting.
  • Gap between Basic and Business plan pricing leaves solos and very small teams without a mid-tier option, forcing an expensive jump for additional features.

Choosing

Odoo CRM logo

Odoo CRM

What's pulling them in

  • Teams choose Odoo CRM for its modular architecture — one base install with one-click app additions means they can adopt CRM alone and add accounting, inventory, or sales later as the business grows.
  • Small businesses pick Odoo because the Community edition is free and open-source, with no per-user or contact limits, allowing full evaluation before committing to a paid Enterprise tier.
  • The drag-and-drop Kanban pipeline and AI lead scoring are highlighted across G2 reviews as concrete features that make lead management faster and more visual than spreadsheet-based workflows.
  • Odoo's native integration with email, live chat, SMS, VoIP, and WhatsApp means inbound leads from multiple channels feed into a single pipeline without third-party middleware.
  • Companies in retail, supply chain, and construction value that Odoo's CRM module shares the same PostgreSQL database and UI as its ERP modules, eliminating data silos between sales and operations.

Object mapping

How InStream objects map to Odoo CRM

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

maps to

Odoo CRM

crm.lead or res.partner

1:many
Fully supported

InStream 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

maps to

Odoo CRM

res.partner

1:1
Fully supported

InStream 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

maps to

Odoo CRM

crm.lead

1:1
Fully supported

InStream 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

maps to

Odoo CRM

crm.stage

lossy
Fully supported

InStream 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

maps to

Odoo CRM

crm.tag

lossy
Fully supported

InStream 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

maps to

Odoo CRM

mail.message

1:1
Fully supported

InStream 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

maps to

Odoo CRM

mail.message (Call subtype)

1:1
Fully supported

InStream 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

maps to

Odoo CRM

calendar.event

1:1
Fully supported

InStream 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

maps to

Odoo CRM

mail.message

1:1
Fully supported

InStream 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

maps to

Odoo CRM

crm.tag

1:1
Fully supported

InStream 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

maps to

Odoo CRM

Custom Fields on crm.lead and res.partner

lossy
Mapping required

InStream 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

maps to

Odoo CRM

res.users

1:1
Fully supported

InStream 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.

Gotchas + challenges

What specifically takes care here

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 logo

InStream gotchas

High

Free plan 100-contact cap applies to total contacts, not just active ones

Medium

Social profile enrichment does not migrate as raw data

Medium

Pipeline stage names are free-text and not normalized

Low

Custom fields schema is not publicly documented

Odoo CRM logo

Odoo CRM gotchas

High

Odoo.sh version gating blocks assisted migrations from trial

High

Enterprise modules fail to install on Community after database restore

Medium

Custom module view inheritance breaks between Odoo major versions

Medium

Custom fields risk losing their application context on Community

Low

API access for Community is gated behind the Custom Plan

Pair-specific challenges

  • Social profile enrichment does not transfer as enriched data

    InStream pulls social profile data from LinkedIn, Twitter, and Facebook at import time via external API enrichment. This enriched snapshot is linked to the external API, not stored as independent fields in InStream. When migrating out of InStream, social profile URLs transfer as plain text fields on the Contact record, but the enriched headline, job title, company size, and other API-sourced data are not available for export. We extract and map all native contact fields explicitly and store social profile URLs in custom fields on the Odoo crm.lead or res.partner. Customers relying on the enriched data for segmentation or scoring should treat this as a partial data loss item and plan to re-enrich contacts post-migration using an Odoo-compatible data enrichment tool.

  • InStream pipeline stage names are free-text with no enforced taxonomy

    InStream allows users to name pipeline stages freely, so 'Qualified Lead' in one account may have a completely different meaning and close rate in another. We capture the stage name-to-order mapping during discovery and explicitly create Odoo crm.stage records with matching names and a probability percentage set by the customer during scoping. Stage names with identical text but different intended order are disambiguated using InStream's stage sequence position. Any InStream Deals without a recognizable stage are assigned the default Odoo New stage during migration.

  • Custom field schema is not publicly documented via InStream API

    InStream does not publish its custom field definitions via a public API reference. During migration, we extract available field definitions from the InStream UI data export and cross-reference them against the destination Odoo schema. Fields that appear as free-form columns in the export are matched to Odoo field types by content inspection (date formats, numeric values, URL patterns). Any unmapped or ambiguous custom fields are flagged in the discovery report for the customer's admin to define explicitly in Odoo Studio before migration runs. This step adds one to two weeks to the discovery phase for accounts with more than five custom fields.

  • Odoo xmlrpc API has per-request rate limits requiring chunked migration

    Odoo's xmlrpc interface enforces rate limits that vary by hosting configuration (cloud-hosted Odoo Online has tighter limits than self-hosted). We handle this by chunking all batch operations into groups of 100-500 records with exponential backoff on 429 responses, and by using Odoo's ir.model.data approach for creating tag and stage configuration records before data import. Self-hosted Odoo instances may have higher or lower limits depending on server resources; we confirm the applicable limit during discovery and adjust chunk sizes accordingly.

  • InStream free plan contact cap must be confirmed before scoping

    InStream's free plan limits storage to 100 contacts total. When scoping a migration out of InStream, we confirm the plan tier and contact count in the discovery phase. Any InStream account on the free plan with more than 100 contacts will have had the data capped during use, meaning some records may not exist in the export. We flag this risk during scoping and recommend the customer upgrades to a paid plan before export begins if full record coverage is required. This gotcha is scoped from the source side rather than the destination but directly affects what data is available to migrate.

Migration approach

Six steps for a successful InStream to Odoo CRM data migration

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

  6. 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

Context on both ends of the pair

InStream logo

InStream

Source

Strengths

  • Free plan for 1 user and 100 contacts enables zero-cost evaluation.
  • Social media integration pulls LinkedIn, Twitter, and Facebook data into contact records automatically.
  • Grid view gives a visual at-a-glance summary of pipeline status across all leads.
  • Contact import is straightforward, with responsive support available during initial setup.

Weaknesses

  • CRM features are basic — no advanced automation, custom reporting, or workflow builder beyond simple lists.
  • Performance occasionally slows, which disrupts daily use for contact-heavy workflows.
  • Integration library is limited to Gmail and major social platforms, excluding many common business tools.
  • Pricing tier jump from Basic to Business is steep, leaving solos without a comfortable mid-range option.
Odoo CRM logo

Odoo CRM

Destination

Strengths

  • Modular open-source architecture lets teams start with CRM and add ERP apps as needs grow, all sharing one PostgreSQL database.
  • Free Community edition with no contact limits and full source code access means zero licensing cost for evaluation and small deployments.
  • Drag-and-drop Kanban pipeline with AI lead scoring gives a visual, prioritized view of the sales funnel without requiring custom configuration.
  • Native integrations with email, live chat, SMS, VoIP, WhatsApp, and social media feed all inbound leads into a single unified inbox.
  • Active Odoo Community Association (OCA) maintains dozens of community-maintained modules on GitHub for extended functionality.

Weaknesses

  • Gmail and email integration reliability is a recurring complaint — threads drop and conversations scatter across inboxes, disrupting sales team workflows.
  • Enterprise edition pricing stacks quickly: multiple apps at per-user rates ($25–$50/user/month) plus Odoo.sh hosting costs more than many SMBs anticipate.
  • Setup and configuration complexity increases significantly once custom fields, automation rules, and multiple installed modules are in play.
  • Odoo.sh trial databases run on a version (e.g., 18.3) that is not directly migratable to Odoo.sh, blocking the assisted migration path Odoo advertises.
  • Version upgrades between major Odoo releases (e.g., 17→18) frequently break custom module view definitions and XPath expressions, requiring manual remediation.

Complexity grading

How hard is this migration?

Standard CRM migration. 1 of 8 objects need a mapping; the rest are 1:1.

B

Overall complexity

Standard migration

Derived from compatibility, mapping clarity, API constraints, and data volume across InStream and Odoo CRM.

  • Object compatibility

    B

    1 of 8 objects need a mapping; the rest are 1:1.

  • Field mapping clarity

    C

    Field mapping is derived from defaults — final spec confirmed during the sample migration.

  • Timeline complexity

    B

    8-object category — typical timelines run 2–7 days end-to-end.

  • API constraints

    B

    InStream: Not publicly documented..

  • Data volume sensitivity

    B

    InStream doesn't expose a bulk API — REST + parallelization used for high-volume runs.

Estimator

Estimate your InStream to Odoo CRM migration cost

Rule-based pricing — no per-record fees, no manual quotes. Migrations over 2M records are scoped individually.

Step 1

What are you migrating?

Pick a category, then your source and destination platforms.

Category

FAQ

Frequently asked questions about InStream to Odoo CRM data migrations

Answers to the questions buyers ask most during InStream to Odoo CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between two and four weeks for accounts under 5,000 Contacts, 1,000 Deals, and no custom field schema requiring admin definition. Migrations with active custom field schemas (more than five fields to define), large activity histories (over 100,000 engagement records), or a self-hosted Odoo destination requiring server access coordination move to six to ten weeks because of field schema extraction, Odoo xmlrpc rate-limit chunking, and stage-configuration scope.

Adjacent paths

Related migrations to explore

Ready when you are

Move from InStream.
Land in Odoo CRM, intact.

Tell us record counts and timeline. We'll come back with a written quote inside 1 business day — no commitment, no sales pitch.

Accuracy guarantee Rollback included Quote in 1 business day