A2P 10DLC Campaign Rejected: Reasons and Fixes - Zian AI

A2P 10DLC Campaign Rejected: Reasons and Fixes

A 10DLC or toll-free campaign is rejected on the fields you filed, not on the message your AI writes. The Campaign Registry’s FAQ says it “does not review, approve, or reject campaigns” — CSPs and their upstream partners do. Twilio’s toll-free edit window is seven days from the initial request; AWS publishes up to four weeks for campaign registration.

Every generic A2P 10DLC guide we could find assumes a human wrote the messages. If you are registering a generative AI SMS agent — one that composes a fresh string on every send — you hit a contradiction none of the guides we reviewed addresses: the registration form wants sample messages that reflect what you will actually send, and your system has no fixed messages to show. This page resolves that, with the exact rejection strings mapped across providers.

Why was my 10DLC campaign rejected when my provider approved everything else?

Because your provider is not the decision-maker. Twilio’s error dictionary is explicit about who is: error 30902 is titled “Campaign rejection – A DCA2 rejected this campaign registration request”, and the body states that the “campaign registration was rejected during third-party review”. Error 30880 describes a campaign “rejected by an A2P ecosystem vetting party” where “the returned result did not identify which field failed review”.

The registry itself disclaims the decision. The Campaign Registry’s Resources FAQ states plainly: “The Campaign Registry (TCR) does not review, approve, or reject campaigns. This is solely done by the CSPs and their upstream connection partners.” So the popular shorthand that “TCR rejected you” is wrong at the source. The chain that actually decides runs: you → your CSP (Twilio, AWS End User Messaging, or another) → the aggregators and vetting parties above them → the mobile operators. TCR is the record, not the referee.

This matters operationally, because it tells you where an appeal goes. TCR’s FAQ: “If your campaign is rejected for any reason, you will need to speak to your CSP that you registered through.” A support ticket with your provider is the only door.

One more line is worth memorising, from Twilio’s toll-free opt-in rejection page (error 30476): “The review process looks at the business sending messaging (not the software powering it), the use case, sample content, the web presence, the opt-in/consent collected and associated website terms and privacy policies.” Your AI platform is not the brand. Your client is.

Unverified US toll-free numbers are blocked, not throttled

If you are waiting out a toll-free rejection assuming traffic is merely degraded, it is not. Twilio’s changelog entry of 8 November 2023 is headed “Messaging on unverified U.S. Toll-free phone numbers now fully blocked”. A second entry dated 31 January 2024 closed the remaining gap: “Effective January 31, 2024, messages sent from toll-free numbers pending verification will be blocked. Only fully verified toll-free phone numbers will be eligible to send messages.” (Twilio changelog.)

Blocked sends return Error 30032, and Twilio’s changelog notes that messaging fees still apply to blocked messages. So a rejection on a toll-free number is a live outage on that number, and it is an outage you are paying for. Treat the clock accordingly.

Cross-provider rejection-reason map, with the LLM-specific fix

Column one is verbatim from AWS End User Messaging’s toll-free rejection-reason table and its rejection troubleshooting page (which publishes the console title and the API ENUM side by side). Column two is the nearest Twilio error, quoted from its title in Twilio’s error dictionary; the mapping between columns one and two is ours, not an equivalence either provider publishes. Column three is our own recommendation — what we would change when the sender is a generative agent rather than a marketing team. It is not registry, carrier or provider policy, and no provider endorses it.

