Skip to main content
The Compliance hub is where you submit and track the regulatory paperwork that carriers and Twilio require before your SMS channels can actually send messages at scale. There are three main Compliance options:

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.
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.
Local state: approved · Twilio state: TWILIO_APPROVED You can send.What you can do: Nothing — you’re done.
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.
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:
  1. Brand — who you are (legal entity / sole proprietor). Registered once per account.
  2. Campaign — what you’re texting about (use case, sample messages, opt-in flow). One or more per brand.
Both are submitted to Twilio, which forwards them to The Campaign Registry (TCR) for carrier review.

Brand

Use this if you have a legal entity with an EIN (US) or BN (Canada). This is the right choice for almost every business.
FieldWhat it should beCap
Legal nameExact legal entity name on your EIN paperwork. Capitalisation matters.255
DBA (optional)Trading name if different from legal name.255
EIN9 digits, formatted XX-XXXXXXX (hyphen optional).10
Vertical categoryClosest dropdown match. Common: RETAIL, HEALTHCARE, HOSPITALITY, PROFESSIONAL. Wrong category is a top-3 rejection reason.enum
Entity typePRIVATE_PROFIT, PUBLIC_PROFIT, NON_PROFIT, GOVERNMENT.enum
AddressPhysical street address. No PO boxes. US or CA only.
WebsiteMust use https://. Cannot contain example.com or localhost.
Authorized contact nameA human who can answer questions about the brand.255
Authorized contact emailReal, monitored email — Twilio reviewers do email.
Authorized contact phoneUS/CA E.164 (+1XXXXXXXXXX).

Submit → review → land

When you click Submit, VIVI posts the brand to Twilio:
1

Not registered

NOT_REGISTERED — nothing submitted yet.
2

Submitting

SUBMITTING — VIVI’s request is in flight to Twilio.
3

In review

IN_REVIEW — Twilio has acknowledged and the carrier is reviewing.
4

Approved or failed

APPROVED on carrier sign-off, or FAILED on rejection — with the reason surfaced in the row.

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).
1

Campaign basics

FieldWhat it should beCap
NameInternal-facing label. Cannot contain / or \.128
Use caseClosest match: CUSTOMER_CARE, ACCOUNT_NOTIFICATION, DELIVERY_NOTIFICATION, TWO_FACTOR_AUTHENTICATION, MARKETING.enum
DescriptionWhat this campaign is for, in plain English. Min 40 chars.4096
2

Opt-in & compliance

FieldWhat it should be
Message flowDescribe 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 descriptionWhat 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 URLhttps://..., no example.com / localhost.
Terms & conditions URLSame rules.
3

Sample messages

You need 2 to 5 sample messages that look exactly like the production messages your agent will send. Each is between 20 and 1024 chars.
Common rejection triggers VIVI flags before you submit:
  • [Name]-style template tokens — carriers reject samples that look like raw templates. Render placeholders before pasting (e.g. write “Hi Jane” instead of “Hi [Name]”).
  • https://... URLs when “Embedded links” is off — toggle it on, or remove the URL.
Click Submit campaign — same status flow as the brand.

Editing a failed brand or campaign

A FAILED 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.
IN_REVIEW brands and campaigns cannot be edited as Twilio’s reviewers are actively reading them. VIVI blocks the save with a clear “fields locked, review in progress” message.

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.
1

Business and contact information

FieldCap
Legal entity name255
Website URL500 — must use http(s)
First name / Last name100 each
Email
Phone country + phone numberE.164
Business typePRIVATE_PROFIT, PUBLIC_PROFIT, SOLE_PROPRIETOR, NON_PROFIT, GOVERNMENT
Doing business as (optional)255
Business registration number (required when type ≠ SOLE_PROPRIETOR)50
Registration authorityEIN / DUNS / CCN
Registration country2-letter ISO
2

Business location

Physical address. Cap: street 255, city 100, state 100, ZIP 20. US + CA only.
3

Messaging use case

This is where rejections happen most often. Take it seriously.
FieldWhat good looks likeCap
Estimated monthly volumeRealistic projection. Underestimating is fine; overestimating gets scrutiny.dropdown
Opt-in typeHow recipients consent: VERBAL, WEB_FORM, PAPER_FORM, VIA_TEXT, MOBILE_QR_CODE.enum
Use case categoriesClosest 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 summaryThe 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 sampleA 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’s verificationStatus 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:
TwilioVIVI localEditable?
DRAFT, PENDING_REVIEWpendingYes — edits patch the existing verification
IN_REVIEWpendingNo — locked. Save returns 409 with errorKey=tollFreeReviewInProgress
TWILIO_APPROVEDapprovedNo — locked. Save returns 409 with errorKey=tollFreeAlreadyApproved
TWILIO_REJECTEDfailedYes — 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 the 30xxx 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.

SMS Channel Creation

The channel-level flow that triggers compliance.

Twilio Errors & Use Cases

Canonical rejection reasons + remediation.