CRM migration
Field-level mapping, validation, and rollback between Alpine IQ and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Alpine IQ
Source
Freshsales
Destination
Compatibility
8 of 10
objects map 1:1 between Alpine IQ and Freshsales.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Alpine IQ and Freshsales serve different primary use cases. Alpine IQ is a customer engagement and loyalty CRM purpose-built for regulated retail markets, particularly cannabis dispensaries, with deep POS integrations, behavioral audience segmentation, and compliance tooling. Freshsales is a general SMB sales CRM from Freshworks with built-in phone, email, AI-powered lead scoring, and a standard Contacts-Accounts-Deals data model. The migration from Alpine IQ to Freshsales is a platform pivot: a cannabis retailer or regulated-industry operator moving to a general-purpose CRM typically means trading loyalty-native architecture and compliance tooling for broader sales automation, a larger app ecosystem, and per-seat pricing that scales predictably. We migrate Personas as Freshsales Contacts, Orders as Deals with line items, loyalty point balances as numeric custom fields, opt-in status as contact properties, and attribution parameters as deal-level fields. We do not migrate loyalty program rules (point expiration, tier thresholds, reward eligibility) because Alpine IQ stores these as configuration rather than data; we deliver a written loyalty-program inventory for the customer to rebuild in Freshsales.
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 Freshsales, including any object-level transformations, lookup resolution, or schema-design dependencies.
Typical mapping — final map is confirmed during the sample migration step.
Alpine IQ
Persona (Contact)
Freshsales
Contact
1:1Alpine IQ Personas map directly to Freshsales Contacts. Standard PII fields (firstname, lastname, email, phone, birthday, birthdayday, birthdaymonth, birthdayyear, gender) migrate to Freshsales Contact fields. Medical ID and compliance fields migrate to custom Contact fields (med_id__c, compliance_state__c, customer_type__c for veteran/police/local status) that the customer configures post-migration. Birthdate parsing from Alpine IQ's three-field format (birthday, birthdayday, birthdaymonth) combines into Freshsales Date_of_Birth.
Alpine IQ
Opt-In Record
Freshsales
Contact (custom properties)
1:1Alpine IQ stores SMS and email opt-in status separately via /api/v2/optin endpoints. We export both email opt-in and SMS opt-in as boolean contact properties: email_opt_in__c and sms_opt_in__c. For email, Freshsales uses the standard HasOptedOutOfEmail field (inverted logic: true means opted out). For SMS, Freshsales does not have a native SMS opt-out field, so we use a custom field sms_opt_in__c. Blocklisted contacts are silently excluded from standard GET responses; we query alternative endpoints where available and cross-reference opt-in flags on returned records to build a complete suppression list.
Alpine IQ
Order
Freshsales
Deal (Opportunity)
1:manyAlpine IQ Order objects carry customer PII, item-level data (product name, category, SKU, brand, price, discount), payment details, attribution parameters, and timestamps. We split each Order into a Freshsales Deal (Opportunity) at the header level (order ID, status, timestamps, totals, tax, tip) and individual Deal Line Items for each product line. The attr attribution parameter on each order migrates to a custom Opportunity field attribution_source__c for campaign ROI reporting.
Alpine IQ
Order Item
Freshsales
Deal Line Item
1:1Order line items (product name, SKU, brand, category, price, discount) map to Freshsales Deal Product records. We create Product2 records in Freshsales for each distinct SKU, set Standard Price Book entries, and link line items to the parent Opportunity during migration. Discount values migrate as custom line-item fields if the destination Freshsales edition supports them.
Alpine IQ
Loyalty Program (Points and Tiers)
Freshsales
Contact (custom fields)
1:1Alpine IQ stores point balances and tier status on the Persona record. We export point_balance as a numeric custom field loyalty_points__c and tier_name as a text field loyalty_tier__c. The rules governing point expiration, tier progression thresholds, and reward eligibility are configuration-level settings in Alpine IQ and are NOT exported as data. We deliver a written loyalty-program inventory document listing all point tiers, earning rates, expiration rules, and reward structures so the customer's Freshsales admin can rebuild equivalent logic using Freshsales Workflows or a third-party loyalty app.
Alpine IQ
Audience
Freshsales
List
1:1Alpine IQ Audiences are segmented contact groups used for campaign targeting. Each contact's audience membership (with points multiplier) is stored by contact ID. We map each Alpine IQ Audience to a Freshsales Static List and populate it with the matching Contacts. Dynamic List behavior (auto-updating membership based on criteria) cannot be replicated without Freshsales dynamic filter logic, which requires post-migration configuration. Audience points multipliers migrate as a custom field audience_multiplier__c on the Contact.
Alpine IQ
Discount Group
Freshsales
Contact (custom field)
1:1Alpine IQ discount groups map to POS discount rules and customer eligibility flags. The Dutchie integration guide shows discount groups as a mapped field in the customer profile. We export discount_group as a text field discount_group__c on the Contact record. Discount rule logic (percentage off, buy-one-get-one, member-only pricing) does not migrate as configuration; the customer reviews and rebuilds discount eligibility in Freshsales.
Alpine IQ
Store/Location Mapping
Freshsales
Account (custom field)
1:1Multi-location Alpine IQ accounts require each integration or data source to be mapped to a specific store location. Store names in Alpine IQ must exactly match location names in the connected POS (Dutchie, Cova, Flowhub, etc.). We extract the full store mapping configuration from Alpine IQ and create Account records in Freshsales representing each location. The contact's preferred store or favorite-store attribution migrates as a lookup field store_location__c pointing to the corresponding Account. Store name mismatches between Alpine IQ and POS are flagged during scoping and must be resolved before migration begins.
Alpine IQ
Custom Contact Properties
Freshsales
Contact (custom fields)
lossyAlpine IQ supports custom fields on Persona records set via override endpoints. We export all custom properties alongside standard fields. Custom property names in Alpine IQ map to Freshsales custom Contact fields using the same label (with spaces removed and underscores substituted). Field types are mapped: text to Text, number to Number, date to Date, boolean to Checkbox. We pre-create all custom fields in Freshsales before migration begins.
Alpine IQ
Attribution Parameters
Freshsales
Deal (custom field)
1:1The attr parameter on Alpine IQ orders stores campaign attribution (UTM-like sources, campaign IDs). Attribution values are stored in the Order object and migrate to Freshsales Opportunity custom fields: attribution_source__c, attribution_campaign__c, and attribution_medium__c. These fields enable campaign ROI reporting at the opportunity level in Freshsales reporting.
| Alpine IQ | Freshsales | Compatibility | |
|---|---|---|---|
| Persona (Contact) | Contact1:1 | Fully supported | |
| Opt-In Record | Contact (custom properties)1:1 | Fully supported | |
| Order | Deal (Opportunity)1:many | Fully supported | |
| Order Item | Deal Line Item1:1 | Fully supported | |
| Loyalty Program (Points and Tiers) | Contact (custom fields)1:1 | Fully supported | |
| Audience | List1:1 | Fully supported | |
| Discount Group | Contact (custom field)1:1 | Fully supported | |
| Store/Location Mapping | Account (custom field)1:1 | Fully supported | |
| Custom Contact Properties | Contact (custom fields)lossy | Mapping required | |
| Attribution Parameters | Deal (custom field)1: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.
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
Freshsales gotchas
Freddy AI is Pro-tier only despite heavy marketing
Post-migration emails and sequences are disabled
Bot session credits are a one-time 500-session allocation
Phone credits charged per minute with no cap
File storage limits scale with plan tier
Pair-specific challenges
Migration approach
Discovery and scope confirmation
We audit the source Alpine IQ account: Persona count, order volume, audience count, discount group count, loyalty tier structure, custom field inventory, multi-location store count, blocklist volume estimate, and integration source inventory (POS platforms, ecommerce). We confirm whether the customer is moving out of regulated-industry compliance requirements (medical ID, state flags) or retaining them. The discovery output is a written migration scope with object counts, custom field list, store mapping validation checklist, and a loyalty-program inventory template for the customer to complete.
Freshsales schema provisioning
We create all custom fields in Freshsales before any data migration: loyalty_points__c (Number), loyalty_tier__c (Text), email_opt_in__c (Checkbox), sms_opt_in__c (Checkbox), med_id__c (Text), med_expiration__c (Date), customer_type__c (Text), discount_group__c (Text), attribution_source__c (Text), attribution_campaign__c (Text), attribution_medium__c (Text), store_location__c (Lookup to Account), and audience_multiplier__c (Number). Account records for each store location are created with names matching the Alpine IQ store configuration. We validate that the custom field API names do not conflict with existing Freshsales fields.
Blocklist audit and suppression export
We request a full export snapshot from Alpine IQ including blocklisted contacts, cross-reference opt-in status flags on returned records, and generate a suppression list distinct from the active contact export. We deliver the suppression list separately so the customer's Freshsales admin can import it as a blocklist in Freshsales or a connected email/SMS tool. This step adds one to two days to the timeline for accounts with high blocklist volume.
Test migration in Freshsales trial or sandbox
We run a test migration with a representative sample (typically 500-1,000 records) into a Freshsales trial or sandbox environment. The customer's admin spot-checks migrated contacts against Alpine IQ source records, validates point balance accuracy, order deal creation, store location lookups, and opt-in status flags. We correct any field mapping errors and re-run the test until reconciliation passes before production migration begins.
Production migration in dependency order
We run production migration in this order: Account records (store locations), Contacts (Personas with loyalty points, tier, opt-in flags, custom properties), Deals (Orders split into Opportunity header plus line items), Lists (Audiences populated with contact IDs), and a final delta run for any records modified during the migration window. Each phase emits a row-count reconciliation report. We use Freshsales REST API for contact and deal creation with batch chunking and exponential backoff on rate limit responses.
Cutover, loyalty inventory handoff, and validation
We freeze Alpine IQ writes during cutover, run a final delta migration, then enable Freshsales as the system of record. We deliver the loyalty-program inventory document listing all point tiers, earning rates, expiration rules, and reward structures for the customer's Freshsales admin to rebuild. We do not rebuild loyalty program logic as Freshsales Workflows inside the migration scope; that is a separate configuration task. We support a three-day hypercare window where we resolve any record-count discrepancies or mapping issues raised during the first business day post-cutover.
Platform deep dives
Alpine IQ
Source
Strengths
Weaknesses
Freshsales
Destination
Strengths
Weaknesses
Complexity grading
Standard CRM migration. 2 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 Freshsales.
Object compatibility
2 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 Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Alpine IQ to Freshsales 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 Freshsales
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.