CRM migration

Migrate from Alpine IQ to Twenty CRM

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 logo

Alpine IQ

Source

Twenty CRM

Destination

Twenty CRM logo

Compatibility

55%

6 of 11

objects map 1:1 between Alpine IQ and Twenty CRM.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Alpine IQ logo

Alpine IQ

What's pushing teams away

  • Steep learning curve with a complex, layered interface makes onboarding staff time-consuming and delays realizing value from advanced segmentation and automation features.
  • Reporting tools lack customization and flexibility—dashboards are difficult to parse at a glance and loading times for filtered reports frustrate marketing teams.
  • SMS deliverability and compliance requirements in regulated markets can limit campaign effectiveness, especially as carriers tighten filtering on cannabis-adjacent content.
  • Multi-location store mapping requires exact name matching between Alpine IQ and POS systems, creating friction during rollout and causing sync failures when locations are renamed.
  • Per-store and per-contact pricing model historically inflated costs for growing dispensary chains, prompting operators to evaluate alternatives when expanding across new markets.

Choosing

Twenty CRM logo

Twenty CRM

What's pulling them in

  • Top open-source CRM on GitHub with 40.6K stars, giving teams full source code access and infrastructure ownership without per-feature licensing surprises.
  • Free self-hosting under AGPL-3.0 means unlimited users and custom objects for the cost of cloud infrastructure alone, typically $20–100/month.
  • Pricing page explicitly mocks competitors for charging add-on fees for API access, webhooks, and workflows — transparency that resonates with RevOps teams burned by Salesforce.
  • Unlimited custom objects and fields with no price impact, letting teams shape the data model to their business rather than forcing business into rigid schemas.
  • Modern TypeScript/React/PostgreSQL stack means developer-led teams can extend, self-host, or integrate without fighting legacy architecture.

Object mapping

How Alpine IQ objects map to Twenty CRM

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)

maps to

Twenty CRM

Contact or Person

lossy
Fully supported

Alpine 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

maps to

Twenty CRM

Opportunity

1:1
Fully supported

Order 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)

maps to

Twenty CRM

Contact custom fields

lossy
Mapping required

Loyalty 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

maps to

Twenty CRM

Tags on Contact

lossy
Mapping required

Alpine 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

maps to

Twenty CRM

Contact custom fields

1:1
Fully supported

Email 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

maps to

Twenty CRM

Custom Object: Dispensary Location

1:1
Mapping required

Multi-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

maps to

Twenty CRM

Contact custom fields

1:1
Fully supported

The 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

maps to

Twenty CRM

Contact custom field or Tag

lossy
Mapping required

Alpine 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

maps to

Twenty CRM

Custom fields on Contact

1:1
Mapping required

Alpine 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

maps to

Twenty CRM

Contact custom field

1:1
Fully supported

Every 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

maps to

Twenty CRM

Not migrated

lossy
Mapping required

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

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.

Alpine IQ logo

Alpine IQ gotchas

Medium

Blocklist contacts excluded from standard API GET

High

Store name matching required for loyalty attribution

Low

Initial integration sync delay up to 24 hours

Medium

Points and tier expiration logic not exported

Twenty CRM logo

Twenty CRM gotchas

High

Import order is enforced and critical

High

Export limited to 20,000 records and visible columns only

Medium

Soft-deleted records count toward uniqueness and trigger restores

Medium

API rate limits cap at 200 req/min on Organization tier

Low

No native email sequences — follow-up cadences require external tools

