CRM Architecture: The Complete Guide to Contact Tags, Custom Fields & Smart Lists
In GoHighLevel, tags are short, freeform labels used to mark a contact’s status or behavior and to trigger automations; custom fields are structured data points — attached specifically to either a Contact record or an Opportunity record — used to store information like budget, service type, or renewal date; and Smart Lists are saved, real-time filtered views built from tags, fields, and activity data that update automatically as contacts meet or stop meeting the criteria.
None of the three works well in isolation — Smart Lists are only as reliable as the tag and field discipline behind them, and most “messy CRM” complaints trace back to that discipline never being established.
This guide covers how each piece actually behaves inside GoHighLevel (based on HighLevel’s own support documentation), where agencies typically get it wrong, and a build order that holds up as an account scales past a few thousand contacts.
What Tags Actually Do in GoHighLevel
A tag is a label you attach to a contact to categorize it — by lifecycle stage, source, behavior, or any other status you want to track and later filter, search, or act on. Tags aren’t cosmetic: they can fire automations directly, since HighLevel’s workflow builder includes a dedicated Contact Tag trigger that runs whenever a specified tag is added to or removed from a contact.
Tags can be applied to a contact through several different paths, all of which end up in the same tag field on the record:
Two behaviors are easy to miss and cause real problems downstream:
Where Agencies Misuse Tags
The most common architectural mistake is using tags for information that has many possible values or that changes over time — for example, creating a separate tag for every budget bracket (budget-1k, budget-2k, budget-5k-plus) instead of a single number-type custom field called “Budget.” Tags don’t get automatically removed when the underlying fact changes, so a contact tagged budget-1k eighteen months ago may still carry that tag long after their budget moved on. The result, at scale, is a tag list with hundreds of entries, no naming logic, and search results nobody trusts.
Rule of thumb: if a piece of information is a discrete event or binary state (webinar attended, no-show, unsubscribed), it belongs in a tag. If it’s a value that could be one of many options, changes over time, or needs to be reported on numerically, it belongs in a custom field.
Read this: GoHighLevel for Coaches and Consultants: Complete 2026 Setup Guide
Custom Fields: Contact vs. Opportunity, and Why the Distinction Is Permanent
GoHighLevel supports two categories of custom fields, and the platform enforces a hard rule about them: a custom field is created as either a Contact field or an Opportunity field, and it cannot be switched between the two after creation. If you assign a field to the wrong object type, HighLevel’s documentation is direct about the fix — you have to recreate it under the correct object type. This makes it worth pausing before creating a field, not after.
A practical implication: if you need to report on “average deal budget by pipeline stage,” that field belongs on the Opportunity object — a Contact-level “Budget” field won’t show up in opportunity-level reporting at all.
Available Field Types
HighLevel’s custom field builder supports a range of types, and picking the right one is what keeps the field usable in filtering and automation later:
| Field Type | Best Use | Notes |
|---|---|---|
| Short Text | Free-form short values | Not filterable to a fixed set of options |
| Long Text / Text Area | Notes, descriptions | Not reliable for workflow conditions |
| Number | Quantities, scores, counts | Supports greater-than/less-than logic in filters |
| Monetary | Budget, deal size | Formats as currency |
| Date Picker | Renewal dates, birthdays, booking dates | Supports before/after filter logic |
| Dropdown (Single Select) | Lead source, service type, job status | The most reliable type for clean workflow filtering — one fixed value per contact |
| Dropdown / Checkbox (Multi-Select) | Services interested in, days available | Can hold 50+ options with no practical limit, but is harder to filter precisely than single-select |
| Radio Select | Mutually exclusive choices | Similar to single-select dropdown |
| File Upload / Signature | Signed contracts, ID verification, before/after photos | Useful for document storage, not usable in workflow logic |
Fields can also be organized into folders (sometimes called groups), which keeps related fields together on the record layout — for example, grouping every field related to “Billing Details” or “Onboarding Info” so the contact or opportunity screen doesn’t become an unstructured wall of fields as the account grows.
Custom Fields vs. Custom Values vs. Merge Fields
These three terms get used interchangeably by agencies but mean different things in HighLevel, and mixing them up causes confusion when building personalized messaging:
Smart Lists: What They Are, and Where the Filter Logic Comes From
A Smart List is a saved, dynamic view of contacts (or, in newer accounts, companies, appointments, and custom object records) built from one or more filter conditions. Unlike a static list, a Smart List updates in real time — contacts are automatically added or removed from the list as their tags, field values, or activity change, with no manual refresh required.
Smart Lists support combining multiple filters at once — for example, “opened an email in the last 30 days” AND “has an open invoice,” or a tag condition combined with a custom field condition. According to HighLevel’s own documentation, when you stack filters inside a Smart List they combine using AND logic: a contact has to satisfy every condition in the list to appear, not just one of them. That’s an important detail to design around — if you actually need “any of these conditions,” you’ll need to structure separate lists or reconsider the filter logic, since a single Smart List won’t natively give you OR-across-filters behavior.
Once built, a Smart List can be:
This is also where clean tags and fields directly determine whether a Smart List is trustworthy. A Smart List defined as:
Tag contains "webinar-attended"
AND Custom Field "Budget" is greater than 5000
AND Tag does NOT contain "customer-active"
…is only correct if “webinar-attended” is always spelled and cased the same way, “Budget” is a genuine number field rather than a scattering of tags, and “customer-active” gets removed reliably when a customer actually churns. Smart Lists don’t fix inconsistent underlying data — they just make the inconsistency visible faster, in the form of a segment that quietly includes or excludes the wrong people.
A Build Order That Holds Up at Scale
Common Mistakes Worth Naming Directly
Read this: GoHighLevel Conversation AI Setup: Complete Training Guide 2026
FAQ
Do I need both tags and custom fields, or can I use just one?
You need both. Tags handle binary states and discrete events well; custom fields handle structured, variable, or reportable data. Forcing everything into tags leads to sprawl and unreliable filtering; relying only on custom fields loses the speed and flexibility of quickly flagging behavior-based events.
Can I convert a Contact custom field into an Opportunity custom field?
No. HighLevel’s platform does not allow switching a custom field’s object type after creation. You have to create a new field under the correct object and migrate the data manually.
Are GoHighLevel tags case-sensitive?
Yes. “Facebook” and “facebook” are treated as two separate tags, which is why a documented, enforced naming convention matters more than it might seem to at first.
Do Smart List filters combine with AND or OR logic?
Filters within a single Smart List combine using AND logic — a contact must meet every condition applied, not just one. If you need “any of” logic across conditions, you’ll need to plan around this rather than assume the Smart List will support it natively.
Do Smart Lists update automatically, or do I need to refresh them?
They update in real time as contacts meet or stop meeting the filter conditions — there’s no manual refresh step.
If your account already has months of inconsistent tags and fields, a rebuild is usually faster than trying to clean it up filter-by-filter. Our CRM Architecture Setup service audits your existing data, rebuilds your tagging and field structure, and rebuilds your Smart Lists so every workflow downstream is actually reliable.