CRM migration
Field-level mapping, validation, and rollback between Tofu and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Tofu
Source
Freshsales
Destination
Compatibility
5 of 9
objects map 1:1 between Tofu and Freshsales.
Complexity
BStandard
Timeline
4-8 weeks
Overview
Moving from Tofu to Freshsales is a structural migration that changes the primary record type from an account-based marketing model to a sales-oriented CRM model. Tofu uses Accounts, Campaigns, Playbooks, Personas, and Content Assets; Freshsales uses Contacts, Accounts, Deals, and Tasks. We decompose Tofu's multi-step Playbook sequences into individual Step records, preserve Persona definitions as Contact custom fields, and map Audiences to Freshsales lists. The absence of a Tofu public API means we work from native export formats, which requires a manual scoping step before migration planning commits. Freshsales' built-in phone, email, and Freddy AI lead scoring become the replacement for Tofu's AI-generated content layer. Playbooks, workflows, and automations do not migrate as code; we deliver a written Playbook inventory for Freshsales admin to rebuild.
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 Tofu 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.
Tofu
Accounts
Freshsales
Account
1:1Tofu Accounts (target companies in the ABM model) map directly to Freshsales Account. We export Account name, industry, tier, owner, and any custom enrichment fields. The Account becomes the parent record for all Contact and Deal records. We use Account name as the dedupe key during import.
Tofu
Contacts (via Audience membership)
Freshsales
Contact
1:1Tofu does not have a native Contact object. Contact records exist as membership entries within Audiences (filtered subsets of Accounts). We extract Audience membership by Account, retrieve Contact fields from Tofu's Audience export (name, email, title, company), and create Freshsales Contacts with AccountId resolved to the parent Account. Any Contacts without a matching Account are held in a reconciliation queue.
Tofu
Campaigns
Freshsales
Deal (with campaign metadata)
1:manyTofu Campaigns (top-level containers for demand generation work) map to Freshsales Deal records with campaign metadata preserved as custom fields. Freshsales has no native Campaign object equivalent to HubSpot or Salesforce Marketing. We create Deal records for each Tofu Campaign, preserve campaign status and targeting strategy in custom fields, and link the Deal to the primary Account.
Tofu
Playbooks
Freshsales
Tasks + Custom Fields (step sequence)
lossyTofu Playbooks encode multi-step outreach sequences with conditional branching based on prospect engagement signals. We decompose each Playbook into discrete Step records. Each Step becomes a Freshsales Task with Subject, Description, and due date from the step timing. Conditional branching that cannot be represented in Freshsales' linear workflow model is preserved as a Custom Field on the Task record. The customer receives a Playbook Map document listing each original Playbook, its steps, and any unrepresentable conditions.
Tofu
Personas
Freshsales
Contact Custom Fields (ICP profile)
lossyTofu Personas define ICP profiles (industry, role, pain points, messaging tone) used to personalize content. Freshsales has no native Persona object. We export persona definitions as structured data and create corresponding Contact custom fields in Freshsales (persona_industry__c, persona_role__c, persona_pain_points__c, persona_messaging_tone__c). During scoping, the customer chooses whether to assign Persona directly to Contacts or to use Freshsales lists for persona-based segmentation.
Tofu
Audiences
Freshsales
Freshsales Lists
lossyTofu Audiences are filtered subsets of Accounts or Contacts used to trigger Playbook activation. We export audience membership as a list of linked Account or Contact IDs with the filter criteria preserved. In Freshsales, we create Lists matching each Audience and populate membership based on the exported ID list. Any filter criteria that cannot be represented as a static list are flagged in the scope document for the customer to configure manually.
Tofu
Content Assets
Freshsales
ContentDocument + Contact/Account Custom Fields
1:1Content Assets (landing pages, one-pagers, ads, sales collateral) generated by Tofu live on Tofu's CDN as platform-hosted binaries. We export asset metadata (name, type, version, linked Campaign/Account associations) and re-download binaries from Tofu's asset URLs at export time. Binaries are re-hosted in Freshsales as ContentDocument records linked to the relevant Account or Contact. If Tofu rotates asset URLs post-migration, some Content Assets may become inaccessible; we snapshot URLs at export and re-validate before the final sync.
Tofu
Custom Properties
Freshsales
Custom Fields
1:1Tofu supports custom fields on Accounts, Campaigns, and Playbooks. We detect any non-standard properties during the pre-migration schema scan, map them to Freshsales custom fields of equivalent type (text, number, date, picklist, checkbox), and create them in Freshsales before data import begins. Custom field API names follow Freshsales naming conventions.
Tofu
Users / Owners
Freshsales
User
1:1Tofu Users are assigned as Campaign owners and Playbook creators. We export user email addresses and names and match by email against the Freshsales User table. Any Tofu Owner without a matching Freshsales User is held in a reconciliation queue for the customer's Freshsales admin to provision before record import resumes.
| Tofu | Freshsales | Compatibility | |
|---|---|---|---|
| Accounts | Account1:1 | Mapping required | |
| Contacts (via Audience membership) | Contact1:1 | Fully supported | |
| Campaigns | Deal (with campaign metadata)1:many | Fully supported | |
| Playbooks | Tasks + Custom Fields (step sequence)lossy | Mapping required | |
| Personas | Contact Custom Fields (ICP profile)lossy | Mapping required | |
| Audiences | Freshsales Listslossy | Mapping required | |
| Content Assets | ContentDocument + Contact/Account Custom Fields1:1 | Mapping required | |
| Custom Properties | Custom Fields1:1 | Mapping required | |
| Users / Owners | User1:1 | 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.
Tofu gotchas
No public API documentation or published rate limits
Content Assets are platform-hosted binaries not separately exported
Playbook branching logic maps imperfectly to most destination CRMs
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 export capability assessment
We audit the source Tofu account across Accounts, Campaigns, Playbooks, Personas, Audiences, Content Assets, and custom properties. Because Tofu has no published public API, we assess what export formats are available (CSV, native export, webhook access) and confirm export capabilities during the discovery call. We pair this with a Freshsales schema pre-design: identifying which custom fields, lists, and Deal custom fields are needed. The discovery output is a written migration scope document and a confirmed export method.
Schema design and Persona/Audience mapping decision
We design the destination Freshsales schema. This includes provisioning Account and Contact custom fields for Persona data, creating Freshsales Lists for each Audience, and designing the Deal custom field structure for Campaign metadata. The customer chooses during this step whether Personas apply globally (custom fields on every Contact) or selectively (linked to Freshsales Lists). This decision affects the import logic and must be finalized before production migration begins.
Export, transformation, and sandbox validation
We extract data from Tofu using the confirmed export method, transform field names and types to match Freshsales schema, and run a migration into a Freshsales Sandbox. The customer's RevOps lead reviews record counts (Accounts in, Contacts in, Deals in, Tasks in), spot-checks 20-30 records against the Tofu source, and validates that Persona custom fields and List memberships are populated correctly. Any mapping corrections happen in the sandbox, not in production.
Owner and user reconciliation
We extract every distinct Tofu User referenced on Account, Campaign, and Playbook records and match by email against the Freshsales User table. Owners without a matching Freshsales User go to a reconciliation queue. The customer's Freshsales admin provisions any missing Users before production migration resumes. This step must complete before Account and Contact imports begin because OwnerId references are required.
Production migration in dependency order
We run production migration in record-dependency order: Accounts first (as parent records), then Contacts (with AccountId resolved and Persona custom fields populated), then Deals (with campaign metadata from Tofu Campaigns), then Tasks (Playbook steps decomposed into discrete records), then List memberships (Audiences mapped to Freshsales Lists), then ContentDocument binaries (re-downloaded and re-hosted in Freshsales). Each phase emits a row-count reconciliation report before the next phase begins.
Cutover, validation, and Playbook rebuild handoff
We freeze Tofu writes during cutover, run a final delta migration of any records modified during the migration window, then enable Freshsales as the system of record. We deliver the Playbook Map document listing each original Playbook, its decomposed steps, any unrepresentable branching conditions, and the recommended Freshsales workflow reconstruction approach. We support a one-week hypercare window where we resolve any data reconciliation issues raised by the customer's team.
Platform deep dives
Tofu
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 Tofu 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
Tofu: Not publicly documented — typical SaaS limits assumed and confirmed during scoping.
Data volume sensitivity
Tofu 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 Tofu to Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Tofu 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 Tofu
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.