Approval Patterns
Common Rejection Reasons
Error Code Reference
30xxx codes you’ll see in failureReason.Approval Patterns
Consent
Gathering user opt-in consent is the most critical portion of the approval flow. There are a few ways to gather user consent that are approved by Twilio:- Web Form
- In-Person / Verbal
Opt-In Strategies
- Double Opt-In (Safest Default)
- Single Opt-In
YES (or START) before they’re marked OPTED_IN. This is the default VIVI behavior.Why?
How to Format
Fallback
STOP and HELP
Every CTIA-compliant SMS program must respond to:STOP
UNSUBSCRIBE, END, CANCEL, QUIT — immediate opt-out.HELP
INFO — return identifying information about the program and how to contact support.Re-Engagement After STOP
Best Practices Summary
A summary that passes review hits four points:Who is sending?
Who is receiving?
What kind of message?
How consent was collected?
Passing Example
Passing Example
Rejected Examples
Rejected Examples
Sample Messages
The sample messages field on A2P campaigns and the production message sample field on TFV both require a realistic example of what your agent will send in production, not a template or placeholder.Common Rejection Reasons
These are the exact strings you’ll see infailureReason (or, for live channels, in the rejection banner on the form), grouped by what VIVI receives back from Twilio.
"Invalid use case summary"
"Invalid use case summary"
- Length over 500 characters. Twilio’s hard length cap. The VIVI form now blocks typing past 500 with a live counter; if you’re seeing this error from a pre-existing submission, the row has stale data over cap. Open the form, shorten it, and save.
- Summary doesn’t match
useCaseCategories. Categories sayTWO_FACTOR_AUTHENTICATIONbut the summary describes appointment reminders, or vice versa. - URLs, emails, or phone numbers in the summary. Put URLs in
business_website/privacy_policy_url. Don’t put a contact phone in the summary. - Marketing language on a non-MARKETING category. Words like “promotions”, “offers”, “deals”, “sale” combined with
ACCOUNT_NOTIFICATIONSor2FAtriggers it. - Placeholder text — “test”, “TBD”, “N/A”, a category name copied verbatim.
- Prohibited content keywords — cannabis, CBD, firearms, gambling, payday/debt collection in the content.
"Verification already exists for this phone number"
"Verification already exists for this phone number"
- If the existing verification is
PENDING_REVIEW/DRAFT/TWILIO_REJECTED→ VIVI patches it with the new values (preserves audit trail). - If it’s
IN_REVIEW/TWILIO_APPROVED→ VIVI blocks the save with a clear 409 and a “fields locked” toast. - If a race produces this error despite the pre-flight, VIVI recovers by refreshing from Twilio’s truth instead of writing a spurious local “failed” state.
"Address is invalid" / "Could not verify business address"
"Address is invalid" / "Could not verify business address"
- PO box (not allowed for brand or TFV business address).
- Typo in street name.
- Mismatched ZIP / state (e.g.
94105paired withCAis fine, but94105paired withTXis rejected). - Building / suite number stuck on the street line without a separator.
"EIN not found" / "Business registration not verifiable"
"EIN not found" / "Business registration not verifiable"
- Verify the EIN at the IRS’s EIN online verification.
- The legal name field must match the EIN paperwork exactly — including LLC/Inc/Corp suffixes and capitalisation. If your IRS letter says “Acme Restoration LLC”,
Acme Restoration(no LLC) will fail.
Sample message contains URLs but embedded links is off
Sample message contains URLs but embedded links is off
http:// or https://. Carriers reject samples that contain URLs when embedded links isn’t declared.Fix: either toggle Embedded links on (and accept the tougher review), or remove the URL from the sample.Sample message contains template placeholders
Sample message contains template placeholders
[Hi [Name], your appointment is at [Time]. Carriers reject samples with [bracketed] placeholders.Fix: render the placeholders before pasting. Submit a realistic example with real names and times."Carrier rejected campaign" / generic carrier rejection on A2P
"Carrier rejected campaign" / generic carrier rejection on A2P
FAILED and the failureReason field shows a carrier-supplied reason (often vague — “did not meet messaging guidelines”).Common root causes:- Use case category mismatch — you picked
CUSTOMER_CAREbut the sample messages look like marketing. - Insufficient opt-in evidence — the opt-in description doesn’t name the consent source.
- Embedded links to an unverified domain — your privacy policy URL points at a domain different from your business website with no clear connection.
Error Code Reference
Twilio surfaces numeric error codes for SMS-platform errors. The most common ones you’ll see in VIVI’s logs or rejection banners:Reading a Twilio Rejection in Detail
When a TFV is rejected, thefailureReason field on toll_free_channel_compliance will look something like:
Numeric code
30445 maps to the Twilio docs URL: https://www.twilio.com/docs/api/errors/30445.Rejection reason category
Use Case Information / Message Volume tells you which form section to focus on.Specific note
When to Escalate
Most rejections are self-serve — fix the form, resubmit, wait. Escalate to Twilio support directly when:Stalled review
IN_REVIEW for more than 5 business days with no movement.Permanent carrier failure on an approved number
Suspected throughput throttling
Related
SMS Channel Creation
Compliance Hub Overview
- Twilio’s canonical error code reference: twilio.com/docs/api/errors
- Twilio’s TFV documentation: twilio.com/docs/messaging/compliance/toll-free-verification
- Twilio’s A2P 10DLC documentation: twilio.com/docs/messaging/compliance/a2p-10dlc

