A2P 10DLC Brand
Your business identity, registered once per account.
A2P 10DLC Campaign
The per-use-case registration on top of a brand.
Toll-Free Verification
The per-number verification for toll-free SMS.
Local 10DLC numbers need brand + campaign; toll-free numbers need TFV. You don’t need both for the same channel.
Status Badges
Every brand, campaign, and TFV row carries a status badge. The vocabulary is unified across A2P and TFV.Under review (amber)
Under review (amber)
Local state:
pending · Twilio state: IN_REVIEW, PENDING_REVIEW, SUBMITTING Twilio (and/or the carrier) is reading your submission.What you can do: Wait. ~2–3 business days for A2P, 1–5 for TFV.Approved (emerald)
Approved (emerald)
Local state:
approved · Twilio state: TWILIO_APPROVED You can send.What you can do: Nothing — you’re done.Action required (red)
Action required (red)
Local state:
failed · Twilio state: TWILIO_REJECTED / FAILED / SUBMIT_FAILED Carrier or Twilio rejected the submission. Read the reason, fix, resubmit.What you can do: Click Manage → fix the flagged fields → save. VIVI patches the existing verification instead of starting a new one, which preserves Twilio’s audit history.Not registered (grey)
Not registered (grey)
Local state:
null / first-time · Twilio state: — You haven’t submitted yet.What you can do: Click Manage → fill the form → submit.A2P 10DLC
A2P 10DLC stands for “application-to-person messaging on 10-digit long codes”, the framework US carriers built to police business texting on local numbers. Two registrations are required:- Brand — who you are (legal entity / sole proprietor). Registered once per account.
- Campaign — what you’re texting about (use case, sample messages, opt-in flow). One or more per brand.
Brand
- Standard (Registered Business)
- Sole Proprietor
Use this if you have a legal entity with an EIN (US) or BN (Canada). This is the right choice for almost every business.
| Field | What it should be | Cap |
|---|---|---|
| Legal name | Exact legal entity name on your EIN paperwork. Capitalisation matters. | 255 |
| DBA (optional) | Trading name if different from legal name. | 255 |
| EIN | 9 digits, formatted XX-XXXXXXX (hyphen optional). | 10 |
| Vertical category | Closest dropdown match. Common: RETAIL, HEALTHCARE, HOSPITALITY, PROFESSIONAL. Wrong category is a top-3 rejection reason. | enum |
| Entity type | PRIVATE_PROFIT, PUBLIC_PROFIT, NON_PROFIT, GOVERNMENT. | enum |
| Address | Physical street address. No PO boxes. US or CA only. | — |
| Website | Must use https://. Cannot contain example.com or localhost. | — |
| Authorized contact name | A human who can answer questions about the brand. | 255 |
| Authorized contact email | Real, monitored email — Twilio reviewers do email. | — |
| Authorized contact phone | US/CA E.164 (+1XXXXXXXXXX). | — |
Submit → review → land
When you click Submit, VIVI posts the brand to Twilio:Campaign
A campaign is the per-use-case bundle that sits on top of an approved brand. You can have multiple campaigns per brand (e.g. one for transactional, one for marketing).Campaign basics
| Field | What it should be | Cap |
|---|---|---|
| Name | Internal-facing label. Cannot contain / or \. | 128 |
| Use case | Closest match: CUSTOMER_CARE, ACCOUNT_NOTIFICATION, DELIVERY_NOTIFICATION, TWO_FACTOR_AUTHENTICATION, MARKETING. | enum |
| Description | What this campaign is for, in plain English. Min 40 chars. | 4096 |
Opt-in & compliance
| Field | What it should be |
|---|---|
| Message flow | Describe how recipients consent — must mention the consent source (web form, in-person, text-to-join), the brand, and the opt-out option. Min 40, max 2048 chars. |
| Opt-in description | What users see/hear at the moment they consent. VIVI provides a default opt-in description button that fills in CTIA-compliant text using {brand}; tweak as needed. Min 40, max 2048. |
| Embedded links (toggle) | On only if your messages will contain URLs. |
| Embedded phone numbers (toggle) | On only if your messages will contain phone numbers other than your sender ID. |
| Age-gated (toggle) | On for alcohol, cannabis, firearms, gambling content — triggers carrier scrutiny. |
| Privacy policy URL | https://..., no example.com / localhost. |
| Terms & conditions URL | Same rules. |
Editing a failed brand or campaign
AFAILED or SUBMIT_FAILED brand/campaign is editable in place — click Manage, fix the flagged fields, click Resubmit. VIVI patches the existing record via Twilio’s resubmit endpoint, preserving the audit trail (Twilio reviewers see exactly what changed). You don’t lose your slot in the review queue.
Toll-Free Verification (TFV)
Toll-free numbers don’t use the A2P framework — they use Twilio’s per-number verification, the Toll-Free Verification (TFV). One TFV per toll-free channel.Immediately after creating a toll-free SMS channel, the channel detail page shows an Action required banner with a Start verification button. The Compliance hub also lists the channel under Toll-Free Verifications with an Action required badge.
Business and contact information
| Field | Cap |
|---|---|
| Legal entity name | 255 |
| Website URL | 500 — must use http(s) |
| First name / Last name | 100 each |
| — | |
| Phone country + phone number | E.164 |
| Business type | PRIVATE_PROFIT, PUBLIC_PROFIT, SOLE_PROPRIETOR, NON_PROFIT, GOVERNMENT |
| Doing business as (optional) | 255 |
| Business registration number (required when type ≠ SOLE_PROPRIETOR) | 50 |
| Registration authority | EIN / DUNS / CCN |
| Registration country | 2-letter ISO |
Messaging use case
| Field | What good looks like | Cap |
|---|---|---|
| Estimated monthly volume | Realistic projection. Underestimating is fine; overestimating gets scrutiny. | dropdown |
| Opt-in type | How recipients consent: VERBAL, WEB_FORM, PAPER_FORM, VIA_TEXT, MOBILE_QR_CODE. | enum |
| Use case categories | Closest matches (multi-select): ACCOUNT_NOTIFICATIONS, CUSTOMER_CARE, DELIVERY_NOTIFICATIONS, 2FA, MARKETING, etc. | enum list |
| Proof of consent URL(s) | Comma-separated https:// URLs pointing at screenshots/recordings of the opt-in source — a sign-up form, a receipt with a consent checkbox, etc. | — |
| Use case summary | The single most common rejection point. Twilio caps this at 500 characters. Describe who’s getting messages, why, what consent looks like, and that no marketing is involved. | 500 (hard cap, enforced in the UI) |
| Production message sample | A representative real message your agent would send. | 1000 |
Optional details
Privacy policy URL, terms & conditions URL, and additional information are all optional but all helpful to Twilio’s reviewers — include them if you have them.What happens after you submit
Click Submit verification. VIVI posts (or patches — see below) to Twilio. The compliance row’sverificationStatus transitions to pending, and the TFV banner on the channel detail page flips to Verification in progress.
Twilio’s actual states map onto VIVI’s:
| Twilio | VIVI local | Editable? |
|---|---|---|
DRAFT, PENDING_REVIEW | pending | Yes — edits patch the existing verification |
IN_REVIEW | pending | No — locked. Save returns 409 with errorKey=tollFreeReviewInProgress |
TWILIO_APPROVED | approved | No — locked. Save returns 409 with errorKey=tollFreeAlreadyApproved |
TWILIO_REJECTED | failed | Yes — edits trigger a patch-resubmit; this preserves Twilio’s audit |
What happens on rejection
The channel detail page shows a Twilio rejection banner with the reason text and a “How to fix it” link to the relevant Twilio docs page (auto-resolved from the30xxx error code in the reason). The form re-opens for editing; saving again triggers a resubmit so you don’t burn through Twilio’s rate limit on new TFV submissions.
See Twilio errors and use cases for the canonical rejection reasons and how to fix each one.
Resubmission After Rejection
The biggest gotcha across both A2P and TFV is that resubmits are PATCHes, not new submissions. VIVI handles this automatically:Status Check First
VIVI fetches Twilio’s current status before saving.
Editable → PATCH
If the existing verification is editable (DRAFT / PENDING_REVIEW / TWILIO_REJECTED), VIVI sends a PATCH with your changes.
Locked → Blocked
If it’s not editable (IN_REVIEW / APPROVED), VIVI blocks the save with a clear message.
Race Recovery
If a race occurs and Twilio responds “already exists” anyway, VIVI recovers by refreshing local state from Twilio’s truth instead of writing a spurious “failed” status.
This is invisible to you — but it’s why you should never see the same TFV submission counted twice on Twilio’s side, and why the audit trail to Twilio’s reviewers stays clean across multiple iterations.
Related
SMS Channel Creation
The channel-level flow that triggers compliance.
Twilio Errors & Use Cases
Canonical rejection reasons + remediation.

