You wired up the send endpoint and the code looks done. Then traffic to US numbers starts failing. Often the code is fine. The missing piece is registration.

Disclosure: I work at a CRM company that connects to Twilio for texting.

This post is the developer's version: what fails, what to register, what data to gather first, and what it costs in money and calendar days. Every number below links to the page it came from.

Why unregistered traffic fails

A2P 10DLC means application-to-person messaging over a normal 10-digit US long code. The carriers want every business sending that kind of traffic registered first.

At Twilio, a message to a US number from a +1 10DLC number that is not tied to an approved campaign is blocked with error 30034. The same page lists the ways to send before you are registered: toll-free, short code, or Verify.

This is not a Twilio quirk. Telnyx's AT&T FAQ says that "From February 3rd 2025, any 10DLC traffic which is not registered will be blocked altogether."

So treat registration as a deploy dependency, not a compliance task for later.

The flow: brand, then campaign, then number

There are three objects, and each one depends on the one before it.

  1. Brand. The legal business doing the sending. Your provider submits it to The Campaign Registry (TCR).
  2. Campaign. What you send, to whom, and how they opted in.
  3. Number. Your 10DLC numbers get attached to an approved campaign. Only then does traffic flow.

If you build for clients, note the limit: Twilio caps it at five Standard or Low Volume Standard brands for each tax ID.

Collect this before you open the console

Most delays come from data that does not match an official record. Gather it all first. Twilio's brand field list looks roughly like this:

{ "legal_business_name": "Exactly as printed on the IRS CP 575 EIN letter", "business_type": "e.g. LLC, corporation, non-profit", "industry": "...", "registration_id_type": "EIN", "registration_number": "12-3456789", "address": "Same address the IRS has on file for that EIN", "website": "Live site on your own domain", "social_media_urls": ["..."], "regions_of_operation": ["..."], "authorized_rep": { "first_name": "...", "last_name": "...", "title": "...", "job_position": "...", "phone": "...", "email": "name@yourdomain.com" }, "stock_exchange_and_ticker": "only if public", "brand_contact_email": "name@yourdomain.com" } 

A few rules hide inside those fields:

  • Legal name comes from the CP 575 letter, never from a W-2 or W-9. Lost the letter? You can request a 147C letter instead (Twilio).
  • The address should match the EIN record. Twilio names an address that differs from the EIN record as one cause of a low trust score (Twilio).
  • Use a domain email. Twilio's campaign guide rules out gmail and yahoo addresses and wants a working website with no third-party redirects (Twilio).
  • A sole proprietorship that has an EIN registers as Standard or Low Volume Standard, not as Sole Proprietor (Twilio).

What it costs

TCR sets most fees and providers pass them through. Here are the main lines from TCR's fee schedule:

  • Brand registration: $4.50 ($4.00 for sole proprietors)
  • Standard vet, which produces a 0-100 trust score: $41.50
  • Monthly campaign fee: $1.50 for low volume mixed, $10 for standard use cases such as 2FA, account notifications, customer care and marketing

On top of that, Twilio and Telnyx each charge a $15 campaign vetting fee. Twilio's is non-refundable (Twilio). Telnyx charges it per review (Telnyx). TCR's schedule does not list this fee.

Bandwidth prices differ. For example, its brand registration is $9, and a standard campaign is $20 a month (Bandwidth).

Pick the brand tier by volume. Twilio's Low Volume Standard brand fits under 6,000 messages a day, and Standard fits above that (Twilio). For the full fee table across providers, there is a longer walk-through of 10DLC costs and rejections.

How long it takes

Put these waits on the project plan, not in the last sprint. From Twilio's onboarding doc:

  • Customer Profile approval "may take 72 hours or more". You can keep going while it is pending.
  • TCR brand review usually takes a few minutes. If it goes to manual third-party review, expect seven business days or more.
  • Campaign review: a standard use case can sit for as long as 5 business days. Past 10 days, open a support ticket.

Telnyx and Bandwidth did not publish review times on the pages I checked, so I would not assume they are faster.

Trust score, throughput and daily caps

