Quick answer: Most 10DLC rejections come down to four fixable things: the legal entity behind the brand doesn't match the tax record exactly, the sample messages don't match the registered use case, the message flow describes opt-in but never mentions opt-out, or a political-vertical campaign was submitted without a Campaign Verify token. Fix those before you submit and a campaign typically passes carrier review in the same 1–5 business day window a first submission takes. This field note walks the rejection reasons, the CSP-versus-carrier status split that confuses operators, the throughput math that decides how many numbers to assign, and the checklist to run before re-submission.
The full registration flow is the 10DLC registration guide. This post is the debugging companion: what to do when Step 3 comes back FAILED.
What actually gets 10DLC registrations rejected
The Campaign Registry (TCR) rejects at two levels — the brand and the campaign — and the reasons are different at each.
EIN mismatch (brand level). If your brand carries an EIN, the legal company name and EIN must match IRS records exactly. "Acme Corp" on the form and "Acme Corporation Inc." in the tax record is a rejection, not a rounding error. This is the single most common brand rejection, and it's fully knowable before submission: check the name and EIN against your IRS determination letter or SS-4 confirmation, character for character.
Sample messages that don't match the use case (campaign level). Register a CUSTOMER_CARE campaign and submit sample messages that read like promotions — "20% off this week only" — and the reviewer rejects it. The sample messages are treated as the contract for what you'll actually send. Write them from real traffic: the exact strings your application would put on the wire, including any URLs, in the same format you send them. Registering MIXED to cover everything is the usual workaround and it costs you: MIXED campaigns carry a reduced daily cap (see the tier table below).
Missing opt-out language in the message flow (campaign level). The message_flow field describes how recipients consent. A flow that only covers the opt-in half — "customers opt in at checkout" — without stating how they opt out is a rejection. Reference the STOP keyword explicitly in the flow and in your samples: "Reply STOP to unsubscribe." It has to appear in narrative you control, not just get handled at send time.
Political verticals without a Campaign Verify token (campaign level). Campaigns with a usecase of POLITICAL_ADVOCACY or POLLING_AND_VOTING, or flagged is_political, require a Campaign Verify cv_token. Submit without it and the campaign rejects. Order the token from Campaign Verify before you file the campaign, not after the first rejection.
Two more that are less a rejection than a long delay: a usecase value sent lowercase (TCR codes are uppercase — customer_care is rejected at submission), and a brand with almost no identifying information, which lands on a low vetting score and a slow manual review.
CSP approval is not carrier approval
The status endpoint returns two things that operators routinely conflate:
{
"status": "APPROVED",
"mnoStatuses": {
"10017": "APPROVED",
"10035": "APPROVED",
"10095": "REVIEW"
}
}The top-level status is the CSP-level decision — the Campaign Service Provider's verdict on the campaign as filed. mnoStatuses is the per-carrier approval map (the keys are MNO carrier ids — 10017 T-Mobile, 10035 AT&T, 10095 Verizon). A campaign can be APPROVED at the CSP level while one carrier is still in REVIEW, and deliverability on that carrier's network is not the same as on the approved ones in the meantime.
The operational consequence: don't treat the top-level APPROVED as the all-clear to route full volume. Read mnoStatuses, and treat traffic to a carrier still in REVIEW as unproven until it flips. Symmetrically, a campaign that shows REVIEW or FAILED at one carrier while the CSP level reads APPROVED is a carrier-specific problem, not a do-over of the whole filing.
How status actually moves on Orbit (so you're not polling blind)
TCR vetting is a multi-day asynchronous process. On Orbit, two mechanisms keep your dashboard and the API's status truthful while it runs out at the registry:
- Signed lifecycle webhooks. When the registry emits a brand or campaign status event, the platform flips your stored status immediately. This is the primary path.
- A status reconciler every 30 minutes. Webhooks are best-effort — a dropped event would otherwise leave a registration sitting at
PENDINGuntil someone clicked Refresh. The reconciler re-reads every org's pending brands and campaigns against the provider on a half-hourly cadence, persists any change, and pushes a dashboard Notification Center entry on every terminal transition (approved, rejected, verified, expired, failed) with the rejection reason attached. Once everything is terminal, it settles into a daily re-poll so a later carrier-side suspension or expiry still gets caught.
What that means for you as a tenant: when a campaign is rejected, the rejection reason shows up in three places without you doing anything — the campaign status response, the dashboard's compliance section, and a notification. The reason string comes straight from the registry ("EIN does not match", "sample content does not match declared use case"), so read it literally. It is the reviewer's actual finding, not a generic error class.
Throughput tier math: per number, per day
10DLC throughput is granted as a per-day, per-number message-segment cap — not a per-second rate — and the tier comes from your brand's vetting score and entity type:
| Tier | Eligibility | Daily cap per number |
|---|---|---|
| Sole Proprietor | Entity type SOLE_PROPRIETOR | ~1,000 msg/day |
| Low Volume Standard | Baseline (any brand, including unscored) | ~30,000 msg/day |
| Standard | Vetting score 50+ | ~200,000 msg/day |
| Top Tier | Vetting score 75+ | ~2,000,000 msg/day |
Each tier's cap applies to every number assigned to the campaign, so total campaign throughput scales with the assigned-number count: a Standard-tier campaign with five assigned numbers carries roughly a million segments a day in aggregate. That's the design lever — tier sets the per-number cap, assignment count multiplies it. (Caps reflect T-Mobile defaults; AT&T and Verizon land within roughly 10%.)
Two consequences worth planning around:
- An unscored brand defaults to Low Volume Standard. If you're planning volume, the cheapest throughput upgrade is a complete brand record — EIN, website, stock symbol if public — because a score of 75+ unlocks the Top Tier per-number cap.
- `MIXED` campaigns carry a reduced daily cap. Spreading two unrelated use cases across one
MIXEDcampaign to avoid a second filing pays for itself only below a certain volume; past that, split the use cases into their own campaigns and take the full tier cap on each.
The pre-submission checklist
Run this before a first submission, and again before any re-submission after a rejection:
- Legal name + EIN match the IRS record exactly. Pull the name from the IRS document, not from memory or marketing materials. If your entity has no EIN, say so rather than guessing one.
- Samples are copied from real traffic. 1–10 messages, exactly as sent, matching the registered
usecase— including URLs in live format, notexample.complaceholders. - Opt-out is explicit. The
message_flownarrates both consent and revocation, and at least one sample includes working opt-out language ("Reply STOP to unsubscribe").help_messageandoptout_messageare filled in, not skipped. - Field minimums are met.
descriptionandmessage_flowat least 40 characters;help_messageandoptout_messageat least 20;usecasein uppercase TCR codes. - Political verticals carry the token.
POLITICAL_ADVOCACY,POLLING_AND_VOTING, oris_political: true→ Campaign Verifycv_tokenobtained first. - Assign enough numbers for the tier. Compute your daily volume against the per-number cap for the tier you expect, and assign that many numbers to the campaign at submission — adding numbers later is fine, but a campaign approved with one number on a Low Volume tier is a ceiling you set for yourself.
- After re-submission, read the per-carrier map. When the status flips, check
mnoStatuses— not just the top-level verdict — before routing full volume.
Frequently asked questions
Why was my 10DLC brand rejected when the company name is correct?
The most common cause is an EIN that doesn't match IRS records exactly — the legal name and EIN are checked as a pair. "Acme Corp" versus "Acme Corporation Inc." is enough to fail. Copy both the name and the EIN from the IRS determination letter and resubmit.
My campaign is APPROVED but messages to Verizon still get filtered — why?
Check the mnoStatuses map on the campaign status. APPROVED is the CSP-level decision; each carrier approves separately, and a carrier still in REVIEW (or FAILED) doesn't carry deliverability until it flips. The top-level status doesn't override a per-carrier holdout.
How long does TCR campaign vetting take?
Brand vetting typically completes within 24–48 hours; campaign review takes 1–5 business days. On Orbit you don't need to poll: lifecycle webhooks flip the status the moment the registry emits an event, and a half-hourly reconciler catches any event that was dropped, with a dashboard notification on every terminal transition.
How do I get more 10DLC throughput — a higher tier or more numbers?
Both, and they multiply. The tier (set by your brand vetting score and entity type) fixes the per-day cap per number; assigning more numbers to the campaign scales the total. A complete, accurate brand record is the cheapest lever — a score of 75+ moves you from ~30,000 to ~2,000,000 segments per day per number.
What does a political campaign need that a commercial one doesn't?
A Campaign Verify token. Campaigns registered as POLITICAL_ADVOCACY or POLLING_AND_VOTING, or flagged is_political, are rejected without a cv_token from Campaign Verify. Obtain the token before filing the campaign.
Do I have to re-file everything after one campaign rejection?
No. A rejection is scoped to the brand or the campaign that failed. Read the rejection reason in the campaign status response (or the dashboard notification), fix that specific item, and re-submit the rejected campaign — your brand's vetting score and any already-approved campaigns are unaffected.
The takeaway
TCR vetting is strict but not opaque: the four rejection causes above account for the overwhelming majority of failures, and all four are checkable before you submit. Read the per-carrier map rather than the top-level status, size the number assignment to the tier you're actually in, and treat the rejection reason string as the reviewer's literal finding. The step-by-step flow with request shapes is in the 10DLC registration guide; the checklist above is the pre-flight for it.