Indonesia SMS Best Practices, Compliance, and Features
Indonesia SMS Market Overview
Locale name: | Indonesia |
---|---|
ISO code: | ID |
Region | Asia |
Mobile country code (MCC) | 510 |
Dialing Code | +62 |
Market Conditions: Indonesia has one of the largest mobile markets in Asia, with high SMS usage alongside popular OTT messaging apps like WhatsApp and LINE. The market is dominated by major operators including Telkomsel, Indosat Ooredoo, and XL Axiata. Android devices hold approximately 92% market share, while iOS devices account for roughly 8%. SMS remains a critical channel for business communications, particularly for authentication, notifications, and marketing messages.
Key SMS Features and Capabilities in Indonesia
Indonesia supports most standard SMS features including concatenated messaging and alphanumeric sender IDs, though two-way SMS functionality is not available through most providers.
Two-way SMS Support
Two-way SMS is not supported in Indonesia through major SMS providers. Businesses requiring interactive messaging capabilities should consider alternative communication channels or specialized local providers.
Concatenated Messages (Segmented SMS)
Support: Yes, concatenation is supported, though availability may vary based on sender ID type.
Message length rules: Messages are limited to 160 characters before splitting occurs when using GSM-7 encoding.
Encoding considerations: GSM-7 is the standard encoding format. UCS-2 encoding is only supported for International Registered Sender IDs, not for domestic ones.
MMS Support
MMS messages are automatically converted to SMS with an embedded URL link. This ensures compatibility across all devices while still allowing rich media content to be shared through a web-based interface.
Recipient Phone Number Compatibility
Number Portability
Number portability is not available in Indonesia. This means phone numbers remain tied to their original mobile network operators.
Sending SMS to Landlines
Sending SMS to landline numbers is not possible in Indonesia. Attempts to send messages to landline numbers will result in a 400 response error (code 21614) through most SMS APIs, and such messages will not be processed or charged to the sender's account.
Compliance and Regulatory Guidelines for SMS in Indonesia
Indonesia's SMS communications are regulated by the Ministry of Communication and Information Technology (Kominfo). All SMS providers and businesses must comply with local telecommunications laws and data privacy regulations, including the Personal Data Protection Law (UU PDP) implemented in 2022.
Consent and Opt-In
Explicit consent is mandatory before sending any marketing or promotional messages to Indonesian mobile users. Best practices for consent management include:
- Maintaining clear records of when and how consent was obtained
- Providing transparent information about message frequency and content type
- Using double opt-in verification for marketing lists
- Storing consent documentation for at least 5 years
- Including clear terms and conditions during the opt-in process
HELP/STOP and Other Commands
- All SMS campaigns must support standard opt-out keywords in both English and Bahasa Indonesia:
- STOP/BERHENTI
- HELP/BANTUAN
- CANCEL/BATAL
- Messages should include opt-out instructions in Bahasa Indonesia
- Opt-out confirmations must be sent in the recipient's preferred language
Do Not Call / Do Not Disturb Registries
While Indonesia does not maintain a centralized Do Not Call registry, businesses must:
- Maintain their own suppression lists
- Honor opt-out requests within 24 hours
- Implement systems to prevent messaging to opted-out numbers
- Regularly clean and update contact lists
Time Zone Sensitivity
Indonesia spans three time zones (WIB, WITA, and WIT). Best practices include:
- Sending messages between 08:00 and 20:00 local time
- Respecting religious observances, particularly during Ramadan
- Only sending urgent messages (like OTP) outside these hours
- Scheduling campaigns according to the recipient's local time zone
Phone Numbers Options and SMS Sender Types for Indonesia
Alphanumeric Sender ID
Operator network capability: Fully supported
Registration requirements: Pre-registration required for both domestic and international senders
Sender ID preservation: Yes, preserved when properly registered
- Domestic registration takes approximately 3 weeks
- International registration takes approximately 4 weeks
- Must include brand name in message body
- Limited to 11 alphanumeric characters
Long Codes
Domestic vs. International:
- Domestic long codes not supported
- International long codes supported but with limitations Sender ID preservation: No, typically overwritten Provisioning time: N/A for domestic, immediate for international Use cases: Not recommended for primary messaging; use alphanumeric sender IDs instead
Short Codes
Support: Not currently supported in Indonesia Provisioning time: N/A Use cases: N/A
Restricted SMS Content, Industries, and Use Cases
The following content types are strictly prohibited:
- Firearms and weapons
- Gambling and betting
- Adult content
- Political messages
- Religious content
- Controlled substances
- Cannabis products
- Alcohol-related content
- Phone numbers within message body
Content Filtering
Carrier Filtering Rules:
- Messages must include brand name or service program identifier
- URLs should be from approved domains
- Content must be in either Bahasa Indonesia or English
- Maximum 160 characters per segment recommended
Tips to Avoid Blocking:
- Avoid URL shorteners
- Don't include multiple links in one message
- Keep content professional and business-related
- Avoid excessive punctuation or all-caps text
Best Practices for Sending SMS in Indonesia
Messaging Strategy
- Keep messages under 160 characters when possible
- Include clear call-to-action
- Use personalization tokens appropriately
- Maintain consistent sender ID across campaigns
Sending Frequency and Timing
- Limit to 4-5 messages per month per recipient
- Respect religious and cultural observances
- Avoid sending during major holidays
- Space out messages to prevent fatigue
Localization
- Primary language should be Bahasa Indonesia
- Consider regional dialects for specific areas
- Use formal Bahasa Indonesia for business communications
- Include English translations for international brands
Opt-Out Management
- Process opt-outs within 24 hours
- Send confirmation of opt-out completion
- Maintain centralized opt-out database
- Regular audit of opt-out compliance
Testing and Monitoring
- Test across all major carriers (Telkomsel, Indosat, XL)
- Monitor delivery rates by carrier
- Track opt-out rates and patterns
- Regular testing of opt-out functionality
SMS API Integrations for Indonesia
Twilio
Twilio provides robust SMS capabilities for Indonesia through their REST API. Authentication uses account SID and auth token credentials.
import { Twilio } from 'twilio';
// Initialize Twilio client with your credentials
const client = new Twilio(
process.env.TWILIO_ACCOUNT_SID,
process.env.TWILIO_AUTH_TOKEN
);
// Function to send SMS to Indonesia
async function sendSMSToIndonesia(
to: string,
message: string,
senderId: string
) {
try {
// Ensure phone number is in E.164 format for Indonesia
const formattedNumber = to.startsWith('+62') ? to : `+62${to}`;
const response = await client.messages.create({
body: `${senderId}: ${message}`, // Include brand name as required
from: senderId, // Your registered alphanumeric sender ID
to: formattedNumber,
});
console.log(`Message sent successfully: ${response.sid}`);
return response;
} catch (error) {
console.error('Error sending message:', error);
throw error;
}
}
Sinch
Sinch offers SMS API access with REST endpoints and requires API token authentication.
import axios from 'axios';
class SinchSMSClient {
private readonly apiToken: string;
private readonly serviceId: string;
private readonly baseUrl: string = 'https://sms.api.sinch.com/xms/v1';
constructor(apiToken: string, serviceId: string) {
this.apiToken = apiToken;
this.serviceId = serviceId;
}
async sendSMS(to: string, message: string, senderId: string) {
try {
const response = await axios.post(
`${this.baseUrl}/${this.serviceId}/batches`,
{
from: senderId,
to: [to],
body: message,
delivery_report: 'summary'
},
{
headers: {
'Authorization': `Bearer ${this.apiToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
console.error('Sinch SMS Error:', error);
throw error;
}
}
}
MessageBird
MessageBird provides SMS capabilities with RESTful API access.
import messagebird from 'messagebird';
class MessageBirdClient {
private client: any;
constructor(apiKey: string) {
this.client = messagebird(apiKey);
}
sendSMS(to: string, message: string, senderId: string): Promise<any> {
return new Promise((resolve, reject) => {
this.client.messages.create({
originator: senderId,
recipients: [to],
body: message,
datacoding: 'auto' // Automatically handles character encoding
}, (err: any, response: any) => {
if (err) {
reject(err);
} else {
resolve(response);
}
});
});
}
}
Plivo
Plivo offers SMS integration through their REST API with auth ID and token authentication.
import plivo from 'plivo';
class PlivoSMSClient {
private client: any;
constructor(authId: string, authToken: string) {
this.client = new plivo.Client(authId, authToken);
}
async sendSMS(to: string, message: string, senderId: string) {
try {
const response = await this.client.messages.create({
src: senderId, // Your registered sender ID
dst: to, // Destination number
text: message,
url_strip_query_params: false
});
return response;
} catch (error) {
console.error('Plivo SMS Error:', error);
throw error;
}
}
}
API Rate Limits and Throughput
- Default rate limits vary by provider:
- Twilio: 100 messages per second
- Sinch: 50 messages per second
- MessageBird: 60 messages per second
- Plivo: 30 messages per second
Strategies for Large-Scale Sending:
- Implement queue systems (Redis/RabbitMQ)
- Use batch APIs where available
- Implement exponential backoff for retries
- Monitor throughput metrics
Error Handling and Reporting
- Implement comprehensive logging:
interface SMSLog {
messageId: string;
timestamp: Date;
recipient: string;
status: string;
errorCode?: string;
errorMessage?: string;
}
function logSMSEvent(log: SMSLog): void {
// Log to your preferred system (e.g., CloudWatch, ELK Stack)
console.log(JSON.stringify(log));
}
Recap and Additional Resources
Key Takeaways
-
Compliance Priorities
- Register alphanumeric sender IDs
- Include brand name in messages
- Honor opt-out requests
- Maintain consent records
-
Best Practices
- Send during business hours
- Use proper character encoding
- Implement proper error handling
- Monitor delivery rates
Next Steps
- Review Kominfo's telecommunications regulations
- Consult with local legal counsel for compliance
- Register sender IDs with chosen SMS provider
- Implement proper consent management system