If you run SMS through GoHighLevel and your messages have started quietly disappearing, the culprit is almost always A2P 10DLC, the US carrier registration system for application-to-person texting. This is the guide we wish every agency had before their first campaign got filtered.
What A2P 10DLC actually is
A2P stands for application-to-person: any text sent by software rather than a human thumb. 10DLC means 10-digit long code, i.e. a normal local number. US carriers now require every business sending A2P traffic over a 10-digit number to register two things: a Brand (who you are) and a Campaign (what you send and why). Unregistered traffic gets throttled, filtered, or blocked outright.
Registering in GoHighLevel, step by step
- Open the sub-account → Settings → Phone Numbers → Trust Center and start the A2P registration.
- Submit the Brand: legal business name, EIN, address, and website. The name and EIN must match IRS records exactly. A mismatch is the #1 rejection reason.
- Create the Campaign: pick a use-case (usually Mixed or Customer Care), describe what you send, and provide two real sample messages that include the business name and an opt-out line.
- Confirm your opt-in flow. Carriers want proof consent was collected: a form screenshot, checkbox language, or a keyword opt-in. "We bought a list" is an automatic decline.
- Wait for approval, then attach the approved campaign to the sending number.
Why registrations get rejected
Most rejections come down to a handful of avoidable mistakes:
- EIN / legal name mismatch: it must match the IRS letter character-for-character, not your DBA.
- No visible opt-out: every sample message needs a
Reply STOP to opt out(or similar). - Vague sample messages: "Hi, thanks!" tells the reviewer nothing. Show a real, branded message.
- Missing opt-in proof: no consent mechanism described means an instant decline.
- Prohibited content: anything touching cannabis, loans, or high-risk finance faces far stricter review.
The Twilio error codes that mean you're blocked
GoHighLevel runs on Twilio underneath, so when texts fail you'll often see a Twilio code in the logs. The ones that actually mean "A2P problem":
30034: sending A2P traffic over an unregistered number. Register the campaign.30007: carrier filtered the message as spam. Usually content or an unregistered/low-trust campaign.30032: the number type isn't permitted for this traffic. Check the number is 10DLC and campaign-attached.30003 / 30005: unreachable or unknown destination handset (not an A2P issue, but a bad number).
Staying delivered after approval
- Keep opt-out honored automatically. GoHighLevel handles STOP, but never re-add someone who opted out.
- Warm up volume gradually; a brand-new number blasting thousands of texts looks exactly like spam.
- Keep message content close to your registered samples. Wildly different content erodes trust scores.
- Monitor throughput (MPS) on high-volume sends so you don't queue faster than the number can deliver.
A2P is tedious, but it's also the difference between a client's automations working and silently failing. If you'd rather hand the whole registration (brand, campaign, opt-in proof, and troubleshooting) to a team that does it every week, that's exactly what we do.