CRM migration
Field-level mapping, validation, and rollback between Alpine IQ and Twenty CRM. We move data and schema; workflows are rebuilt natively in Twenty CRM.
Alpine IQ
Source
Twenty CRM
Destination
Compatibility
6 of 11
objects map 1:1 between Alpine IQ and Twenty CRM.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Alpine IQ to Twenty CRM is a structural migration from a regulated-industry loyalty CRM to a general-purpose open-source CRM. Alpine IQ stores customer data as Personas with order history, loyalty point balances, tier names, audience membership, and compliance flags; Twenty CRM uses standard Contact, Company, and Opportunity objects with custom field support for loyalty and behavioral data. We resolve the Persona routing decision (whether each contact belongs as a Twenty Contact or Person record), preserve loyalty point balances and tier names as custom fields on the contact, map order history to Opportunities with custom line-item fields, and carry forward audience membership as tag-based segmentation. Flow automations, discount group POS rules, and push notification device tokens do not migrate; we deliver a written inventory of every active Flow and discount configuration for the customer's admin to rebuild in Twenty or via connected tools like Zapier.
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 Twenty 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)
Twenty CRM
Contact or Person
lossyAlpine IQ Personas are the primary contact unit with name, phone, email, birthdate, med ID, and custom properties. We migrate Personas to Twenty CRM Contacts by default. If the customer uses Twenty's Person object for individual records without an associated Company, we configure that at scoping. Loyalty point balance maps to a numeric custom field, tier name to a text custom field, and the original alpine_iq_uid preserves as an external ID for reconciliation.
Alpine IQ
Orders
Twenty CRM
Opportunity
1:1Order records in Alpine IQ include order ID, status, timestamps, customer PII, item data (product name, category, SKU, brand, price, discount), payment details, and attribution parameters. We map Orders to Twenty Opportunities with custom line-item fields capturing product name, category, SKU, brand, unit price, and discount. The Order total becomes the Opportunity amount, and the original alpine_iq_order_id preserves for audit.
Alpine IQ
Loyalty Programs (Points and Tiers)
Twenty CRM
Contact custom fields
lossyLoyalty point balances and tier names are stored as properties on the Alpine IQ Persona record. We create two custom fields on the Twenty CRM Contact: loyalty_points_balance (number) and loyalty_tier_name (text). Point expiration rules, tier progression thresholds, and reward eligibility are configuration-level settings in Alpine IQ and do not export; we request a loyalty program snapshot from the customer and deliver it as a written configuration reference for manual rebuild.
Alpine IQ
Audiences
Twenty CRM
Tags on Contact
lossyAlpine IQ Audiences are segmented contact groups used for campaign targeting. Audience membership is stored by contact ID with a points multiplier per audience. We export audience membership as tag records on the Twenty CRM Contact using the audience name as the tag label. The customer decides during scoping whether to preserve the points multiplier as a secondary tag field or as a note on the contact.
Alpine IQ
Opt-In Records
Twenty CRM
Contact custom fields
1:1Email and SMS opt-in status is tracked via Alpine IQ's /api/v2/optin endpoints per email address or phone number. We migrate opt-in flags as boolean custom fields on the Twenty CRM Contact: email_opt_in and sms_opt_in. The opt-in timestamp migrates as an additional date field if the source record contains it.
Alpine IQ
Store/Location Mappings
Twenty CRM
Custom Object: Dispensary Location
1:1Multi-location Alpine IQ accounts map each integration or data source to a specific store location with exact name matching between Alpine IQ and the connected POS. We create a Dispensary Location custom object in Twenty CRM with fields for store_name, pos_integration_type, pos_location_id, and favorite_store_count. The customer validates that all location names in Alpine IQ exactly match the destination Twenty Location names before migration begins.
Alpine IQ
Attribution Parameters
Twenty CRM
Contact custom fields
1:1The attr parameter on Alpine IQ orders tracks campaign attribution and UTM-like sources at the order level. We preserve attribution values in custom fields on the Twenty CRM Contact: original_source, original_utm_campaign, original_utm_medium, and original_utm_content. Attribution parameters also exist on individual Order records as custom Opportunity fields.
Alpine IQ
Discount Groups
Twenty CRM
Contact custom field or Tag
lossyAlpine IQ discount groups map to specific POS discount rules and customer eligibility flags, visible in the Dutchie integration guide as mapped customer profile fields. We export discount group names as a multi-value tag or custom picklist field on the Twenty CRM Contact. POS discount rule configuration does not export; we document the discount group-to-rule mapping for the customer to rebuild in the POS.
Alpine IQ
Custom Contact Properties
Twenty CRM
Custom fields on Contact
1:1Alpine IQ supports custom fields on Persona records set via override endpoints. We export all custom properties alongside standard fields and create matching custom fields in Twenty CRM using the schema API. Custom field type mapping follows: text to text, number to number, date to date, boolean to boolean, and multi-select to multi-select where supported.
Alpine IQ
Integration Source IDs
Twenty CRM
Contact custom field
1:1Every Alpine IQ contact has a source ID from the integration that created it (POS, ecommerce, etc.). The /api/v1/piis/:uid/bySrcID endpoint allows lookup by source ID. We preserve all source IDs in a custom field on the Twenty CRM Contact for debugging and reconciliation. Push notification device tokens do not transfer between platforms because they are device-specific and platform-specific.
Alpine IQ
Flow Events
Twenty CRM
Not migrated
lossyAlpine IQ Flows are automation triggers based on events like order_created, order_completed, cart_abandoned, and behavioral events. Event schemas vary by integration. We do not migrate Flow configurations as code. We export a written inventory of all active Flows with their trigger event, conditions, and action sequence for the customer's admin to rebuild in Twenty via workflow tools or Zapier.
| Alpine IQ | Twenty CRM | Compatibility | |
|---|---|---|---|
| Personas (Contacts) | Contact or Personlossy | Fully supported | |
| Orders | Opportunity1:1 | Fully supported | |
| Loyalty Programs (Points and Tiers) | Contact custom fieldslossy | Mapping required | |
| Audiences | Tags on Contactlossy | Mapping required | |
| Opt-In Records | Contact custom fields1:1 | Fully supported | |
| Store/Location Mappings | Custom Object: Dispensary Location1:1 | Mapping required | |
| Attribution Parameters | Contact custom fields1:1 | Fully supported | |
| Discount Groups | Contact custom field or Taglossy | Mapping required | |
| Custom Contact Properties | Custom fields on Contact1:1 | Mapping required | |
| Integration Source IDs | Contact custom field1:1 | Fully supported | |
| Flow Events | Not migratedlossy | 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
Twenty CRM gotchas
Import order is enforced and critical
Export limited to 20,000 records and visible columns only
Soft-deleted records count toward uniqueness and trigger restores
API rate limits cap at 200 req/min on Organization tier
No native email sequences — follow-up cadences require external tools
Pair-specific challenges
Migration approach
Discovery and scoping
We audit the source Alpine IQ account across store count, contact volume, order history depth, active audience count, loyalty program configuration, custom property count, and active Flow count. We pair this with a Twenty CRM workspace audit to identify existing Contact fields, custom object schema, and tag configuration. The discovery output is a written migration scope document with the Persona-to-Contact routing decision, loyalty field mapping plan, and store location reconciliation list. We also request a loyalty program configuration snapshot from Alpine IQ during this phase.
Schema design and loyalty field configuration
We design the destination schema in Twenty CRM. This includes creating custom fields for loyalty_points_balance (number), loyalty_tier_name (text), cannabis_license_id (text), email_opt_in (boolean), sms_opt_in (boolean), original_alpine_iq_uid (text as external ID), original_order_id (text), attribution_params (text), and integration_source (text). If the customer maintains multi-location data, we create a Dispensary Location custom object with store_name, pos_integration_type, and pos_location_id fields. All schema is configured in a Twenty test workspace before production migration begins.
Data export and blocklist reconciliation
We extract Persona records from Alpine IQ using the /api/v2/loyalty and /api/v1/piis endpoints, including alternative endpoint queries to surface blocklisted contacts that are silently excluded from standard GET. We export Order records with item data, attribution parameters, and timestamps. We extract audience membership by contact ID, loyalty point balances, opt-in records, and store mapping configurations. Each export produces a row-count reconciliation report before transformation begins. We validate that store names in Alpine IQ match the intended Twenty CRM location names and flag any mismatches for customer correction before contact migration starts.
Test migration and reconciliation
We run a full migration into a Twenty CRM test workspace using production-like data volume. The customer's RevOps lead reconciles record counts (Contacts in, Opportunities in, custom field values), spot-checks 25-50 random records against the Alpine IQ source, and validates that loyalty balances, tier names, and opt-in flags are correctly populated. Any mapping corrections, field type issues, or store name mismatches are resolved in the test workspace before the production migration plan is finalized and approved.
Production migration in dependency order
We run production migration in record-dependency order: first Dispensary Location custom records (to satisfy any location lookups), then Contacts (with external ID and loyalty fields populated), then Opportunities (with contact lookup resolved and order-level attribution preserved), then tags (audience membership), then opt-in records (as updates to existing contacts). Each phase emits a row-count reconciliation report. We handle Alpine IQ's undocumented API rate limits by implementing exponential backoff and batch chunking across all export operations.
Cutover, validation, and workflow rebuild handoff
We freeze Alpine IQ writes during the cutover window, run a final delta migration of any records modified during the migration, then switch the customer to Twenty CRM as the system of record. We deliver the Flow inventory document, loyalty program configuration reference, and discount group map to the customer's admin team. We support a one-week hypercare window where we resolve any record count discrepancies or field mapping issues reported by the customer's team. We do not rebuild Alpine IQ Flows as automations in Twenty within the migration scope; that work is handled by the customer's admin or a separate automation engagement.
Platform deep dives
Alpine IQ
Source
Strengths
Weaknesses
Twenty 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 Alpine IQ and Twenty 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
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 Twenty CRM migration scoping. Not seeing yours? Book a call.
Walk through your Alpine IQ to Twenty 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 Twenty 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.