Open the workflow builder in any GoHighLevel sub-account, click Add New Trigger, and you are looking at one dropdown that decides everything downstream. That dropdown holds 57 native triggers. It reads like abundance. In practice, the number that matters for your agency is much smaller, and knowing the difference is what separates a workflow that fires reliably from one that quietly never starts.

This is a map of that dropdown: what the 57 native triggers actually cover, which ones you will ever use, where the real gaps are, and how to know your true coverage before you build on top of it.

What the 57 actually cover

The native trigger list is not a random pile. It is organized by the part of GoHighLevel that emits the event. Broken down by category, the 57 native triggers land like this:

  • Events (14): form submissions, survey submissions, inbound calls and call status, customer replies, email events, trigger links, Conversation AI, Facebook lead gen, TikTok form submissions, and the scheduler. This is the busiest bucket and the one most agencies live in.
  • Courses and memberships (12): lesson started, lesson completed, category started and completed, product access granted or removed, offer access, membership contact created, and member login. Twelve of the 57, all gated to the membership product.
  • Contacts (10): contact created, contact changed, tag added or removed, DND change, note added or changed, task added, task due reminder, birthday reminder, and custom date reminder.
  • Opportunities (5): opportunity created, opportunity changed, status changed, pipeline stage updated, and opportunity decay (the stale-deal timer).
  • Payments (4): invoice events, payment received, order submission, and two-step order form.
  • Appointments (2): the standard appointment trigger and the customer-booked appointment trigger.
  • Shopify (3), Facebook and Instagram comments (2), custom objects (2), affiliates (1), plus the inbound webhook and IVR incoming call as standalone entries.

That accounting is exact, not rounded. It comes straight from the trigger registry the workflow builder itself loads, which is where the 57 count lives.

The number that actually matters for your agency

Here is where 57 gets misleading. A trigger you cannot fire is not coverage. It is a menu item.

Count how many of the 57 depend on a module a given sub-account may not run. Twelve are course and membership triggers. Three are Shopify. One is affiliates. Two are custom-object triggers that do nothing until you build a custom object. Two are Facebook and Instagram comment triggers that only matter if you run organic social for that client. If a clinic sub-account has no courses, no store, no affiliate program, and no custom objects, roughly twenty of those 57 are inert on day one.

Strip it down to what a typical service agency actually uses across most sub-accounts and the working set is small: the tag trigger, contact created and changed, pipeline stage updated, form submission, customer reply, appointment, payment received, and the inbound webhook for everything outside GoHighLevel. That is the real toolkit. Roughly a dozen triggers do the vast majority of the work, and the other forty-odd are there for the modules you may never turn on.

This is not a criticism of the platform. It is a planning fact. When you scope an automation build, count the triggers you can actually fire in that sub-account, not the ones on the master list.

What the native triggers do well

Inside that working set, GoHighLevel triggers are genuinely good at what they are for: reacting to something that just happened in the CRM.

  • The tag trigger is the universal hinge. Almost every reliable multi-workflow architecture routes on tags: one workflow adds a tag, a second workflow starts because that tag was added. It keeps each workflow short and lets you chain intent without deep if/else trees.
  • Pipeline stage updated turns your sales process into automation. Move a card, start a sequence. It is the cleanest way to tie follow-up to where a deal actually sits.
  • Form submission and customer reply cover the front door and the conversation. New lead in, human reply detected, workflow reacts. The customer reply trigger is also what you use to stop a nurture the moment a real person answers.
  • The inbound webhook is the escape hatch. Any system that can send an HTTP POST can start a GoHighLevel workflow through it. That single trigger is how you connect the platforms that have no native trigger of their own.

Where the native triggers cannot help you

Now the honest part. A few limits catch agency owners repeatedly.

A trigger is not a filter. This is the single most common misread. The trigger decides what event starts the workflow, not which contacts qualify. A tag trigger fires for every contact that gets the tag; a contact-changed trigger fires on any change to any field. You narrow the audience with filters on the trigger and conditions inside the workflow, not by expecting the trigger itself to be selective. Build it assuming the trigger is a wide net and you will not be surprised by who lands in the workflow.

