
Custom CRM & Micro-SaaS
Migrate Off HubSpot or GoHighLevel and Keep Your Data
A step-by-step CRM migration checklist for leaving HubSpot or GoHighLevel: what exports miss, API limits, validation tests and when to cancel before renewal.
By Issa Badran · Published · 8 min read
Migrating off HubSpot or GoHighLevel without losing data means exporting by object, pulling activity and conversation history through each platform's API, rebuilding the links between records, and validating the result before you cancel. Neither platform's standard export captures everything: HubSpot's sales activity and inbox data need APIs, and GoHighLevel's contact CSV leaves out message history and all but the latest note. The checklist below covers both platforms, with a timeline built backward from your renewal date.
Key Takeaways
- Inventory every object first: contacts, companies, deals, activities, conversations, notes, custom objects and workflows.
- HubSpot: use the full CRM backup, then the Engagements and Conversations APIs for activity and inbox history.
- GoHighLevel: the contact CSV excludes email and SMS logs and keeps only the latest 255-character note, so use the Conversations API for message history; notes beyond the CSV need a separate check.
- Validate with row counts, a 20-record sample and association checks before you trust the new system.
- Export download links expire after 30 days on both platforms, and HubSpot auto-renews unless you turn it off.
The Migration in One View
- Inventory objects, fields, associations and automations.
- Export by object through the UI (CSV).
- Use the API for engagements, conversations and anything the UI misses.
- Map old IDs to new IDs and rebuild associations.
- Import into a sandbox, then production, in dependency order.
- Validate: row counts, a 20-record sample, association integrity.
- Run both systems in parallel.
- Cut over.
- Cancel before auto-renew.
Test every step on a sandbox or copy of your data before running it for real.
Inventory What You Actually Have
Before exporting anything, list what lives in the old CRM. In our experience, data loss usually comes from objects nobody remembered existed.
- Core records: contacts, companies, deals or opportunities, tickets
- Custom objects and custom fields, including their definitions and allowed values
- Associations: which contacts belong to which companies and deals
- Activity: calls, emails, meetings, notes, tasks
- Conversations: inbox threads, SMS, chat
- Automations: workflows, sequences, triggers
- Files and attachments
- Integrations: ad platforms, accounting, forms, phone systems
For each item, decide whether you need it in the new system, need it archived only, or can let it go. Archiving old activity as files is often cheaper than importing it.
Leaving HubSpot
What the built-in export covers
HubSpot's "Export your content and data" guide (updated August 25, 2026) describes a full CRM backup download that includes property definitions, property history and records, including calls and custom objects (HubSpot KB). Start there. Property history is especially useful if you need to prove when a deal changed stage or a lead changed owner.
What needs the API
The same guide notes several gaps (HubSpot KB):
- Sales activity (calls, chats, meetings) needs custom reports or the Engagements API.
- Inbox data needs the Conversations API.
- Marketing events need the Marketing Events API.
- Workflow exports omit history and performance data.
For programmatic record exports, HubSpot's CRM Exports API (POST /crm/exports/2026-09/export/async) produces CSV, XLS or XLSX files, requires the crm.export scope, and is available on Free tiers (HubSpot developer docs).
Export limits to plan around
HubSpot's record export limits (updated April 2, 2026) shape how you schedule the work (HubSpot KB):
| Limit | Value | What it means for you |
|---|---|---|
| Exports per rolling 24 hours | 300 | Batch by object, not by tiny segments |
| Exports running at once | 3 | Queue large objects |
| Rows per file | Over 1 million rows split into a zip | Expect multiple files for big objects |
| XLS columns | Capped at 256 | Use CSV for wide objects |
| Associated IDs per column | Up to 1,000 | Very connected records may need API checks |
| Download link lifetime | 30 days | Download and store files immediately |
API calls through a private app are also rate limited: Free and Starter allow 100 requests per 10 seconds and 250,000 per day; Professional allows 190 per 10 seconds and 625,000 per day; Enterprise allows 190 per 10 seconds and 1,000,000 per day (HubSpot developer docs). If you have a large activity history, the daily cap may turn extraction into a multi-day job, so script it to resume where it stopped.
Leaving GoHighLevel
Most GoHighLevel migration content explains how to move into the platform, not out of it. Here is what to know when leaving.
What the contact CSV leaves out
GoHighLevel's contact CSV export excludes automation history, meaning past email and SMS logs. It includes "only the latest note of up to 255 characters." It runs per sub-account, can't be scheduled, and the files are available for 30 days to Agency and Location Admins only (GoHighLevel help).
That notes limit is long-standing. A feature request to export notes has been "under review" since August 20, 2020, with 314 votes as of October 10, 2026 (GoHighLevel ideas board). Don't plan around it being fixed before your renewal.
Pulling conversation history via API
To get message history, use the Conversations API: GET /conversations/:conversationId/messages. It uses cursor pagination (lastMessageId and nextPage), returns 20 messages per page by default, and can filter by TYPE_SMS, TYPE_EMAIL or TYPE_CALL (GoHighLevel API docs).
Rate limits are 100 requests per 10 seconds in bursts and 200,000 per day, per app per sub-account (GoHighLevel API docs). At 20 messages per page, each request moves only a small batch, so a sub-account with years of SMS traffic needs a script that paces itself and records its cursor position. If you manage several sub-accounts, run them one at a time and log progress for each.
Opportunities and pipelines
Export deals from Opportunities using the three-dot menu and Export Opportunities. GoHighLevel's August 2023 changelog says this export includes custom fields (GoHighLevel changelog). Confirm in the UI that every field you need appears in your file, since the interface may have changed since then.
Phone numbers and A2P registration
Your phone numbers and A2P messaging registration are separate from your data. We haven't verified the process for porting numbers out of LC Phone, so confirm it directly with GoHighLevel support before you cancel anything. Losing a number customers already text is a costly mistake that no data export can fix.
Map IDs and Rebuild Associations
Every exported record carries its old platform ID. Keep those IDs as a field in the new system, then build a mapping table of old ID to new ID for each object. Use that table to recreate associations: contact to company, contact to deal, activity to contact.
Do this before importing activities. An imported call or SMS with no parent contact is just noise.
Import in Dependency Order
- Field definitions and picklist values
- Companies
- Contacts, linked to companies
- Deals or opportunities, linked to contacts and companies
- Activities, notes and conversations, linked to their parent records
- Files and attachments
Run the full sequence in a sandbox first. Fix mapping errors there, not in production.
Validate Before You Trust It
Validation is the step teams are most tempted to skip, and it's the one that catches silent data loss.
- Row counts. Compare record counts per object between the export files and the new system. Investigate any gap.
- 20-record sample. Pick 20 records across objects, including your oldest, newest and most active, and compare every field side by side with the old CRM.
- Association integrity. For the sample, confirm each contact shows the right company, deals and activity history.
- Activity spot checks. Open several conversation threads and confirm messages appear in the right order with correct timestamps.
- Integration tests. Submit a test lead through each form and ad integration and confirm it lands correctly. If you send conversions back to ad platforms, check that pipeline too; our guide to Google Ads offline conversion tracking covers what to verify.
Parallel Run and Cutover
Run both systems side by side for a short period, with new leads entering both. This shows whether anything in daily work depends on a feature you didn't rebuild. When the team is comfortable, switch forms and integrations to the new system, freeze edits in the old one and take a final export.
Timeline: Working Back From Your Renewal Date
HubSpot subscriptions renew automatically unless you turn off auto-renew in Account and Billing before the term ends (HubSpot Terms). Build your plan backward from that date. The intervals below are practitioner guidance, not vendor rules; adjust them to your data volume.
| When | Task |
|---|---|
| 90+ days before renewal | Confirm the renewal date and auto-renew setting; complete the inventory |
| 75 days | Run UI exports; start API extraction for activity and conversations |
| 60 days | Build ID mapping; run a sandbox import |
| 45 days | Full import; complete validation |
| 30 days | Parallel run; check for any price-increase notice |
| 14 days | Cut over; final export from the old system |
| Before term end | Turn off auto-renew (HubSpot: Account and Billing); confirm access end date; download all files before links expire |
On GoHighLevel, check your billing settings and cancellation terms directly, since we haven't verified them here. On both platforms, export files are available for only 30 days, so store them in your own storage as soon as they are ready.
What a Migration Can't Carry Over
Be clear about the limits before you start:
- Workflow logic can't be migrated, only documented. Screenshot or write out every workflow, trigger and sequence, then rebuild it in the new system.
- Some history may be partial. GoHighLevel notes other than the most recent one, and anything past 255 characters in that note, and HubSpot workflow performance data won't come across through standard exports.
- Phone numbers and messaging registration are separate. Treat them as their own project.
- Migration may not be the right move. If you're leaving mainly over price, compare a renegotiated renewal against the full cost of switching first. Our per-seat CRM pricing guide shows how to model both sides, and custom CRM vs Salesforce and HubSpot helps you choose the destination.
Planned well, a migration is also the moment to put your data where you control it: in a system whose code, hosting account and exports are yours. That's the idea behind an owned marketing stack.
If you'd like help planning or running the move, Robustech's custom CRM development service covers migration, validation and handover.



