GoHighLevel sending duplicate text messages

Short answer
When GoHighLevel sends the same text twice, it's usually because two triggers or workflows fire on the same event, a trigger fires on every event (each form submission, each call status change), re-entry is allowed, or the person exists as two contacts. Execution Logs show which workflow and step sent each copy, so start there.
How to fix it
- Find out which workflow sent each copy. Open the workflow and check Enrollment History and Execution Logs. They show each contact's path and the step that sent each message.
- Look for overlapping triggers. Every trigger in a workflow fires on its own when its conditions are met. Check other workflows for the same trigger, too.
- Check Allow Re-entry. In the workflow's Settings tab, Allow Re-entry off means a contact can go through the workflow only once. Appointment and invoice triggers always allow re-entry.
- Check Allow multiple Opportunities. Also on the Settings tab. It runs one instance per opportunity and is on by default in new workflows.
- Guard event triggers. Form Submitted fires on each submission and Call Details (formerly Call Status) fires on each status change. Add a condition or a wait so one person doesn't trigger it twice.
- Stop duplicate contacts. Go to Settings > Business Profile > Contact Deduplication Preferences. Turn off Allow Duplicate Contact and choose whether to match on email or phone.
- Merge the duplicates you have. Contacts > the ⋮ menu > Manage Duplicates > Find Duplicates, review, then merge. Merging is permanent.
How to find the cause
Start from one pair of duplicate texts and work back to whatever sent each copy.
- Trace each copy. In Conversations, open each message's details. If a workflow sent it, the Workflow link opens its Execution Details. Do this for both copies; they often come from different places.
- Look for copies with no workflow. A copy with no workflow behind it came from somewhere else: a bulk send, a campaign, Missed Call Text Back or the calendar's own notifications. Messaging Analytics, under Settings > Phone System > Messaging tab, can filter messages by where it came from (a campaign, a workflow or a bulk request).
- Read the enrollment history. In the workflow's Enrollment History, find the contact. Highlight Contact Path shows the route they took, including skipped steps and errors.
- Search for the phone number in Contacts. Two contacts with the same number each get their own copy of every text.
| What you see | What it means | What to do |
|---|---|---|
| Two workflows each logged a send | Two workflows react to the same event | Keep the text in one workflow, or add a condition to the other |
| One workflow, two enrollments seconds apart | Two triggers matched, or the event happened twice: a double form submit, or two call status changes | Remove the extra trigger, or add a condition or wait |
| One workflow, two enrollments days apart | Re-entry is allowed, or the trigger is appointment or invoice based, which always allows re-entry | Turn off Allow Re-entry, or tag the contact on the first run and check for the tag |
| One enrollment per opportunity | Allow multiple Opportunities is on and the contact has more than one deal | Turn it off if the text is about the person, not the deal |
| One enrollment, two sends | The path has two Send SMS steps | Remove one, or put a condition in front of it |
| Two contacts, one phone number | Duplicate contacts | Merge them and set deduplication preferences |
| A workflow copy plus a copy with no workflow | A workflow and a built-in feature both send | Use one: calendar notifications or a reminder workflow, Missed Call Text Back or a Call Status workflow |
The deduplication setting covers contacts from forms, Zapier, Facebook and Instagram. HighLevel says CSV imports merge matching contacts automatically, whatever the setting.
How to confirm it's fixed
- Make a test contact with your own phone. So the texts land somewhere you can see them.
- Fire the trigger once. Submit the form, book the appointment, or make the call that starts the workflow, once.
- Check the log. A pass is one enrollment in Enrollment History and one Send SMS line in Execution Logs for the test contact.
- Fire it the way real people do. Submit the form twice in a row, or call and hang up twice. A pass is the number of texts you meant, usually one.
- Check your phone and the conversation. One text on your phone, and one outbound message in the conversation.
- Recheck after a few days. In Execution Logs, filter by the Send SMS action over the last week (the date range goes up to 30 days) and look for any contact listed twice.
If you merged contacts, HighLevel combines their tags and workflows into the one you keep. Check which workflows the merged contact is in now, so the merge itself doesn't start a second run.
Missed call text back sends more than once
The built-in Missed Call Text Back sends a text for every missed call, even from the same caller. HighLevel suggests a workflow with a wait step or a tag check instead.
Common questions
- Will turning off re-entry fix it?
- Only if the same contact is entering the same workflow twice. If two workflows or two contacts are involved, re-entry won't change it. Check the execution logs first.
- Does the deduplication setting merge contacts I already have?
- No. It decides how new contacts from forms and other sources are matched. Use Manage Duplicates for the ones already there.
- A customer booked two appointments and got two sets of texts. Is that a bug?
- No. HighLevel enters a contact into an appointment workflow once per booking, whatever the re-entry setting, so two bookings mean two runs. If one set is enough, add a condition that checks for a tag set on the first run.
- Why did both the contact and their guest get the text?
- Appointment triggers can enroll Contact and Guests, and the workflow runs separately for each person. Each person gets one copy, which isn't a duplicate. Set it to Contact only if guests shouldn't get it.
Rather we set it up?
We set this up for you as part of a done-for-you package, quoted on a free call.
GoHighLevel rescue
A messy account someone else built, gone through and fixed: duplicate workflows, broken automations, bad data and texts that don't send.
More workflow fixes
GoHighLevel workflow not triggering: a checklist
Usually it's still in Draft, the trigger filters don't match, or re-entry is off. The execution logs tell you which.
GoHighLevel workflow Wait step not working, or contacts stuck
Usually the wait is waiting exactly as set: for a reply or event with no timeout, inside an advanced window, or on timing that was edited later.
GoHighLevel workflow Goal Event not firing
Only one goal per workflow, each contact is checked against it once, and the event or filter has to match exactly.
GoHighLevel trigger links not tracking clicks
Usually a pasted URL instead of the trigger link itself, no workflow listening for the click, or a filter pointing at a different link.
GoHighLevel If/Else branch not matching
Usually AND and OR grouped wrong, a field updated in the same second as the check, or data that isn't there when the step runs.
GoHighLevel custom values or fields showing blank in messages
The contact has no value saved, the workflow doesn't supply it (appointment fields need an appointment trigger), or it was typed instead of picked.
GoHighLevel birthday or date triggers firing at the wrong time
The birthday trigger runs at 8 AM in the account's time zone and skips badly formatted dates. Waits set the hour; workflow settings set the time zone.
Related fixes
GoHighLevel appointment reminders going out at the wrong time
Usually the workflow's time zone, a fixed wait instead of one timed from the appointment, or calendar notifications sending a second copy.
Read the fixGoHighLevel missed call text back not working
Usually the call was "answered" by a cell phone's voicemail before the timeout, or the number isn't A2P registered.
Read the fix
Want GoHighLevel set up and running for you?
Book a free 15-minute call. Tell us what you sell and where your leads come from, new account or the one you have, and we'll tell you what we'd set up, how long it takes and what it costs.