AWS reason (verbatim) Nearest Twilio error code and title The LLM-specific fix
Compliant Opt In Missing 30476: Toll Free verification rejection – Opt-in not provided Submit a hosted screenshot of the consent widget itself, not a description of it. An agent that “asks permission in conversation” produces no reviewable artefact. Point the opt-in URL at the live form, or a hosted image of it, that a stranger can open.
Non Compliant Opt In 30475: Toll Free rejection: Cannot combine messaging consent with service requirement If your agent replies to web enquiries, the SMS consent must be its own control. AWS’s remedy: “Include an unchecked checkbox specifically for SMS messaging consent that the consumer must actively select.” Never bundle it with the submit action or the terms tick.
Non Compliant Opt In Consent 30476: Toll Free verification rejection – Opt-in not provided Store consent per number with source, the wording displayed and a timestamp, in the CRM rather than the conversation log. A model reading “yeah go ahead” out of a thread is not express written consent and cannot be produced on request.
Non Compliant Opt In Third Party 30477: Toll Free rejection: Third-party information sharing not allowed If you operate the agent for clients, the privacy policy under review is the end business’s, not your platform’s. Each client site needs mobile opt-in data explicitly carved out of any information-sharing clause.
Invalid Business Connection 30474: Toll Free verification rejection – Need end business Register the client, not the AI platform. Twilio 30474 fires when “the submission identified the ISV, reseller, or software provider instead of the end business that has the relationship with the opted-in consumer”. One brand per client; never a single house brand fanning out across accounts.
Invalid Company Info 30472: Toll Free verification rejection – Could not verify Business; 30484: Toll Free verification rejection – Business name and office record mismatch Pin the sender name as a constant in the send path, not a model-supplied variable. The name the agent writes into the message must equal the registered legal or DBA name character for character, including punctuation such as Pty Ltd.
Invalid URL 30473: Toll Free verification rejection – Cannot validate business website URL; 30471: Toll Free verification rejection – High Risk – Non-secured URL in sample message Forbid model-generated links. AWS: “Public URL shorteners are not permitted in 10DLC message content.” Twilio 30471 rejects a sample where “the sample message includes a URL that does not use https://”. Give the agent a fixed allow-list of full-domain HTTPS links to slot in.
Invalid Multi Numbers 30478: Toll Free verification rejection – single phone number used for multiple businesses One number per client brand. A shared agent pool that rotates numbers across clients is exactly the pattern this reason exists to catch; AWS separately rejects the same or similar use case repeated across multiple campaigns as “indicating snowshoeing”.
Invalid Overall We could not locate a single Twilio code that maps to this; the nearest analogue on the 10DLC side is 30880: Campaign vetting rejection – Unknown Error (we checked Twilio’s error dictionary entries 30437 and 30450–30485, plus its A2P 10DLC overview) When nothing specific comes back, your five artefacts disagree with each other. Diff campaign description, use case, samples, website copy and opt-in wording line by line. A description written by a model almost always drifts from the samples it was meant to describe.
Non Compliant Use Case The 30455–30469 "Disallowed" family — SHAFT, cannabis/CBD, gambling, sweepstakes, cryptocurrency, third-party lead generation — for example 30461: Toll Free verification rejection – Disallowed: Gambling Screen the rendered string at the send boundary, after generation. AWS’s troubleshooting table describes the category as “SHAFT content (sex, hate, alcohol, firearms, tobacco/vape)”. A denylist inside the system prompt is guidance; a denylist on the outbound payload is a control, and only the second one survives a jailbreak or a temperature spike.
Sample messages use case mismatch (ENUM: SAMPLE_MESSAGE_USE_CASE_MISMATCH) 30902: Campaign rejection – A DCA2 rejected this campaign registration request Register skeletons, not transcripts. AWS’s own instruction is the whole answer: “Provide at least two different sample messages reflecting actual messages your campaign will send… Use brackets for templated fields (for example, [name], [order number]).”
Duplicate content across fields (ENUM: CAMPAIGN_TEMPLATE_REUSE) 30880: Campaign vetting rejection – Unknown Error Do not paste the system prompt into every field. AWS asks you to “Provide distinct, field-specific content for each field, including different sample messages representing the range of messages your campaign sends” — range, meaning the agent’s opener and its follow-up should not be the same skeleton twice.

The Bracket Contract: how to register an agent that writes every message fresh

Here is the structural problem stated plainly. Registration wants sample messages that reflect real traffic — AWS’s review criteria require you to “Provide at least two distinct sample messages that represent the actual messages your campaign sends”, and reviewers check that “Samples reflect actual messages the campaign sends”. A generative agent emits a string that has never existed before, on every send. Two samples cannot represent an infinite set.

The reconciliation is already in the reviewers’ own instructions, and it sits in the CSP’s checklist rather than at TCR: The Campaign Registry’s Resources FAQ does not mention sample messages or brackets at all, on our reading of it. The same AWS checklist says “Variable fields use brackets: [name], [order number], [date]”. Brackets are the review process’s native notation for content that varies. So:

The Bracket Contract: a generative SMS agent becomes registrable the moment the review checklists’ bracket notation is literally true — every message it sends is an approved skeleton with its slots filled, and nothing else leaves the queue.

