When a lead texts “STOP”, carriers handle it at the gateway level. But when someone texts “please stop texting me”, “wrong number”, or “take me off your list”, GoHighLevel keeps firing your scheduled follow-ups. Here’s how to build an automated opt-out and Do Not Disturb (DND) workflow in HighLevel that catches conversational opt-outs, isolates SMS-only DND, and handles resubscribes without killing your email automations.

Why Default HighLevel SMS Opt-Out Leaves You Exposed
If you rely solely on Twilio or LC Phone’s built-in keyword handling, you only catch exact single-word replies: STOP, UNSUBSCRIBE, CANCEL, END, and QUIT. The second a contact replies “remove me from this list” or “stop messaging this number”, downstream carriers pass the message straight through as standard inbound SMS without toggling any carrier-level block.
Because the carrier didn’t trigger an automatic opt-out webhook, your active campaigns keep running. Two days later, an automated review request or reminder goes out. The contact files a TCPA complaint, and your sending reputation tanks. As I covered in my guide on troubleshooting LC Phone carrier filtering errors, repeated messages to opt-out requests are the fastest way to get your phone numbers flagged and suspended.
You need a workflow that catches inbound phrasing intent, applies channel-specific DND flags, sends an immediate compliant confirmation, and logs the opt-out timestamp for legal audit trails.
Channel-Specific DND vs Full Contact DND
One common mistake I see in client setups is slapping a global Enable DND for Contact action onto every opt-out workflow. Doing that nukes SMS, email, WhatsApp, GMB messaging, and automated calls all at once.
If a lead says “stop texting me”, they don’t mean “never email me my invoice or password reset link again”. HighLevel lets you split DND controls into granular channels. You can toggle DND independently for:
- SMS / Text Messaging
- Voice / Inbound & Outbound Calls
- Facebook Messenger / GMB
Check the HighLevel DND Management Guide to see how these flags look in the contact card UI. For SMS compliance, we strictly isolate the SMS channel unless the contact explicitly demands a total purge.
Step 1: Create the Inbound Opt-Out Workflow
Open your sub-account, go to Automation > Workflows, and hit Create Workflow > Start from Scratch. Name it Compliance: Inbound SMS Opt-Out Handler.
Configure the trigger with these settings:
- Trigger: Customer Replied
- Reply Channel: SMS
- Contains Phrase: Add your target keywords. I use:
stop,unsubscribe,cancel,quit,end,remove,opt out,wrong number,do not text,dont text.
Make sure you open Workflow Settings at the top and toggle Allow Re-entry ON. If a lead opts out, later re-subscribes, and then opts out again months later, this workflow has to fire every time.
Step 2: Apply Channel DND and Add Compliance Tags
Once triggered, the workflow should execute four actions in sequence:
- Action 1: Set Contact DND → Select Enable DND for Specific Channels → Check only SMS.
- Action 2: Add Contact Tag → Add
sms-dnd-activeandopted-out. - Action 3: Update Custom Field → Set a datetime field like
SMS Opt Out Dateto{{ right_now }}using workflow execution variables. - Action 4: Remove from All Active Campaigns → Use the Remove from All Workflows action, excluding any critical billing automations if necessary.
Here’s the visual logic structure you should have on your canvas:
Workflow structure for the opt-out handler:
{ "trigger": { "type": "Customer Replied", "filters": { "channel": "SMS", "match_type": "contains_phrase", "phrases": ["stop", "unsubscribe", "cancel", "remove me", "wrong number"] } }, "actions": [ { "type": "set_dnd", "channels": ["SMS"], "status": "enabled" }, { "type": "add_tags", "tags": ["sms-dnd-active", "opt-out-tcpa"] }, { "type": "send_sms", "message": "You have been unsubscribed and will receive no further text messages. Reply START to resubscribe." } ]
}Sending an automated SMS confirmation is standard practice under the Twilio Opt-Out Keywords Documentation and CTIA guidelines. You are legally permitted to send exactly one single transactional message confirming the opt-out went through.
Step 3: Handle the Resubscribe Flow (START / UNSTOP)
If a customer opted out by accident or later wants to resume appointment notifications, you need an automated path to re-enable SMS without digging into contact records manually.
Create a second workflow named Compliance: Inbound SMS Resubscribe Handler:
- Trigger: Customer Replied → Reply Channel: SMS.
- Filter: Exact Match / Contains Phrase →
start,unstop,yes,subscribe. - Condition (If/Else): Check if the contact has the tag
sms-dnd-active. - Branch True:
- Action: Set Contact DND → Disable DND for Specific Channels → Check SMS.
- Action: Remove Tag →
sms-dnd-active,opted-out. - Action: Add Tag →
sms-opted-in. - Action: Send SMS: “You have successfully resubscribed to text notifications from {{location.name}}. Reply STOP at any time to unsubscribe.”
- Branch False: Do nothing (let normal conversational replies go to your team or AI assistant).
When writing your response templates, check out my breakdown on merge fields in SMS templates so missing custom values don’t blow past SMS character limits.
Syncing DND Status to External Databases via API v2
If you’re syncing contacts to an external CRM, database, or analytics platform, you need to push DND updates out immediately. You can trigger an HTTP POST action using authenticated webhooks in HighLevel straight from the workflow.
If you manage contacts programmatically via the GoHighLevel API v2 Contacts Endpoint, here is the exact payload structure to update DND flags directly:
Sample API v2 request to apply SMS DND to a specific contact:
curl --request PUT --url https://services.leadconnectorhq.com/contacts/CONTACT_ID_HERE --header 'Accept: application/json' --header 'Authorization: Bearer YOUR_OAUTH_TOKEN' --header 'Content-Type: application/json' --header 'Version: 2021-07-28' --data '{ "dnd": true, "dndSettings": { "SMS": { "status": "active", "message": "Opted out via workflow webhook", "code": "OPT_OUT" } }, "tags": ["sms-dnd-active"] }'Note the dndSettings structure. Setting "dnd": true at the root level while defining sub-channel objects lets you shut off the SMS pipeline while keeping email and voice permissions intact.
What I Ran and What Broke
The first time I deployed this multi-phrase matching workflow on a high-volume client account (roughly 15,000 texts a week), we triggered an infinite workflow loop within 48 hours.
Here’s what happened: A lead texted “STOP”. The workflow caught it, enabled DND, and sent the confirmation SMS: “You have been unsubscribed. Reply STOP to cancel.” Because that confirmation template literally included the word STOP, an external webhook bridge reflected the outbound text back into the system as an inbound event. The workflow matched its own text, fired again, and tried to send another message.
Two ways to prevent this loop:
- Never include trigger words (like “STOP” or “UNSUBSCRIBE”) inside the body of your confirmation SMS message. Only mention inverse keywords (like “Reply START to resume”).
- Add a safety check right at the top of the workflow using an If/Else branch: If the contact already has
sms-dnd-activeAND the last opt-out date was updated less than 1 minute ago, terminate the workflow immediately.
If you’re still provisioning numbers or dealing with registration rejections, make sure you go through our walkthrough on A2P 10DLC registration requirements before scaling your outbound campaigns.
Frequently Asked Questions
Does toggling SMS DND also stop outbound messages sent manually by my team?
Yes. Once SMS DND is turned on for a contact, the text input box in the HighLevel Conversations tab is greyed out. Team members will see a warning banner showing that SMS DND is active. Admins can manually override this from the contact card, but normal workflows and direct conversation sends will be blocked.
What happens if a contact replies STOP to a Twilio-backed number?
Twilio blocks outbound messages at the carrier gateway level regardless of your HighLevel settings. Even if you turn off DND inside HighLevel, Twilio won’t deliver any texts to that number until the user sends an explicit “START” or “UNSTOP” message from the exact same phone.
Can I trigger an internal Slack or email alert when someone opts out?
Yes. Add an Internal Notification action right after the DND step in your opt-out workflow. Pick SMS, Email, or In-App Notification to alert the assigned rep so they don’t waste time calling someone who just asked off the list.
Should I delete contacts who opt out of SMS?
No. If you delete the contact record, you lose the historical record of their opt-out request and the timestamp. Keeping the tagged contact with active DND status is your audit proof in case of a TCPA complaint.
Next Steps
Now that your compliance workflow handles both carrier keywords and natural replies, check your overall delivery rates across carriers. See our guide on fixing GoHighLevel LC Phone SMS carrier filtering and delivery errors to monitor throughput and resolve bounce error codes.

