sms compliance
sms compliance
India SMS Best Practices, Compliance, and Features
Learn everything about sending SMS in India, from DLT registration and TRAI compliance to API integration with Twilio, Sinch, and Bird. This comprehensive guide covers regulatory requirements, sender ID types, message templates, and best practices for successful SMS campaigns in India's market.
India SMS Best Practices, Compliance, and Features
Learn everything about sending SMS in India, from DLT registration and TRAI compliance to API integration with Twilio, Sinch, and Bird. This comprehensive guide covers regulatory requirements, sender ID types, message templates, and best practices for successful SMS campaigns in India's market.
SMS Market Overview in India
| Locale name: | India |
|---|---|
| ISO code: | IN |
| Region | Asia |
| Mobile country code (MCC) | 404, 405 |
| Dialing Code | +91 |
Market Conditions: India represents one of the world's largest and most dynamic SMS markets, with over 1.2 billion mobile subscribers. Major operators include Reliance Jio, Airtel, and Vodafone Idea. While OTT messaging apps like WhatsApp dominate consumer communications, SMS remains crucial for business messaging and authentication. Android devices command approximately 95% market share, with iOS devices accounting for 5%.
SMS Features and Technical Capabilities
India supports comprehensive SMS capabilities through both international and domestic routes, though regulatory requirements restrict certain features based on your routing choice.
Routing Options: International vs. Domestic
| Feature | International Route | Domestic Route |
|---|---|---|
| Setup time | Immediate | 2–4 weeks (requires DLT registration) |
| Sender ID format | 5–9 digits (5NNNN–5NNNNNNN) | Alphanumeric with 2-letter prefix (e.g., "VM-TWILIO") |
| Cost | Higher per message | Lower per message |
| Delivery rate | 85–90% | 95–98% |
| Best for | Quick testing, global campaigns | Production, local campaigns |
Two-Way SMS Support
Two-way SMS is not supported through standard A2P channels in India due to TRAI regulations. For two-way communication, explore dedicated short code services or alternative channels like WhatsApp Business API.
Concatenated Messages (Segmented SMS)
Support: Yes, though availability varies by sender ID type.
Message length rules: Messages split after 160 characters with GSM-7 encoding or 70 characters with UCS-2 encoding (Unicode/local languages).
Character limits per segment:
- GSM-7 encoding: 160 characters
- UCS-2 encoding: 70 characters
MMS Support
MMS messages automatically convert to SMS with an embedded URL link. This ensures compatibility across all devices while allowing rich media sharing through a web interface.
Recipient Phone Number Compatibility
Number Portability
Number portability is available in India. Users can switch carriers while keeping their phone numbers. This doesn't impact message delivery or routing.
Sending SMS to Landlines
You cannot send SMS to landline numbers in India. Attempts return a 400 error (code 21614) from the API, and you won't be charged.
SMS Compliance Requirements: TRAI & DLT Registration
India maintains strict SMS oversight through the Telecom Regulatory Authority of India (TRAI). You must comply with the Telecom Commercial Communications Customer Preference Regulations (TCCCPR) and register with the Distributed Ledger Technology (DLT) platform before sending commercial messages.
What is DLT (Distributed Ledger Technology)?
The DLT platform is a blockchain-based system mandated by TRAI to combat spam and unauthorized commercial messaging. Every business must register their:
- Principal Entity (PE) ID: Your business registration number
- Message Templates: Pre-approved message formats with variables
- Sender IDs: Brand names or identifiers (6 characters, alphanumeric)
- Consent Records: Documentation of customer opt-ins
How to Register on DLT Platform: Step-by-Step Guide
- Choose your operator's DLT portal (Airtel, Jio, Vodafone Idea, or BSNL)
- Create your Principal Entity account with business documents (GST, PAN, incorporation certificate)
- Register your Sender IDs (approval takes 2–3 business days)
- Submit message templates with variables marked (e.g.,
{#var#}) - Wait for approval (3–5 business days per template)
- Share PE ID and Template IDs with your SMS provider
Registration timeline: 7–10 business days total
SMS Consent Requirements and Opt-In Best Practices
You must obtain explicit consent for all commercial communications in India. Best practices:
- Maintain detailed records of when and how you obtained consent
- Use double opt-in verification processes
- Provide clear information about message frequency and content type
- Document consent duration and purpose
- Implement regular consent refresh processes
HELP/STOP and Other Commands
Support these opt-out keywords in both English and local languages:
- STOP, CANCEL, UNSUBSCRIBE, END
- Local language equivalents
- Respond to HELP messages with service information and opt-out instructions
- Acknowledge opt-out requests within 24 hours
Example opt-out handler:
function handleOptOut(phoneNumber: string, keyword: string) {
if (['STOP', 'CANCEL', 'UNSUBSCRIBE', 'END'].includes(keyword.toUpperCase())) {
// Add to suppression list
suppressionList.add(phoneNumber);
// Send confirmation
sendSMS(phoneNumber, 'You have been unsubscribed. Reply START to opt back in.');
// Log for compliance
logOptOut(phoneNumber, new Date(), keyword);
}
}Do Not Call / Do Not Disturb Registries
India maintains a National Do Not Disturb (NDND) registry managed by TRAI:
- Scrub your contact lists against the NDND registry
- DND violations result in significant penalties
- Maintain internal suppression lists for opted-out numbers
- Implement real-time DND checking through DLT platforms
How to check NDND status:
- Integrate with your DLT portal's NDND API
- Upload contact lists for bulk verification
- Remove flagged numbers before sending
- Re-check monthly as users update preferences
Time Zone Sensitivity
India operates in a single time zone (IST, UTC+5:30). TRAI recommends:
- Send promotional messages only between 9:00 AM and 9:00 PM IST
- Send transactional messages 24/7
- Avoid sending during major religious and cultural holidays
SMS Sender ID Types: Alphanumeric, Long Codes & Short Codes
Choose your sender type based on your use case, timeline, and budget:
| Sender Type | Registration | Provisioning Time | Best For | Cost |
|---|---|---|---|---|
| Alphanumeric Sender ID | Required (DLT) | 2–4 weeks | Brand recognition, marketing | Medium |
| International Long Code | Not required | Immediate | Testing, OTP, transactional | High |
| Short Code | Required (operator approval) | 10–12 weeks | High-volume campaigns, alerts | Highest |
Alphanumeric Sender ID
Operator network capability: Fully supported through domestic routes
Registration requirements: Pre-registration mandatory through DLT platform
Sender ID preservation: Mobile operators append a two-letter prefix (e.g., "VM-TWILIO")
Long Codes
Domestic vs. International: International long codes supported; domestic not available
Sender ID preservation: International sender IDs are replaced with 5–9 digit format (5NNNN–5NNNNNNN)
Provisioning time: Immediate for international routes
Use cases: Transactional messaging and two-factor authentication
Short Codes
Support: Available through select operators
Provisioning time: 10–12 weeks for approval and setup
Cost: ₹50,000–₹2,00,000 setup fee + monthly rental (₹25,000–₹75,000)
Application process: Contact operators directly (Airtel, Jio, Vodafone Idea)
Use cases: High-volume campaigns, time-sensitive alerts, marketing messages
Restricted Content: What You Cannot Send via SMS in India
These content types and industries face strict restrictions:
- Gambling and betting
- Adult content
- Cryptocurrency promotions
- Unauthorized financial services
- Political messaging without approval
- Religious content
- Controlled substances
- Cannabis products
- Alcohol-related content
Content Filtering
Known carrier filtering rules:
- Register and whitelist all URLs
- Avoid shortened URLs (generally blocked)
- Avoid keywords related to restricted industries
- Match approved message templates
Tips to avoid blocking:
- Register all URLs in DLT platform
- Use approved message templates
- Avoid spam trigger words ("free," "winner," "urgent," "click now")
- Maintain consistent sender IDs
Message Template Examples
Approved templates:
✅ "Your OTP for {#var#} is {#var#}. Valid for 10 minutes. Do not share."
✅ "Hi {#var#}, your order {#var#} has been shipped. Track at {#var#}."
✅ "Your appointment with Dr. {#var#} is confirmed for {#var#} at {#var#}."
Rejected templates:
❌ "Congratulations! You won a prize. Click here: bit.ly/xyz"
(Reason: Shortened URL, spam trigger word)
❌ "Limited time offer! Get 90% off now!!!"
(Reason: Multiple exclamations, spam trigger words)
❌ "Check your account balance at mybank.com/login"
(Reason: Unregistered URL)
What happens to filtered messages:
- Message fails at operator level
- You receive error code 1001 (Invalid template) or 3xx (Content blocked)
- Message is not delivered
- You're charged for the attempt
- Repeated violations may suspend your sender ID
SMS Best Practices: Messaging Strategy & Optimization
Messaging Strategy
Good vs. Bad Messages:
| ❌ Bad | ✅ Good |
|---|---|
| "Dear customer, we are pleased to inform you that your transaction has been successfully processed." (19 words) | "Your payment of ₹{#var#} succeeded. Ref: {#var#}." (7 words) |
| "Click here for details" (no URL) | "View details at yourbrand.com/order/12345" (registered URL) |
| "URGENT!!! ACT NOW!!!" | "Your subscription expires in 3 days. Renew at {#var#}." |
Best practices:
- Keep messages under 160 characters when possible
- Include clear calls-to-action
- Use registered templates for consistency
- Personalize messages using approved variable fields
Sending Frequency and Timing
- Limit promotional messages to 3 per week per user
- Respect time zone restrictions (9 AM – 9 PM IST for promotional)
- Avoid sending during major holidays (Diwali, Holi, Eid, Christmas)
- Space out bulk campaigns to prevent network congestion
Localization
| Language | Speakers | Script | Encoding |
|---|---|---|---|
| Hindi | 43% | Devanagari | UCS-2 |
| Bengali | 8% | Bengali | UCS-2 |
| Telugu | 7% | Telugu | UCS-2 |
| Marathi | 7% | Devanagari | UCS-2 |
| Tamil | 6% | Tamil | UCS-2 |
Localization tips:
- Support multiple regional languages
- Use Unicode (UCS-2) encoding for local scripts
- Consider cultural sensitivities in content
- Provide language preference options
- Test messages with native speakers
Opt-Out Management
- Process opt-outs within 24 hours
- Maintain centralized opt-out database
- Include clear opt-out instructions
- Confirm opt-out status via SMS
Testing and Monitoring
Expected performance benchmarks:
- Delivery time: 2–5 seconds (domestic), 5–15 seconds (international)
- Success rate: 95–98% (domestic), 85–90% (international)
- Delivery report lag: 30–60 seconds
Testing checklist:
- Test across all major Indian carriers (Jio, Airtel, Vodafone Idea, BSNL)
- Monitor delivery rates by operator
- Track engagement metrics (opens, clicks, conversions)
- Analyze template performance regularly
- Conduct A/B testing for optimal results
SMS API Integration: Twilio, Sinch & Bird for India
Twilio
Twilio provides SMS API with features for India's regulatory requirements. Authenticate with Account SID and Auth Token.
import { Twilio } from 'twilio';
// Initialize client with authentication credentials
const client = new Twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
// Function to send SMS to India with DLT compliance
async function sendSMSToIndia(
to: string,
message: string,
entityId: string,
templateId: string
) {
try {
// Create message with required parameters for India
const response = await client.messages.create({
to: `+91${to}`, // India country code
from: 'YOUR_REGISTERED_SENDER_ID', // DLT registered sender ID
body: message,
// DLT compliance parameters
messagingServiceSid: 'YOUR_MESSAGING_SERVICE_SID',
statusCallback: 'YOUR_WEBHOOK_URL',
// India-specific DLT parameters
contentSid: templateId,
contentVariables: JSON.stringify({ entity_id: entityId })
});
console.log(`Message sent successfully: ${response.sid}`);
return response;
} catch (error) {
// Handle India-specific errors
if (error.code === 21614) {
console.error('Invalid phone number (landline or invalid format)');
} else if (error.code === 21408) {
console.error('DLT registration failure – check entity ID and template ID');
} else if (error.code === 30007) {
console.error('Message filtered by carrier – check template and content');
} else {
console.error('Error sending message:', error.message);
}
throw error;
}
}Sinch
Sinch offers dedicated India SMS capabilities with DLT compliance support built-in.
import axios from 'axios';
interface SinchSMSConfig {
apiToken: string;
servicePlanId: string;
senderId: string;
}
class SinchSMSService {
private readonly baseUrl: string;
private readonly config: SinchSMSConfig;
constructor(config: SinchSMSConfig) {
this.config = config;
this.baseUrl = 'https://sms.api.sinch.com/xms/v1';
}
async sendSMS(
to: string,
message: string,
templateId: string,
entityId: string
) {
try {
const response = await axios.post(
`${this.baseUrl}/${this.config.servicePlanId}/batches`,
{
from: this.config.senderId,
to: [`+91${to}`],
body: message,
// India-specific parameters
dlt_template_id: templateId,
dlt_principal_entity_id: entityId
},
{
headers: {
'Authorization': `Bearer ${this.config.apiToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
// Handle India-specific errors
if (axios.isAxiosError(error)) {
const status = error.response?.status;
const errorCode = error.response?.data?.code;
if (status === 400 && errorCode === 'invalid_dlt_params') {
console.error('Invalid DLT parameters – verify entity ID and template ID');
} else if (status === 403) {
console.error('Sender ID not authorized – complete DLT registration');
} else if (status === 429) {
console.error('Rate limit exceeded – implement retry with exponential backoff');
}
}
console.error('Sinch SMS Error:', error);
throw error;
}
}
}Bird
Bird's API provides specialized features for India's SMS market with built-in DLT compliance.
import axios from 'axios';
class BirdSMSService {
private readonly apiKey: string;
private readonly baseUrl: string;
constructor(apiKey: string) {
this.apiKey = apiKey;
this.baseUrl = 'https://api.bird.com/v1';
}
async sendSMS(to: string, message: string, templateId: string) {
try {
const response = await axios.post(
`${this.baseUrl}/messages`,
{
destination: `+91${to}`,
message_text: message,
sender_id: 'YOUR_SENDER_ID',
template_id: templateId,
entity_id: 'YOUR_ENTITY_ID'
},
{
headers: {
'Authorization': `Bearer ${this.apiKey}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
console.error('Bird SMS Error:', error);
throw error;
}
}
}API Rate Limits and Throughput
| Provider | Default Rate Limit | Enterprise Limit | Recommended Queue System |
|---|---|---|---|
| Twilio | 10 msg/sec | Up to 100 msg/sec | Redis, SQS |
| Sinch | 20 msg/sec | Up to 200 msg/sec | RabbitMQ, Kafka |
| Bird | 50 msg/sec | Up to 500 msg/sec | Redis, BullMQ |
Best practices:
- Implement exponential backoff for retry logic
- Use queuing systems (Redis, RabbitMQ) for high-volume sending
- Consider batch APIs for bulk messaging
- Monitor throughput metrics and adjust accordingly
Error Handling and Reporting
Common error codes and solutions:
| Error Code | Meaning | How to Fix |
|---|---|---|
| 1001 | Invalid template | Verify template ID matches DLT registration |
| 1002 | DLT registration failed | Check entity ID and sender ID registration |
| 1003 | Rate limit exceeded | Implement exponential backoff, upgrade plan |
| 3xx | Content blocked | Remove spam trigger words, register URLs |
| 21614 | Invalid recipient (Twilio) | Validate phone numbers before sending |
| 30007 | Message filtered (Twilio) | Use approved templates, avoid restricted content |
Retry strategies:
async function sendWithRetry(
sendFunction: () => Promise<any>,
maxRetries: number = 3
): Promise<any> {
let lastError;
for (let attempt = 0; attempt < maxRetries; attempt++) {
try {
return await sendFunction();
} catch (error) {
lastError = error;
// Don't retry for permanent failures
if (isPermanentError(error)) {
throw error;
}
// Exponential backoff: 1s, 2s, 4s
const delayMs = Math.pow(2, attempt) * 1000;
await new Promise(resolve => setTimeout(resolve, delayMs));
}
}
throw lastError;
}
function isPermanentError(error: any): boolean {
const permanentCodes = [1001, 1002, 21614, 30007];
return permanentCodes.includes(error.code);
}Monitoring best practices:
- Implement comprehensive error logging
- Track delivery receipts (DLRs)
- Store message metadata for troubleshooting
- Set up automated alerts for error thresholds (>5% failure rate)
- Monitor delivery time trends by carrier
Troubleshooting SMS Delivery Issues in India
Messages Not Delivering
Symptoms: Messages sent successfully but not received
Solutions:
- Verify DLT registration is complete and active
- Check template ID matches message content exactly
- Confirm sender ID is registered and approved
- Test with different carriers to isolate operator issues
- Verify recipient numbers are not on NDND registry
Template Rejection
Symptoms: Template approval pending for >7 days or rejected
Solutions:
- Remove spam trigger words ("free," "winner," "urgent")
- Register all URLs before template submission
- Use proper variable syntax:
{#var#} - Ensure template matches your registered business category
- Contact DLT portal support with rejection reason
High Delivery Costs
Symptoms: Unexpected charges or high per-message cost
Solutions:
- Switch from international to domestic routing (requires DLT)
- Negotiate volume discounts with your provider
- Optimize message length to avoid segmentation
- Use GSM-7 encoding instead of UCS-2 when possible
- Implement smart routing based on message type
Rate Limiting Issues
Symptoms: Error 1003 or 429 responses
Solutions:
- Implement exponential backoff retry logic
- Use message queuing systems (Redis, RabbitMQ)
- Spread campaigns over longer time periods
- Upgrade to enterprise rate limits
- Use multiple sender IDs to distribute load
Recap and Additional Resources
Pre-Launch Compliance Checklist
- Complete DLT registration with Principal Entity ID
- Register all sender IDs with operators
- Submit and approve all message templates
- Implement consent collection and documentation
- Set up NDND registry checking
- Configure opt-out keyword handling
- Test message delivery across all major carriers
- Implement delivery receipt tracking
- Set up error monitoring and alerting
- Document compliance processes for audit
Frequently Asked Questions
Q: How long does DLT registration take? A: 7–10 business days for complete setup (entity registration + sender IDs + template approval).
Q: Can I send messages without DLT registration? A: Yes, using international routes, but delivery rates are lower (85–90% vs. 95–98%) and costs are higher.
Q: What happens if I send to a DND-registered number? A: Transactional messages deliver normally. Promotional messages are blocked, and repeated violations result in penalties.
Q: Can I use the same template for multiple sender IDs? A: Yes, but you must register the template separately for each sender ID in the DLT portal.
Q: How do I handle messages in multiple languages? A: Register separate templates for each language. Use UCS-2 encoding for non-English scripts.
Key Takeaways
- Compliance First: Complete DLT registration and template approval before sending
- Technical Integration: Choose an API provider with strong India support
- Monitoring: Implement robust tracking and error handling
- Best Practices: Follow timing, content, and opt-out guidelines
Next Steps
-
Review Regulations
- Visit TRAI website (https://trai.gov.in)
- Review DLT platform requirements
- Understand template registration process
-
Legal Compliance
- Consult with telecom law experts
- Review privacy policy requirements
- Establish consent management processes
-
Technical Setup
- Complete DLT registration
- Register message templates
- Implement API integration
- Set up monitoring systems
Additional Resources
- TRAI SMS Regulations: https://trai.gov.in/sites/default/files/TCCCPR_2018.pdf
- DLT Platform Guidelines: https://www.trai.gov.in/sites/default/files/DLT_Guidelines.pdf
- Telecom Commercial Communication Customer Preference Portal: https://www.nccptrai.gov.in/
Industry Guidelines:
- Mobile Marketing Association India: https://www.mmaglobal.com/india
- IAMAI Digital Marketing Guidelines: https://iamai.in/guidelines
Frequently Asked Questions
How to send SMS in India using Twilio?
Use Twilio's SMS API with your Account SID and Auth Token. Remember to include the +91 country code, your registered sender ID, and a status callback URL for delivery tracking and compliance in India.
What is DLT registration for SMS in India?
Distributed Ledger Technology (DLT) registration is mandatory in India for sending commercial SMS messages. It's a TRAI-regulated system to combat spam and ensure compliance with the Telecom Commercial Communications Customer Preference Regulations (TCCCPR).
Why does India require SMS consent?
Explicit consent is required for all commercial SMS in India to protect consumers from unwanted messages. This is part of the Telecom Commercial Communications Customer Preference Regulations (TCCCPR) overseen by TRAI.
What is the maximum SMS length in India?
SMS messages in India are limited to 160 characters when using GSM-7 encoding. Longer messages are split into multiple segments (concatenated SMS). UCS-2 encoding allows only 70 characters per segment.
When should I send promotional SMS in India?
TRAI recommends sending promotional SMS messages between 9:00 AM and 9:00 PM IST. Transactional messages, however, can be sent 24/7.
Can I send SMS to landlines in India?
No, sending SMS to landline numbers in India is not supported. Attempts to do so will result in a 400 error response (code 21614) from the API.
How to handle SMS opt-outs in India?
You must process opt-out requests within 24 hours. Maintain a database of opted-out numbers, include clear opt-out instructions in every message (STOP, CANCEL, etc.), and confirm the opt-out via SMS.
What are the penalties for violating DND in India?
Violating the National Do Not Disturb (NDND) registry can result in significant penalties. Businesses must scrub their contact lists against the NDND registry and respect user preferences.
How to use alphanumeric sender IDs in India?
Alphanumeric sender IDs are supported in India, but they require pre-registration through the DLT platform. Mobile operators also append a two-letter prefix to these sender IDs.
What are short codes used for in India?
Short codes are available for high-volume SMS campaigns, time-sensitive alerts, and marketing messages in India. They require a longer provisioning time of 10-12 weeks.
What is the difference between long codes and short codes for SMS in India?
International long codes are supported for transactional and 2FA messages. Domestic long codes aren't available. Short codes are for high-volume marketing but require a longer setup time through operators.
How to integrate Sinch SMS API for India?
Use Sinch's SMS API with your API token, service plan ID, and sender ID. Ensure to include India-specific parameters like the `dlt_template_id` and `dlt_principal_entity_id` for DLT compliance.
What SMS content is restricted in India?
Content related to gambling, adult material, cryptocurrency, unauthorized financial services, and political messaging (without approval) is restricted. Religious content, controlled substances, alcohol, and cannabis products are also prohibited.
How to avoid SMS filtering in India?
Register all URLs in the DLT platform and avoid using shortened URLs, which are generally blocked. Use approved message templates, avoid spam trigger words, and maintain consistent sender IDs.
What are the best practices for SMS marketing in India?
Keep messages under 160 characters, include clear calls to action, personalize with approved variables, respect time zone and frequency limits (3 per week), and support local languages.