GoHighLevel Contact Import: CSV Mapping (2026) — HL Growth Partner, Dr Priya Jaganathan

GoHighLevel Contact Import: CSV Mapping (2026)

September 19, 2026

By Dr Priya Jaganathan, GoHighLevel Certified Admin · HL Growth Partner, Australia · Updated 19 September 2026 · 10 min read

Some links below are affiliate links — if you sign up through them, HL Growth Partner may earn a commission at no extra cost to you. It never changes what we recommend. Full disclosure.

A GoHighLevel contact import looks like a five-minute job and routinely turns into a two-day cleanup. The wizard itself is not the hard part — the hard part is the file you feed it, and the decisions you make on the duplicate-handling screen before you click Import.

This is the process we run for Australian clients moving a database into a sub-account: prepare the CSV, map fields without guessing, and make the import reversible so a bad HighLevel CSV import is a twenty-minute fix, not a restore-from-backup conversation. Migrating a whole platform? Pair this with our GoHighLevel CRM migration guide.

Quick Facts

Where the importer livesContacts > Import Contacts, inside the sub-account. Admin-level access required.
File format.csv only, one sheet, header row required (GoHighLevel Help Docs, 2026).
Maximum file size30 MB per file; split anything larger (GoHighLevel Help Docs, 2026).
Minimum data per rowAt least one of name, email or phone.
Duplicate match orderContact ID, then Email, then Phone (GoHighLevel Help Docs, 2026).
Custom fieldsMust already exist before you can map a column to them.
Phone formatE.164 recommended — +61412345678 for an Australian mobile.

Prepare the CSV properly and the HighLevel import stops fighting you

Every import failure I have debugged traces back to the file, not the platform. Spend forty minutes in the spreadsheet and the wizard becomes a formality.

Encoding and structure

Save as CSV UTF-8 — export from Excel as plain "CSV" and accented names arrive as mojibake. One header row: not two, not a merged title row, not a blank first row.

Delete every blank row and column before exporting — trailing empty rows are the most common cause of an import reporting more records than you have.

Australian mobile numbers

Convert every phone number to E.164: +61 followed by the number with the leading zero stripped. 0412 345 678 becomes +61412345678; 02 9876 5432 becomes +61298765432.

Format the column as text first, or Excel drops the leading zero. Numbers outside E.164 may still import, but they cause trouble later with LC Phone routing, A2P-registered SMS, and duplicate matching on the next import.

The date format trap

GoHighLevel's documented date formats are MM/DD/YYYY, YYYY/MM/DD, MM-DD-YYYY and YYYY-MM-DD (GoHighLevel Help Docs, 2026). Australian DD/MM/YYYY is not on that list — 03/09/2026 reads as 9 March, not 3 September. Use YYYY-MM-DD everywhere and the bug class disappears.

Splitting full names

Most legacy systems export a single "Name" column. GoHighLevel wants First Name and Last Name separately, and merge fields in Workflows and emails read wrong if you dump "Sarah Nguyen" into First Name.

Split it in the spreadsheet, then check the edge cases: hyphenated and multi-part surnames, titles, and trading names — anything that looks like a business belongs in Company.

Your CSV column to GoHighLevel field mapping reference

Rename your CSV headers to match GoHighLevel's field labels exactly and the wizard auto-maps most of the file. This is the reference we keep on the wall.

CSV column headerMaps to GHL fieldFormat exampleNotes
First NameFirst NamePriyaSplit from any single-name column
Last NameLast NameJaganathanMerge fields depend on it
EmailEmail[email protected]Primary deduplication key
PhonePhone+61412345678E.164 — no spaces or brackets
Additional Phone NumbersAdditional phone numbers+61298765432, +61412345679Separate column, comma-separated
CompanyCompany NameNorthside Plumbing Pty LtdNever merge into name fields
CountryCountryAustraliaMust match GHL's country list exactly
TimezoneTimezoneAustralia/SydneyCase-sensitive; Brisbane and Perth differ
Signup DateCustom date field2025-04-16YYYY-MM-DD; DD/MM/YYYY not accepted
TagsTagsplumbing, import-2026-09-19Comma, semicolon or full stop separated
Contact OwnerContact OwnerPriya JaganathanMust match an existing user's name
Pipeline / StageOpportunity fieldsSales Pipeline / New EnquiryOnly with Contacts & Opportunities ticked

