GoHighLevel · Workflows and landing pages

19 GoHighLevel workflows for three businesses. Try every one yourself.

GoHighLevel is an all-in-one sales and marketing platform: contacts, landing pages, texts, emails, calendars and a sales board in one place. A workflow is a set of automatic steps inside it. When someone fills in a form or calls, a workflow can email and text them, hand the lead to a salesperson, remind that person to call, and stop the moment the customer replies.

I built 19 of them for three made-up businesses: a roofer, a software company and an online coach. Each one also has a working landing page. Everything runs here in your browser, on sample customers or with your own name. Need this for your business, or hiring for GoHighLevel? Get in touch.

How to use this page

  1. Pick a business. New to GoHighLevel? Start with the roofer.
  2. Be the customer. Fill in its sign-up form with any name, or pick a sample customer such as “Never replies” or “Submits at 11:48 PM”.
  3. Press Run. Watch every email, text and task go out, with the time each would happen. Days of waiting are fast-forwarded.

Short on time? Each workflow opens with The problem and What I built in plain words. The diagrams and Build notes are the detail a GoHighLevel builder would check. Words you may not know

Workflows you can run
19
Automatic steps inside them
532
Sample customers to test with
106
Possible paths, each one reached by a test
188/188

Are these real businesses?

No. Harbor & Pine Roofing, Crewlo and Trailhead Career Coaching, and everyone who works there, are made up, so every workflow can be shown end to end with its real messages and tried by anyone. The workflows themselves use GoHighLevel’s real triggers, actions and settings, checked against HighLevel’s help center, so each one can be rebuilt step for step in a real account. Nothing on this page sends a message or keeps what you type.

Who built this

I’m Nick Soderstrom, a project and operations lead who also builds CRM automations in GoHighLevel, HubSpot, Zoho and Zapier. My client work includes a 2025 Upwork contract for GoHighLevel, Zapier and Slack automations (see recent contracts). This page and its simulator were built by directing AI, like the projects on my AI Projects page.

GoHighLevel words in plain English (21)
GoHighLevel (GHL, HighLevel)
An all-in-one sales and marketing platform: contacts, landing pages, texts, emails, calendars and sales tracking in one place. Agencies often run it for their clients.
Sub-account
One business’s own space inside GoHighLevel, with its own contacts, workflows, phone numbers and settings.
Workflow
A set of automatic steps that runs on its own, such as “email the lead, assign a salesperson, wait a day, text again.”
Trigger (the orange lightning bolt)
The event that starts a workflow: a form sent, a missed call, a booking, a deal card moving.
Contact, contact record
A person in the account, and everything saved about them: details, answers, tags, owner and history.
Lead score
A number from 0 to 100 that a workflow gives each new lead from their answers. For the roofer it comes from the service, the roof’s age and where the lead came from. The higher it is, the sooner someone should call.
Custom field, tag
A custom field is an extra box on the record for the business’s own answers, like roof age. A tag is a short label, like stl-no-response, that other workflows can react to.
Pipeline, opportunity, stage
The sales board. Each deal is a card (GoHighLevel calls it an opportunity) that moves through stages such as New Lead and Job Complete. Its status is Open, Won, Lost or Abandoned.
Round robin
Handing new leads to salespeople in turn, so the work is shared evenly.
If/Else, branch
A fork in the workflow: “Agreed to texts? Yes: text them. No: email only.” Each path is a branch.
Wait, Go To, goal
A Wait pauses for a set time or until something happens. Go To jumps to another step. A goal lets the contact skip ahead once they do what the workflow was after, like booking.
Stop on Response
A setting that ends the automatic follow-up as soon as the customer replies, so a person can take over.
DND (Do Not Disturb)
A switch on a contact that blocks texts, emails or calls. Texting STOP turns it on for texts; these workflows also turn it on for anyone who didn’t agree to texts.
Quiet hours, time window, Advance Window
Settings that hold a message until an allowed time, so nobody gets a sales text at night.
Re-entry
Whether someone who already went through a workflow can go through it again later, like a past lead who asks again next year.
A2P 10DLC
The registration US phone carriers require before a business can send texts from an ordinary local number. Reviewers check how people opt in.
UTM tags
Labels on a link, like utm_source=google, that record which ad or email brought a visitor.
Landing page, funnel
A one-purpose web page, or a short series of pages, built to get one action, like booking an inspection.
Merge fields, custom values
Placeholders like {{contact.first_name}} that fill in each person’s details when a message goes out. Custom values keep things like the booking link in one place.
Execution log
GoHighLevel’s step-by-step record of what a workflow did for one contact, with times. The simulator here shows the same kind of log.
Custom Code, webhook
Custom Code runs a short script inside a workflow, here to score leads. A webhook is an automatic message from one app to another, like “trial started.”
Case study 1 · Residential roofing