Pair-specific challenges

  • Blocklist contacts silently excluded from standard API export

    The Alpine IQ Personas API filters out any blocklisted contacts from standard GET responses. When we export contact lists via the standard endpoints, suppressed contacts are silently omitted from the export file. We mitigate this by querying the full contact list via alternative endpoints where available and cross-referencing blocklist flags on returned records. If the account has a high blocklist volume, we adjust the export strategy during scoping and document the reconciliation approach before migration begins.

  • Loyalty program rules and tier logic do not export

    Alpine IQ stores loyalty point balances and tier status on the Persona record, but the rules governing point expiration, tier progression thresholds, and reward eligibility are configuration-level settings that do not export via API. We migrate all point balances accurately and preserve tier names as custom fields on each contact, but the destination Twenty CRM workspace requires manual reconfiguration of loyalty program rules. We request a loyalty program snapshot from the customer before migration and deliver it as a written configuration reference for their admin to rebuild.

  • Multi-location store name matching can break POS attribution

    Alpine IQ resolves customer messaging and favorite-store attribution by matching integration source names to store names in the retail store settings. If a store name in Alpine IQ does not exactly match the corresponding record in Twenty CRM's location configuration, POS attribution fails silently after migration. We extract the full store mapping configuration from Alpine IQ, create matching location records in Twenty before contact migration, and validate name alignment as part of the pre-migration checklist.

  • Push notification device tokens are non-transferable

    Alpine IQ stores mobile push notification IDs (device tokens) on contacts via /api/v1.1/contact/addPushID. These tokens are platform-specific (iOS APNs, Android FCM) and tied to the Alpine IQ mobile app. They cannot be transferred to Twenty CRM because the token-to-device binding is valid only within the issuing platform's infrastructure. We export the push ID field for audit purposes but do not migrate it; the customer should notify users to re-enable push notifications in Twenty's mobile app post-migration.

  • Flow automations and discount group rules require manual rebuild

    Alpine IQ Flows (event-triggered automations) and discount group POS rules are stored as configuration rather than contact data. These do not export via the API. We do not migrate them as code. We deliver a written inventory of every active Alpine IQ Flow with its trigger, conditions, and action sequence, and a discount group configuration map, so the customer's admin can rebuild them in Twenty or connect equivalent logic via Zapier, Make, or a custom integration.

Migration approach

Six steps for a successful Alpine IQ to Twenty CRM data migration

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

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

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

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

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

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

Context on both ends of the pair

Alpine IQ logo

Alpine IQ

Source

Strengths

  • Purpose-built compliance tooling for regulated industries including cannabis marketing restrictions and SMS carrier rules.
  • Deep bidirectional POS integrations that sync customer records and transaction data without manual reconciliation.
  • Flexible audience segmentation combining purchase frequency, product category, visit recency, and custom behavioral signals.
  • Order attribution tracking with attr parameters enables campaign ROI reporting at the order level.
  • BigQuery integration provides a documented bulk data export path for organizations with data warehouse infrastructure.

Weaknesses

  • Steep learning curve and complex interface delay time-to-value for new users and smaller teams without dedicated ops resources.
  • Reporting and dashboard tooling lacks customization, filtering depth, and suffers from slow load times on large datasets.
  • API rate limits are not publicly documented, creating uncertainty for large-scale migration batch planning.
  • SMS deliverability in cannabis-adjacent markets is constrained by carrier filtering, limiting campaign reach despite opt-in compliance.
  • Blocklist suppression is handled server-side on GET but the full blocklist is not accessible via API, complicating audit completeness.
Twenty CRM logo

Twenty CRM

Destination

Strengths

  • AGPL-3.0 open-source license with full source code on GitHub — no vendor lock-in, no sunset risk.
  • Unlimited users and unlimited custom objects on self-hosted, with no feature gating based on headcount.
  • REST and GraphQL APIs available on all paid tiers, not locked behind an enterprise add-on fee.
  • MCP server and webhooks shipped as standard features, not premium upgrades.
  • Modern PostgreSQL-backed data model that developer teams can query, extend, and self-host.

Weaknesses

  • Recent v1.0 release means limited production hardening compared to CRMs with multi-year operational track records.
  • No native email sequencing or sales engagement tools — follow-up cadences require a separate platform.
  • No native two-way email sync or inbox integration, requiring third-party connectors for full activity logging.
  • Self-hosting 'free' pricing hides real infrastructure and DevOps costs that stack up over time.
  • Workflow automation is functional but lacks the complexity needed for sophisticated multi-step sales motions.

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 Alpine IQ and Twenty 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

    Alpine IQ: 5 requests per second, 120 per minute, and 2,000 per hour per documented developer guide..

  • Data volume sensitivity

    B

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

Estimator

Estimate your Alpine IQ to Twenty 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 Alpine IQ to Twenty CRM data migrations

Answers to the questions buyers ask most during Alpine IQ to Twenty CRM migration scoping. Not seeing yours? Book a call.

Can't find your answer?

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 consultation

Most migrations land between two and four weeks for accounts under 10,000 Personas and 2,000 Orders with a straightforward loyalty program and no custom objects. Migrations with loyalty tier programs, multiple audience segments, multi-location store data, or data volumes above 50,000 records move to six to ten weeks because of custom object schema design, loyalty field mapping, and multi-location reconciliation. Timeline is driven primarily by data volume and complexity of the loyalty program structure rather than record count alone.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Alpine IQ.
Land in Twenty 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