CRM migration
Field-level mapping, validation, and rollback between Alpine IQ and Odoo CRM. We move data and schema; workflows are rebuilt natively in Odoo CRM.
Alpine IQ
Source
Odoo CRM
Destination
Compatibility
10 of 12
objects map 1:1 between Alpine IQ and Odoo CRM.
Complexity
BStandard
Timeline
4-6 weeks
Overview
Alpine IQ and Odoo CRM occupy fundamentally different positions in the software stack. Alpine IQ is a purpose-built customer engagement platform for regulated retail markets, with deep POS integrations, behavioral segmentation, and cannabis compliance tooling baked into every layer. Odoo CRM is the CRM module inside a full ERP suite that consolidates sales, inventory, accounting, and point-of-sale into a single database. Moving from Alpine IQ to Odoo CRM means trading specialized loyalty and compliance features for a unified operational view, but it also means rebuilding loyalty programs, re-mapping POS integrations, and re-implementing compliance flags that Alpine IQ handled natively. We extract Personas, Orders, opt-in records, and loyalty point balances via Alpine IQ's REST endpoints, map them to Odoo's Contact, crm.lead, and custom fields, and preserve the original loyalty tier and attribution parameters as custom properties. We do not migrate Flows, Audiences as automation triggers, or compliance configuration rules; these require manual rebuild in Odoo.
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 Alpine IQ 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.
Alpine IQ
Personas (Contacts)
Odoo CRM
Contact
1:1Alpine IQ Personas map directly to Odoo CRM Contacts. We extract every standard PII field (name, phone, email, birthdate, gender, address) via the /api/v2/loyalty POST endpoint and POST each contact to Odoo's /res.partner endpoint. The Alpine IQ med_id (medical cannabis patient ID) migrates to a custom contact field med_id that must be created in Odoo before migration begins. We also map Alpine IQ source integration IDs (tracking which POS created the contact) to a custom field legacy_source_id for audit continuity.
Alpine IQ
Orders
Odoo CRM
crm.lead (Opportunity) + custom Order record
1:manyAlpine IQ Orders carry the richest migration signal: order ID, status, timestamps, customer PII, item data (product name, category, SKU, brand, price, discount), payment details, and attribution parameters. We map order data to an Odoo custom sale_order record linked to the Contact via partner_id. The Alpine IQ attr parameter (campaign attribution) migrates as a custom field on the order record for campaign ROI reporting. POS integration source ID on the order migrates to a custom field for multi-location reconciliation.
Alpine IQ
Opt-In Records
Odoo CRM
Contact (opt_in field)
1:1Email and SMS opt-in status from Alpine IQ's /api/v2/optin endpoints migrates as boolean fields on the Odoo Contact. We set opt_in_email and opt_in_sms custom fields and set Odoo's standard blocking fields (block_email, block_sms) if the contact has suppressed status. GDPR consent timestamps migrate to a custom field consent_date for compliance audit.
Alpine IQ
Loyalty Programs (Points and Tiers)
Odoo CRM
Contact custom fields
1:1Loyalty point balances and tier names are stored on the Alpine IQ Persona record. We extract both as numeric and text custom fields (loyalty_points__c, loyalty_tier__c) on the Odoo Contact. Point expiration rules, tier progression thresholds, and reward eligibility are configuration-level settings in Alpine IQ that do not export; we flag these as a rebuild requirement and recommend the customer request a loyalty program export snapshot before migration to document reward structures.
Alpine IQ
Discount Groups
Odoo CRM
Custom field or pricelist rule
1:1Alpine IQ discount groups define customer eligibility for POS discount rules. We export discount group membership as a multi-select text custom field on the Odoo Contact (discount_group__c). The Odoo Pricelist module can replicate discount eligibility logic, but the customer's admin must configure the discount rules post-migration based on the exported snapshot.
Alpine IQ
Audiences
Odoo CRM
Contact Tags
1:1Alpine IQ Audiences are segmented contact groups used for campaign targeting. Audience membership (contact ID plus points multiplier per audience) migrates as Odoo Contact Tags. Multiplier values migrate to a custom field audience_multiplier__c per tag. Dynamic behavioral segmentation rules in Alpine IQ do not transfer; Odoo Tags are static lists that require manual rebuild by the customer's marketing team.
Alpine IQ
Store / Location Mappings
Odoo CRM
Custom field on Contact
lossyMulti-location Alpine IQ accounts map each integration or data source to a specific store location, with exact name matching required between Alpine IQ and the connected POS. We extract the full store mapping configuration and store it as a custom field favorite_store__c on each Contact. The customer's admin must validate store name alignment in Odoo POS before loyalty redemption functions. Mismatched store names between Alpine IQ and Odoo POS will break attribution and customer lookup.
Alpine IQ
Attribution Parameters
Odoo CRM
Custom field on Order
1:1The attr URL parameter and order-level attribution tracking in Alpine IQ store campaign attribution values in the Order object. We migrate these as custom fields on the Odoo sale_order record (campaign_source__c, campaign_medium__c, campaign_name__c) so the customer's admin can rebuild campaign ROI reporting in Odoo without referencing Alpine IQ.
Alpine IQ
Custom Contact Properties
Odoo CRM
Custom fields on Contact
1:1Alpine IQ supports custom fields on Persona records that can be set via override endpoints. We export all custom properties alongside standard fields and create matching custom fields on the Odoo Contact object before migration. Field type mapping follows Odoo's allowed types: text fields for strings, numeric fields for integers and floats, date fields for dates. Boolean custom properties map to Odoo boolean fields.
Alpine IQ
Integration Source IDs
Odoo CRM
Custom field on Contact
1:1Every Alpine IQ contact carries a source ID from the POS or integration that created it. The /api/v1/piis/:uid/bySrcID endpoint allows lookup by source ID. We preserve all source IDs as a custom field legacy_source_id on the Odoo Contact for cross-reference and audit purposes. This field cannot be used as a dedupe key in Odoo but serves as a backstop for reconciliation.
Alpine IQ
Flow Events
Odoo CRM
Note or custom activity log
1:1Alpine IQ Flows are automation triggers based on events like order_created, order_completed, cart_abandoned, and behavioral signals. We export the event history as Odoo Note records linked to the Contact for audit completeness. Odoo has no native Flow automation equivalent; the customer's admin must evaluate Odoo Server Actions or a third-party automation app (such as Automate2) to rebuild behavioral triggers.
Alpine IQ
Push Notification IDs
Odoo CRM
Not migrated
1:1Mobile wallet push notification IDs are device-specific platform tokens stored via Alpine IQ's /api/v1.1/contact/addPushID. These tokens cannot transfer between systems and are invalid once the customer moves to a new CRM. We export push ID records as a reference file for the customer's admin to re-enable push notifications post-migration in Odoo's mobile app context.
| Alpine IQ | Odoo CRM | Compatibility | |
|---|---|---|---|
| Personas (Contacts) | Contact1:1 | Fully supported | |
| Orders | crm.lead (Opportunity) + custom Order record1:many | Fully supported | |
| Opt-In Records | Contact (opt_in field)1:1 | Fully supported | |
| Loyalty Programs (Points and Tiers) | Contact custom fields1:1 | Mapping required | |
| Discount Groups | Custom field or pricelist rule1:1 | Mapping required | |
| Audiences | Contact Tags1:1 | Mapping required | |
| Store / Location Mappings | Custom field on Contactlossy | Fully supported | |
| Attribution Parameters | Custom field on Order1:1 | Fully supported | |
| Custom Contact Properties | Custom fields on Contact1:1 | Mapping required | |
| Integration Source IDs | Custom field on Contact1:1 | Fully supported | |
| Flow Events | Note or custom activity log1:1 | Mapping required | |
| Push Notification IDs | Not migrated1:1 | Mapping required |
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.
Alpine IQ gotchas
Blocklist contacts excluded from standard API GET
Store name matching required for loyalty attribution
Initial integration sync delay up to 24 hours
Points and tier expiration logic not exported
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 Alpine IQ API audit
We audit the source Alpine IQ account across integration connections, POS store mappings, audience count and membership size, loyalty program tier count, custom contact properties, order volume, and blocklist volume. We extract the full loyalty program configuration snapshot (point values, tier names, reward structures) for documentation. We confirm whether the customer uses Flow automation, event triggers, or behavioral segments and flag these as non-migratable with a rebuild handoff document. The discovery output is a written migration scope covering record counts, field mapping inventory, and a pre-migration Odoo configuration checklist.
Odoo schema design and custom field creation
We design the destination Odoo schema in a staging environment before any data moves. This includes creating all custom contact fields (med_id, loyalty_points__c, loyalty_tier__c, legacy_source_id, favorite_store__c, opt_in_email, opt_in_sms, consent_date, audience_multiplier__c, campaign_source__c, compliance_state__c, marketing_restricted__c), configuring the Contact form layout, and setting up Tags for audience migration. If the customer installs the Odoo loyalty app, we configure the loyalty program structure during this step using the Alpine IQ loyalty snapshot as the specification.
Store and POS mapping validation
We extract the full Alpine IQ store and location mapping configuration and cross-reference it against Odoo POS location records (or third-party POS location names if the customer continues using an existing POS). Exact name matching is required for loyalty attribution to function. Any mismatches are flagged in a store name reconciliation report, and the customer's admin resolves them before contact migration begins. This step is the most common source of post-migration loyalty breakage and is completed before any records move.
Contact migration with blocklist reconciliation
We migrate Personas in batches using Odoo's REST XML-RPC API (jsonrpc endpoint). Each batch is processed with retry logic and exponential backoff. We cross-reference the opt_in flag on each contact against Alpine IQ's blocklist and suppress any contacts that were silently filtered from the standard GET export. Suppressed contacts are listed in a separate file for the customer's compliance review. All loyalty point balances and tier names migrate as custom fields. The Alpine IQ source integration ID migrates as legacy_source_id for audit continuity.
Order and attribution migration
We migrate Alpine IQ Order records as Odoo sale_order records linked to the Contact via partner_id. Each order carries the original product data (name, SKU, brand, price, discount), payment details, timestamps, and attr attribution parameters as custom fields. Attribution parameters are separated into campaign_source__c, campaign_medium__c, and campaign_name__c fields to enable Odoo reporting by campaign. Orders are imported after all contacts to satisfy the partner_id foreign key constraint.
Audience and tag migration
We migrate Alpine IQ Audience membership as Odoo Contact Tags. The audience points multiplier is stored per tag-contact relationship as a custom field audience_multiplier__c. Dynamic behavioral segmentation rules in Alpine IQ are documented in the automation handoff report and are not transferred as working logic. The customer's marketing team rebuilds dynamic segments in Odoo using Tags as static lists or evaluates a third-party Odoo automation app.
Cutover, validation, and compliance handoff
We freeze Alpine IQ writes during cutover, run a final delta migration of any contacts or orders modified during the migration window, then enable Odoo CRM as the system of record. We deliver a row-count reconciliation report comparing Alpine IQ export totals against Odoo import totals across contacts, orders, opt-in records, and loyalty balances. We deliver the loyalty program snapshot, Flow automation inventory, and push notification ID reference file as separate documents for the customer's admin team. We support a one-week hypercare window for reconciliation issues. We do not rebuild Flows, loyalty program rules, or compliance configuration inside the migration scope; these are separate engagements.
Platform deep dives
Alpine IQ
Source
Strengths
Weaknesses
Odoo CRM
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. All 8 core objects map 1:1 between Alpine IQ and Odoo CRM.
Overall complexity
Standard migration
Derived from compatibility, mapping clarity, API constraints, and data volume across Alpine IQ and Odoo CRM.
Object compatibility
All 8 core objects map 1:1 between Alpine IQ 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
Alpine IQ: 5 requests per second, 120 per minute, and 2,000 per hour per documented developer guide..
Data volume sensitivity
Alpine IQ 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 Alpine IQ to Odoo CRM migration scoping. Not seeing yours? Book a call.
Walk through your Alpine IQ 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 Alpine IQ
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.