Create your custom fields before the import, not during it

GoHighLevel only lets you map a CSV column to a custom field that already exists. Building them mid-wizard is a bad habit regardless — you end up with rushed names and a text field where you needed a date picker.

List every column that is not a standard field and build them first. Choose the data type deliberately: date picker for dates, single option for a fixed list, multi-select where a contact holds several values, numerical for anything you will filter with greater-than.

If you are creating fields like "job_1_address", "job_2_address" and "job_3_address", stop — that is a repeating relationship, and it belongs in custom objects rather than flattened contact fields.

An import you cannot reverse is not an import — it is a gamble. Tag the batch before you click the button, every single time.

Inside the GoHighLevel import wizard: the screens that actually matter

Go to Contacts > Import Contacts. Choose Contacts only, or Contacts and Opportunities together. Upload the file, then pick your import type.

Duplicate handling: add, update, or both

This decides whether you end up with a clean database or two thousand half-populated duplicates. When updating, GoHighLevel checks existing records in a set order — Contact ID, then Email, then Phone (GoHighLevel Help Docs, 2026).

Import typeWhat it doesUse it when
Create onlyAdds new records; leaves matches untouchedA new list entering an established sub-account
Update onlyChanges matched records; creates nothingBackfilling a field across existing contacts
Create and updateAdds new records and updates matchesMost migrations and re-syncs

Tick "Don't update empty values" whenever you are updating. Without it, a blank cell overwrites good data already in the CRM — the one import mistake you genuinely cannot undo from the interface.

Tag the batch so the import is reversible

The final screen offers three preferences: create a smart list for the new contacts, add them to a Workflow, and tag them. Always use the tag.

Make it dated and machine-readable — import-2026-09-19-legacy-db. That tag is your undo button: it isolates exactly what came in so you can bulk-review, correct or delete. Keep it consistent with your tag naming conventions.

Be careful with "add to Workflow". If that Workflow has an email or SMS action near the top and no filter, you are about to message the entire imported list. Leave it unticked unless you built a silent import sequence on purpose.

Not on HighLevel yet? Start with a free 30-day trial here — long enough to build everything in this guide before you pay a cent.

Bring your opt-outs with you. If a contact unsubscribed in the old system and you import them without setting DND, your first campaign re-contacts people who already said no. Map an unsubscribe or DND column during import, or tag those records and set DND in bulk straight afterwards — before any Workflow fires.

Bring your consent evidence too. Under the Spam Act 2003 the sender carries the burden of proving consent for every address, and buying a list does not shift that burden to the vendor (ACMA). Consent may be express or inferred, but ACMA is clear that inferred consent does not follow from merely having a commercial relationship.

So: do not import a purchased list into a client's sub-account. Beyond the regulatory exposure, you burn the sending reputation of a domain and an LC Phone number the client depends on for revenue. Carry consent source and consent date into custom fields at import time and you can prove the point later.

Run a staged test import before the full file

Never load the whole database first. Copy the top twenty rows into a separate CSV, same headers, and import that.

  • Open five contacts and check every mapped field landed in the right place.
  • Confirm dates read correctly — test a record where the day is 12 or lower, since those silently flip.
  • Confirm phone numbers display as valid Australian numbers, not raw strings.
  • Confirm custom field values sit under the right labels with the right data types.
  • Check the batch tag applied and that no Workflow fired.

Only when all five pass do you run the full file. Building the sub-account from scratch? The import belongs at a specific point in the build order — our GoHighLevel implementation checklist sets out where.

Post-import QA: prove the data landed before you tell the client

The import status screen lives under Bulk Actions. Click Show Stats for created, updated and failed counts, and download the error log from the Error tab — it names the row and the reason.

Then do the manual pass. Reconcile your source row count against the batch tag; they should match minus known duplicates. Build filtered smart lists and segments for the failure modes: no email, no phone, key custom field empty, DND set.

