CRM migration

Migrate from Iterable to Freshsales

Field-level mapping, validation, and rollback between Iterable and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.

Iterable logo

Iterable

Source

Freshsales

Destination

Freshsales logo

Compatibility

73%

8 of 11

objects map 1:1 between Iterable and Freshsales.

Complexity

BStandard

Timeline

2-4 weeks

Rollback included Accuracy guarantee Field-level validation

Overview

What this migration involves

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.

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

Iterable logo

Iterable

What's pushing teams away

  • Steep learning curve with unclear documentation forces teams to rely heavily on support for tasks that should be self-service.
  • SMS deliverability issues with accounts blocked without clear accountability or transparent root-cause communication from Iterable.
  • Contract pricing increases when usage is reduced, creating a billing model that punishes customers who downscale usage.
  • Cluttered UI requiring multiple clicks through nested menus to access common functions, slowing down campaign creation and editing.
  • Inconsistent conversion tracking and reporting makes it difficult to reliably measure campaign performance and optimize spend.

Choosing

Freshsales logo

Freshsales

What's pulling them in

  • Lowest barrier to entry among major CRMs — the free tier supports up to 3 users and includes core CRM functionality before committing to per-seat pricing.
  • Built-in chat, email, and phone reduce reliance on third-party integrations for basic sales communication and contact management.
  • Freddy AI contact scoring and deal insights are included on Pro plans at a lower price than comparable HubSpot tiers.
  • Kanban pipeline views across Contacts, Accounts, and Deals provide visual deal management without requiring custom configuration.
  • Integration with the broader Freshworks ecosystem (Freshdesk, Freshchat, Freshservice) reduces tool sprawl for teams already using Freshworks.

Object mapping

How Iterable objects map to Freshsales

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

maps to

Freshsales

Contact

1:1
Fully supported

Iterable 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

maps to

Freshsales

Contact (custom fields)

lossy
Fully supported

Iterable 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

maps to

Freshsales

Contact (HasOptedOutOfEmail + custom fields)

1:1
Fully supported

Iterables 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

maps to

Freshsales

Contact (custom multi-select or tag field)

1:1
Fully supported

Iterable 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

maps to

Freshsales

Contact (campaign association)

1:1
Fully supported

Iterable 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

maps to

Freshsales

Deal (custom fields)

1:many
Fully supported

Iterable 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

maps to

Freshsales

Product

1:1
Fully supported

Iterable 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

maps to

Freshsales

Workflow (documented, not migrated)

1:1
Fully supported

Iterable 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

maps to

Freshsales

Email Templates (manual rebuild required)

1:1
Fully supported

Iterable 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

maps to

Freshsales

User

1:1
Fully supported

Iterable 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

maps to

Freshsales

Contact (custom fields)

lossy
Fully supported

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

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.

Iterable logo

Iterable gotchas

Medium

Iterable does not allow field deletion

High

Separate API endpoints for US and EU data centers

Medium

Soft limit of 8,000 unique fields per project

High

Enterprise pricing is opaque and contract-based

Low

Usage metrics lag by one calendar day

Freshsales logo

Freshsales gotchas

Medium

Freddy AI is Pro-tier only despite heavy marketing

High

Post-migration emails and sequences are disabled

Medium

Bot session credits are a one-time 500-session allocation

Medium

Phone credits charged per minute with no cap

Low

File storage limits scale with plan tier

