Learn how to build GoHighLevel workflow automation that follows up with leads, books appointments, and handles missed calls, without touching your phone every hour.
GoHighLevel's workflow builder is the engine behind everything the platform does. Automations for missed calls, lead follow-up, appointment reminders, review requests, and client re-engagement all run through the same builder. Once you understand how it works, you can automate nearly every repeating communication your business sends, and stop losing leads because someone didn't check their phone in time.
This guide walks through how the workflow builder works, which triggers matter most for service businesses, and the exact workflows we set up for every client on day one. We're not going to cover every single option in the builder, the interface has dozens of action types. We're going to focus on what actually produces results for businesses running on GHL.
A workflow in GoHighLevel is a sequence of steps that runs automatically when a contact meets a specific trigger condition. The basic structure is: trigger → optional filters → actions in order.
You build workflows inside Automation → Workflows in your GHL sub-account. Each workflow has:
Workflows run per contact. When a contact triggers a workflow, GHL creates a workflow execution for that specific contact and runs through the steps. Multiple contacts can be in the same workflow simultaneously, each progressing through steps at their own pace based on wait times.
A workflow does not send one message to everyone at once. It runs individually for each contact who hits the trigger. Think of it as a conveyor belt, each contact steps onto the belt when they trigger it and moves through at their own pace.
When you open a workflow, you see a canvas with a vertical flow of steps. Each step is a block you can drag, reorder, or delete. At the top is the trigger block. Below it, you add action blocks from the right sidebar.
The most important action types for service businesses:
GHL has more trigger types than most businesses will ever use. Here are the ones that drive the majority of meaningful automation for service businesses:
Most service businesses start with three triggers: Form Submitted, Missed Call, and Appointment Booked. Those three cover 80% of the automations that actually move the needle. Build those first, then layer in the rest.
We've built workflows for hundreds of service businesses across HVAC, landscaping, dental, coaching, law, and home services. The following five workflows appear in nearly every account we set up. Build these first.
Trigger: Missed Call
Goal: Respond to missed calls within 2 minutes via text so the lead doesn't call your competitor next
Steps:
We've written a full breakdown of this workflow in our GoHighLevel missed call text-back guide. The key thing to know: this workflow alone recovers a meaningful percentage of unanswered leads. Most businesses that turn it on and actually look at the conversations are surprised how many people were one step from calling someone else.
Trigger: Form Submitted (your main contact/quote request form)
Goal: Follow up with every new lead across SMS and email until they respond or book
Steps:
For a more detailed look at this sequence, including the exact message copy we use, see our guide on GHL follow-up sequences for SMS and email.
Trigger: Appointment Booked
Goal: Confirm appointments and reduce no-shows through timely reminders
Steps:
No-shows are expensive. Our guide on no-show recovery automation covers what to do when reminders don't work and a contact doesn't show.
Trigger: Tag Added: "Service Complete" (or Appointment Status Changed to "Showed")
Goal: Request a Google review from happy customers within 24-48 hours of service
Steps:
Timing matters a lot here. Requesting reviews the same day while the service is fresh produces better response. Don't wait a week.
Trigger: Contact Tag Added: "Lead Sequence Complete" (or a scheduled enrollment based on last activity date)
Goal: Re-surface leads who went cold 30-90 days ago
Steps:
The if/else action is what separates basic broadcast sequences from actual automation. Without branches, every contact gets the exact same messages in the exact same order regardless of what they've done. Branches let you respond to behavior.
The most common if/else conditions we use:
The most common workflow mistake we see: not adding an if/else check for "has contact replied?" before sending follow-up messages. Without it, contacts who respond get the next follow-up anyway, which feels robotic and damages trust. Always check for a reply before continuing a sequence.
A Goal Event in GHL workflows is a special step that acts as a "skip ahead" point. When a contact hits a goal condition from anywhere in the workflow (or even from outside it), they jump forward to the goal step and continue from there.
Use a Goal Event when you want to say: "If the contact books an appointment, skip all remaining follow-up steps and go straight to the confirmation sequence." If/Else is for in-line conditional logic. Goal Events are for async conditions that can happen at any point.
Testing is non-negotiable. A workflow error that fires 200 messages to the wrong people at 2am is a real scenario if you skip this step.
The correct testing process:
GHL's workflow editor has a "Test" button on the top right that lets you simulate a workflow run without actually executing actions. Use that for a first-pass check, then do a full live test with a real contact record before turning the workflow on.
A few settings inside the workflow configuration menu that matter:
By default, a contact can only enter a workflow once. If they trigger it again (e.g., submit another form), GHL ignores the second trigger. Toggle "Allow Re-Entry" on if you want the workflow to restart for returning contacts. Use this for lead sequences if you want to follow up again on a second form submission. Leave it off for one-time sequences like review requests.
This setting automatically pauses a contact's progress through a workflow when they reply to any message. It's a blunt instrument, but it prevents embarrassing over-messaging when someone has already engaged. We recommend using explicit if/else reply checks rather than relying on this setting, because "Stop on Response" can halt sequences you actually want to continue (like appointment reminders after a confirmation reply).
Workflows have three states: Draft, Published, and Paused. While in Draft, nothing fires even if contacts trigger the condition. Always verify the workflow is Published before expecting it to run.
Workflows become significantly more powerful when they're wired into your pipeline. Every contact who submits a lead form should be automatically added to your pipeline. Every appointment should move a contact to a new stage. Every closed deal should trigger a post-sale onboarding sequence.
The actions that connect workflows to your CRM:
The pattern we follow for every new client account: one workflow per pipeline stage transition. When a lead submits a form, a workflow fires and creates the opportunity at "New Lead." When the contact books, a different workflow fires (via the "Appointment Booked" trigger) and moves the opportunity to "Appointment Scheduled." This keeps the pipeline accurate without relying on anyone to manually update stages.
If you manage multiple client sub-accounts, you don't need to rebuild workflows from scratch for each client. GHL's snapshot feature lets you save a workflow configuration and deploy it into a new sub-account in minutes.
Build your core five workflows in one clean "template" sub-account. Verify they work correctly. Then when you onboard a new client, use a snapshot that includes those workflows. You'll still need to update the message copy and phone numbers for each client, but the structure carries over automatically.
This is one of the biggest time-savers for agencies moving from manual client setup to a repeatable onboarding process.
First check: is the workflow Published (not Draft or Paused)? Second: does the trigger condition exactly match what's happening? If the trigger is "Form Submitted: Contact Form" and a lead submitted a different form, it won't fire. Check the trigger filters carefully.
You likely have multiple workflows with overlapping triggers. Check if the contact is enrolled in more than one active workflow that sends the same message type. Use the "Enrolled Workflows" section on the contact record to see which workflows a contact is currently in.
GHL's wait steps use the timezone configured in your sub-account settings. If contacts are in a different timezone, "Wait 1 day" may fire at unexpected times. For appointment reminders specifically, use the "Wait Until" step with an offset from the appointment time rather than a flat wait duration.
The most common cause: the condition is checking for a reply to a specific message, but the contact replied to a different conversation thread. Make sure your if/else conditions are checking the right data source (last message in the conversation vs. a specific campaign reply).
GoHighLevel's workflow builder has a learning curve, but once you understand the trigger-action structure and how if/else branches work, the five core workflows we covered here are buildable in a single afternoon. Start with the missed call text-back and the new lead sequence. Get those live and working. Then layer in appointment reminders and the review request flow. Those four alone cover the majority of revenue-impacting automations for any service business running on GHL.
If you want to skip the build-it-yourself process entirely, we set up complete workflow automation as part of our GHL implementation service. Book a free call and we'll walk through what your account needs.
Done For You
Already on GHL? Let's build your automation engine together.
We build the five core workflows, connect them to your pipeline, and verify every trigger is live, so you stop losing leads to missed calls and slow follow-up.
See the Full GHL Setup Service → or answer 7 quick questionsEverything in this guide runs on GoHighLevel. Try it free for 30 days and see why we chose it.
No credit card required · Cancel anytime