CRM migration
Field-level mapping, validation, and rollback between Streak and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Streak
Source
Odoo CRM
Destination
Compatibility
9 of 12
objects map 1:1 between Streak and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Moving from Streak to Odoo CRM is a structural migration that also represents a full context switch: Streak delivers its CRM entirely inside Gmail as a Chrome extension, while Odoo CRM is a standalone web application that is one module of a modular ERP suite. The primary migration challenge is resolving the Streak Box record — which bundles an email thread, contact data, stage history, and custom fields into one Gmail-native object — into Odoo CRM's separate Lead, Contact (Partner), and Opportunity objects. We extract Box metadata and thread associations during the discovery phase, design the Odoo pipeline configuration (stages as kanban columns), and map Box custom properties to Odoo's ir.model.data field definitions before import. We do not migrate Streak Workflows, Snippets, or Mail Merge Campaigns; we deliver a written inventory of these for the customer's admin to rebuild in Odoo's built-in automation studio or through a certified Odoo partner. Teams switching to Odoo CRM are often attracted by the ERP adjacency — the ability to connect CRM data to accounting, inventory, and project modules — but should understand that Odoo's after-sales support receives consistent criticism in user reviews, and that the CRM module alone does not include the advanced sales engagement cadence features that Streak's Mail Merge provides.
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 Streak 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.
Streak
Box
Odoo CRM
crm.lead (Lead and Opportunity)
1:manyStreak's Box is the primary CRM record, bundling the email thread, contact associations, stage history, and custom fields into one object. We split each Box into an Odoo crm.lead record. If the Box represents an unqualified prospect (early pipeline stage), it remains as an Odoo Lead. If the Box represents a qualified opportunity (later stage, associated with a known deal value), we convert it to an Opportunity in Odoo's CRM pipeline. We preserve the original Box ID as an external identifier (x_streak_box_id) on the Odoo crm.lead for traceability and re-import verification. The Box's stage history maps to Odoo's lead history tracking (mail.message records on the crm.lead) rather than a separate stage history table.
Streak
Pipeline
Odoo CRM
crm.lead Stage (stage_id)
lossyStreak Pipelines define the workflow stages a Box moves through. Each Odoo CRM pipeline is represented by a stage sequence on cdoo.crm.lead model. We create Odoo CRM stages that match Streak's pipeline stage names and ordering. If the source account has multiple Streak pipelines (one per product line or sales process), we replicate them as separate Odoo stage sequences within a single crm.lead pipeline or as separate CRM teams in Odoo. Stage probabilities from Streak (if configured) map to Odoo's probability field on crm.lead, and closed-won / closed-lost states map to the corresponding Odoo stage state.
Streak
Contact
Odoo CRM
res.partner
1:1Streak Contacts (pulled from Gmail and stored alongside Boxes) map to Odoo res.partner records. We extract contact name, email address, phone, company affiliation, and any custom contact properties. Gmail contact associations are preserved as a note on the res.partner record referencing the source Gmail contact ID. Companies associated with Streak Contacts map to separate res.partner records of type 'company' with individual contacts linked via the child_ids relationship. The primary contact on a Box becomes the res.partner record; additional shared contacts on the Box are created as separate res.partner records and linked to the Box's crm.lead via a many2many relation.
Streak
Tasks
Odoo CRM
crm.lead.task or mail.activity
1:1Streak Box-level tasks map to Odoo crm.lead tasks (crm.activity or ir.model.data tasks). Streak tasks are flat — no subtasks or dependencies — and lack date-based ordering. We map assignee, due date, task title, and completion status to Odoo's mail.activity model. If Odoo CRM is configured with the Tasks app enabled, Box tasks migrate to the Tasks module linked to the crm.lead record. We flag any Box tasks that reference a Gmail attachment (file stored in Gmail) for manual relinking post-migration because Gmail file IDs are not accessible outside the source Gmail account.
Streak
Snippets
Odoo CRM
Email Templates (mail.template)
1:1Streak Snippets are templated email text blocks with merge variables (e.g., {{contact.first_name}}). We export snippet content and merge variable syntax. Odoo uses Jinja-style template variables ({{object.partner_id.name}}) inside mail.template records. We map Streak snippet content to Odoo email templates, transforming merge field syntax from Streak's format to Odoo's format. Variable naming conventions differ between platforms, so we document the mapping table in the handoff deliverable. Note that Snippets are content templates only; they do not include scheduling or sequence logic, which resides in Streak's Mail Merge Campaign feature.
Streak
Mail Merge Campaigns
Odoo CRM
Email Campaigns (utm.campaign) + Email Templates
1:1Streak Mail Merge campaigns store recipient lists, email templates, send history, and open/reply tracking data. We export campaign metadata (name, send date, send volume) and send logs as a CSV attachment to an Odoo note on the corresponding crm.lead records. Open tracking metrics and reply rates are Streak-specific; we import these as custom fields on crm.lead (x_streak_open_rate, x_streak_reply_rate) as reference data. Odoo does not have a native sales engagement cadence feature equivalent to Streak Mail Merge; the customer rebuilds outreach sequences in a dedicated sales engagement tool (such as Mailchimp, Lemlist, or Lavender) or through Odoo's email marketing module. We do not migrate Mail Merge sequences as code.
Streak
Tags
Odoo CRM
crm.tag
1:1Streak Tags are flat labels applied to Boxes for filtering. We preserve all tag names and associations as Odoo crm.tag records linked to crm.lead via a many2many field. Tags with no associated Boxes are included as empty tag records for reconstruction in the destination. Odoo CRM's tag model is a simple shared tag pool across all leads, not per-pipeline like Streak, so we consolidate tags across pipelines during mapping.
Streak
Custom Box Properties
Odoo CRM
Custom Fields on crm.lead (ir.model.fields)
lossyStreak custom properties (dropdowns, text fields, dates, numbers, checkboxes) vary per pipeline and per Box. We discover the full property schema per pipeline during the discovery audit, then create equivalent custom fields in Odoo using Odoo Studio (or via XML data if a custom module is deployed). Odoo field types are mapped: Streak text -> char or text, Streak number -> float or integer, Streak date -> date, Streak checkbox -> boolean, Streak dropdown -> selection or many2one. Per-pipeline custom properties require per-pipeline Odoo field creation; if two pipelines share a custom property with the same name but different value sets (e.g., a dropdown with different options per pipeline), we map them to a single Odoo field with the superset of options and flag the discrepancy in the handoff document.
Streak
Attachments
Odoo CRM
ir.attachment
1:1File attachments stored inside Box threads are referenced by Gmail file ID. We export the file URL, filename, size, and attachment date. File content download requires the source Gmail account to remain active and accessible. Attachments that originated from within the Gmail thread migrate as Odoo ir.attachment records linked to the corresponding crm.lead. We flag any Box attachments that were Gmail-native files (Google Drive links, Google Docs) as external URLs in a note field rather than downloadable files, since Google Drive file access requires OAuth tokens outside FlitStack AI scope.
Streak
Team Members / Users
Odoo CRM
res.users
1:1Streak User records (email, name, role, permissions level) map to Odoo res.users. We resolve owners by email match. Shared pipeline access (Pro tier or above) maps to Odoo's internal user access controls — Odoo does not have a shared/private pipeline distinction at the same level as Streak; pipeline visibility is controlled at the record level via Odoo's access rights model. Any archived Streak users are created in Odoo as inactive users so their Box ownership records can be mapped without data loss.
Streak
Box Stage History
Odoo CRM
mail.message on crm.lead
1:1Streak preserves the chronological stage changes a Box has moved through, including the date and owner at each stage. We extract this history as a set of mail.message records attached to the migrated crm.lead, with each message recording the old stage, new stage, date, and responsible user. This preserves the pipeline audit trail inside Odoo's native activity and message thread, allowing the customer's sales team to view the full stage history without leaving the crm.lead record.
Streak
Pipeline Permissions (Enterprise)
Odoo CRM
res.groups
1:1Streak Enterprise tier includes custom roles and data validation rules. Odoo models access control through res.groups (security groups) assigned to modules. We extract Streak role definitions and permission scopes and map them to Odoo's nearest equivalent security groups (CRM / Sales / Administrator). Enterprise-specific data validation rules in Streak have no direct Odoo equivalent; we flag these as manual policy decisions for the customer's admin to implement in Odoo using domain filters on the crm.lead model or server actions.
| Streak | Odoo CRM | Compatibility | |
|---|---|---|---|
| Box | crm.lead (Lead and Opportunity)1:many | Fully supported | |
| Pipeline | crm.lead Stage (stage_id)lossy | Fully supported | |
| Contact | res.partner1:1 | Fully supported | |
| Tasks | crm.lead.task or mail.activity1:1 | Mapping required | |
| Snippets | Email Templates (mail.template)1:1 | Mapping required | |
| Mail Merge Campaigns | Email Campaigns (utm.campaign) + Email Templates1:1 | Mapping required | |
| Tags | crm.tag1:1 | Fully supported | |
| Custom Box Properties | Custom Fields on crm.lead (ir.model.fields)lossy | Mapping required | |
| Attachments | ir.attachment1:1 | Mapping required | |
| Team Members / Users | res.users1:1 | Mapping required | |
| Box Stage History | mail.message on crm.lead1:1 | Fully supported | |
| Pipeline Permissions (Enterprise) | res.groups1: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.
Streak gotchas
Free CRM tier removal catches long-time users off guard
Gmail-only is a hard migration boundary
Enterprise-only roles and data validation require permission remapping
Archived user Boxes require reactivation before export
Mail merge daily send limits gate campaign data export
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 schema audit
We audit the source Streak account across plan tier (Free legacy, Pro, Pro+, Enterprise), pipeline count, stage configuration per pipeline, custom Box properties per pipeline, Box volume, associated contact count, task count, tag taxonomy, mail merge campaign count, and archived user count. We confirm which customers are on a paid plan versus a legacy free account that may have different data export capabilities. We also identify whether the destination Odoo instance is a new deployment or an existing Odoo database (which requires a schema collision check against existing crm.lead and res.partner records). The discovery output is a written migration scope document including the Lead-to-Opportunity split rule, the per-pipeline custom property mapping table, and the Odoo stage configuration plan.
Odoo CRM pipeline and field configuration
Before any data moves, we configure the destination Odoo CRM module. This includes creating CRM stages that match Streak pipeline stage names and ordering, configuring stage probabilities, enabling the tag field on crm.lead, and creating custom fields for every Streak custom Box property using Odoo Studio (or XML data if a custom module is deployed). We also configure the Lead-to-Opportunity conversion mapping so that when an Odoo Lead is converted, the correct Partner (Contact), Opportunity, and field mappings are applied. All configuration is deployed into an Odoo staging or test database first for validation before production migration begins.
Box extraction and Lead-Opportunity split
We export all Box records from Streak via the Streak API. We apply the Lead-Opportunity split rule (defined in discovery) to classify each Box: early-stage Boxes become Odoo crm.lead records in the Lead stage; mid-to-late-stage Boxes with a deal value become crm.lead records in the Opportunity stage. We extract Box stage history as mail.message records to be attached to the crm.lead post-import. Box custom properties are transformed to Odoo field values using the field type mapping defined in discovery. Each Box is assigned a Streak external ID (x_streak_box_id) for reconciliation. Archived user Boxes are included only after the customer confirms user reactivation in Streak.
Contact and Company extraction (res.partner)
We export all Streak Contacts associated with migrating Boxes, de-duplicate by email address, and create Odoo res.partner records. For each Partner, we extract name, email, phone, company affiliation, and any custom contact properties. Company affiliations become separate res.partner records of type 'company' with the contact as a child. We resolve the Box-to-Contact linking so that each migrated crm.lead points to the correct Partner. Odoo Partner records are created before crm.lead records so that the Partner lookup is satisfied at the moment of record insert.
Production migration in dependency order
We run production migration in strict record-dependency order: res.partner (Contacts and Companies) first, then crm.lead records (Leads and Opportunities) with the stage and custom field values resolved, then mail.message stage history records, then ir.attachment records for Box attachments, then crm.tag associations, then crm.activity task records. Each phase emits a row-count reconciliation report comparing source record counts against destination inserted counts. Any records rejected by Odoo's validation rules (required fields, picklist values, etc.) are collected in a correction queue, mapped back to the source, corrected, and retried in the next batch. We use Odoo's XML-RPC API with batch chunking and exponential backoff on rate-limit responses.
Cutover, validation, and admin handoff
We freeze Streak writes during the cutover window, run a final delta migration of any records modified during the migration window, then mark Odoo as the system of record. We run a full reconciliation: total Box count vs crm.lead count, total Contact count vs res.partner count, stage distribution across the Odoo kanban view, and spot-check 25-50 random crm.lead records against the source Streak Boxes. We deliver the written inventory of Mail Merge campaigns (with send history and engagement metrics), Snippet templates (with merge variable mapping table), Workflow rules (if any on Pro+ or Enterprise), and archived user records. We support a one-week hypercare window for reconciliation issues. Post-migration admin support, Odoo email sync configuration, and Odoo CRM training are separate engagements not included in FlitStack AI standard scope.
Platform deep dives
Streak
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Streak and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Streak and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Streak 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
Streak: Not publicly documented in Streak's API docs.
Data volume sensitivity
Streak 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 Streak to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Streak 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 Streak
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.