Harbor & Pine Roofing

Harbor & Pine is a local roofing company with two estimators, an office manager and a production crew. Leads came from the website, Facebook and the phone, and too many went cold before anyone called back. The owner needed every lead answered in seconds, inspections that people actually show up to, estimates that get a decision, a clean hand-off to the crew, and reviews from every finished job.

Workflows
7
Steps
197
Sample customers
42
Where
Chicago suburbs

The sample team

  • Maya Ortiz Estimator (sales)
  • Luis Grant Estimator (sales)
  • Jordan Blake Owner and office manager
  • Sam Rivera Production manager

Harbor & Pine Roofing is a fictional company. The people, phone numbers and links are samples.

The system

One pipeline, one customer journey

Each workflow does one job and hands the customer to the next. The orange text with the lightning bolt on each card is its trigger: the event that starts it. The grey chips are the stages of the sales board (GoHighLevel calls it a pipeline), where each customer’s card moves from left to right. Pick a card to open that workflow below.

Roofing SalesNew LeadContactedInspection BookedInspectedEstimate SentJob ScheduledJob Complete

  1. 01Speed to leadForm SubmittedNew Lead, then a person on reply
  2. 02Missed-call text-backCall DetailsNew Lead from a missed call
  3. 03Inspection bookedCustomer Booked AppointmentInspection Booked → Inspected
  4. 04Estimate follow-upPipeline Stage ChangedEstimate Sent → Won
  5. 05Won to job hand-offOpportunity Status ChangedJob Scheduled → Job Complete
  6. 06Reviews and referralsPipeline Stage ChangedReview and referral asks
  7. 07Database reactivationContact TagOld leads back to New Lead
Live demo

The landing page, working

Fill in the form as if you were a customer and press Get my free inspection. Use any name and a made-up number if you like: nothing is sent or stored. Then press Watch the workflow run, which appears once you submit, to see each email, text and task you would get from workflow 01 · Speed to lead, and when. It runs at your local time, so if it is late where you are, you will see texts wait for morning.

(312) 555-0142

Chicago suburbs · Free inspection

Storm damage? Get a free roof inspection this week.

One of our estimators checks your roof, photographs anything that needs attention and sends you a written estimate within 24 hours. No pressure and no cost.

  • Licensed and insured
  • Photos of every issue we find
  • Help with insurance claims

Book your free inspection

Consent is optional and not a condition of purchase. Privacy Policy · Terms of Service · Required

In short: one goal and no menu, a six-question form, separate unticked boxes for service texts and for offers, hidden fields that record which ad brought the visitor, and the booking calendar on the thank-you page.

How the page is built in GoHighLevel’s funnel builder (7 notes for builders)
  • One goal, one actionNo navigation menu on the step, and every button on the page leads to the same form. The copy is short, plain and specific to the offer.
  • A short, honest formSingle column, labels above the fields, six questions. The two SMS consent boxes are separate (inspection updates, and offers), unticked and optional, with the Privacy Policy and Terms linked, which is what A2P reviewers look for.
  • Hidden UTM fieldsCustom fields utm_source, utm_medium and utm_campaign with Hidden on and a Query Key that matches the URL parameter exactly. GHL already records First and Latest Attribution by itself; the fields are there so workflows, filters and merge fields can use the values.
  • Thank-you step with the calendarStep 2 embeds the Roof Inspection calendar. Sticky Contact prefills the booking form, so nobody types their details twice, and booking fires workflow 03.
  • Tracking that survives editsMeta Pixel and GA4 go in the funnel’s head tracking code. GHL does not copy tracking code when a step is cloned, so re-checking it is on the launch checklist.
  • Fast on a phoneOptimize JavaScript and Image Optimization on, hero image under 200 KB. Any custom script listens for the hydrationDone event, so deferred loading does not break it.
  • Test the headline, not the button colorA split-test variation on the step with a 50/50 slider. The Stats tab reports opt-in rate as opt-ins divided by unique page views, and one variation wins before the next test starts.
