AI CEO Lab← All free guides
GoHighLevel ยท Automations

How I Build Automations In GoHighLevel

One inbound webhook, one resource email, a one day wait, one tag that hands off to the newsletter. The shape I clone for every keyword, and the gotchas that cost me an afternoon each.

Every automation I build in GoHighLevel is the same shape now. It took a lot of broken ones to get there.

Someone comments a keyword on Instagram. A DM captures their email. That email lands in one GoHighLevel workflow, which sends the resource they asked for, waits a day, and hands them to the newsletter. New keyword, new copy of the workflow. Nothing else changes.

The part that breaks is never the logic. It is the plumbing. A tag that does not exist yet. A workflow saved as draft. A webhook that never got a sample payload so the field mapping is empty. An email that reads as one wall of text because nobody set paragraph spacing.

So this is the shape, the build order, and the checks. If you follow the order the automation works the first time you test it.

Written from the GROK keyword build in September 2026: a comment-to-DM automation, the resource-email workflow and the Health and Wealth newsletter onramp, all live in the Dr. Lead Flow account.

The three levels

Level 1 · Manual

A form and an email. Every new lead magnet is a new build from scratch, half of them saved as draft.

Level 2 · AI + connections

One workflow shape, cloned per keyword. Tags created first, webhook mapped from a real sample, test contact in and out before anyone real touches it.

Level 3 · Agents on cadence

Resource workflows hand off to one shared newsletter workflow by tag. Every email carries a preheader and real spacing. Emails are inked for the primary inbox and verified as sent.

Connections for this guide: A GoHighLevel sub-account, the inbound webhook trigger, a DM tool that can post JSON when it captures an email (I use Zernio), your CRM tags, and one test contact you are willing to delete.

The mental model

Wrong

A new workflow for every idea, built in the moment.

Right

One shape, cloned per keyword. Resource in, wait, hand off to the shared newsletter by tag.

RoleTalks to youJob
Resource workflowOne per keywordWebhook in, contact, tags, resource email, wait one day, tag health-wealth
Newsletter workflowOne, sharedTrigger on the tag, tag subscriber, issue one, then weekly
The DM toolOutside GHLCaptures the email and posts it to the webhook

The build, in order

1. Create the tags before anything references them

Two for the keyword (kw-grok, ig-dm-lead), one for the hand off (health-wealth), one for the subscriber (newsletter-subscriber). A trigger or an add-tag step that names a tag that does not exist shows a warning badge and does nothing. Tags applied by a running workflow get created on the fly, but a trigger cannot listen for a tag that is not there.

2. Build the newsletter workflow first

Trigger: contact tag added, health-wealth. Steps: add tag newsletter-subscriber, send issue one. Publish it. It exists before anything can hand off to it.

3. Build the resource workflow

Trigger: inbound webhook. Steps in order: create or update contact from the payload name and email, set the optin source and optin resource fields, add the keyword tags, send the resource email, wait one day, add tag health-wealth. Publish it. The last step is the hand off; it is the only line that connects the two.

4. Fire a sample payload at the webhook

Post name, email, source, resource and the platform id to the webhook URL with a throwaway address before you map fields. GoHighLevel captures the request and the mapping picker fills in. Without a sample the picker is empty and you will type field names wrong.

5. Point the DM tool at it

In the DM automation, after the email is captured, add a webhook step that posts the same JSON shape. Both the success and the error branch continue to deliver the resource in the chat, so a webhook hiccup never blocks the person.

6. Test with a throwaway contact

Send the sample again with a fake address. Confirm the contact exists with both tags and that the email send fired (a bounce tag on a fake address is proof of a send). Then delete the test contact so it never enters the newsletter.

7. Write the email like a person

Short paragraphs with explicit spacing between them. A preheader line. One button. A plain reply-to ask. If it reads as one block on a phone it goes to promotions or gets skimmed. If you use a primary-inbox tool like Ghost Ink, run it after the copy is final and verify the sent HTML.

8. Clone for the next keyword

Duplicate the resource workflow, rename it, swap the resource email and the keyword tag, register a fresh webhook trigger, fire a new sample. The hand off tag stays. That is the whole change.

One keyword, one afternoon

Each phase has a done-when. If you have not hit it, do not start the next one. Every failure I have seen came from skipping ahead.

Hour 1

Tags and the newsletter side

  • Create the four tags
  • Newsletter workflow: tag trigger, subscriber tag, issue one
  • Publish
Done when: Adding health-wealth to a test contact sends issue one.
Hour 2

The resource workflow

  • Inbound webhook trigger
  • Contact, fields, tags, email, wait, hand off tag
  • Sample payload posted, fields mapped
  • Publish
Done when: A posted sample creates a tagged contact and sends the resource email.
Hour 3

Wire the DM tool and test

  • Webhook step after email capture, both branches continue
  • Throwaway contact in, verified, deleted
  • Read the resource email on a phone
Done when: A real comment from a non-admin account gets the DM, the guide, the email, and shows in the CRM.

Operating principles

  1. Tags before triggers. A trigger cannot listen for a tag that does not exist.
  2. Published, not draft. A draft workflow does nothing and says nothing.
  3. Sample payload before field mapping.
  4. One shape, cloned. Change the email and the tag, nothing else.
  5. The hand off is one tag. Every resource workflow ends by adding it.
  6. Test with a throwaway, verify in the CRM, delete it.
  7. Never block delivery on the webhook. Success and error both continue.
  8. Emails have spacing, a preheader and one button.
  9. Instagram closes the DM window at 24 hours. The newsletter lives in email, not in DMs.
  10. No secrets in a workflow node. Use the inbound webhook, which needs none.