Pair-specific challenges

  • Iterables behavioral event history has no native Freshsales home

    Iterable Custom Events store behavioral data (purchases, page views, feature usage, engagement patterns) that Freshsales cannot represent as native records. We handle this by serializing event names and timestamps into Contact-level custom fields and a JSON event log field. However, Freshsales reporting cannot slice and dice this serialized data the way Iterable can. If behavioral analytics is a core reporting need, the customer should plan for a BI layer (Freshsales integrations with Tableau, Power BI, or the native reporting suite) rather than relying on CRM-level event reporting post-migration.

  • Iterable Journeys do not migrate to Freshsales Workflows

    Iterables Journey builder is a multi-step, multi-channel automation engine with branching logic, wait steps, AI decision nodes, and catalog-linked content. Freshsales Workflows (Pro tier) handle basic record-triggered updates, field updates, and task creation. The feature sets are not equivalent and there is no automated conversion path. We deliver a written Journey inventory with step-by-step documentation for each active Journey so the customers admin can rebuild them manually in Freshsales Workflows or decide which Journeys to retire.

  • Separate API endpoints for US and EU data centers require confirmation upfront

    Iterable operates two distinct data centers with separate API base URLs: api.iterable.com for USDC and api.eu.iterable.com for EDC. API keys are scoped to a single data center and are not interchangeable. We confirm the customers data center during scoping and use the correct base URL for all extraction operations. If the wrong endpoint is used, API calls return authentication failures and the migration stalls with no data extracted. This is a frequent scoping oversight with Iterable migrations.

  • Iterable field deletion is impossible, creating migration field-mapping overhead

    Iterable does not allow custom field deletion once a field is created on a User Profile. This means teams that ran experiments and created temporary fields carry permanent schema overhead. During migration scoping, we audit the active field count and identify deprecated fields to exclude from the Freshsales mapping. When Iterables field count approaches Freshsales practical limits, we consolidate redundant or unused fields during the transform phase to avoid field-creation errors during import.

  • Freshsales does not have a native marketing campaign tracking object

    Freshsales base CRM does not include a Campaign object for tracking marketing send performance. Contact-level campaign associations exist but campaign metadata (send date, open rate, click rate, channel type) has no native Freshsales object. We store campaign metadata as a JSON log in a custom Contact field, but the customer should set expectations with their team that Freshsales reporting does not replace Iterables campaign analytics. If campaign reporting is required post-migration, Freshmarketer (Freshworks marketing automation product) is the native solution, which requires an additional platform subscription.

Migration approach

Six steps for a successful Iterable to Freshsales data migration

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

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

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

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

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

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

Context on both ends of the pair

Iterable logo

Iterable

Source

Strengths

  • Cross-channel execution across email, SMS, push, and in-app from one unified platform interface.
  • Real-time AI decisioning using behavioral, contextual, and performance signals to optimize message delivery.
  • Enterprise-grade infrastructure with contracts supporting billions of messages and high deliverability standards.
  • Comprehensive API with documented endpoints for users, events, campaigns, and catalogs, plus an interactive API reference.
  • Helpful customer support with strong onboarding assistance cited across review sites.

Weaknesses

  • High total cost of ownership with opaque enterprise pricing starting at $20K+ annually.
  • Significant learning curve requiring extensive support and time investment to build competent workflows.
  • SMS deliverability reliability issues with account suspensions applied without clear explanation.
  • Cluttered UI requiring multiple navigation steps to complete common campaign management tasks.
  • Limited reporting consistency that complicates performance measurement and campaign optimization.
Freshsales logo

Freshsales

Destination

Strengths

  • Generous free tier for small teams with core CRM functionality without per-seat costs.
  • All-in-one sales CRM with built-in telephony, chat, and email reducing third-party tool dependency.
  • Freddy AI contact scoring and deal predictions available on Pro tier.
  • Multiple pipeline views with Kanban and list options across all plans.

Weaknesses

  • Reports lack depth compared to competitors like HubSpot, with limited customization options.
  • Integration setup is poorly documented with no clear guides for connecting third-party tools.
  • AI features gated behind $39/user/month Pro tier despite marketing emphasis on Freddy AI.
  • Bot sessions limited to 500 one-time allocation with no monthly refresh.

Complexity grading

How hard is this migration?

Standard CRM migration. 2 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 Iterable and Freshsales.

  • Object compatibility

    B

    2 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

    Iterable: Not publicly documented; returns RateLimitExceeded code on limit.

  • Data volume sensitivity

    A

    Iterable exposes a bulk API — large-volume migrations stream efficiently.

Estimator

Estimate your Iterable to Freshsales 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 Iterable to Freshsales data migrations

Answers to the questions buyers ask most during Iterable to Freshsales migration scoping. Not seeing yours? Book a call.

Can't find your answer?

Walk through your Iterable to Freshsales 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 50,000 User Profiles with under 500,000 custom events and no active Catalog items. Migrations with high event volumes (over 1 million records), 100+ active custom profile fields, or multiple active Journeys requiring documentation move to four to eight weeks because of field-by-field mapping, event serialization, and the Journey inventory work that precedes automation rebuild.

Adjacent paths

Related migrations to explore

Ready when you are

Move from Iterable.
Land in Freshsales, 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