Error 30915 Is No Longer Just a 10DLC Problem: It Now Affects Toll-Free and Your WhatsApp Bot
If you're running a WhatsApp bot on Twilio—whether through the WhatsApp Business API or using U.S. numbers for A2P notifications—and your messages suddenly stop going out with a 30915 error code, welcome to the club of people who didn't read the registration form carefully enough. This tutorial explains what changed, why it matters, and how to register your entity correctly so you don't block your production traffic.

As of mid-2026, Twilio unified the behavior of error 30915 to apply consistently across both A2P 10DLC campaigns and Toll-Free Verification. Previously, the error was more lenient or appeared at different points depending on the channel. Now, if you submit a Sole Proprietor registration but the available information—legal name, EIN, public records—indicates you're actually an LLC, a Corp, or any legally constituted entity, the system rejects it immediately with 30915: Invalid Sole Proprietor Classification. And that blocks your sends. This is not a warning. It's a hard block.
Why This Matters for Your WhatsApp Bot
Because in the Mexican and Latin American ecosystem that operates with U.S. numbers to reach users in that market—or that uses Twilio as a gateway for WhatsApp Business—A2P registration is mandatory. Not optional. If your bot sends marketing messages, transactional notifications, or reminders from an unregistered 10DLC number without a properly registered campaign, Twilio filters them. And since 2026, the filter is more aggressive.
The same applies if you use a Toll-Free number (800, 888, etc.) for your bot: Toll-Free verification also requires correct entity classification.
Requirements Before You Start
- Twilio account with console access (administrator or owner role)
- A U.S. phone number already purchased (local 10DLC or Toll-Free)
- Legal documents for your company: RFC if you're Mexican with U.S. presence, EIN if you have a U.S. entity, or equivalent
- Knowing exactly what type of entity you are: Sole Proprietor (individual with no registered company) vs. Standard/Legal Entity (LLC, Corp, S.A., etc.)
- Node.js 20+ or Python 3.11+ if you plan to automate registration via API
Step 1: Correctly Identify Your Entity Type
This is the step people skip and then cry about later. Before touching the Twilio console:
Sole Proprietor applies if:
- You are an individual operating without a registered entity
- You do not have a U.S. EIN (Employer Identification Number)
- You have no LLC, Corp, or any equivalent registered with any state
Standard Business applies if:
- You have an LLC, Inc., Corp, S.A. de C.V., or any legally registered entity
- You have an EIN
- Your business name is legally registered in any jurisdiction
If you're unsure, the rule is simple: if you have an EIN or equivalent, you are NOT a Sole Proprietor. Registering as one with that information available is exactly what triggers 30915.
Step 2: Register Your Brand in Twilio's Trust Hub
Go to Twilio Console → Trust Hub → Customer Profiles.
- Create a new Customer Profile
- In the Business Type field, select what applies:
Sole Proprietoronly if you meet the criteria from Step 1Private Profitfor LLC, Corp, etc.
- Fill in the EIN or equivalent tax ID
- Legal name exactly as it appears in public records
- Registered address
- Upload supporting documents if requested (on new or high-volume accounts)
Production warning: Twilio cross-references your information against public business registration databases. If your legal name in state records says "Acme Media LLC" but you submitted as "Sole Proprietor," the system detects it and throws
30915. This is automated, not manual.
Step 3: Create Your A2P Brand (for 10DLC)
From the console or via API:
curl -X POST https://messaging.twilio.com/v1/a2p/BrandRegistrations \
-u "$TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN" \
-d "CustomerProfileSid=$CUSTOMER_PROFILE_SID" \
-d "A2PProfileBundleSid=$A2P_BUNDLE_SID"
Or in Node.js:
const twilio = require('twilio');
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
async function registerBrand(customerProfileSid, a2pBundleSid) {
try {
const brand = await client.messaging.v1.brandRegistrations.create({
customerProfileSid,
a2PProfileBundleSid: a2pBundleSid,
});
console.log('Brand SID:', brand.sid);
console.log('Status:', brand.status);
return brand;
} catch (err) {
// Catch 30915 before it breaks production
if (err.code === 30915) {
console.error('ERROR 30915: Invalid entity classification. Review your Customer Profile.');
console.error('Detail:', err.message);
}
throw err;
}
}
Step 4: Handle Error 30915 in Your Bot
If you already have a running bot and want to detect this error in real time so you don't silently lose messages:
// In your Twilio message sending handler
async function sendWhatsAppMessage(to, body) {
try {
const message = await client.messages.create({
from: 'whatsapp:+1XXXXXXXXXX',
to: `whatsapp:${to}`,
body,
});
return message.sid;
} catch (err) {
switch (err.code) {
case 30915:
// Critical alert: the registration is wrong, not just this message
await notifyOps('CRITICAL: Error 30915 - Invalid Sole Proprietor classification. Review Trust Hub immediately.');
break;
case 30007:
// Carrier filtering, different problem
console.warn('Message filtered by carrier:', err.message);
break;
default:
console.error('Twilio Error:', err.code, err.message);
}
throw err;
}
}
Step 5: Toll-Free Verification (If You Use an 800/888 Number)
The process is analogous but goes through a different flow:
- Console → Phone Numbers → Manage → Active Numbers → your Toll-Free number
- Click Set up Toll-Free Verification
- In Business Information, same rules apply: legal entity means no Sole Proprietor
- Fill in use case, estimated volume, and message examples
# Toll-Free verification via API (Python)
from twilio.rest import Client
import os
client = Client(os.environ['TWILIO_ACCOUNT_SID'], os.environ['TWILIO_AUTH_TOKEN'])
verification = client.messaging \
.v1 \
.tollfree_verifications \
.create(
business_name='Acme Media LLC',
business_website='https://example.com',
notification_email='ops@example.com',
use_case_summary='Transactional notifications for DJ platform users',
production_message_sample='Your set tonight starts in 30 minutes. Join here: https://example.com/live',
opt_in_image_urls=['https://example.com/assets/optin-screenshot.png'],
opt_in_type='VERBAL',
message_volume='10000',
tollfree_phone_number_sid='PNXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
customer_profile_sid='BUXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
)
print(f"Verification SID: {verification.sid}")
print(f"Status: {verification.status}")
Real Production Warnings
- Do not try to register as Sole Proprietor to skip the longer process. The longer process exists for a reason and the shortcut will burn you.
- Error
30915blocks the entire campaign, not just one message. All sends from that number are at risk until you fix the registration. - Twilio does not always notify you proactively. You could be losing messages for days before you notice if you don't have error monitoring in your bot.
- For Mexican entities: if your company is an S.A. de C.V. or SAS, register as
Private Profitwith documentation proving incorporation. RFC alone is not sufficient; you need the EIN equivalent if operating in the U.S. - Review time for Brand corrections can be 1 to 5 business days. Plan ahead if you have scheduled campaigns.
Quick Reference Table
| Situation | Correct Classification |
|---|---|
| Individual with no registered company | Sole Proprietor |
| LLC, Inc., Corp, S.A. de C.V. | Standard Business / Private Profit |
| You have an EIN | Standard Business |
| Operating under a registered trade name | Standard Business |
Register correctly from the start, monitor error code 30915 in your bot, and don't let a poorly filled form take down your production traffic.