The workflows

Pick a workflow, pick a sample customer, press Run

Each tab below is one workflow. Read The problem and What I built for the short version. Then pick a sample customer and press Run workflow: the log lists every email, text and task in order, with the time it would happen, and the diagram ticks off each step as it runs.

For GoHighLevel builders: the diagram reads as it does in the workflow builder, and the simulator follows the builder’s rules: branches never rejoin, a goal pulls the contact forward, Stop on Response ends the run, DND skips the message and time windows hold it. New to the words? Open the decoder.

01 · Lead intake

Speed to lead

Every new lead gets an email, an owner and a call task within seconds, and a text if they asked for one (at night it waits until 8 AM). A person takes over the moment they reply.

The problem

Leads from the website and Facebook sat in the inbox until someone noticed. By the time a rep called, the homeowner had booked another roofer.

What I built

One workflow for both lead sources: it finds or creates the opportunity, scores the lead, assigns a rep by round robin, emails them and gives them a call task, then follows up by text and email for a week. Leads who did not tick the SMS box are switched to email only, and no text goes out before 8 AM. It stops the moment the lead replies, and steps aside as soon as they book.

Companies that tried to reach a web lead within an hour were nearly seven times as likely to qualify it as those that waited even one hour longer, and over sixty times as likely as those that waited a day or more.

Oldroyd, McElheran and Elkington, “The Short Life of Online Sales Leads,” Harvard Business Review, March 2011
Lead Intake /01 · Lead Intake · Speed to LeadPublished
Re-entry
Allowed
Stop on response
On
Timezone
Contact
Why these settings, and when it stops early (5)
  • Allow Re-entry on: a past lead who asks again next spring gets a fresh follow-up, and the first step takes them out of 07. GHL never enrolls a contact who is still active in the workflow, so a double submit during the week starts nothing.
  • Stop on Response on: a reply to any text or email from this workflow hands the lead to their rep.
  • No workflow Time Window: it would hold the email to the lead too. The texts wait behind their own 8 AM to 8 PM Advance Window.
  • Allow multiple Opportunities is for opportunity-based triggers. Here Find Opportunity and the Duplicate Opportunity toggle on Create Opportunity decide the card.
  • Leaves early: Booking fires 03 · Inspection Booked, whose first step is Remove from Workflow: 01 · Speed to Lead. No more "are you still interested?" texts to someone who already booked.

The workflow as it reads in GoHighLevel’s builder. Scroll inside it; each step gets a green tick when the run reaches it.