Finish with ten random spot checks against the source file, side by side. Counts tell you records arrived; only a human eye tells you the right values landed in the right fields.

What to do when a GoHighLevel import goes wrong

Stop immediately. Do not run a corrective import on top of a broken one — you compound the mess and lose track of which values came from where.

If the batch created new contacts, filter the smart list by your dated import tag, check the count, and bulk delete. Re-prepare the file and import again. If it updated existing contacts with wrong or blank values, deletion will not help — re-import correct values from your source export with "Don't update empty values" ticked.

Which is exactly why you export the sub-account's contacts before any significant import. It takes five minutes and it is the only true rollback that exists — the same discipline covered in our guide to client offboarding and data export.

Common mistakes to avoid

  • Importing DD/MM/YYYY dates. Any day of 12 or lower silently flips and nothing flags it.
  • Leaving "Don't update empty values" unticked on an update run. Blank cells overwrite live data, with no undo.
  • Skipping the batch tag. Without it you cannot isolate, review or reverse what you loaded.
  • Adding the import to a Workflow that sends. One checkbox separates a quiet import from a thousand unexpected SMS messages.
  • Creating custom fields mid-wizard. Rushed names and wrong data types, paid for in every future smart list.
  • Importing a purchased or scraped list. The consent burden sits with you, not the vendor.

If you want your database migrated into GoHighLevel cleanly — fields modelled properly, consent evidence carried across, a reversible import plan — book a strategy call with the HL Growth Partner team.

Book Your Strategy Call →

Or if you just need the software first: grab the 30-day HighLevel trial and book us when you're ready to scale it.

Frequently asked questions

Where is the contact import tool in a GoHighLevel sub-account?

Open the sub-account, go to Contacts, and click Import Contacts. You need Admin-level access — a standard user role will not see the option. From there you choose contacts only, or contacts and opportunities together.

What file format and size does a HighLevel CSV import accept?

CSV only — .xlsx and Google Sheets files are not accepted, so export to CSV UTF-8 first. GoHighLevel's documentation specifies a 30 MB maximum, one sheet per file, and a header row that is not blank. Split anything larger into separate batches.

How should I format Australian mobile numbers for import?

Use E.164: +61 followed by the number with the leading zero removed, so 0412 345 678 becomes +61412345678. Strip all spaces, brackets and dashes. Format the spreadsheet column as text before you start, otherwise Excel will drop the leading zero and corrupt the numbers.

Why did my dates import as the wrong day?

GoHighLevel's accepted date formats are MM/DD/YYYY, YYYY/MM/DD, MM-DD-YYYY and YYYY-MM-DD — Australian DD/MM/YYYY is not among them. A date like 03/09/2026 is therefore read as 9 March, not 3 September. Convert every date column to YYYY-MM-DD before importing.

Do custom fields need to exist before I import?

Yes. You can only map a CSV column to a custom field that already exists in the sub-account, so build them first with the correct data types. Doing it beforehand also means sensible field names rather than rushed ones, which matters in every future smart list and workflow condition.

How does GoHighLevel decide what counts as a duplicate?

When updating, it checks existing records in a defined order: Contact ID, then Email, then Phone. Your sub-account's duplicate detection preferences decide whether matched records are merged or skipped. Make sure at least one of email or phone is consistently populated, or matching cannot work reliably.

Can I undo a contact import in GoHighLevel?

There is no one-click undo, which is why you tag the batch on the final wizard screen. With a dated import tag you can build a smart list of exactly those records and bulk delete them. Updates to existing contacts cannot be reversed this way — export your contacts before any significant import.

Will imported contacts trigger my existing workflows?

Only if you add them to a Workflow on the final import screen, or if a Workflow uses a trigger the import satisfies — a tag being added, for instance. Review your active triggers first, and leave the add-to-workflow option unticked unless you built a silent import sequence.

Moving data in and out of HighLevel

Keeping the database clean

Making imported data earn its keep

Dr PriyaJaganathan

Dr PriyaJaganathan

Dr Priya Jaganathan is a Go High Level Certified Admin, trusted CRM consultant based in Australia, and a keynote speaker at SaaSpreneur Sydney and Level Up 2025 in Dallas.

Back to Blog