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.
A form and an email. Every new lead magnet is a new build from scratch, half of them saved as draft.
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.
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.
A new workflow for every idea, built in the moment.
One shape, cloned per keyword. Resource in, wait, hand off to the shared newsletter by tag.
| Role | Talks to you | Job |
|---|---|---|
| Resource workflow | One per keyword | Webhook in, contact, tags, resource email, wait one day, tag health-wealth |
| Newsletter workflow | One, shared | Trigger on the tag, tag subscriber, issue one, then weekly |
| The DM tool | Outside GHL | Captures the email and posts it to the webhook |
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.
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.
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.
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.
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.
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.
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.
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.
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.
Paste these as written. They are short on purpose, because the long ones drift.
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.
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.
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.
Every one of these has happened to me or to someone I set this up for.
| Failure | Fix |
|---|---|
| Trigger picker empty, warning badge on the tag step | The tag did not exist; create it, re-save |
| Nothing fires | Workflow saved as draft; publish |
| Field mapping blank on the webhook | No sample payload was ever posted; post one |
| Email arrives as one block | No paragraph spacing; add it explicitly |
| Newsletter DM never arrives | Instagram 24 hour window; move the newsletter to email |
| Test contact got the newsletter a day later | Delete the throwaway after verifying |
| Every keyword built differently | One shape, cloned |
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.
---
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.
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.