Workflow triggers
  • Form SubmittedForm is Free Roof Inspection
  • Facebook Lead Form SubmittedPage is Harbor & Pine Roofing · Form is Storm Inspection 2026
  1. Remove from WorkflowOne follow-up at a time

    Another Workflow: 02 · Missed-Call Text-Back and 07 · Database Reactivation. A caller or an old lead who fills in the form gets this follow-up only, not a second one running alongside it.

  2. Find OpportunityOpen card already?
    Opportunity FoundLatest opportunity in Roofing Sales with Status Open
    1. Update OpportunityName the card

      Opportunity Name is {{contact.name}} · {{contact.service_needed}}. A card 02 made from a missed call only had a phone number to go on. Stage, status and source stay as they are.

    2. Custom CodeLead score

      Scores the lead 0 to 100 from the service, roof age and source, and sets how fast the rep should call: 15 minutes or an hour, or first thing after 8 AM for a lead that arrives outside the hours the texts keep.

      View the code
      // Custom Code step, JavaScript. Properties added in the step:
      //   service  = {{contact.service_needed}}
      //   roof_age = {{contact.roof_age}}
      //   source   = {{contact.source}}
      //   hour     = {{right_now.hour}}   (24-hour; all Harbor & Pine leads are local)
      // GHL wraps this in an async function and reads the result from `output`.
      const service = (inputData.service || '').toLowerCase();
      const age = inputData.roof_age || '';
      
      let score = 20;
      if (service.includes('storm')) score += 35;
      else if (service.includes('replacement')) score += 30;
      else if (service.includes('leak')) score += 25;
      
      if (age === 'Over 20 years') score += 25;
      else if (age === '10-20 years') score += 15;
      
      // The owner asked for lead-ad leads to rank a little below form fills.
      if ((inputData.source || '').toLowerCase().includes('facebook')) score -= 5;
      
      score = Math.max(0, Math.min(100, score));
      
      // Calls keep the same 8 AM to 8 PM hours as the texts.
      const hour = Number(inputData.hour);
      const afterHours = hour < 8 || hour >= 20;
      
      output = {
        lead_score: score,
        call_within: afterHours ? 'first thing after 8 AM' : score >= 70 ? 'within 15 minutes' : 'within 1 hour',
      };
    3. Update Contact FieldSave the score

      Writes the code output to Lead Score and Call Priority, so reports, filters and later steps can use it.

    4. Assign To UserRound robin

      Maya and Luis, Split Traffic Equally. Only Apply to Unassigned Contacts is on, so a returning customer, or a caller 02 already assigned, keeps their rep.

    5. Internal NotificationTell the rep

      Type Email, To User Type Assigned User, with the score and how fast to call. Not a text to the rep at midnight; the call task below is the second channel.

      New lead: {{contact.name}}, score {{contact.lead_score}}/100{{contact.service_needed}}, roof {{contact.roof_age}}, SMS consent {{contact.sms_consent}}. Call {{contact.call_priority}}: {{contact.phone}}

    6. Send EmailRequest received

      Confirms the request, says who will call and links the booking page. Every lead gets it, texts or not.

      Your free roof inspection requestHi {{contact.first_name}}, Thanks for reaching out to Harbor & Pine Roofing. {{user.first_name}} will call you from {{custom_values.office_phone}} to set up your free inspection. If it is easier, pick a time yourself: {{custom_values.booking_link}} An inspection takes about 45 minutes. You get photos of anything we find and a written estimate. {{user.name}} {{location.name}}, {{location.full_address}}

    7. If/ElseWhose call?
      LuisAssigned User is Luis Grant
      1. Add TaskCall task for Luis

        Assign To Luis Grant, Due In: Now. Title "Call {{contact.first_name}} {{contact.call_priority}}". The description has the service, roof age, score and SMS consent, so nobody texts a lead who did not tick the box.

      2. Go To→ Can we text?

        Back to the consent check, so both estimators share one follow-up sequence.

      MayaNone of the above
      1. Add TaskCall task for Maya

        Assign To Maya Ortiz, Due In: Now. Title "Call {{contact.first_name}} {{contact.call_priority}}". The description has the service, roof age, score and SMS consent, so nobody texts a lead who did not tick the box.

      2. If/ElseCan we text?
        SMS consentSMS consent (service) is Yes, and the contact is not DND for SMS
        1. WaitQuiet hours

          A set period of time of 0 minutes with an Advance Window: resume between 8 AM and 8 PM in the contact's time zone, so a lead at midnight gets their text at 8 AM.

        2. Send SMSInstant reply

          From the rep, with the booking link and the opt-out line.

          Hi {{contact.first_name}}, it's {{user.first_name}} at Harbor & Pine Roofing. Got your inspection request. Pick a time here: {{custom_values.booking_link}} or reply with a good time to call. Reply STOP to opt out.

        3. Wait1 day

          One day.

        4. Send SMSNudge

          Short, from the same rep, one link.

          Hi {{contact.first_name}}, {{user.first_name}} again from Harbor & Pine. Still want that free roof inspection? It takes about 45 minutes. Book here: {{custom_values.booking_link}}

        5. Wait2 days

          Two days.

        6. Send EmailWhat we check

          Says what the inspection covers instead of another "just checking in".

          What we look for on a free roof inspectionHi {{contact.first_name}}, On every inspection we check shingles and flashing, vents and pipe boots, gutters and the attic for signs of leaks, and we photograph anything that needs attention. No pressure and no cost. Book a time that suits you: {{custom_values.booking_link}} {{user.name}} {{location.name}}, {{location.full_address}}

        7. Wait4 days

          Four days.

        8. Send SMSLast try

          Closes the loop politely. A reply to this one still stops the workflow.

          Hi {{contact.first_name}}, I'll close out your inspection request for now. If you still want one, reply here or book: {{custom_values.booking_link}} Thanks, {{user.first_name}}

        9. Add Contact Tagstl-no-response

          Marks the lead for the no-response report and for the 07 · Database Reactivation list later.

        10. Go To→ Still at New Lead?

          Joins the email path at the close-out, so there is one copy of it.

        No consent, or texts offNone of the above
        1. Enable/Disable DNDTexts off

          Direction Outbound, Enable, selected channel SMS. They did not tick the box, so 02, 03 and every later workflow skip texts to them as well. Email and calls stay open.

        2. Add Contact Tagsms-off-no-consent

          A receipt for the DND above. If they tick the texts box when they book, 03 · Inspection Booked reads it as a new opt-in, lifts the DND and removes the tag.

        3. Wait1 day

          One day.

        4. Send EmailFollow-up

          Booking link and the office number.

          Still want your free inspection, {{contact.first_name}}?Hi {{contact.first_name}}, Following up on your free roof inspection request. Pick any open time here: {{custom_values.booking_link}}, or call us at {{custom_values.office_phone}}. {{user.name}} {{location.name}}, {{location.full_address}}

        5. Wait3 days

          Three days.

        6. Send EmailClosing the request

          Last email, easy to answer.

          Closing out your inspection requestHi {{contact.first_name}}, I will close out your request for now. If your roof needs a look later, reply to this email or book at {{custom_values.booking_link}}. {{user.name}} {{location.name}}, {{location.full_address}}

        7. Add Contact Tagstl-no-response

          Same tag as the text path, so the report counts both.

        8. Find OpportunityStill at New Lead?
          Opportunity FoundLatest opportunity in Roofing Sales, Stage New Lead, Status Open
          1. Update OpportunityAbandoned

            Status Abandoned, not Lost: they never said no. The board only shows live leads, and 07 · Database Reactivation can pick them up later without a clean-up first.

          2. End
          Opportunity Not FoundNone of the above
          1. Add to NotesCard already moved on

            The card is past New Lead or already closed, so a rep has it. The follow-up ends and leaves the card as it is.

          2. End
    Opportunity Not FoundNone of the above
    1. Create OpportunityNew lead

      Roofing Sales › New Lead, named {{contact.name}} · {{contact.service_needed}}, Opportunity Source {{contact.source}}. Duplicate Opportunity on: this only runs when there is no open card, and with it off a lead whose only card was lost last year would get none.

    2. Go To→ Lead score

      On to the score. Nothing later updates the card, so it does not need to be found again.

