Why GoHighLevel sends duplicate text messages, and how to stop it
Contacts getting the same text twice, texts from two different numbers, or a whole list blasted at once. The four causes and the fix for each.
Learn moreTwelve checks, in order, that show what is broken in an inherited GoHighLevel account: shared triggers, dead tags, orphaned pipelines, phone and A2P status, and what to fix first.
Short answer: a GoHighLevel audit is a twelve-point inventory of what the account actually does, run in a fixed order: workflows and their triggers, then tags and custom fields, then pipelines and calendars, then phone numbers, A2P registration, integrations and users. You touch nothing during the inventory. The output is a list of fixes ordered by risk (double sends and missed follow-ups first, cosmetic cleanup last). One owner described the account we inherited as a "big rat's nest": 160 workflows, 242 tags and six pipelines, and the checklist below is the exact order we worked through it.
Three things pile up. First, snapshots: every agency, course and marketplace template that ever touched the account loaded its own workflows, tags and pipelines, and nobody removed the previous set. Second, tags are free text with no schema, so "Hot Lead", "hot-lead" and "HOT" all exist and different workflows read different ones. Third, workflows are cheap to clone and expensive to understand, so when something did not work the last builder made a copy and left the original published.
The result is an account where a form submission can start three workflows, two of which send a text. That is how you get the duplicate text messages owners complain about, and it is why the audit begins with triggers rather than with the tag list.
Work top to bottom. Each row names where in the sub-account you look and what you are looking for. Copy it into a sheet and fill the last column as you go.
| # | Check | Where in GoHighLevel | What you are looking for |
|---|---|---|---|
| 1 | Workflow inventory | Automation, Workflows list | Every workflow, its status (published or draft), last edited date, and its trigger |
| 2 | Shared triggers | Open each workflow, read the trigger block | Two or more published workflows on the same form, stage, tag or appointment event |
| 3 | Re-entry and wait steps | Workflow settings and Enrollment History | Allow re-entry turned on, and drips with contacts sitting in wait steps |
| 4 | Send steps and from numbers | SMS and email actions inside each workflow | Which number and which sender each message uses |
| 5 | Tags | Settings, Tags, plus a smart list per tag | Duplicates by spelling, tags nothing reads, tags with zero contacts |
| 6 | Custom fields and values | Settings, Custom Fields and Custom Values | Fields nothing writes to, values with stale phone numbers or prices |
| 7 | Pipelines and stages | Opportunities, Pipelines | Pipelines with no open opportunities, stages that no workflow moves into or out of |
| 8 | Calendars | Calendars, Settings | Time zone, assigned users, confirmation and reminder workflows attached |
| 9 | Phone numbers | Settings, Phone Numbers | Which number is default, which are unused, which have forwarding set |
| 10 | A2P and wallet | Settings, Phone Numbers, Trust Center; Billing, Wallet | Campaign status, numbers attached to the campaign, auto-recharge on |
| 11 | Integrations | Settings, Integrations; Marketplace apps; webhook actions | Connected Google, Facebook, Stripe, QuickBooks accounts and where webhooks point |
| 12 | Users and permissions | Settings, My Staff | Former employees, former agencies, and who owns the agency account |
The workflow list in GoHighLevel shows name, status and last modified date but not the trigger, so you open each one. Put the trigger in a column next to the workflow name and sort by it. In the 160-workflow account, sorting by trigger showed form submissions and stage changes that each started more than one published workflow, and more than one of those sent a welcome text.
Check 3 matters because of how GoHighLevel handles edits. A workflow with a seven-day wait step can hold hundreds of contacts, and Enrollment History shows you who is inside it. If you pause and republish that workflow, every waiting contact advances at once. So during the audit you only read; you do not republish anything that has people in a wait step. Check 4 explains the "texts from a different number" complaint: a send step that uses the sub-account default number instead of the number the contact texted.
Settings shows the tag list, but the useful count comes from building a smart list filtered on each tag. The 242-tag account had dozens of tags with zero contacts and groups like "Booked", "booked" and "Appointment Booked". More important than the count is the second column of your sheet: which workflow or smart list reads the tag. A tag that nothing reads is not automation, it is a sticky note, and it can be merged without breaking anything.
Custom values hide a different problem. They are account-wide variables (a phone number, an address, a price) that templates and workflows reference, and inherited accounts often still carry the previous agency's booking link or an old office number. Pipelines get the same treatment as tags: a pipeline with no open opportunities and no workflow moving contacts into it can be archived. Calendars need their time zone checked against the sub-account and the assigned user, which is the usual cause of reminders arriving at the wrong time.
A workflow can be perfectly built and still send nothing. Under Settings, Phone Numbers, the Trust Center shows whether the A2P 10DLC brand and campaign are approved and which numbers are attached to the campaign. A number bought last month and never attached will fail on every send. Wallet auto-recharge turned off produces the same symptom on a different day of the month.
Integrations are the last technical check because they cross the account boundary. Note every connected Google or Facebook account (whose login is it?), every Stripe connection, and every outbound webhook action inside a workflow, because those point at a Zapier or Make scenario that may belong to a previous vendor. Then look at users. Former employees with admin seats, and especially a former agency that still owns the agency-level account your sub-account lives under, are the highest-risk item in the whole list, because they decide whether you can ever move.
Order the list by what can hurt a customer. Shared triggers that send messages come first. Then re-entry settings, then send-step numbers, then A2P and wallet. Tag and pipeline cleanup is safe and satisfying but changes nothing a customer sees, so it goes last.
For workflows, switch to draft rather than delete. Draft stops new contacts from entering and keeps the build, so if a form stops getting a reply you republish in seconds. Give it two or three weeks before deleting. For tags, merge by adding the surviving tag to every contact that has the duplicate, updating the workflows that filter on the old spelling, and only then removing the old tag. Do the workflow filters before the tag removal or the filter silently matches nobody.
We ask for a user seat, agree in writing not to publish or delete anything, and run these twelve checks. You get the filled-in sheet, a fix list ordered by risk, and a fixed price for the cleanup, not an hourly estimate. The GoHighLevel audit and cleanup service is scoped that way on purpose: you should know what is wrong and what it costs before anyone changes a live workflow. If you would rather talk it through first, book a free discovery call and bring the login.
Ask for a user seat with admin permissions but agree with the owner that you will not publish, delete or edit anything for the first pass. Then work through the twelve checks in this article in order: workflows and triggers first, then tags and fields, then pipelines and calendars, then phone, A2P and integrations. Write down what each item does before deciding what to change.
Not on the first pass. Switch a workflow to draft instead, which stops new contacts entering it but keeps the build. If a form stops getting a reply or a reminder goes missing, you can republish in seconds. Delete after two or three weeks of nothing breaking.
There is no hard limit, but when the tag list is longer than anyone on the team can explain, the tags have stopped being useful. The practical test is to list every tag with the workflow or smart list that reads it. Tags that nothing reads are memory, not automation, and can be merged or archived.
For a single sub-account with under two hundred workflows, a first pass that inventories triggers, tags, pipelines, calendars and phone setup takes about 90 minutes. Writing up the fixes and ordering them by risk takes another hour or two. Agency accounts with many sub-accounts take longer because each sub-account is audited on its own.
Contacts getting the same text twice, texts from two different numbers, or a whole list blasted at once. The four causes and the fix for each.
Learn morePatients or customers getting reminders for the old appointment, the wrong day, or after they cancelled. What causes it and how to build reminders that cancel themselves.
Learn moreBook a 30-minute call. We look at the account live and tell you what is broken, what we would fix first and what it would cost.
No pitch deck. We look at your current setup and tell you what we would do and what it would cost.Need more than GoHighLevel? Yotomations, our parent company, also builds AI agents, custom software and websites.