Keap-to-HighLevel migration is a data-architecture problem — tags carry business logic, automations can't be exported, and both APIs impose strict rate limits. Choose your method based on dataset size and tag complexity.
There is no native migration path from Keap to GoHighLevel; the platforms differ fundamentally in how they encode business logic. Keap relies on a tag-heavy, campaign-builder model where tags carry segmentation logic and automation triggers, while HighLevel uses a pipeline-driven, workflow-based architecture where tags are simple labels and intelligence lives in the workflow engine. CSV exports from Keap flatten tag history and exclude tag associations, pipeline data, and automation logic entirely, meaning any serious migration requires API-based extraction, custom ETL, or a managed service to preserve data relationships and re-map tag logic to HighLevel workflows and pipeline stages.
Read this first
Pair-specific gotchas that catch teams out. Each one has cost somebody a weekend.
A note on Keap API rate limit references
As of April 2026, treat older Keap limit references with caution. Community Postman collections and some migration guides still cite 60 requests per minute. Keap's current official documentation specifies different limits depending on key type — see the API Rate Limits section below for current numbers. (postman.com)
Sub-account vs. Location terminology
In HighLevel, "sub-account" and "location" refer to the same thing. The API uses locationId as the scoping parameter. When reading HighLevel documentation or writing API calls, treat these terms as interchangeable — but always use locationId in your code.
No method migrates Keap automations automatically
Keap's API does not expose Campaign Builder logic beyond completing a goal. Campaign Builder sequences, triggers, and decision nodes cannot be exported via API or CSV. Regardless of which approach you choose, automations must be documented manually and rebuilt in HighLevel's workflow builder. This is a separate implementation task from the data migration — see Why Data Migration Isn't Implementation for more on this distinction. (developer.infusionsoft.com)
HighLevel contact and opportunity custom fields are separate object types and cannot be
HighLevel contact and opportunity custom fields are separate object types and cannot be converted later. Recreate contact custom fields as contact fields and deal fields as opportunity fields. Get this right before import. (help.gohighlevel.com)
Keap's native CSV export does not include tags
You must use the Tag Tracker report (Keap Pro and Max) to export Contact IDs with their associated tags, then join this data with your contact export before importing into HighLevel. (help.keap.com)
The runbook
Work top to bottom. Tick steps as you go — your progress is saved in this browser.
01 Discovery Agree scope, pipeline design and success criteria before touching data.
Objective A scope covering every object in the revenue model, with sales leadership signed up to the pipeline design.
Keep these open
-
Inventory every object in Keap
Count accounts, contacts, leads, deals or opportunities, activities, notes, emails, files, products and quotes. Activity and email history is usually the largest object by an order of magnitude and the one people forget to size.
Data Profiler Get real record counts instead of estimating from memory -
Map the current pipeline and agree the target model
Document every pipeline, stage, probability and required field, then agree the HighLevel model with sales leadership. Migrating a broken pipeline faithfully is a wasted opportunity; redesigning it mid-migration is a wasted migration.
Stage changes alter historical conversion rates. Agree how you will restate reporting before you change the model.
-
Catalogue integrations and automation
List every system touching Keap: marketing automation, quoting, billing, ERP, data enrichment, dialler, BI. Each is a separate cutover task with its own owner, and each can silently write bad data into your new CRM.
-
Capture the reporting that must survive
Interview the people who actually live in the dashboards — forecast, pipeline coverage, rep activity, cohort conversion. Every one of these needs the underlying fields to migrate, which frequently expands the scope.
-
Build the business case and pick the go-live date
Model licence delta, implementation effort and productivity dip. Then choose the date deliberately: mid-quarter is disruptive, quarter-end is worse. Most teams land on the first week of a new quarter.
COI & ROI Calculator Build the 36-month business case you will need for sign-off -
Archive externally
email send history, order/invoice records, referral partner data, file attachments
-
Record count comparison
Total contacts, companies, and open opportunities in Keap vs. HighLevel. Any delta needs investigation.
Keap → HighLevel specifics
- Cost consolidation
- Keap Pro and Max pricing scales per-contact, and adding SMS, funnels, or scheduling means stacking third-party subscriptions on top. GoHighLevel bundles CRM, pipeline management, funnel builder, email/SMS, appointment scheduling, and reputation management into a single flat-rate subscription. (gohighlevel.com)
- Campaign Builder fatigue
- Keap's visual Campaign Builder — with its decision diamonds, tag sequences, and nested goals — is powerful but creates brittle, hard-to-audit automation logic. HighLevel's workflow builder covers most of those use cases with a simpler trigger-action-condition model.
- Agency model fit
- GoHighLevel was built for agencies. Its sub-account architecture lets agencies white-label and manage dozens of client accounts under one roof — something Keap was never designed to do. (marketplace.gohighlevel.com)
- Must move
- live contacts, open deals, active tags, compliance-relevant notes, active custom fields, email/SMS opt-in status
- Nice to have
- closed-lost history older than X years, obsolete campaigns, dead tags
Don't move on until
- Object counts confirmed for accounts, contacts, deals and activities
- Target pipeline and stage model agreed with sales leadership
- Reporting requirements captured from the people who use the reports
02 Data Audit CRM data is usually dirtier than anyone expects. Find out how dirty.
Objective A profiled export with duplicates, ownership gaps and relationship integrity all quantified and triaged.
Keep these open
-
Export and profile every object
Profile null rates, distinct values and type consistency across all objects. Pay attention to fields sales reps were supposed to fill in: an 80% null rate on a field your forecast depends on is a business finding, not a data one.
Data Profiler Profile the Keap export for nulls, outliers and type drift -
Quantify duplicates and agree the merge policy
Measure duplicate accounts (same company, different spellings and suffixes) and contacts (same email, or same person at a renamed company). Agree survivorship rules before merging: which record wins, which fields, and what happens to the activity history on the loser.
Merging before you have agreed survivorship rules destroys history irreversibly. Decide first, merge second.
Data Cleaner Strip empty rows, stray whitespace and dead columns -
Verify relationship integrity
Check every deal has a valid account, every contact a valid account, every activity a valid parent. Referential breaks are the defect that turns a clean-looking load into a CRM where the pipeline report does not tie to the account list.
-
Resolve ownership and the user map
Build the Keap user → HighLevel user map, including leavers. Every record needs a valid owner: records assigned to deactivated users either fail to load or land unassigned, and unassigned pipeline is pipeline nobody works.
Records owned by deactivated users are a top cause of load failures. Decide the reassignment target before you start.
-
Scan for PII and regional compliance
CRMs hold marketing consent, lawful basis and unsubscribe state. Confirm these fields migrate intact and that consent provenance survives — losing consent records is a regulatory problem, not a data-quality one.
PII & Compliance Scanner Find regulated fields before they land in a new system -
Clean, normalise and archive the pre-state
Normalise country and state values, phone formats, currencies and casing, and standardise all timestamps to UTC. Keep an untouched copy of the raw export — it is your only reference if a mapping decision turns out wrong.
Keap → HighLevel specifics
- Tags are not included in Keap's CSV export
- You need the Tag Tracker report to match exported Contact IDs with applied tags, then merge the data manually before importing. (help.keap.com)
- Pipeline/Opportunity data is not part of the contact export
- You need a separate export. HighLevel caps opportunity CSV files at 30 MB, requires each opportunity to reference a valid contact, and says imports cannot be undone. (help.gohighlevel.com)
- Company import is indirect
- HighLevel creates companies from the contact's Business Name during CSV import; standalone company CSV import is not supported. (help.gohighlevel.com)
- Automation logic does not transfer
- Campaign sequences, triggers, and decision trees must be documented manually and rebuilt.
Don't move on until
- Duplicate rate quantified per object with a merge policy agreed
- Every record has a valid owner mapped to a target user
- Relationship integrity verified — no orphaned deals or contacts
03 Field Mapping Map objects, relationships and picklists — in that order.
Objective A signed mapping spec that covers objects, relationships, picklist values and currency handling.
Keep these open
-
Map objects and their relationships first
Establish how Keap objects correspond to HighLevel objects before any field work. Leads-versus-contacts, accounts-versus-organisations and deal hierarchies differ structurally between CRMs, and a field map built on the wrong object model has to be redone.
Schema Mapper Opens pre-loaded with the Keap → HighLevel field pair -
Generate and then hand-review the field map
Auto-match both schemas, then review every row. Look hardest at anything named "type", "source", "stage" or "status", where names match and meanings do not.
-
Map every picklist value, including retired ones
Enumerate all values on both sides — deal stages, lead sources, industries, statuses — and map each explicitly, including values no longer offered but still present on old records. Unmapped values either fail the row or land as blanks that quietly break segmentation.
Historical records often carry picklist values that were retired years ago and no longer appear in the UI.
-
Decide currency, amount and date handling
If you sell in multiple currencies, confirm how HighLevel stores amounts, exchange rates and dated conversion rates. Recalculating historical deal values at today's rate silently rewrites your revenue history.
Multi-currency deals re-converted at current rates will not tie to your historical reporting or your finance system.
-
Determine the load order
Sequence the load so parents exist before children: users, then accounts, then contacts, then deals, then activities and notes. Keep source IDs in custom fields so relationships can be rebuilt by lookup rather than guesswork.
-
Freeze the spec and sign off
Version-control the mapping, walk RevOps and sales leadership through the decisions that change reporting, and get written sign-off before the pilot.
Keap → HighLevel specifics
- Custom fields must be manually recreated in HighLevel's Settings > Custom Fields before the import
- the CSV import cannot create new fields on the fly. HighLevel's own Keap migration guide explicitly instructs users to rebuild custom fields and tags first. (help.gohighlevel.com)
- Custom field type check
- Ensure dates are dates (not strings), dropdowns have the right options selected, and numeric fields didn't lose precision.
Don't move on until
- Object and relationship model mapped and reviewed
- Every picklist value explicitly mapped, including dead values
- Load order determined so parents always exist before children
04 Test Migration Pilot with related records, not a flat sample.
Objective A pilot load whose relationships, ownership and roll-up reporting all verify against source.
Keep these open
-
Configure the HighLevel sandbox to match the agreed model
Build the pipelines, stages, custom fields, record types and user roles first. Load into a default configuration and you will only discover the configuration defects at full scale.
-
Select a connected pilot slice
Take complete account trees — 50-100 accounts with all their contacts, deals, activities and files — rather than a flat random sample. Relationship defects are the whole point of a CRM pilot and a flat sample cannot expose them.
-
Run the load in dependency order with full logging
Load users, accounts, contacts, deals, then activities, logging every request against its source ID. Note which failures are transient (rate limits, timeouts) and which are structural (validation, missing parent).
-
Verify relationships and roll-ups
Confirm every deal sits on the right account with the right owner and stage, and that pipeline totals per account and per rep match Keap exactly. Roll-up mismatches almost always mean a relationship or currency defect upstream.
Migration Validation Tool Diff the pilot batch against source before scaling up -
Measure throughput and project the full load
Record actual records-per-hour under HighLevel's API limits and extrapolate, remembering activity history usually dominates volume. If the projection exceeds your window, split the load or trim activity scope now.
-
Let reps work the pilot data
Put two or three reps in the sandbox against their own accounts. They spot missing context, wrong owners and unusable notes far faster than any reconciliation script, and their buy-in is what makes adoption work.
Keap → HighLevel specifics
- Workflow smoke test
- Trigger each rebuilt workflow with a test contact and verify the action chain fires correctly.
Don't move on until
- Relationships intact across the whole pilot slice
- Pipeline roll-ups match source for the pilot accounts
- Reps have worked pilot records and confirmed they are usable
05 Cutover Switch the revenue system with the pipeline intact.
Objective All in-scope CRM data live in HighLevel, integrations repointed, and reps selling on day one.
Keep these open
-
Pre-load history ahead of the freeze
Load closed deals, historical activities and inactive accounts while Keap stays live. Only open pipeline and the final delta need to move inside the window.
-
Publish the cutover runbook
A timed sequence with owners and abort criteria: freeze, final export, delta load, integration switch, smoke test, go/no-go, rep enablement. Pick a window that avoids quarter-end and month-end close.
-
Freeze Keap and take the final delta
Set Keap read-only and export everything changed since the pre-load. Reps updating deals during an unenforced freeze is the classic way to lose the most recent — and most valuable — pipeline changes.
A rep who updates a deal in the old CRM during the freeze will lose that update permanently.
-
Load the delta and reconcile the pipeline
Run the delta, then verify open pipeline value and count per rep against Keap before anything else. If the pipeline number is wrong on day one, reps stop trusting the system and never fully come back.
Migration Validation Tool Confirm the final delta landed before you reopen -
Repoint every integration and verify with real records
Switch marketing automation, quoting, billing, enrichment, dialler and BI connections, then push a live record through each path. An unrepointed integration writing into the old CRM causes divergence that gets harder to reconcile every day.
Two-way integrations left pointing at the old CRM will keep writing there. Disable them before you switch, not after.
Cron Expression Builder Schedule the delta syncs that run through the freeze -
Go/no-go, then enable the reps
Call the decision explicitly against the exit criteria. Run enablement on real data with their own accounts on screen, and keep Keap read-only rather than cancelled until validation closes.
Don't move on until
- Historical load complete and reconciled before the freeze
- All integrations repointed and verified end to end
- Reps logged in with pipeline visible and correct
06 Validation Prove the revenue numbers tie out, then close the project.
Objective Reconciled data, forecast parity with pre-migration reporting, and signed acceptance.
Keep these open
-
Reconcile every object
Compare counts and values across accounts, contacts, deals, activities and files, plus field-level spot checks on a random sample. Produce a single report suitable for audit and for finance.
Migration Validation Tool Reconcile Keap and HighLevel record-for-record -
Tie the pipeline and forecast to baseline
Rebuild forecast, pipeline coverage and win-rate reporting and compare to pre-migration figures. Every variance needs an explanation — most trace back to stage or currency mapping decisions made in Field Mapping.
Stage-model changes will legitimately shift historical conversion rates. Restate the baseline rather than chasing the difference as a defect.
-
Verify ownership, visibility and permissions
Confirm every record has the right owner and that sharing rules, territories and role hierarchy give each rep exactly the visibility intended. Over-broad visibility in a CRM is a data-protection issue as much as a config one.
-
Re-profile for field completeness
Compare loaded null rates against the source profile per field. A field that arrived empty while counts matched is the failure counts alone cannot detect.
Data Profiler Prove field completeness held up through the load -
Test automation and integration write-back
Fire every workflow, assignment rule, sequence and notification, and confirm each integration writes correctly in both directions. Automation is rebuilt rather than migrated, so it is unproven until observed.
-
Sign off and schedule decommission
Get written acceptance against the Discovery criteria, keep Keap read-only for 30-90 days with a final archive export taken, then diarise cancellation so the contract does not auto-renew.
-
Rebuild automations
Use your documented campaign logic to create HighLevel workflows. Start with your highest-impact sequences (lead capture → follow-up, purchase → onboarding).
-
Rebuild forms and funnels
Keap forms and landing pages don't transfer. Recreate them in HighLevel's funnel builder.
-
Monitor for 30 days
Watch for data inconsistencies, workflow misfires, missing contact records, duplicate merges, and company association drift.
Keap → HighLevel specifics
- Field-level sampling
- Pull 50–100 random records and compare field values side-by-side (first name, email, phone, tags, custom fields). Use a stratified sample: newest leads, oldest customers, biggest open deals, records with attachments, records with the most tags.
- Tag count verification
- For each migrated tag, compare the contact count in Keap vs. HighLevel.
- Pipeline validation
- Verify every deal is in the correct stage with the correct contact association and deal value.
- DND/compliance spot check
- Verify that opted-out and bounced contacts in Keap have the correct DND flags set in HighLevel. Check a sample of SMS-opted-in contacts to confirm DND SMS is not enabled.
- Duplicate scan
- Run a deduplication check in HighLevel post-import.
Don't move on until
- Full reconciliation report complete across all objects
- Forecast and pipeline reports tie to pre-migration baselines
- Acceptance signed and Keap decommission scheduled
Field mapping reference
The field-by-field mapping for each object. Use this as the starting point for your mapping spec.
Object Equivalent
| Keap field | HighLevel field | Notes |
|---|---|---|
| Contact | Contact | Direct 1:1 mapping. Standard fields map cleanly. |
| Company | Business/Company | HighLevel's Company object is simpler — fewer native fields, no deep relational hierarchy. CSV import creates companies from contact Business Name, not as standalone records. (help.gohighlevel.com) |
| Opportunity | Opportunity (inside a Pipeline) | Create pipelines and stages first. Opportunity CSV import requires a valid contact link and cannot be undone. (help.gohighlevel.com) |
| Tags | Tags + Workflow logic | Informational tags → HighLevel Tags. Logic-carrying tags → Workflow triggers or Pipeline stages. |
| Tasks | Tasks | HighLevel has a task API. Map due dates, assignees, and linked contacts. |
| Notes | Notes | HighLevel supports notes on contact records via API. Keep source timestamp and owner in the note body if audit context matters. (help.keap.com) |
| Appointments | Calendar events | Recreate appointment types; integrate Google/Outlook calendars. |
| Custom Objects (Max Classic) | Custom Objects (up to 10 per sub-account) | Available on all plans as of October 2025. API support for associations is still partial. (help.gohighlevel.com) |
| Email history / sent emails | ❌ No migration path | Keap stores email send history and conversation logs per contact. HighLevel does not support importing historical email threads. Archive email history externally if you need it for compliance or reference. |
| Orders / Invoices | ❌ No direct equivalent | Keap's e-commerce module (orders, invoices, payment records) has no import path into HighLevel. Export order history from Keap for archival. If you need active e-commerce data, plan to integrate HighLevel with a separate payment/invoicing platform. |
| Referral Partners | ❌ No equivalent | Keap's referral partner module has no counterpart in HighLevel. Export referral partner data for archival before migration. |
Keap HighLevel
| Keap field | HighLevel field | Notes |
|---|---|---|
| Direct | ||
| FirstName / LastName | firstName / lastName | Direct |
| Phone1 | phone | Normalize format |
| Company.name | companyName / Business Name | Direct; drives company auto-creation in CSV |
| ContactType (Lead/Client/Other) | Tag or Pipeline stage | Map to tag or pipeline position based on target model |
| Owner (Keap user) | assignedTo (User ID) | Map Keap user IDs → HighLevel user IDs |
| Tags (comma-separated) | tags [] | Split, clean, create in HL first |
| EmailStatus (opted-in, opted-out, bounced, complained) | DND settings (per channel) | Map opted-out/bounced/complained → enable DND for email. HighLevel uses per-channel DND (email, SMS, calls, GMB, FB), so each Keap email status needs a deliberate mapping rule. |
| SMSOptStatus | DND SMS setting | If your Keap instance tracks SMS opt-in status, map it to HighLevel's SMS DND flag. TCPA compliance requires explicit opt-in records — preserve opt-in timestamps and consent source in custom fields if you send SMS through HighLevel. |
| Custom dropdown fields | Custom Field (Single Option) | Recreate options in HL; validate values match exactly |
| Custom date fields | Custom Field (Date) | Verify format (ISO 8601) |
| Drill-Down fields | Multiple single-option fields or text | Flatten — no direct equivalent in HighLevel |
| Opportunity.stage | Pipeline stage ID | Map stage names → HL stage IDs via explicit mapping table |
| File attachments | ❌ Not directly supported | Store externally (S3, Google Drive), link via custom field |
| Country values | Country field | Normalize exactly — HighLevel CSV import requires accepted values to match. (help.gohighlevel.com) |
| Contact ID | Custom field keap_contact_id | Preserve source ID for replays and dedupe |
Risk matrix
Per-object risk for this pair. Plan extra validation around anything marked high.
| Object | Risk | Notes |
|---|---|---|
| Contacts | low | Core contact records with standard fields export cleanly via CSV or API and map directly to HighLevel's flat contact model. |
| Tags | high | Tags are excluded from Keap's CSV export, carry embedded business logic, and must be individually re-mapped to HighLevel pipeline stages, workflow triggers, or flat labels. |
| Custom Fields | medium | Custom fields must be manually recreated in HighLevel before import since the CSV importer cannot create new fields on the fly, and field type mismatches can cause silent data loss. |
| Opportunities/Deals | high | Pipeline and opportunity data requires a separate export from Keap, each opportunity must reference a valid contact in HighLevel, and imports cannot be undone. |
| Companies | medium | Keap's dedicated Company object with custom fields must be reduced to HighLevel's simpler Business object, created indirectly through contact imports with no standalone company CSV import available. |
| Campaign Automations | high | Keap's Campaign Builder sequences with decision trees, tag triggers, and nested goals have no export or migration path and must be fully documented and rebuilt as HighLevel workflows. |
| Notes and Tasks | medium | Notes and tasks associated with contacts require API-based extraction from Keap and must be pushed individually to HighLevel's corresponding endpoints with correct contact linkage. |
| Email/SMS History | high | Historical communication logs from Keap's campaign sequences are not included in standard exports and typically cannot be migrated into HighLevel's conversation threads. |
| Contact-Company Relationships | medium | Keap's explicit contact-to-company associations may be lost during migration since HighLevel derives company records from contact fields rather than maintaining independent relational links. |
The hard parts
What makes this specific migration difficult, beyond the mechanics.
Tag Logic Does Not Transfer
Keap encodes lifecycle state, segmentation, and automation triggers in tags, but HighLevel treats tags as flat labels, requiring each tag to be manually re-mapped to pipeline stages, workflow triggers, or informational labels.
CSV Export Excludes Tags
Keap's standard contact CSV export does not include tag associations, requiring a separate Tag Tracker report to be merged with contact data before import.
Campaign Automation Requires Manual Rebuild
Keap's visual Campaign Builder sequences with decision diamonds, nested goals, and tag-based triggers have no export format and must be manually documented and reconstructed as HighLevel workflows.
Pipeline and Opportunity Data Separation
Opportunity and pipeline data is not part of Keap's contact export and must be extracted separately, then imported into HighLevel with valid contact references and within a 30 MB file cap.
API Rate Limit Bottlenecks
Keap enforces a 25-request-per-second spike limit with non-adjustable daily quotas for PAT/SAK keys, while HighLevel caps at 100 requests per 10 seconds, requiring careful throttling and backoff logic in migration scripts.
Company Object Model Mismatch
Keap has a dedicated Company object with custom fields, but HighLevel only creates companies indirectly from a contact's Business Name during CSV import, with no standalone company import supported.
Tools used in this playbook
All free, all run entirely in your browser — nothing is uploaded.
FAQ
Can I migrate Keap automations to GoHighLevel automatically?
No. Keap's API does not expose Campaign Builder logic beyond completing a goal. Campaign Builder sequences, triggers, and decision nodes cannot be exported via API or CSV. They must be manually documented and rebuilt in HighLevel's workflow builder. This applies to all migration methods — CSV, API, or managed service.
What are the Keap API rate limits for data extraction?
Keap enforces a spike limit of 25 requests per second per application. Daily quotas vary by key type: OAuth2 bearer tokens get 150,000 requests/day, while PAT and SAK quotas are lower and not adjustable. Monitor the x-keap-product-throttle-available response header and implement exponential backoff to avoid 429 errors.
Can I export tags from Keap in a CSV file?
No. Keap's native CSV contact export does not include tags. You must use the Tag Tracker report (available on Keap Pro and Max) to export Contact IDs with associated tags, then merge this data with your contact export before importing into HighLevel.
Does HighLevel support custom objects for Keap migration?
Yes. As of October 2025, HighLevel supports Custom Objects on all plans with a limit of 10 per sub-account. Each object can have its own fields and associations. However, the support matrix is still partial — Custom Objects are not supported in Company, Conversations, Calendars, Payments & Invoicing, or bulk messaging surfaces.
How long does a Keap to GoHighLevel migration take?
A small migration (under 5K contacts, minimal tags) can be completed via CSV in 1–2 days of manual work. API-based migrations of 10K–100K+ contacts with complex tag structures typically take 1–3 weeks DIY, or can be completed in days by a managed migration service.