Pick a sample customer
Tue, Mar 3 · 2:14 PMNot started
  1. Pick a sample customer above, then press Run workflow. Each line is one step, with the time it would happen: blue bubbles are texts, boxes are emails, and notes marked To: or Slack go to the team. Days of waiting are fast-forwarded.

Build notes

The detail a GoHighLevel admin would check before trusting this workflow. Start with What if… for the unusual cases in plain words. Words you may not know

  • Lead comes in at midnightThe email to the lead, the rep's email alert and the call task happen immediately, but the code sets Call Priority to "first thing after 8 AM", so nobody is told to phone a homeowner at midnight. The text waits for the Advance Window and goes out at 8 AM, around the same time as the call.
  • No SMS consent, or DNDThe If/Else sends them down the email path, which turns SMS DND on first, so 02, 03 and the rest skip texts to them too. Ticking the box on the inspection form again does not turn texts back on. Ticking it on the booking calendar does: 03 · Inspection Booked treats that as a new opt-in and lifts a DND that carries the sms-off-no-consent tag, never one from a STOP. Any other new consent, the office checks and switches SMS DND off by hand.
  • They reply on day threeStop on Response takes them out wherever they are in the sequence, because they answered a message this workflow sent. The conversation is already assigned to their rep. An out-of-office auto-reply counts too, which is fine here: a person looks at every reply anyway.
  • They book without replying03 · Inspection Booked removes them from this workflow in its first step, so the follow-ups stop.
  • Called first, then filled in the form02 made a New Lead card from the missed call and may still be waiting to send its own follow-up. The first step takes them out of 02, Find Opportunity finds that card and renames it, and Only Apply to Unassigned Contacts keeps the rep 02 assigned.
  • Double submitThe first run is still active, and GHL does not enroll a contact twice in the same workflow, so the second submit starts nothing. One text, one email, one deal.
  • Asks again next yearRe-entry is on, so the new request gets the full follow-up. Their old card is Abandoned or Lost, so Find Opportunity finds nothing open and Create Opportunity adds a new one, with Duplicate Opportunity on. If they were in the middle of 07, the first step takes them out.
  • Someone edits the Facebook formMeta gives a duplicated form a new ID, which silently breaks the trigger filter. The SOP says to re-select the form in the trigger after any change.

