CRM migration
Field-level mapping, validation, and rollback between Iterable and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Iterable
Source
Freshsales
Destination
Compatibility
8 of 11
objects map 1:1 between Iterable and Freshsales.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Iterable to Freshsales is a platform-category shift from marketing automation to sales CRM. Iterable organizes data around User Profiles with behavioral event histories, campaign references, and subscription states. Freshsales organizes around Contacts, Accounts, Deals, and Leads with a different field model and no native behavioral event store. We map Iterable User Profiles to Freshsales Contacts using email as the dedupe key, preserve Iterables custom event names and timestamps in Freshsales custom contact fields, migrate Subscription status to Freshsales HasOptedOutOfEmail and related opt-in fields, and store List memberships as contact-level custom fields or tags. Iterables Journeys, Templates, and Campaigns have no direct Freshsales equivalent; we deliver a written inventory of these for the customers admin to rebuild or recreate. We do not migrate Journeys as automation code, Templates as content assets, or Catalog items as native Freshsales records.
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 Iterable 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.
Iterable
User Profile
Freshsales
Contact
1:1Iterable User Profiles map to Freshsales Contacts using email as the dedupe key. System fields firstName, lastName, email, phoneNumber, and userId migrate to Freshsales standard contact fields. All active custom profile fields migrate to Freshsales custom contact fields, preserving data type (string, number, boolean, date). We flag Iterables deprecated fields during scoping and exclude them from the import. If the custom field count exceeds Freshsales practical limits, we consolidate redundant fields during the mapping phase.
Iterable
Custom Event
Freshsales
Contact (custom fields)
lossyIterable Custom Events track behavioral data beyond profile updates, including event name, timestamp, and arbitrary metadata. Freshsales has no native behavioral event object, so we store event data in Contact-level custom fields. For migrations where event history is required, we create a custom text field event_history__c storing a JSON array of event names and timestamps, and a separate custom field last_event__c holding the most recent event name and date. We scope event history retention with the customer before migration to avoid field size issues.
Iterable
Subscription
Freshsales
Contact (HasOptedOutOfEmail + custom fields)
1:1Iterables per-channel subscription state (email, SMS, push, in-app) maps to Freshsales Contact compliance fields. The standard Freshsales HasOptedOutOfEmail field receives the email subscription status. SMS, push, and in-app opt-out states map to custom contact fields sms_opt_out__c, push_opt_out__c, and in_app_opt_out__c as boolean values. We preserve the full subscription event history in a custom text field subscription_history__c as a JSON log for compliance audit.
Iterable
List
Freshsales
Contact (custom multi-select or tag field)
1:1Iterable Lists are collections of User Profiles used for audience segmentation. We migrate List names and membership to Freshsales by creating a custom multi-select picklist field list_membership__c on Contact, with each Iterable List name as a picklist value. Contact records are set to all List names they belonged to in Iterable. If the number of Lists exceeds the multi-select picklist practical limit, we create a tag-based alternative using Freshsales native contact tags.
Iterable
Campaign
Freshsales
Contact (campaign association)
1:1Iterable Campaigns are sendable units with names, channels, templates, and schedules. Freshsales does not have a native Campaign object in the base CRM (Campaign belongs to Sales Cloud which may not be active on the customers plan). We store campaign metadata as reference records in a custom Contact field campaign_history__c holding campaign names, send dates, and channel type as a JSON log. We flag which campaigns had active sends during the migration window for the customer to reconcile against Freshsales reports.
Iterable
Purchase
Freshsales
Deal (custom fields)
1:manyIterable Purchase events record transaction data (orderId, total, items, associated user). We map Purchase records to Freshsales Deals by grouping all purchases by User Profile email and creating one Deal per customer with aggregated purchase data (total revenue, order count, first purchase date, last purchase date) stored in custom Deal fields purchase_total__c, order_count__c, first_purchase_date__c, and last_purchase_date__c. Individual order line items are stored as a JSON array in a custom field order_items__c on the Deal.
Iterable
Product
Freshsales
Product
1:1Iterable Catalog Items define product data used for dynamic content insertion. Freshsales has a standard Product object for sales pipeline items. We migrate Catalog schemas and item records to Freshsales Products with Catalog item attributes mapped to custom Product fields. Note that Catalog relationships to Journey steps in Iterable must be re-established in Freshsales manually because the dynamic content injection logic has no Freshsales equivalent.
Iterable
Journey
Freshsales
Workflow (documented, not migrated)
1:1Iterable Journeys define multi-step, multi-channel automation paths with trigger conditions, branching logic, and message actions. Freshsales has a basic Workflow automation engine (Pro tier and above) that handles record-triggered updates and task creation but does not replicate Iterables Journey builder scope. We do not migrate Journeys as automation code. We deliver a written inventory of every active Journey including trigger conditions, step sequence, channel actions, and conditional branches for the customers admin to rebuild as Freshsales Workflows or document as manual processes. Journey re-trigger behavior is flagged because Freshsales Workflows do not support the same re-entry rules.
Iterable
Template
Freshsales
Email Templates (manual rebuild required)
1:1Iterable Templates define message content using HTML, plain text, and Handlebars personalization syntax. Freshsales has an Email Templates feature but it does not accept raw HTML imports or Handlebars expressions. We export template content and metadata as a written reference document and deliver it to the customers admin for recreation. We do not convert HTML templates or migrate Handlebars logic automatically because content rendering depends on Freshsales template syntax which differs from Iterables.
Iterable
Owner
Freshsales
User
1:1Iterable Owners associated with User Profiles map to Freshsales Users by email match. We extract all distinct Owner references from Iterable profiles and cross-reference against Freshsales Users. Any Owner without a matching Freshsales User goes to a reconciliation queue for the customers admin to provision before record import. Owner records are required to be resolved before Contact migration begins so that the OwnerId reference is satisfied at insert time.
Iterable
Data Sync Record
Freshsales
Contact (custom fields)
lossyIterable Data Sync exports warehouse data for BI use. Freshsales does not have a native warehouse export feature on Growth and Pro tiers. If the customer uses Data Sync records for reporting, we migrate the most recent Data Sync snapshot fields as custom Contact fields or store the data in a custom object. We note that ongoing Data Sync requires an alternative export method post-migration such as Freshsales native reporting exports or a third-party BI connector.
| Iterable | Freshsales | Compatibility | |
|---|---|---|---|
| User Profile | Contact1:1 | Fully supported | |
| Custom Event | Contact (custom fields)lossy | Fully supported | |
| Subscription | Contact (HasOptedOutOfEmail + custom fields)1:1 | Fully supported | |
| List | Contact (custom multi-select or tag field)1:1 | Fully supported | |
| Campaign | Contact (campaign association)1:1 | Fully supported | |
| Purchase | Deal (custom fields)1:many | Fully supported | |
| Product | Product1:1 | Fully supported | |
| Journey | Workflow (documented, not migrated)1:1 | Fully supported | |
| Template | Email Templates (manual rebuild required)1:1 | Fully supported | |
| Owner | User1:1 | Fully supported | |
| Data Sync Record | Contact (custom fields)lossy | 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.
Iterable gotchas
Iterable does not allow field deletion
Separate API endpoints for US and EU data centers
Soft limit of 8,000 unique fields per project
Enterprise pricing is opaque and contract-based
Usage metrics lag by one calendar day
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 data center confirmation
We audit the source Iterable project for User Profile field count, custom event volume and schema, List names and membership totals, Subscription records per channel, active Journey count, active Template count, Catalog item volume, and data center (USDC or EDC). We use the confirmed data center URL for all API extraction. We identify deprecated Iterable fields to exclude from mapping and flag behavioral event retention requirements with the customer before the mapping phase begins.
Schema design in Freshsales
We design the Freshsales destination schema before any data moves. This includes creating custom Contact fields for custom profile data from Iterable, custom fields for behavioral event history, custom fields for subscription status per channel, a custom multi-select field for List memberships, and a custom Deal field structure for aggregated Purchase data. We confirm the field data types match between Iterable source and Freshsales destination and resolve any type mismatches (for example, Iterable date fields that need conversion to Freshsales date format) during the design phase.
Sandbox test migration and reconciliation
We run a test migration into a Freshsales sandbox environment using a representative sample of data. The customer reconciles record counts (Profiles in, Contacts in), spot-checks 20-30 random records against the Iterable source, and reviews the custom field mapping for accuracy. Any corrections to field names, data types, or picklist values happen in the sandbox before production migration begins. We also validate that the behavioral event JSON serialization is correctly formatted and that List memberships populate the custom multi-select picklist as expected.
Owner and User reconciliation
We extract all distinct Owner references from Iterable User Profiles and match by email against the Freshsales destination Users. Owners without a matching Freshsales User are held in a reconciliation queue for the customers admin to provision before Contact import resumes. This step is required before Contact migration because OwnerId is a required reference on many Freshsales standard objects. We also confirm that the admin has set up the correct Freshsales user roles and territories that align with the Owner hierarchy from Iterable.
Production migration in dependency order
We run production migration in sequence: Custom fields and picklist values (created first), Products (from Iterable Catalog), Contacts (from User Profiles with OwnerId resolved, event history serialized, subscription status mapped), Deals (aggregated from Purchase records), List membership populated on Contacts, and campaign metadata stored in the custom Contact field. Each phase emits a row-count reconciliation report before the next phase begins. We freeze Iterable writes during the cutover window to prevent delta records from being missed.
Cutover, validation, and Journey rebuild handoff
We freeze Iterables write access during cutover, run a final delta migration for any records modified during the migration window, then mark Freshsales as the system of record. We deliver the Journey inventory document, Template reference list, and campaign metadata log to the customers admin for rebuild planning. We support a 72-hour hypercare window where we resolve reconciliation issues. We do not rebuild Iterables Journeys as Freshsales Workflows or recreate Templates as part of the standard migration scope; those are separate engagements or internal admin tasks.
Platform deep dives
Iterable
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 Iterable 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
Iterable: Not publicly documented; returns RateLimitExceeded code on limit.
Data volume sensitivity
Iterable 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 Iterable to Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Iterable 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 Iterable
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.