Uruguay SMS Best Practices, Compliance, and Features
Uruguay SMS Market Overview
Locale name: | Uruguay |
---|---|
ISO code: | UY |
Region | South America |
Mobile country code (MCC) | 748 |
Dialing Code | +598 |
Market Conditions: Uruguay has a mature mobile market with high smartphone penetration and widespread SMS usage. The country's telecommunications landscape is dominated by three major operators: Antel (state-owned), Movistar (Telefónica), and Claro (América Móvil). While OTT messaging apps like WhatsApp are popular, SMS remains a crucial channel for business communications and authentication services. Android devices hold a significant market share advantage over iOS in the region.
Key SMS Features and Capabilities in Uruguay
Uruguay supports basic SMS functionality with some limitations on sender ID options and two-way messaging capabilities.
Two-way SMS Support
Two-way SMS is not supported in Uruguay through most providers. This limitation affects interactive messaging campaigns and automated response systems.
Concatenated Messages (Segmented SMS)
Support: Yes, concatenated messages are supported in Uruguay, though support may vary by sender ID type.
Message length rules: Standard SMS length limits apply - 160 characters for GSM-7 encoding, 70 characters for UCS-2 encoding.
Encoding considerations: Both GSM-7 and UCS-2 encodings are supported, with messages automatically split and concatenated based on the character encoding used.
MMS Support
MMS messages are not directly supported in Uruguay. Instead, MMS content is automatically converted to SMS with an embedded URL link where recipients can view the multimedia content. This ensures compatibility while still allowing rich media sharing capabilities.
Recipient Phone Number Compatibility
Number Portability
Number portability is not available in Uruguay. This means mobile numbers remain tied to their original carriers, which can simplify message routing but limits consumer flexibility.
Sending SMS to Landlines
Sending SMS to landline numbers is not supported in Uruguay. Attempts to send messages to landline numbers will result in delivery failure, typically generating a 400 response error (code 21614) from SMS platforms, with no charges incurred.
Compliance and Regulatory Guidelines for SMS in Uruguay
While Uruguay doesn't have specific SMS marketing legislation, communications are governed by general consumer protection laws and telecommunications regulations overseen by URSEC (Unidad Reguladora de Servicios de Comunicaciones). Best practices from global standards should be followed to ensure compliance.
Consent and Opt-In
Explicit Consent Requirements:
- Obtain clear, documented opt-in consent before sending marketing messages
- Maintain detailed records of when and how consent was obtained
- Include clear terms of service and privacy policy information
- Specify the type and frequency of messages recipients will receive
HELP/STOP and Other Commands
- Support for STOP commands is mandatory for all marketing messages
- Common keywords in both Spanish and English must be recognized:
- STOP, BAJA, CANCELAR for opt-out
- AYUDA, HELP for assistance
- Response messages should be in Spanish, the primary language in Uruguay
Do Not Call / Do Not Disturb Registries
Uruguay does not maintain an official Do Not Call registry. However, businesses should:
- Maintain their own suppression lists
- Honor opt-out requests immediately
- Document all opt-out requests and their processing dates
- Regularly clean contact lists to remove unsubscribed numbers
Time Zone Sensitivity
Uruguay observes UTC-3 time zone. While there are no strict legal restrictions on messaging hours:
- Limit marketing messages to business hours (9:00 AM to 8:00 PM local time)
- Avoid sending messages on Sundays and national holidays
- Reserve after-hours messaging for urgent notifications only
Phone Numbers Options and SMS Sender Types for Uruguay
Alphanumeric Sender ID
Operator network capability: Not supported by most carriers
Registration requirements: N/A - feature not available
Sender ID preservation: Sender IDs are typically overwritten with a numeric format
Long Codes
Domestic vs. International:
- Domestic long codes not supported
- International long codes are supported but with limitations
Sender ID preservation: No, original sender IDs are not preserved
Provisioning time: Immediate to 24 hours for international long codes
Use cases: Transactional messages, alerts, and notifications
Short Codes
Support: Not currently supported in Uruguay
Provisioning time: N/A
Use cases: N/A
Restricted SMS Content, Industries, and Use Cases
Restricted Industries and Content:
- Gambling and betting services
- Adult content or services
- Unauthorized pharmaceutical promotions
- Political campaign messages without proper authorization
- Financial services without proper licensing
Content Filtering
Carrier Filtering Rules:
- Messages containing certain keywords may be blocked
- URLs may be subject to screening
- High-volume sending patterns may trigger spam filters
Best Practices to Avoid Filtering:
- Avoid excessive punctuation and special characters
- Use clear, straightforward language
- Include company name in messages
- Maintain consistent sending patterns
- Use registered and approved sender IDs
Best Practices for Sending SMS in Uruguay
Messaging Strategy
- Keep messages under 160 characters when possible
- Include clear call-to-actions
- Personalize messages with recipient's name when appropriate
- Maintain consistent branding across messages
Sending Frequency and Timing
- Limit marketing messages to 2-4 per month per recipient
- Space out messages to avoid overwhelming recipients
- Consider Uruguay's business calendar for timing
- Respect local holidays and cultural events
Localization
- Primary language should be Spanish
- Use local formatting for dates (DD/MM/YYYY)
- Consider local cultural references and expressions
- Avoid colloquialisms that might not translate well
Opt-Out Management
- Process opt-out requests within 24 hours
- Maintain a centralized opt-out database
- Include clear opt-out instructions in messages
- Confirm opt-out status with a final confirmation message
Testing and Monitoring
- Test messages across all major carriers (Antel, Movistar, Claro)
- Monitor delivery rates by carrier
- Track engagement metrics and optimize accordingly
- Regularly test opt-out functionality
SMS API integrations for Uruguay
Twilio
Twilio provides a robust SMS API that supports messaging to Uruguay. Here's how to implement it:
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 Uruguay
async function sendSMSToUruguay(
to: string,
message: string
): Promise<void> {
try {
// Ensure number is in E.164 format for Uruguay (+598)
const formattedNumber = to.startsWith('+598') ? to : `+598${to}`;
const response = await client.messages.create({
body: message,
to: formattedNumber,
from: process.env.TWILIO_PHONE_NUMBER,
// Optional: statusCallback URL for delivery updates
statusCallback: 'https://your-webhook.com/status'
});
console.log(`Message sent successfully! SID: ${response.sid}`);
} catch (error) {
console.error('Error sending message:', error);
throw error;
}
}
Sinch
Sinch offers SMS capabilities for Uruguay through their REST API:
import axios from 'axios';
interface SinchSMSResponse {
id: string;
status: string;
}
class SinchSMSClient {
private readonly baseUrl: string;
private readonly apiToken: string;
constructor(apiToken: string) {
this.baseUrl = 'https://sms.api.sinch.com/xms/v1';
this.apiToken = apiToken;
}
async sendSMS(to: string, message: string): Promise<SinchSMSResponse> {
try {
const response = await axios.post(
`${this.baseUrl}/batches`,
{
from: process.env.SINCH_SENDER_ID,
to: [to],
body: message
},
{
headers: {
'Authorization': `Bearer ${this.apiToken}`,
'Content-Type': 'application/json'
}
}
);
return response.data;
} catch (error) {
console.error('Sinch SMS Error:', error);
throw error;
}
}
}
Bird (MessageBird)
MessageBird's API implementation for Uruguay messaging:
import messagebird from 'messagebird';
class MessageBirdClient {
private client: any;
constructor(apiKey: string) {
this.client = messagebird(apiKey);
}
sendSMS(
to: string,
message: string,
callback: (error: any, response: any) => void
): void {
const params = {
originator: process.env.MESSAGEBIRD_ORIGINATOR,
recipients: [to],
body: message,
// Optional parameters for delivery reporting
reportUrl: 'https://your-webhook.com/delivery-reports'
};
this.client.messages.create(params, callback);
}
}
// Usage example with promises
const sendMessageBirdSMS = (to: string, message: string): Promise<any> => {
return new Promise((resolve, reject) => {
const client = new MessageBirdClient(process.env.MESSAGEBIRD_API_KEY);
client.sendSMS(to, message, (error, response) => {
if (error) reject(error);
else resolve(response);
});
});
};
API Rate Limits and Throughput
When sending SMS to Uruguay, consider these limitations:
- Rate Limits:
- Twilio: 250 messages per second
- Sinch: 30 messages per second
- MessageBird: 60 messages per second
Throughput Management Strategies:
// Example rate limiting implementation
class RateLimiter {
private queue: Array<() => Promise<void>> = [];
private processing: boolean = false;
private readonly rateLimit: number;
private readonly interval: number;
constructor(rateLimit: number, interval: number = 1000) {
this.rateLimit = rateLimit;
this.interval = interval;
}
async add(task: () => Promise<void>): Promise<void> {
this.queue.push(task);
if (!this.processing) {
this.processing = true;
await this.processQueue();
}
}
private async processQueue(): Promise<void> {
while (this.queue.length > 0) {
const batch = this.queue.splice(0, this.rateLimit);
await Promise.all(batch.map(task => task()));
await new Promise(resolve => setTimeout(resolve, this.interval));
}
this.processing = false;
}
}
Error Handling and Reporting
Implement comprehensive error handling:
interface SMSError {
code: string;
message: string;
timestamp: Date;
provider: string;
}
class SMSErrorHandler {
static handleError(error: any, provider: string): SMSError {
const errorLog: SMSError = {
code: error.code || 'UNKNOWN',
message: error.message,
timestamp: new Date(),
provider
};
// Log error to monitoring system
console.error(JSON.stringify(errorLog));
// Implement retry logic for specific error codes
if (this.isRetryableError(error.code)) {
// Add to retry queue
}
return errorLog;
}
private static isRetryableError(code: string): boolean {
const retryableCodes = ['30001', '30002', '30003'];
return retryableCodes.includes(code);
}
}
Recap and Additional Resources
Key Takeaways
-
Compliance Priorities:
- Obtain explicit consent
- Honor opt-out requests
- Maintain proper documentation
-
Technical Considerations:
- Use E.164 number formatting
- Implement proper rate limiting
- Handle errors gracefully
-
Best Practices:
- Test thoroughly across carriers
- Monitor delivery rates
- Keep messages concise and relevant
Next Steps
- Review URSEC regulations at www.ursec.gub.uy
- Consult with local telecommunications counsel
- Set up test accounts with preferred SMS providers
- Implement proper monitoring and logging systems
Additional Resources
- URSEC Telecommunications Guidelines: www.ursec.gub.uy/guidelines
- Uruguay Consumer Protection Laws: www.impo.com.uy/consumer-protection
- SMS Provider Documentation: