GoHighLevel CRM: How the Contact and Pipeline System Actually Works
Contacts, opportunities, pipelines, custom fields and tags in GoHighLevel. How the data model works, how to structure it, and the mistakes that ruin reporting.

Key takeaways
- Contacts are people, opportunities are potential business, and one contact can hold several opportunities.
- Pipeline stages should be states the deal is in, not tasks somebody does.
- Custom fields hold single-value facts; tags hold states and memberships.
- The conversations inbox unifies SMS, email, Facebook, Instagram and web chat in one thread.
- There is no true company object, which limits complex B2B use.
Contents
GoHighLevel's CRM is contact-centric and deliberately simple. A contact is a person, an opportunity is a potential piece of business attached to them, and a pipeline is the sequence of states that opportunity moves through. Everything else in the platform hangs off that.
It is capable enough for most service businesses and agencies. It is also easy to structure badly, and a badly structured CRM produces reporting nobody trusts, which is worse than no reporting at all.
The data model
| Object | What it is | Common mistake |
|---|---|---|
| Contact | A person, with name, email, phone and custom fields | Creating one per job instead of per person |
| Opportunity | A potential piece of business, in a pipeline stage, with a value | Not using them at all and tracking deals with tags |
| Pipeline | An ordered set of stages an opportunity moves through | Stages that describe tasks rather than states |
| Custom field | A single-value fact about a contact or opportunity | Creating a field that should have been a tag |
| Tag | A label indicating a state or membership | Hundreds of tags with no naming convention |
| Conversation | The unified message thread with a contact | Working from separate channel inboxes instead |
The relationship that matters most: one contact can hold many opportunities. A homeowner who books a repair in March and a replacement in September is one contact with two opportunities. Creating a second contact loses their history and breaks every piece of reporting that depends on customer lifetime value.
Designing pipelines that report honestly
This is where most accounts go wrong, and the fix is a single rule.
A stage is a state the deal is in, not a task somebody does. "Quote sent" is a state. "Call the customer" is a task. Pipelines built from tasks cannot report, because a deal can be in three tasks at once and in only one state.
A pipeline built correctly looks like this:
| Good stage | Bad stage | Why |
|---|---|---|
| New enquiry | Contact the lead | The first is where the deal is; the second is a to-do |
| Qualified | Send information | Qualification is a state you can report on |
| Quote sent | Follow up | Follow-up happens in several stages, so it is not one |
| Scheduled | Waiting on customer | "Waiting" describes everything and measures nothing |
| Won | Invoice | Invoicing is a task inside the won state |
Two further rules worth following. Keep it to five or six stages, because a twelve-stage pipeline is a process diagram, not a sales pipeline, and nobody maintains it. And use separate pipelines for genuinely different processes: a residential repair and a commercial contract do not share stages, and forcing them into one produces meaningless averages.
Tags versus custom fields
The distinction is simple once stated, and getting it wrong makes segmentation painful later.
Custom fields hold facts with one value. System age. Property type. Budget band. Preferred technician. If a contact could only sensibly have one answer, it is a field.
Tags hold states and memberships. Lead source. Campaign entered. Lifecycle stage. Interested in a service. A contact can carry many at once, and that is the point.
The practical test: could this contact reasonably have two of these at the same time? Two lead sources, yes, because they found you on Google and were also referred. Two property types for one address, no. So source is a tag and property type is a field.
On tag hygiene: use a prefix convention from day one. src-google, src-referral, svc-repair, svc-install, life-customer. Without it you end up with four hundred tags, three of which mean the same thing with different capitalisation, and nobody willing to clean it up.
The conversations inbox
The unified inbox is one of the genuinely strong parts of the platform, and it is underused.
SMS, email, Facebook Messenger, Instagram DMs, web chat and WhatsApp all appear in one thread per contact, in chronological order. Someone who texted in March and emailed in June is one conversation, not two systems to cross-reference.
For a business whose customers call and text, this is more valuable than most of the automation features. Being able to see the whole relationship in one place before picking up the phone changes how the call goes.
What the CRM does not do well
- No true company object. The model is contact-centric. B2B relationships between people and organisations are handled with custom fields or custom objects rather than proper associations. For a business selling to companies with multiple stakeholders, this is a genuine limitation.
- Reporting is thin. Pipeline value and conversion by stage are available. Multi-touch attribution and custom report building are not. Agencies that need real analytics export elsewhere.
- Deduplication is basic. It matches on email and phone. It will not catch the same person using two email addresses.
- No forecasting. Weighted pipeline value by stage probability is not natively available.
- Bulk editing is limited. Restructuring a messy account is more manual than it should be, which is an argument for structuring it properly at the start.
A structure that holds up
If you are setting up from scratch, this order avoids most of the rework:
- List the facts you need about a contact. Those become custom fields. Create them before importing anything, because mapping on import is far easier than backfilling.
- Decide the tag convention. Prefixes, lowercase, hyphens. Write it down somewhere the whole team can see.
- Map the real sales process. Ask what states a deal genuinely passes through, then cut it to five or six.
- Build a separate pipeline per distinct process. Not per service, per process. Repair and replacement may share one; retail and commercial usually do not.
- Import contacts last, once fields and tags exist to receive them.
- Attach automation to stage changes, not to tasks. A stage change is a real event you can trigger from reliably.
Every snapshot we build ships with this already done: fields, tags, pipelines and stage automation named for the industry rather than left as platform defaults.
Start with a CRM that is already structured
Pipelines, stages, custom fields and tagging built for your industry, with automation attached at each stage change.
Browse snapshotsFrequently asked questions
Is GoHighLevel a real CRM?
Yes, with contacts, opportunities, pipelines, custom fields, tags and a unified conversations inbox. It is a capable CRM for service businesses and agencies. It is not a match for HubSpot or Salesforce on reporting depth, association models or forecasting, and it does not try to be.
What is the difference between a contact and an opportunity?
A contact is a person. An opportunity is a potential piece of business attached to that person, sitting in a pipeline stage with a value. One contact can hold several opportunities, which is how you handle a customer who buys more than once without duplicating their record.
Should I use tags or custom fields?
Custom fields for facts that have one value: system age, property type, budget band. Tags for states and memberships: source, campaign, lifecycle stage. The test is whether a contact could sensibly have two at once. Two sources, yes, so tag. Two property types, no, so field.
Does GoHighLevel have companies or accounts?
Not in the way HubSpot or Salesforce do. The model is contact-centric, and B2B relationships between people and organisations are handled with custom fields or custom objects rather than a native company object with proper associations. For most local service businesses this is fine; for complex B2B it is a real limitation.
How do I stop duplicate contacts?
GoHighLevel deduplicates on email and phone during imports and form submissions. Duplicates mostly appear when the same person uses two email addresses or a different number. Standardise phone formatting before import and make phone the primary identifier for a business whose customers call.
Sources
Skip the build. Import a working GoHighLevel account instead.
Industry-ready snapshots with funnels, pipelines, calendars and automations already wired. Delivered within 24 hours, installable on every sub-account you manage.
Mentioned in this article
Keep reading
All articlesReasons to choose Gohighlevel over other software
If you’ve ever felt overwhelmed juggling multiple tools for email marketing, CRM, funnel building, automation, scheduling, and customer support —
February 9, 20234 min read
How to Use Workflow AI for Pre-Call Lead Qualification in GoHighLevel
Time is your most valuable asset—especially when it comes to sales. Jumping on calls with leads who aren’t ready, aren’t
November 4, 20255 min read
Top 5 AI Automation Tools in GoHighLevel You’re Not Using Yet
If you’re using GoHighLevel for funnels, pipelines, and automations—you’re only scratching the surface. What truly sets HighLevel apart in 2025
October 21, 20254 min read