The vetting score sets your speed limits. Twilio's throughput table gives 75 messages per second per carrier for scores of 75-100, 40 for 50-74, and 4 for 1-49. Twilio also says scores are static, and an appeal needs the IRS EIN letter.

T-Mobile adds a daily cap by score (Twilio):

Trust score T-Mobile daily cap
1-24 2,000
25-49 10,000
50-74 40,000
75-100 200,000

Three details matter for your queue design:

  • The cap applies per EIN, shared across platforms and providers. A second provider does not buy you more room.
  • It resets at midnight Pacific, not midnight in your server's time zone.
  • Texts over the cap fail with error 30023.

If you send a nightly batch, spread it so it does not hit the cap before the reset.

Why campaigns get rejected

Twilio's campaign guide calls message flow "where most rejections happen". The reviewer needs to see how a person opts in. A web form should have:

  • An opt-in checkbox that is not pre-selected
  • Message frequency
  • "Msg & data rates may apply"
  • HELP and STOP instructions
  • Links to your terms and privacy policy

If the form sits behind a login, upload a public screenshot. The privacy policy should also carry this statement: "We do not sell or share your SMS opt-in data or personal information with third parties for marketing purposes." (Twilio)

A bare-bones opt-in block with every required element looks like this:

<label> <input type="checkbox" name="sms_opt_in" value="yes"> Text me appointment reminders from [Brand Name]. Up to [N] msgs/month. Msg &amp; data rates may apply. Reply HELP for help, STOP to cancel. <a href="/terms">Terms</a> | <a href="/privacy">Privacy Policy</a> </label> 

No checked attribute. That one matters.

Other common rejections:

  • Public link shorteners. Links on bit.ly or TinyURL trigger error 30892. If you need short links, put them on your own domain.
  • A website that is only a form. That is error 30920. The site needs to show a real business.
  • A description that does not match. It must say who sends, who receives and why, and it must match the brand and the samples (Twilio).

Content, spam or disallowed-use rejections cannot be resubmitted at Twilio. You appeal through support (Twilio).

Edit, don't recreate

When a campaign comes back rejected, the reflex is to delete it and start over. Don't. Twilio's error 30922 page says to edit the rejected campaign instead, and that "A vetting fee is assessed only once per campaign." A new campaign means a new $15 fee.

Telnyx works differently. Its $15 is charged per review, and a campaign "may be submitted multiple times" (Telnyx). So on Telnyx each resubmission costs money. Fix everything before you resubmit.

Sample messages that pass

Twilio wants 2 to 5 samples with the brand name, bracketed variables, and "Reply STOP to unsubscribe" in at least one (Twilio). Two that fit:

[Brand Name]: Hi [First Name], your appointment is on [Date] at [Time]. Reply C to confirm. Reply STOP to unsubscribe. 
[Brand Name]: Your order [Order Number] has shipped. Track it at [yourdomain.com/track]. Reply HELP for help, STOP to opt out. 

Note the tracking link sits on your own domain, not a public shortener.

Pre-flight checklist

Before your app sends its first US text:

  • [ ] Legal name copied from the CP 575 letter
  • [ ] Address matches the IRS record for the EIN
  • [ ] Live website on your own domain, more than a lone form
  • [ ] Contact email on that domain, not gmail or yahoo
  • [ ] Brand tier picked by daily volume
  • [ ] Opt-in form: unchecked box, frequency, "Msg & data rates may apply", HELP, STOP, terms and privacy links
  • [ ] Privacy policy includes the no-sharing statement for SMS opt-in data
  • [ ] 2-5 samples with brand name, bracketed variables and STOP language
  • [ ] No public shorteners in samples or live templates
  • [ ] Queue respects per-EIN T-Mobile caps that reset at midnight Pacific
  • [ ] Error handling for 30034 and 30023
  • [ ] Calendar time blocked for up to 5 business days of campaign review

I'd register the brand first, the day the project starts. It costs little and has the most unpredictable wait.

If you would rather text from a CRM than build it, Conduyt sends on your own Twilio or Project Blue line.

Jordan Tate is VP of Customer Relations at Conduyt, a flat-price CRM for small sales teams. This post was drafted with AI assistance.