GHL features in this build

  • Form Submitted
  • Facebook Lead Form Submitted
  • Remove from Workflow
  • Find Opportunity
  • Update Opportunity
  • Create Opportunity
  • Go To
  • Custom Code
  • Update Contact Field
  • Assign To User
  • Internal Notification
  • Send Email
  • If/Else
  • Add Task
  • Wait · Advance Window
  • Send SMS
  • Enable/Disable DND
  • Add Contact Tag
  • Stop on Response
Compliance

Compliance is part of the build, not a checkbox

A workflow that texts the wrong person at the wrong time costs more than it earns. These rules are built into the workflows in every case study. In plain words: no texts to anyone who didn’t agree to them, no sales texts at night, anyone who asks to stop is stopped, every customer gets the same review request, and emails are set up to reach the inbox.

Troubleshooting

What I check first when I inherit an account

Most broken GHL setups fail in the same few ways. This is the order I look in, and what I do about each.

  1. LoopsA workflow triggered by a tag that adds the same tag, or two workflows that trigger each other. Fix with trigger filters, re-entry off and an explicit Remove from Workflow.
  2. Double textsGHL will not add a contact who is already active in a workflow, so the duplicates come later: re-entry on and a second form submit next week, or a trigger that fires more than once, like Call Details with no status filter, which fires for each call. Fix with trigger filters, a tag or field check at the top, or re-entry off where one pass is enough.
  3. Stop on Response surprisesIt ends the run on any response to the workflow’s messages, out-of-office auto-replies included. Keep it where any reply should reach a person; use a reply wait with timeout branches where the answer matters.
  4. The wrong clockWorkflows set to the account time zone while contacts span several, and imported contacts with no time zone at all. Quiet hours only work in the recipient’s time.
  5. Duplicate opportunitiesTwo cards per lead because duplicates are allowed. Fix the setting, then merge the pipeline so reporting can be trusted again.
  6. Hard-coded links and numbersA booking link typed into forty messages. Move it into a custom value so the next change is one edit.
  7. Silent trigger breaksA Facebook lead form duplicated in Meta gets a new form ID and the trigger filter stops matching. So does a renamed form, calendar or product. Trigger Statistics shows it; I check it after any change.
  8. Premium steps doing standard workCustom Code, Custom Webhook and Inbound Webhook are billed per execution. Worth it where they earn it, not for a job a standard action does.
How I work

From a brief to a workflow the team trusts

  1. Scope

    Who the lead is, what counts as success, who acts on what, and what must never happen. Written down before anything is built.

  2. Data model

    Custom fields, dropdown values, tags, pipeline stages and custom values first, named so the next person can guess them.

  3. Build in draft

    One workflow per job, named NN · Folder · Name, with the settings chosen on purpose rather than left at the defaults.

  4. Test with test contacts

    A test contact for every path, checked against Execution Logs and Enrollment History. Real phones and real inboxes for the copy.

  5. Publish and hand off

    Published in a quiet hour, then a short screen-recorded walkthrough (Loom) and a one-page how-to for the team (SOP): what it does, what to change, what never to touch.

  6. Watch it

    Trigger Statistics and Execution Logs checked in the first week, then monthly. Errors fixed before anyone notices them.

Naming, so the next person can find things

Workflows
01 · Lead Intake · Speed to Lead in a Lead Intake folder
Tags
stl-no-response, pql-alerted: lowercase, prefixed by the workflow that sets them
Custom fields
lead_score, utm_source: snake_case keys, spelled exactly like the form
Custom values
{{custom_values.booking_link}}: every link and phone number lives in one place

Hiring for GoHighLevel, or need it built?

I build, fix and document GoHighLevel accounts: workflows, sales pipelines, landing pages, and the texting and email rules around them. If you’re hiring for a GoHighLevel role or need this for your business, I’d like to hear about it.