There is no cross-sub-account trigger. Every workflow lives inside one sub-account, and its triggers only see events in that sub-account. An agency running twenty locations does not get one trigger that watches all twenty. Portfolio-level logic has to be replicated per account or coordinated from outside GoHighLevel.

The "changed" triggers are blunt. Contact changed and opportunity changed fire on the change, then rely on your conditions to decide whether it was the change you cared about. Get those conditions slightly wrong and the workflow either fires too often or, worse, silently never matches. There is no native "field X changed from A to B" as a first-class trigger; you assemble that behavior from the broad trigger plus conditions.

A trigger that points at something missing will not warn you. This is the quiet killer. Set a tag trigger to watch a tag that was renamed, or a stage trigger pointed at a pipeline stage that got deleted during a rebuild, and the workflow still shows Published and green. It just never matches, so nothing ever enters. GoHighLevel does not flag the broken reference. We wrote about the same failure mode inside workflow actions in how invalid IDs kill GHL automations without errors, and it is exactly as dangerous at the trigger.

Some events simply have no native trigger. When there is no native trigger for what you need, you have two moves. Use the inbound webhook to catch the event from the source system, or reach for a marketplace trigger. The marketplace adds hundreds of app-specific triggers on top of the 57 native ones, but each is tied to a particular third-party integration and carries that integration's setup and reliability with it. They are not a native part of the platform, and they are not interchangeable with it.

How to know your real coverage before you build

The practical problem is that the trigger dropdown does not tell you any of this. It shows all 57 with no indication of which apply to the account in front of you, which reference objects that still exist, or which you are already using elsewhere. You find the gaps the hard way, when a workflow that looked fine never runs.

This is the seam GHL Command was built for. It reaches the workflow builder layer that GoHighLevel's public API does not expose, so you can work with triggers as data instead of clicking through the UI one account at a time. You can pull the full native trigger registry to see exactly what is available, read a workflow's triggers to confirm what a sub-account is actually listening for, build and clone workflows with the correct trigger shapes already wired, and validate that every tag, pipeline, stage, and field a trigger references exists in that account before you rely on it. Run it across your whole portfolio from one place, at a flat rate that does not climb as you add sub-accounts, because it prices to the operator, not the seat count.

The 57 native triggers are a solid foundation. The trap is treating the number as your coverage instead of counting the triggers you can actually fire, in the actual account, pointed at objects that actually exist. Do that accounting first and the workflows built on top of it stop failing silently.

Audit your triggers before they fail quietly.

GHL Command reads the full native trigger registry, confirms what each sub-account is really listening for, and validates every referenced tag, pipeline, and stage before you deploy. Flat $97/mo, every GoHighLevel sub-account included, run from Claude on your own machine.

See how it works

Frequently asked questions

How many native workflow triggers does GoHighLevel have?
The workflow builder exposes 57 native triggers across contacts, opportunities, appointments, events, payments, courses, custom objects, Shopify, Facebook and Instagram comments, and affiliates. The marketplace adds hundreds more that are tied to specific third-party apps.

Why can I only use a few of the 57?
Many are gated to modules a sub-account may not run. Twelve are course and membership triggers, three are Shopify, one is affiliates, and two need a custom object to exist first. In an account without those modules, roughly twenty of the 57 never fire, so the effective set for a typical service agency is closer to a dozen.

What do you do when there is no native trigger for an event?
Use the inbound webhook trigger to receive the event from the outside system, or a marketplace trigger published by the app that owns the event. The inbound webhook turns anything that can send an HTTP POST into a workflow start.

Why did my trigger not fire?
Usually because its condition references a tag, pipeline, stage, or custom field that no longer exists in that sub-account. GoHighLevel does not warn you. The workflow shows Published and the trigger simply never matches.