Starter prompts

Paste these as written. They are short on purpose, because the long ones drift.

The prompt: design my keyword flow

Act as my GoHighLevel automation builder. Keyword: [WORD]. Resource: [name and link]. Newsletter tag: health-wealth. Produce: (1) the list of tags to create first, (2) the newsletter workflow as trigger and steps, (3) the resource workflow as trigger and steps in exact order: create or update contact, set optin source and resource, add tags, send resource email, wait one day, add the hand off tag, (4) the JSON payload my DM tool should post, (5) the test I run with a throwaway contact and what I should see in the CRM before deleting it, (6) a short resource email with a preheader, short paragraphs, one button and a reply ask. Do not invent any link or claim.

The email prompt

Rewrite this email so it reads like a person. Paragraphs of one to three sentences with a blank line between them. A preheader under 90 characters. One button. End with a question I want them to reply to. No em dashes.

The clone prompt

I am adding keyword [WORD] for resource [name]. List only what changes from the existing resource workflow: the name, the keyword tag, the email subject and body, and the new webhook URL to give the DM tool.

Failure modes

Every one of these has happened to me or to someone I set this up for.

FailureFix
Trigger picker empty, warning badge on the tag stepThe tag did not exist; create it, re-save
Nothing firesWorkflow saved as draft; publish
Field mapping blank on the webhookNo sample payload was ever posted; post one
Email arrives as one blockNo paragraph spacing; add it explicitly
Newsletter DM never arrivesInstagram 24 hour window; move the newsletter to email
Test contact got the newsletter a day laterDelete the throwaway after verifying
Every keyword built differentlyOne shape, cloned

The free skill

It holds the workflow shape as a recipe, the build order, the tag-first rule, the sample-payload rule, the test-then-delete check and the email formatting rules. Hand it to your agent or your VA with a keyword and a resource link and it produces the exact node list to build.

How to use it: copy the whole thing, paste it into your bot (or save it as a skill file if you use Claude Code), and say “build my ghl workflow”. It walks you through the rest. Works with any agent that can read your files.
ghl-automations.md
---
name: ghl-automations
description: Builds the GoHighLevel automation shape used for every keyword lead magnet, an inbound-webhook resource workflow that waits a day and hands off by tag to one shared newsletter workflow, with the tag-first rule, the sample-payload rule, the throwaway test and the email formatting rules. Trigger on "build my ghl workflow", "add a keyword", "why isn't my workflow firing", "clone the resource workflow".
---

# GoHighLevel Automations

One shape, cloned per keyword. Nothing else changes.

## The shape
**Newsletter workflow (one, shared).** Trigger: contact tag added `health-wealth`.
Steps: add tag `newsletter-subscriber`, send issue one, then wait 7 days and send the next
issue, repeated.

**Resource workflow (one per keyword).** Trigger: inbound webhook. Steps in order:
1. Create or update contact from `name` and `email` in the payload
2. Update custom fields: optin source, optin resource
3. Add tags `kw-<keyword>`, `ig-dm-lead`
4. Send the resource email
5. Wait 1 day
6. Add tag `health-wealth` (the hand off)

## Build order
1. Create every tag first: `kw-<keyword>`, `ig-dm-lead`, `health-wealth`,
   `newsletter-subscriber`. A trigger cannot listen for a tag that does not exist and an
   add-tag step naming a missing tag shows a warning badge.
2. Build and publish the newsletter workflow.
3. Build and publish the resource workflow. Draft workflows do nothing.
4. POST a sample payload to the webhook URL before mapping fields:
   `{"name":"ZZ_TEST","email":"zz_test@example.com","source":"instagram-dm","resource":"<keyword>","ig":"test"}`
5. In the DM tool, add a webhook step after the email is captured that posts the same
   shape. Success and error branches both continue to deliver the resource.
6. Test with a throwaway: confirm the contact exists with both tags and the email fired,
   then delete the contact so it never enters the newsletter.
7. Read the resource email on a phone. Short paragraphs with explicit spacing, a
   preheader under 90 characters, one button, one reply ask.

## Clone for a new keyword
Duplicate the resource workflow. Change: the name, the keyword tag, the resource email
subject and body, and register a new inbound webhook trigger. Post a fresh sample. Give the
new webhook URL to the DM tool. The hand off tag stays.

## Rules
- Tags before triggers. Published, not draft. Sample payload before mapping.
- Never block delivery on the webhook.
- Instagram closes the DM window at 24 hours; the newsletter lives in email.
- No API keys inside a workflow node; the inbound webhook needs none.
- Verify counts: keyword leads in the CRM should match the DM tool's count.

## Email checklist
Preheader. Paragraphs of one to three sentences with a blank line between. One button.
Ends on a question. No em dashes. Sender name and address checked in location settings.

What done looks like at thirty days

Want it built with you, live, in your account?

This is the automation layer under the Predictable Patient Pipeline. Inside the AI CEO Lab we build the keyword flow and the nurture in your own GoHighLevel.

Pick a side.

Most people read this and forget it by Friday.

The other kind builds the thing that week. They stop needing free guides, because they are too busy running actual systems.

Free guides stay free. The room is where the builds happen.