
If your A2P 10DLC campaign keeps getting rejected, the problem is almost never technical. It's that your campaign description is too vague for a carrier to understand and your opt-in page isn't something they can verify by clicking it. Fix those two things — write a description that names who is messaging whom and why, and publish a live consent form with Terms and Privacy links on the same page — and most rejected campaigns clear on the next submission.
We register these for clients constantly, usually because someone is wiring up missed-call text-back or an AI follow-up sequence and discovers that nothing sends. Every rejection we've had to untangle in the past year came down to one of five things. Here they are, in the order they actually bite.
1. Your campaign description reads like a category, not a sentence
This is the big one. Agencies write descriptions like "appointment reminders and customer notifications" or "marketing and account updates," because that's how the form is labeled. Carriers read that and learn nothing. Who is sending? To whom? Why did those people agree to hear from you?
Compare it to a description that gets approved:
We send SMS follow-ups to homeowners who submitted a quote request form on our roofing client's website. The messages confirm we received the request, offer available inspection times, and answer basic questions about scope and timing. Consent is collected via a checkbox on the quote form at example.com/quote.
That's three sentences and it answers every question a reviewer has. If an AI agent is generating the messages, say so explicitly — carriers are far more accepting of disclosed automation than of automation they discover later by pattern-matching your traffic.
The fastest sanity check: read your description out loud and ask whether a stranger could tell what your client does. If they can't, a reviewer can't either.
2. Your opt-in URL isn't something a carrier can actually check
Screenshots used to be enough. They aren't. Reviewers now open the URL you submit and expect to land on a working form.
What has to be visible on that page, without scrolling into a modal or clicking through:
- The consent language itself — something like "By submitting this form you agree to receive text messages from [Brand] at the number provided."
- Message frequency — "Msg frequency varies" is acceptable.
- A rate disclosure — "Msg & data rates may apply."
- STOP and HELP instructions — "Reply STOP to opt out, HELP for help."
- Links to Terms of Service and Privacy Policy on the same page as the form. Twilio made these hard-required on new campaign submissions, and other carriers expect them in vetting.
- A public URL. Not staging, not password-protected, not a homepage that merely links to the form somewhere.
The Privacy Policy also needs to say you don't share mobile opt-in data with third parties for marketing. That single missing sentence has cost us more resubmissions than any other line item.
3. You're guessing at the rejection reason instead of reading it
On March 23, 2026, The Campaign Registry started rolling out granular error codes for A2P 10DLC campaign registrations. The old catch-alls — 30883, 30884, 30885, 30897 — got split into specific codes that name the failing field. The SHAFT bucket alone now has a separate code per category.
This matters more than it sounds. Before, a rejection told you "something about your content" and you'd resubmit three times fiddling with different fields. Now the code points at the problem. Twilio's changelog documents the shift, and every major CSP surfaces the code somewhere in the campaign object.
Go get the code before you touch the form. If your CSP's UI only shows a friendly summary, pull the campaign via API — the raw failure reason is usually there and it's usually more specific than the dashboard lets on.
4. Your AI agent writes messages your registered samples never described
This is the failure mode nobody warns agencies about, and it's the one that hits hardest in 2026 because everyone is deploying AI SDRs and follow-up agents.
Here's the mechanic: carriers compare your live traffic against the sample messages you registered. Not once at approval — continuously. A human rep replying by hand tends to stay close to an approved template. An LLM generating fresh copy for every lead does not. It'll open with a joke, reference something from the lead's form submission, restructure the offer. Individually harmless. In aggregate it looks like traffic that doesn't match its registration, and the filtering kicks in on an approved campaign.
What we do about it:
- Register samples that cover every message type the agent can produce — first touch, follow-up, reschedule, qualification question, opt-out confirmation. Not two generic examples.
- Use variable placeholders in the samples, like
Hi {{first_name}}, this is Dana with {{brand}} about your quote request.Placeholders signal to the reviewer that content varies inside a fixed frame. - Constrain the agent to templates. The model picks which template and fills the variables; it doesn't free-write the message body. This is the single highest-leverage change, and it's a five-minute edit in most CRM follow-up workflows.
- Append brand and opt-out to every outbound message at the send layer, not in the prompt. Prompts drift. Code doesn't.
Voice agents have a parallel version of this problem, which we covered in the 2026 voice AI compliance guide — same principle, different channel: disclose the automation, keep the live behavior inside what you declared.
5. You're still building around a rule that no longer exists
A large share of the 10DLC guides published this year still tell agencies to rebuild their lead forms for the FCC's one-to-one consent rule. Skip it. The Eleventh Circuit vacated that rule on January 24, 2025 in Insurance Marketing Coalition v. FCC, and the FCC formally removed it from its rules that September. Lead-generation consent went back to prior express written consent without the one-per-seller constraint. Morrison Foerster's summary is a clean read on what actually happened.
The risk didn't disappear, though. It moved to the states, and that's where agencies running multi-state campaigns should be looking:
- Texas SB 140 expanded the definition of telephone solicitation to cover text messages and tied violations to the Deceptive Trade Practices Act — which opens the door to treble damages. If you operate in Texas, as we do, this is the one to read.
- Virginia SB 1339 requires honoring text opt-outs for ten years, which is a data-retention requirement as much as a compliance one. Your suppression list has to outlive your CRM migration.
Federal rules are the floor now, not the ceiling.
What approval actually gets you
Registered throughput. That's it. It is not a delivery guarantee and it is not a permanent pass.
T-Mobile enforces daily message caps at the brand level, AT&T enforces per-minute throughput at the campaign level, and both apply filtering to approved campaigns when opt-out rates, complaint rates, or volume patterns look wrong. Sole proprietor registrations are capped tightest — roughly 1,000 messages a day on T-Mobile and 15 per minute on AT&T — which is why we push clients to register as a proper entity with an EIN even when a sole prop registration would technically go through.
So build the monitoring in from day one. Delivery rate, opt-out rate, and complaint rate, checked weekly. If you're running this through n8n, a scheduled job that pulls message status from your CSP and posts a weekly summary to Slack takes about twenty minutes to build and will catch a filtering problem weeks before a client does. We prefer that over the dashboard-based approach in GoHighLevel-style platforms precisely because you can alert on it.
The short version
A rejected 10DLC campaign is a communication failure, not an engineering one. Write a description a stranger could understand, publish an opt-in page a reviewer can click, read the actual error code, and — if an AI is writing the messages — make sure the samples you registered describe what the agent really sends. Then keep watching after approval, because carriers never stop watching.
Most agencies discover all of this the hard way, in the middle of a client launch, with a campaign stuck in review and a paid campaign already driving leads into a system that can't text them back.
If you're wiring SMS or voice AI into a client's follow-up and want it reviewed before it goes live, get a free automation audit. We'll look at your registration, your opt-in flow, and the agent that's generating the messages, and tell you what will get filtered.