Most sub-accounts that have been live for a year carry dozens of custom fields nobody uses, plus a few duplicates that hold the same data under different names. Deleting them is simple. Deleting the wrong one is not, because the delete is hard to reverse.
This guide covers a safe order of operations in GoHighLevel itself, then what to do when you have to repeat it across many sub-accounts.
Why custom fields pile up
Duplicates and dead fields tend to come from the same few places:
- Snapshots. Loading a snapshot can bring in a lot of fields at once. One HighLevel feature request describes surveys getting cluttered after loading a snapshot that has a lot of custom fields.
- The form builder. Custom fields can also be created within the Form or Survey Builder, so a field gets made on the spot even if a similar one already exists.
- Imports and one-off campaigns. Someone needs a "Lead Source" field, doesn't see the existing "Source," and makes another.
- Changing a field type. Once you create a custom field, you cannot edit the field type, so you delete it and create a new one. The old one often lingers.
Clutter has a cost. Reps scroll past dead fields on every contact record, merge tag pickers get longer, and a wrong pick sends a blank into a text or email.
Step 1: Pull a full list of fields
In the sub-account, open Settings and go to Custom Fields. As of October 2026, HighLevel's docs describe this page with a Fields tab to view and manage fields, a Folders tab for folders, and column sorting to find fields faster.
Sort by name first. Near-identical names sit next to each other, which is the quickest way to spot duplicates by eye. Then write down, for every field you suspect, its name, its field key, its type and its folder.
If you want a deeper look at how keys work, see how to find a custom field key in GoHighLevel.
Step 2: Identify duplicates
Two fields are real duplicates only if they hold the same kind of data. Check these before you call it:
- Same meaning? "Budget" and "Project Budget" probably match. "Budget" and "Budget Approved" do not.
- Same type? A text field and a dropdown for the same question are duplicates in purpose but not in structure, so merging them means moving data.
- Which one has the data? Keep the field that contacts actually use. Make a smart list with a condition on each field (an "is not empty" style filter) and compare the counts.
- Which one is referenced? The field wired into your workflows and forms is usually the keeper, even if it has the worse name.
Don't confuse custom fields with custom values. Custom values are account-wide constants, not per-contact data, and they're cleaned up separately. See custom values vs. custom fields.
Step 3: Check what depends on each field
This step prevents most cleanup disasters. Before deleting a field, look in each place it can be used:
- Workflows. Conditions, update-contact actions, and merge tags in SMS and email actions. Deleting fields that are referenced in active workflows can break your automation.
- Forms and surveys. Open the builders and check for the field.
- Smart lists and saved filters. Any list that filters on the field.
- Templates and snippets. Email and SMS templates with a merge tag for the field.
- Outside integrations. Zapier, webhooks or other tools that write to the field by its key.
I haven't found a single native screen that lists every place a field is used, so this is a manual check. For a handful of fields that's fine. For hundreds it's the slow part.
Step 4: Back up before you delete
HighLevel's help docs warn that deleting a custom field from the form builder removes it from all forms, surveys, and contacts where it was used. Another guide puts it more bluntly: there is no undo button. Treat deletion as permanent.
Before you delete a field that holds data:
- Export the contacts with that field's column included, using the contacts export.
- Save the list of field names, keys and types you're about to remove. If you ever have to recreate a field, you'll need the key.
- For duplicates, copy the data into the field you're keeping first, using a CSV import or a workflow, then confirm the counts match.
Step 5: Delete the fields
For one field, go back to Settings, then Custom Fields, and use the field's delete option. Confirm the warning.
For many fields, check for a checkbox selection and a Bulk Actions menu on the Custom Fields page. HighLevel's docs say you can select multiple custom fields using the checkbox menu and use the Bulk Actions menu to edit, delete, or move them into a different folder. That passage sits in the opportunity custom fields guide, and older community threads describe the delete option disappearing when several fields were selected. Behavior has changed over time, so test with one or two fields before you queue up a big batch.
Through the API, there's a delete endpoint for a single field: DELETE /locations/:locationId/customFields/:id. That suits scripted cleanups, and you can authenticate with a Private Integration Token for one sub-account. Script it only after you've built a reviewed list of IDs, since the API doesn't ask whether you're sure.
If a field you're keeping is messy rather than dead, move it instead of deleting it. Folders exist to group related fields to keep contact and opportunity records tidy. See organizing custom field folders in GoHighLevel.
Where the native way gets slow
The cleanup itself is quick. The audit is not.
- You review one sub-account at a time.
- There's no export of the field list in the Settings page, so your notes live in a spreadsheet you type by hand.
- Comparing two sub-accounts means two browser tabs and your eyes.
- Agencies that built sub-accounts from the same snapshot end up with the same junk in every one, and you repeat the work each time.
Where Field Finder fits
Field Finder is the audit step, not the delete step. It's one of the six RGS Tools, built by a white-label GoHighLevel agency for its own sub-accounts first.
- Field Browser lets you look through a sub-account's custom fields in one place, so you aren't clicking through Settings.
- Sub-Account Compare lays fields from different sub-accounts side by side, which helps you see which ones drifted apart. There's more on that in comparing custom fields between sub-accounts.
- CSV Export gives you the list as a file, so your audit notes and backup of field definitions don't have to be typed.
You still make the deletion decisions, and the deletes happen in GoHighLevel. Field Finder is $29/month per agency with unlimited sub-accounts, a 7-day free trial and cancel any time. You can connect the whole agency with a marketplace-app install, or a single sub-account with a Private Integration Token. RGS Tools isn't affiliated with HighLevel Inc.
A safe cleanup order
| Field status | What to do |
|---|---|
| Empty, no references | Delete after noting the key |
| Has data, duplicate of a better field | Copy data over, verify, then delete |
| Has data, no references | Export, then decide with the client |
| Referenced in a workflow or form | Fix the references first, then reconsider |
| Messy but needed | Rename or move it to a folder |
Work through the first row first. It's the lowest-risk pass and usually removes the most clutter.
Questions
Can I undo a deleted custom field in GoHighLevel?
Plan on no. HighLevel's own docs warn that deleting a field removes it from the forms, surveys and contacts where it was used. Export the data and note the field key before you delete anything.
Can you bulk delete custom fields in GoHighLevel?
HighLevel's help docs describe selecting several custom fields with checkboxes and using a Bulk Actions menu to delete or move them. The menu has changed over time, so check what your sub-account shows as of October 2026. The API also has a delete endpoint for a single field.
How do I know if a custom field is unused?
Check three things: whether any contacts have data in it, whether any workflows, forms, surveys or templates reference it, and whether a smart list filters on it. A field with no data and no references is a safe candidate.
Why do I have duplicate custom fields in a sub-account?
Usually from loading snapshots, importing contacts, or creating fields on the fly in the form builder. Each source can add a field that already exists under a slightly different name.