Four pins make that true. Each one moves a control out of the model and into the send path, which is the only place a reviewer’s assumption can be enforced.

  1. Pin the skeleton. The model selects which approved skeleton to use and fills the bracketed slots. It does not compose free text on the send path. Slot values are typed and length-capped — first name, suburb, appointment time, order reference — and a render that produces an unfilled or out-of-type slot is dropped, not sent. Your registered samples are then literally two of your skeletons.
  2. Pin the footer. HELP and STOP handling belongs to the messaging layer, not the model. Twilio’s Advanced Opt-Out tutorial states: “By default, Twilio handles standard English-language reply messages” for long code numbers in accordance with industry standards, covering STOP, UNSUBSCRIBE, END, QUIT, STOPALL, REVOKE, OPTOUT and CANCEL. Use that layer. A model asked to “remember to add Reply STOP” will forget, and the forgetting is what a reviewer or a carrier will find.
  3. Pin the denylist. Restricted-content screening runs on the rendered outbound string, at the boundary, after generation — SHAFT terms, cannabis and CBD, gambling, sweepstakes, high-risk financial language, plus any URL that is not on your allow-list. Prompt instructions are not controls. This is the same architecture we describe for other regulated sends in our note on compliance architecture for AI sales agents in regulated industries.
  4. Pin the samples. Draw the registered samples from the live skeleton set, not from a marketing document. Brand name in both, opt-out instruction in at least one, brackets on every variable, full HTTPS domain on every link, and each sample genuinely different from the other. When the skeleton set changes materially, the campaign should be edited, not quietly diverged from.

The test of whether you hold the contract is simple: take yesterday’s outbound log, strip the bracket values, and count the distinct skeletons. If that number is small, stable and matches what you registered, you are compliant with what the reviewer assumed. If it is large or growing, the registration describes a system you no longer run — and that gap is what gets found at audit rather than at submission.

This is the shape we design for at Zian. SmartReach AI™ orchestrates message, channel and timing by country, industry and profile, and PrecisionPitch AI™ continuously split-tests scripts and approaches against real success outcomes — both work from a script set an operator owns and can produce, which is the artefact a registration reviewer is asking to see.

Building an AI SMS agent that has to pass carrier registration? Zian AI is in a partnership-application beta for teams running live phone, SMS, email and WhatsApp outreach. Apply For Partnership.

The approval clock: brand vetting, campaign vetting, resubmission

Rejections come back one field at a time, and each correction restarts a queue. These are the published durations, each traced to the page that states it. Note the first two rows especially if you are registering from Australia.

Stage Published duration Source
Register your brand/company — US-based 1-2 business days AWS End User Messaging, US 10DLC registration
Register your brand/company — internationally based (includes Australian entities) Up to 3 weeks AWS End User Messaging, US 10DLC registration
Apply for vetting — US-based / international 1-2 business days / Up to 3 weeks AWS End User Messaging, US 10DLC registration
Register your campaign Up to 4 weeks AWS End User Messaging, US 10DLC registration
Request your 10DLC number Up to 10 days AWS End User Messaging, US 10DLC registration
Associate a phone number with an approved campaign Approximately 14 days AWS End User Messaging, US 10DLC registration
Toll-free number registration processing Up to 15 business days AWS End User Messaging, US toll-free registration process
Toll-free rejection: priority resubmission window 7 days from the initial request (the edit_expiration timestamp) Twilio toll-free API onboarding; Twilio error 30437
Overall campaign approval time No fixed figure published: “can vary from use-case to use-case, as well as from CSP to CSP” The Campaign Registry, Resources FAQ

Twilio’s own wording on the seven days is worth quoting exactly, because people read it as seven days from the rejection: “You must submit the TFV request before the timestamp provided in the edit_expiration property. Twilio sets this property value to seven days from the initial request.” Error 30437 adds that when a rejected verification is not corrected inside “the seven-day edit window”, the number stays Restricted and a later resubmission is handled like a new verification rather than a priority one. Check edit_allowed, edit_expiration and rejection_reasons on the record before you change anything.

The fix, in order, starting today

  1. Read the machine-readable rejection, not the email. For a campaign, pull failure_reason from Console or the API. For a toll-free verification, pull rejection_reasons, edit_allowed and edit_expiration. That takes ten minutes and it decides whether you are editing or starting again.
  2. Identify the deciding party. If the code is 30902 or 30880, a third-party vetting party rejected it and your provider’s support team is your only appeal route.
  3. Fix the brand layer before the campaign layer. Legal name, tax ID, physical address, branded support email and support phone must match public records. AWS publishes a rejection reason for exactly this — BRAND_EMAIL_PUBLIC_DOMAIN, “The brand’s email domain is from a public email provider” (AWS rejection troubleshooting). A campaign filed against an unfixed brand will fail again.
  4. Rebuild the opt-in artefact. A publicly reachable URL or a hosted screenshot showing an unchecked SMS-specific checkbox, brand name, message frequency, “Message and data rates may apply”, links to terms and privacy policy, and STOP/HELP instructions. On AWS’s own account, “Incomplete opt-in documentation is the most common cause of registration denial.” (AWS opt-in requirements checklist.)
  5. Apply the Bracket Contract. Freeze the skeleton set, move HELP/STOP to the messaging layer, put the denylist on the outbound payload, and pull two genuinely different samples out of the live set.
  6. Make the five artefacts agree. Campaign description, use case, samples, website and opt-in wording must describe one sender and one program. Rewrite the description last, from the samples, rather than the other way round.
  7. Resubmit inside the window, then watch for number-level registration, which is a separate step that can fail after the campaign passes.

