sms compliance

Sent logo
Sent TeamMay 3, 2025 / sms compliance / Article

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
RegionAsia
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

FeatureInternational RouteDomestic Route
Setup timeImmediate2–4 weeks (requires DLT registration)
Sender ID format5–9 digits (5NNNN–5NNNNNNN)Alphanumeric with 2-letter prefix (e.g., "VM-TWILIO")
CostHigher per messageLower per message
Delivery rate85–90%95–98%
Best forQuick testing, global campaignsProduction, 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

  1. Choose your operator's DLT portal (Airtel, Jio, Vodafone Idea, or BSNL)
  2. Create your Principal Entity account with business documents (GST, PAN, incorporation certificate)
  3. Register your Sender IDs (approval takes 2–3 business days)
  4. Submit message templates with variables marked (e.g., {#var#})
  5. Wait for approval (3–5 business days per template)
  6. Share PE ID and Template IDs with your SMS provider

Registration timeline: 7–10 business days total

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:

typescript
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:

  1. Integrate with your DLT portal's NDND API
  2. Upload contact lists for bulk verification
  3. Remove flagged numbers before sending
  4. 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 TypeRegistrationProvisioning TimeBest ForCost
Alphanumeric Sender IDRequired (DLT)2–4 weeksBrand recognition, marketingMedium
International Long CodeNot requiredImmediateTesting, OTP, transactionalHigh
Short CodeRequired (operator approval)10–12 weeksHigh-volume campaigns, alertsHighest

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

LanguageSpeakersScriptEncoding
Hindi43%DevanagariUCS-2
Bengali8%BengaliUCS-2
Telugu7%TeluguUCS-2
Marathi7%DevanagariUCS-2
Tamil6%TamilUCS-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.

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

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

typescript
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

ProviderDefault Rate LimitEnterprise LimitRecommended Queue System
Twilio10 msg/secUp to 100 msg/secRedis, SQS
Sinch20 msg/secUp to 200 msg/secRabbitMQ, Kafka
Bird50 msg/secUp to 500 msg/secRedis, 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 CodeMeaningHow to Fix
1001Invalid templateVerify template ID matches DLT registration
1002DLT registration failedCheck entity ID and sender ID registration
1003Rate limit exceededImplement exponential backoff, upgrade plan
3xxContent blockedRemove spam trigger words, register URLs
21614Invalid recipient (Twilio)Validate phone numbers before sending
30007Message filtered (Twilio)Use approved templates, avoid restricted content

Retry strategies:

typescript
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:

  1. Verify DLT registration is complete and active
  2. Check template ID matches message content exactly
  3. Confirm sender ID is registered and approved
  4. Test with different carriers to isolate operator issues
  5. Verify recipient numbers are not on NDND registry

Template Rejection

Symptoms: Template approval pending for >7 days or rejected

Solutions:

  1. Remove spam trigger words ("free," "winner," "urgent")
  2. Register all URLs before template submission
  3. Use proper variable syntax: {#var#}
  4. Ensure template matches your registered business category
  5. Contact DLT portal support with rejection reason

High Delivery Costs

Symptoms: Unexpected charges or high per-message cost

Solutions:

  1. Switch from international to domestic routing (requires DLT)
  2. Negotiate volume discounts with your provider
  3. Optimize message length to avoid segmentation
  4. Use GSM-7 encoding instead of UCS-2 when possible
  5. Implement smart routing based on message type

Rate Limiting Issues

Symptoms: Error 1003 or 429 responses

Solutions:

  1. Implement exponential backoff retry logic
  2. Use message queuing systems (Redis, RabbitMQ)
  3. Spread campaigns over longer time periods
  4. Upgrade to enterprise rate limits
  5. 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

  1. Compliance First: Complete DLT registration and template approval before sending
  2. Technical Integration: Choose an API provider with strong India support
  3. Monitoring: Implement robust tracking and error handling
  4. Best Practices: Follow timing, content, and opt-out guidelines

Next Steps

  1. Review Regulations

    • Visit TRAI website (https://trai.gov.in)
    • Review DLT platform requirements
    • Understand template registration process
  2. Legal Compliance

    • Consult with telecom law experts
    • Review privacy policy requirements
    • Establish consent management processes
  3. Technical Setup

    • Complete DLT registration
    • Register message templates
    • Implement API integration
    • Set up monitoring systems

Additional Resources

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