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 moreA customer answers your text, then gets three more follow-ups anyway. Here is how to find the workflow that sent them and make every sequence stop when a person replies.
Short answer: GoHighLevel keeps sending follow-ups after a reply because the workflow that sends them is not set to stop on response, or because the contact is enrolled in a second workflow you forgot about. Find the workflow that sent the message from its enrollment history, turn on Stop on Response in every follow-up workflow, and add one reply handler workflow that removes the contact from everything else. Test it with a real reply before you trust it.
Prefer to watch? The 49-second version
If your follow-ups keep firing after a reply, here is the two-part fix: Stop on Response plus one reply handler workflow.
Watch it on its own page, with the transcript.
Do not change anything yet. Open the conversation, note the exact time of the unwanted message, then check the enrollment history of the workflows that could have sent it. You are looking for the contact's name with a step that ran at that time.
This matters because the answer is rarely the workflow you built last week. It is usually an older sequence, a form-submission workflow from a previous agency, or a missed-call text back that also runs a follow-up. If you inherited the account, expect two or three workflows that all text new leads. A Reddit thread from this week makes the same point: check which workflow sent them before you touch settings.
Write down every workflow that shows the contact. If it is more than one, you have found the real problem, and the fixes below are about that.
| Cause | How to spot it | Fix |
|---|---|---|
| Stop on Response is off | The sending workflow's settings show the option disabled | Turn it on in that workflow's settings |
| A second workflow has the same contact | The contact appears in the enrollment history of two or more workflows | Reply handler workflow, plus Stop on Response in each |
| The contact re-enters after leaving | Enrollment history shows a new entry after the reply, often because a tag was re-added or a form was resubmitted | Check the trigger and the re-entry setting, and add a Replied tag check |
| The reply came through a different channel | The contact answered by email or a social DM while the workflow was texting | Test each channel yourself, and have the handler cover the channels you use |
| A bulk or older campaign is still running | The message is not in any current workflow's history | Look at old campaigns and bulk actions, and stop the sequence there |
Most accounts we open have the first two at once. One workflow has the setting off, and another one nobody remembered is doing the sending.
Stop on Response lives in the workflow's settings, not in the individual steps. When it is on, a reply from the contact removes them from that workflow, so remaining wait steps and messages do not fire. Because it is a per-workflow setting, you have to check it in every workflow that sends follow-ups. Make a short list and tick each one off.
Then test it the boring way. Enroll your own mobile number, let the first message arrive, reply from your phone, and watch the enrollment history. Do the same for email if the sequence uses email. If the contact leaves the workflow after the reply, the setting works on that channel.
Do not skip the test. A setting that looks right and a setting that behaves right are different things, and the first time you find out should not be a customer who says "I already answered you."
Per-workflow settings fall apart as an account grows. The fix we install is a single workflow whose only job is to deal with replies.
Now a reply does three things at once. It stops the sequences, flags the contact, and puts a human on it. If you later build a new follow-up workflow, adding it to the handler's removal list is a ten-second job. This is the same pattern we use in the speed to lead system and in quote follow-up for contractors, where the whole point is that automation hands off to a person the moment the customer speaks.
If a sequence runs over several days, put an If/Else step before each message that asks whether the contact has the Replied tag. If yes, end the path. If no, send. It looks redundant next to Stop on Response, and that is the point: it covers the gap between a reply landing and the removal action finishing, and it protects you if someone later turns the setting off.
Keep the logic readable. One tag, one condition, same name everywhere. We have seen accounts with 242 tags where nobody could say which one meant "this person answered," which is how this problem comes back. If your tag list is already tangled, see the notes in our audit checklist.
Two cases look similar and are not. If the same message went out twice at once, you have a duplicate send, not a missed reply, and why GoHighLevel sends duplicate text messages covers it. If the workflow log says it ran fine but the wrong content went out, read why a workflow can say it worked and still send the wrong message.
The third case is the serious one. If the contact replied STOP and still got a message, check whether the contact is marked Do Not Disturb for SMS, then find the workflow that sent it and fix it the same day. Opt-outs sit under TCPA rules enforced through the FCC, and carriers watch for them too. This is practical guidance and not legal advice.
We would open every workflow that texts or emails a lead, list which ones have Stop on Response off, and map which contacts sit in more than one sequence. Then we would build the reply handler and test it with a real phone. On an account with dozens of overlapping workflows, that mapping is most of the work, and it is what our GoHighLevel account audit, starting at $497, is built for. If you only have two or three workflows, you can do the steps above yourself in an afternoon.
Open the workflow, go to its settings, and turn on Stop on Response. Do it in every follow-up workflow, not just one, because the setting belongs to each workflow separately. Then send yourself a test reply and confirm the contact leaves the sequence.
That is a different problem from a missed reply. Check whether the contact is marked Do Not Disturb for SMS, and check which workflow sent the message. If a person opted out and still received a message, treat it as urgent. This is practical guidance and not legal advice, so talk to your attorney about TCPA exposure.
Yes. A contact can be enrolled in several workflows at the same time, and each one runs on its own timer. That is why a reply can stop one follow-up sequence while another keeps sending.
Open the workflows you suspect and check their enrollment history for the contact's name, then compare the timestamps with the message in the conversation. The workflow that was running at the time the message went out is the sender.
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 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.
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.