Finish state: the campaign shows an approved status, every number in the Messaging Service is registered against it, and test sends to a US handset complete without Error 30032. Until all three are true, you are not live.

If you are registering from Australia

Two things change. First, the clock: AWS publishes 1-2 business days for US-based brand registration and vetting against up to 3 weeks for internationally based companies — the same two steps, an order of magnitude apart. Budget for it before you promise a client a launch date.

Second, the identifier. TCR requires a tax ID to verify a brand. Its Resources FAQ gives the EIN for US companies, the Business Number for Canada, and for the rest — a list that names Australia explicitly — instructs: “Please enter the numeric portion of your VAT ID number.” Australia has no VAT; the closest analogue is the ABN. We could not locate TCR guidance naming the ABN specifically, having checked its Resources FAQ and its public site navigation, so confirm the accepted identifier with your CSP before filing rather than guessing.

None of this touches your domestic obligations. Sending SMS to Australian numbers is governed by the Spam Act rather than by 10DLC, and the sender identification question there is a different one again — see our explainer on Australia’s SMS Sender ID Register and what it means for AI outreach, and on inferred consent under the Spam Act for AI agents. If you run both markets, you run two consent regimes and two records of it; our note on consent language and the records to keep covers the wording side.

What this costs you to run yourself

Everything above is buildable in-house, and a competent team should build it. The honest accounting: four pins is roughly a skeleton registry with versioning, a render-and-validate step in the send path, an outbound content filter, and a consent store that can produce a per-number record on demand. Then somebody owns the registrations — one brand and at least one campaign per client, each with its own numbers, each with a 7-day window when it fails, each re-filed when the skeleton set drifts. That last part is not engineering work; it is a recurring operations job that grows linearly with client count, and it is the part most teams under-resource. Work out how many client brands you expect to carry in twelve months, multiply by the queue times in the table above, and the answer will tell you whether this belongs in your roadmap or on someone else’s platform.

Frequently asked questions

Why was my 10DLC campaign rejected when my brand was already approved?

Brand and campaign are vetted separately, and an approved brand does not carry the campaign. Twilio’s error 30880 describes campaigns rejected where “the campaign details did not meet A2P 10DLC approval requirements for consistency, consent collection, or sample message quality, but the returned result did not identify which field failed review”. In practice it is nearly always disagreement between the description, the use case and the samples.

Can I resubmit a rejected campaign, or do I have to start again?

Usually. AWS’s rejection troubleshooting table carries a Resubmittable column, and on our count of that page on 8 September 2026 it held 134 rejection reasons: 100 marked “Yes”, 30 marked “No” and four “Depends on content”. The “No” set is almost entirely restricted content — SHAFT, gambling, cannabis, high-risk financial, illegal substances, affiliate marketing — plus spam or phishing association, high-risk domain reputation and a failed security review. For toll-free, Twilio’s seven-day edit_expiration window decides whether your resubmission goes into the priority queue or the standard one.

How do I register sample messages when my AI writes every message differently?

Register the skeletons. AWS’s review criteria ask you to “Provide at least two distinct sample messages that represent the actual messages your campaign sends” and to use brackets for variable content, listing “[name], [order number], [date]” as the notation. That is the contract: your agent fills brackets in an approved template rather than composing free text, and the samples you file are two real skeletons from that set.

Does an unverified US toll-free number still deliver some messages?

No. Twilio’s changelog of 31 January 2024 states that “messages sent from toll-free numbers pending verification will be blocked. Only fully verified toll-free phone numbers will be eligible to send messages” (Twilio). Blocked sends return Error 30032 and Twilio’s changelog notes messaging fees still apply.

How long does A2P 10DLC approval take from Australia?

Longer than from the US at the brand stage. AWS End User Messaging publishes 1-2 business days for US-based brand registration and vetting against “Up to 3 weeks” for internationally based companies, with campaign registration “Up to 4 weeks” for both. The Campaign Registry does not publish a single approval figure, saying only that time “can vary from use-case to use-case, as well as from CSP to CSP”.

Who actually rejected my campaign — my provider or the registry?

Neither, in most cases. The Campaign Registry states that it “does not review, approve, or reject campaigns. This is solely done by the CSPs and their upstream connection partners”, and Twilio attributes campaign rejections to a third-party vetting party in its error dictionary. Your provider is where the appeal is lodged, not where the decision was made.

Running SMS, voice and WhatsApp agents across US and Australian numbers? Zian AI is in a partnership-application beta. Apply For Partnership.

Related Blogs

Related from Zian AI