CRM migration
Field-level mapping, validation, and rollback between Atomic CRM and Freshsales. We move data and schema; workflows are rebuilt natively in Freshsales.
Atomic CRM
Source
Freshsales
Destination
Compatibility
7 of 8
objects map 1:1 between Atomic CRM and Freshsales.
Complexity
BStandard
Timeline
2-4 weeks
Overview
Moving from Atomic CRM to Freshsales is a structural migration from a developer-maintained Postgres backend to a managed SaaS platform with a REST API. Atomic CRM stores all entities as Supabase tables with custom fields added as Postgres columns via Supabase Studio, meaning every migration requires a schema audit before we know the full field inventory. Pipeline stages and task types in Atomic CRM are defined as TypeScript props in the CRM root component rather than stored in the database, so we ask customers to share App.tsx or the equivalent to capture the enum values that must be replicated as pipeline stages and task categories in Freshsales. We read directly from the Supabase Postgres instance and write to Freshsales via its REST API with rate-limit handling. File attachments stored in Supabase Storage require separate coordination. Workflows, automations, and reporting dashboards are not migratable as code; we deliver a written inventory for the customer's admin 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 Atomic CRM 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.
Atomic CRM
Company
Freshsales
Account
1:1Atomic CRM Company records map to Freshsales Account. The Supabase companies table has columns for name, website, address, and any custom fields added via Supabase Studio. We audit the Postgres schema during scoping to capture all columns before designing the Freshsales Account field mapping. Account is the parent record for Contact, so we migrate Accounts first to satisfy referential integrity on the Contact import.
Atomic CRM
Contact
Freshsales
Contact
1:1Atomic CRM Contact records map to Freshsales Contact with first_name, last_name, email, phone, and any custom columns from the Supabase contacts table. The relationship to Company migrates by resolving the source contact.company_id foreign key to the destination Account ID created during the Accounts phase. Owner mapping resolves by email match between the Supabase auth UUID on contact and the Freshsales user email.
Atomic CRM
Deal
Freshsales
Deal
1:1Atomic CRM Deal records map to Freshsales Deal. The deal value, stage, and expected close date transfer directly. Pipeline stage names in Atomic CRM are defined as TypeScript props in App.tsx rather than stored in the database, so we request the customer share their App.tsx configuration during scoping to capture the exact stage names and probabilities. These are replicated as Freshsales pipeline stages before Deal import. Deals are imported after Accounts and Contacts so that the AccountId and ContactId lookups are resolved.
Atomic CRM
Note
Freshsales
Note
1:1Atomic CRM Notes migrate to Freshsales Notes linked to the parent record (Contact, Account, or Deal). We inspect the Supabase notes table for its content column, parent reference columns, and any polymorphic relationship structure the instance uses. Notes are migrated after the parent records exist in Freshsales to avoid orphaned entries. Rich-text formatting in notes transfers as-is if the destination field supports it.
Atomic CRM
Task
Freshsales
Task
1:1Atomic CRM Task records migrate to Freshsales Task. Task type categories (Call, Email, Meeting) are defined as props in App.tsx, not stored in the database, so we extract the enum values from the source code during scoping and configure corresponding task categories in Freshsales before import. Task status, priority, due date, and owner email map directly from Supabase columns. Owner resolution uses the same email-based mapping used for Contact and Deal owners.
Atomic CRM
Custom Fields
Freshsales
Custom Fields
lossyCustom fields in Atomic CRM are Postgres columns added via Supabase Studio. There is no UI for managing custom fields in Atomic CRM itself, so undocumented columns added post-deployment are a real risk. We run a pre-migration schema diff against a reference export to identify every custom column on the contacts, companies, deals, notes, and tasks tables. Each column is then configured as a corresponding custom field in Freshsales before data ingestion begins. Field type mapping from Postgres types (text, integer, boolean, timestamp, uuid) to Freshsales field types is documented in the scoping deliverable.
Atomic CRM
Owner / User
Freshsales
User
1:1User management in Atomic CRM uses Supabase Auth, where owner references on Contacts, Deals, and Tasks store auth UUIDs rather than readable identifiers. We map owners by email match between the Supabase users table and Freshsales User records. Any Atomic CRM owner without a corresponding Freshsales user is flagged in the reconciliation report and held until the customer's admin provisions the missing user. Owner resolution must complete before Deal and Task import because Freshsales requires OwnerId on those objects.
Atomic CRM
Attachment (Supabase Storage)
Freshsales
Attachment
1:1File attachments in Atomic CRM are stored in Supabase Storage buckets if the instance uses that storage backend, not in the Postgres tables. During scoping we check whether attachments exist and request the Supabase Storage bucket configuration. Files are exported from the bucket and uploaded to Freshsales as attachment records linked to the parent Contact, Account, or Deal. Files stored in custom S3 buckets or external storage require separate coordination and fall outside the standard migration scope.
| Atomic CRM | Freshsales | Compatibility | |
|---|---|---|---|
| Company | Account1:1 | Fully supported | |
| Contact | Contact1:1 | Fully supported | |
| Deal | Deal1:1 | Fully supported | |
| Note | Note1:1 | Fully supported | |
| Task | Task1:1 | Fully supported | |
| Custom Fields | Custom Fieldslossy | Mapping required | |
| Owner / User | User1:1 | Fully supported | |
| Attachment (Supabase Storage) | Attachment1: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.
Atomic CRM gotchas
No hosted SaaS version — migration target is a Postgres database
Custom fields are schema changes, not UI-configured properties
CRM component props define business logic that lives in code, not data
No native file attachment export — storage backend varies by deployment
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
Supabase schema audit and source credentials
We request Supabase project credentials and a read-only service account for the migration. We run a Postgres schema inspection on all five base tables (contacts, companies, deals, notes, tasks) plus any related tables for attachments and users. This produces a written schema inventory listing every column, Postgres type, nullability, and default value. We compare this against the standard Atomic CRM schema to flag any custom columns added post-deployment. We also request App.tsx or the equivalent configuration file to capture pipeline stage names and task type enumerations defined as TypeScript props.
Freshsales pipeline and field configuration
We configure the Freshsales destination environment before any data ingestion. This includes creating the pipeline stages that correspond to the Atomic CRM stage names extracted from App.tsx, setting stage probabilities, and configuring custom fields to match every custom Postgres column discovered during the schema audit. Custom field types are mapped from Postgres types to Freshsales field types. We configure this in a Freshsales sandbox or trial environment first for validation, then replicate to the production account.
Supabase data export in dependency order
We export data from Supabase in record-dependency order: first companies (to create Accounts), then contacts (with the company_id foreign key resolved for AccountId assignment), then deals (with account_id and primary_contact_id resolved), then notes and tasks (with their parent references resolved to Freshsales record IDs). Owner resolution runs concurrently — we extract distinct owner UUIDs from all tables, match by email against the Supabase users table, and produce a UUID-to-email map for the Freshsales user lookup during import.
Sandbox migration and reconciliation
We run a full migration into a Freshsales trial or sandbox account using the extracted data volume. The customer's team spot-checks 20-40 records per object against the Supabase source for field-level accuracy, verifies that parent-child relationships are preserved, and confirms that the pipeline stage assignment matches expectations. We correct any field mapping errors before committing to the production migration. Owner reconciliation happens here — any Atomic CRM owner without a Freshsales user is listed for the customer's admin to provision.
Production migration with ordered API ingestion
We migrate to the production Freshsales account in dependency order: Accounts first, then Contacts, then Deals, then Notes and Tasks. Each phase emits a row-count reconciliation report comparing source record count to destination record count. We use Freshsales REST API with rate-limit handling and exponential backoff on 429 responses. File attachments from Supabase Storage are uploaded in parallel where the storage bucket configuration is available. We run a final delta pass to capture any records modified during the migration window before declaring cutover complete.
Cutover, validation, and automation rebuild handoff
We freeze Supabase writes during cutover and run a final delta migration of records changed during the migration window. We enable Freshsales as the system of record and deliver a written automation and reporting inventory documenting what exists in Freshsales today and what needs to be rebuilt by the customer's admin. We support a five-business-day post-migration window to resolve data reconciliation issues raised by the sales team. We do not configure Freshsales workflow automation, sequences, or reporting dashboards as part of the migration scope; those are separate configuration tasks.
Platform deep dives
Atomic CRM
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 Atomic CRM 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
Atomic CRM: Per Supabase rate limits applicable to your project tier.
Data volume sensitivity
Atomic CRM 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 Atomic CRM to Freshsales migration scoping. Not seeing yours? Book a call.
Walk through your Atomic CRM 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 Atomic CRM
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.