sms compliance

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

Malawi SMS Guide: Compliance, Best Practices & API Integration 2025

Complete guide to sending SMS in Malawi with TNM and Airtel. Learn compliance requirements, phone number formats, MACRA regulations, and API integration with Twilio, Sinch, and MessageBird.

Malawi SMS Best Practices, Compliance, and Features

Malawi SMS Market Overview

Locale name:Malawi
ISO code:MW
RegionMiddle East & Africa
Mobile country code (MCC)650
Dialing Code+265

Market Conditions: Malawi's mobile market is a duopoly dominated by two major operators: Telekom Networks Malawi (TNM) with 44% market share and Airtel Malawi with 56% market share (2024). The market serves approximately 10 million SIM cards with a person penetration rate of 42%. A third operator, Malcel, received a license in August 2022 and planned to launch commercial operations in October 2023 with a $280 million investment in network infrastructure and mobile money services, though commercial launch status remains unconfirmed as of 2024.

Cost Comparison:

OperatorMarket ShareNetwork CoverageEstimated SMS Cost
TNM44%88%+ nationwide (2G/3G/4G/5G)Varies by volume and provider
Airtel56%Nationwide (2G/3G/4G)Varies by volume and provider
MalcelPendingPlanned nationwideNot yet operational

TNM's network covers over 88% of the country through 2G (GSM 900/1800 MHz), 3G (UMTS B1 2100 MHz, B8 900 MHz), and 4G LTE (B41 2500 MHz with LTE-A). TNM officially launched its 5G network in Lilongwe in July 2025, with coverage areas including BICC, Area 9, Kang'ombe, Area 47 ABC, Area 49 Mvama, Kamuzu Central Hospital, Kanengo, Capital Hill, BNS Stadium, and the corridor from Kanengo to Area 2. Following successful trials in 2023 in both Lilongwe and Blantyre, TNM plans to gradually expand 5G coverage to more areas across the country. In 2025, TNM completed a K16 billion nationwide upgrade of 650+ sites, extending coverage to 400,000 additional users. SMS remains the most reliable messaging solution due to its universal accessibility and network coverage, particularly in rural regions where OTT (Over-The-Top) messaging apps have limited reach.


How to Send SMS in Malawi: Key Features and Capabilities

Malawi supports basic SMS features including concatenated messaging and alphanumeric sender IDs, though two-way messaging capabilities are limited.

Two-way SMS Support

Two-way SMS is not supported in Malawi through most providers. Your business cannot receive replies to its messages through standard SMS channels.

Alternative Solutions:

  • Use web-based response forms with SMS-provided links
  • Implement WhatsApp Business API for bidirectional messaging
  • Set up dedicated customer service phone lines for voice responses
  • Use email response options in your SMS content

Concatenated Messages (Segmented SMS)

Support: Yes, concatenation is supported for most sender ID types.

Message length rules:

  • GSM-7 encoding: 160 characters per segment
  • Unicode encoding: 70 characters per segment

Encoding considerations: Messages use GSM-7 encoding for Latin alphabet and UTF-8 for local languages like Chichewa. Unicode messages are limited to 70 characters per segment.

Cost Impact: Each segment counts as a separate message. A 320-character message costs 2× a single message, while a 161-character message costs the same as a 320-character message (both require 2 segments).

Character Count Examples:

Message LengthEncodingSegmentsCost Multiplier
1 – 160 charsGSM-71
161 – 306 charsGSM-72
1 – 70 charsUnicode1
71 – 134 charsUnicode2

MMS Support

MMS messages are not directly supported in Malawi. Instead, MMS content is automatically converted to SMS with an embedded URL link where recipients can view the multimedia content. This ensures compatibility across all devices while still enabling rich media sharing.

MMS-to-SMS Conversion Process:

  1. You send an MMS through your provider's API
  2. The provider uploads images/media to a secure hosting server
  3. The system generates a short URL pointing to the hosted content
  4. Recipients receive an SMS with your message text and the URL
  5. Recipients click the link to view the multimedia content in their browser

Technical Requirements:

  • Most providers handle URL generation and hosting automatically
  • URLs typically expire after 30 – 90 days (varies by provider)
  • Hosted content must comply with local content regulations
  • No additional configuration required beyond standard MMS API calls

Recipient Phone Number Compatibility

Number Portability

Mobile Number Portability (MNP) was implemented in Malawi in 2019 and became operational in January 2020, allowing you to switch operators while keeping your existing number. MACRA (Malawi Communications Regulatory Authority) oversees the MNP process, which typically takes 24 – 48 hours to complete. The implementation of MNP provides a positive example for other nations, as MACRA has taken care to fully understand the implementation journey and lean on global best practices in MNP service design. Real-time checks against the MACRA database are crucial to ensure accurate operator identification when sending SMS messages.

MNP Lookup Implementation:

Most SMS providers automatically perform MNP lookups before routing messages. If you need to verify operator information manually:

typescript
// Example using Home Location Register (HLR) lookup
import { lookupNumber } from 'your-sms-provider-sdk';

async function verifyOperator(phoneNumber: string) {
  const result = await lookupNumber(phoneNumber);
  return {
    operator: result.carrier.name, // "TNM" or "Airtel"
    originalOperator: result.originalCarrier,
    isPorted: result.ported,
    numberType: result.type // "mobile" or "landline"
  };
}

Practical MNP Considerations:

  • Always use current operator information for routing, not historical data
  • Refresh operator lookups regularly (at least monthly) for active contact lists
  • Most major SMS providers (Twilio, Sinch, MessageBird) handle MNP automatically
  • Porting takes 24 – 48 hours, during which SMS delivery may be unreliable

Malawi Phone Number Format:

  • Country code: +265
  • Total digits: 9 (after country code)
  • Mobile format: 0 + Operator Prefix + Subscriber Number (e.g., 0881234567 for TNM, 0991234567 for Airtel)
  • International format: +265 followed by 9 digits (replace leading 0)
  • No area codes: Malawi does not use geographic area codes

Complete Operator Prefix List:

OperatorPrefixesExample
TNM077, 088+265881234567
Airtel099, 088+265991234567
MalcelTBDNot yet operational

Validation Regex Pattern:

regex
^(?:\+265|265|0)?([78]8|99)\d{7}$
typescript
// Phone number validation example
function isValidMalawiNumber(phoneNumber: string): boolean {
  const regex = /^(?:\+265|265|0)?([78]8|99)\d{7}$/;
  return regex.test(phoneNumber);
}

function formatMalawiNumber(phoneNumber: string): string {
  // Remove all non-digit characters
  const cleaned = phoneNumber.replace(/\D/g, '');

  // Handle different input formats
  if (cleaned.startsWith('265')) {
    return '+' + cleaned;
  } else if (cleaned.startsWith('0')) {
    return '+265' + cleaned.slice(1);
  } else if (cleaned.length === 9) {
    return '+265' + cleaned;
  }

  throw new Error('Invalid Malawi phone number format');
}

Sending SMS to Landlines

You cannot send SMS to landline numbers in Malawi. Attempts to send messages to landline numbers will result in delivery failures, typically generating a 400 response error (code 21614) through SMS APIs, with no charges applied to your account.

Landline Number Identification:

Landline numbers in Malawi use different prefixes from mobile numbers. Landline prefixes include:

  • 01 – Fixed-line numbers (Blantyre region)
  • 05 – Fixed-line numbers (other regions)

Always validate phone numbers before sending to avoid unnecessary API calls and failed deliveries.

Malawi SMS Compliance and Regulatory Guidelines

The Malawi Communications Regulatory Authority (MACRA) oversees SMS communications under the Electronic Transactions and Cyber Security Act of 2016 and the Data Protection Act of 2024. Comply with MACRA's guidelines and consumer protection regulations when conducting SMS marketing or communications campaigns.

Key Regulatory Framework:

  • Electronic Transactions and Cyber Security Act (2016): Prohibits unsolicited electronic communications used for illegal trade or purposes. Violations carry penalties of K2,000,000 fine and imprisonment for 5 years.
  • Data Protection Act (2024): Enacted in February 2024 (Act No. 3 of 2024), this law designates MACRA as the data protection authority. The Act grants a two-year transition period for ordinary data controllers and processors, while those classified as of major importance have only six months to comply. Key requirements include maintaining records of processing activities, conducting Data Protection Impact Assessments (DPIAs) for high-risk processing, and notifying MACRA within 72 hours of a data breach. The Act applies to any organization that processes personal data within Malawi or targets individuals in Malawi.
  • Communications (Consumer Protection) Regulations (2019): Establishes consumer rights and provider obligations.

"Major Importance" Definition: Organizations are classified as of major importance if they:

  • Process personal data of more than 50,000 individuals annually
  • Operate in critical infrastructure sectors (telecommunications, banking, healthcare)
  • Process sensitive personal data on a large scale
  • Are public authorities processing personal data

Data Protection Act Compliance Checklist:

  • Appoint a Data Protection Officer (if classified as major importance)
  • Maintain detailed records of all data processing activities
  • Conduct DPIAs for high-risk SMS marketing activities
  • Implement data breach notification procedures (72-hour requirement)
  • Establish consent collection and management systems
  • Create data retention and deletion policies
  • Implement security measures for stored contact data
  • Draft privacy notices explaining SMS data usage
  • Set up cross-border data transfer safeguards (if applicable)
  • Complete registration with MACRA as data controller

Explicit Consent Requirements:

  • Obtain written or digital opt-in confirmation before sending any marketing messages
  • Include timestamp, method of collection, and scope of permission in consent records
  • Store documentation securely with regular backups
  • Ensure consent is specific to the type of messages you send

Consent Record Retention: Maintain consent records for a minimum of 7 years after the last communication with the recipient, or longer if required by your industry regulations.

Consent Form Example:

I consent to receive SMS messages from [Company Name] at the mobile number I provided. I understand that: - Message frequency may vary (maximum 4 – 5 messages per month) - Message and data rates may apply - I can opt out at any time by replying STOP - My phone number will be stored securely and not shared with third parties Signature: ________________ Date: __________ Phone Number: +265 ___ ___ ____

HELP/STOP and Other Commands

  • Include clear opt-out instructions in all marketing messages
  • Support standard keywords like "STOP", "END", and "CANCEL"
  • Honor both English and Chichewa language opt-out instructions
  • Process opt-out requests immediately
  • Send confirmation of opt-out to the user

Chichewa Opt-Out Keywords: Recognize these Chichewa-language opt-out terms:

  • SIYA (stop)
  • YAMBANI (used for opt-in/restart)
  • IMALIZA (finish/end)
  • LEKA (leave/stop)

Complete Keyword List:

EnglishChichewaAction
STOP, END, CANCEL, UNSUBSCRIBESIYA, IMALIZA, LEKAOpt-out
HELP, INFOTHANDIZO, ZAMBIRISend help information
START, YESYAMBANI, INDEOpt-in (requires prior consent)

Do Not Call / Do Not Disturb Registries

Malawi does not maintain an official Do Not Call registry. However, you should:

  • Maintain your own opt-out database
  • Honor all opt-out requests within 24 hours
  • Regularly clean contact lists to remove opted-out numbers
  • Implement a suppression list to prevent accidental messaging to opted-out numbers

Suppression List Implementation:

typescript
// Example suppression list management
class SuppressionList {
  private optedOutNumbers: Set<string> = new Set();

  async addNumber(phoneNumber: string): Promise<void> {
    const formatted = formatMalawiNumber(phoneNumber);
    this.optedOutNumbers.add(formatted);
    // Persist to database
    await db.suppressionList.create({ phoneNumber: formatted, date: new Date() });
  }

  async isOptedOut(phoneNumber: string): Promise<boolean> {
    const formatted = formatMalawiNumber(phoneNumber);
    return this.optedOutNumbers.has(formatted);
  }

  async filterRecipients(recipients: string[]): Promise<string[]> {
    return recipients.filter(async (num) => !(await this.isOptedOut(num)));
  }
}

Time Zone Sensitivity

  • Timezone: Central Africa Time (CAT), UTC+2
  • Daylight Saving Time: Not observed (timezone remains UTC+2 year-round)
  • Restrict promotional SMS messages between 8 AM and 5 PM local time (CAT/UTC+2)
  • Send emergency or service-related messages outside these hours if necessary
  • Consider cultural and religious observances when planning campaign timing

Major Malawi Holidays to Avoid:

  • New Year's Day (January 1)
  • John Chilembwe Day (January 15)
  • Martyrs' Day (March 3)
  • Good Friday (variable)
  • Easter Monday (variable)
  • Labour Day (May 1)
  • Kamuzu Day (May 14)
  • Independence Day (July 6)
  • Mother's Day (October 15)
  • Christmas Day (December 25)
  • Boxing Day (December 26)

Also avoid sending promotional messages during Ramadan (dates vary annually) if targeting Muslim audiences.

Emergency Message Examples:

  • Account security alerts (e.g., "Unusual login detected on your account")
  • Service outage notifications (e.g., "Your service will be interrupted from 2 AM – 4 AM for maintenance")
  • Payment due reminders with immediate deadlines
  • Critical health or safety information
  • Fraud alerts and verification codes (OTP/2FA)

Choosing SMS Sender IDs and Phone Number Options in Malawi

Alphanumeric Sender ID

Operator network capability: Supported Registration requirements: Pre-registration not required Sender ID preservation: Yes, sender IDs are preserved as specified

Character Limits and Restrictions:

  • Maximum length: 11 characters
  • Allowed characters: A-Z, a-z, 0-9, spaces
  • No special characters or punctuation
  • Must start with a letter (not a number)
  • Case-sensitive (displayed as sent)

Best practices: Avoid generic terms like "InfoSMS", "INFO", "Verify", and "Notify"

Effective vs. Ineffective Sender IDs:

✅ Effective❌ IneffectiveReason
BankOfMWINFOToo generic, low trust
AirtelMW12345All numbers, unclear sender
HealthClubVerifyGeneric, looks like spam
MalawiGovSMS-AlertContains special character
MyShopaToo short, unclear

Long Codes

Domestic vs. International:

  • Domestic long codes not supported
  • International long codes supported

Sender ID preservation: No, international long codes may be modified by carriers to improve deliverability or comply with local routing requirements.

Provisioning time: Immediate

Use cases: Transactional messages, alerts, and notifications

When to Use Each Option:

ScenarioRecommended OptionReason
Marketing campaignsAlphanumeric Sender IDHigh brand recognition
Transactional alertsAlphanumeric Sender IDConsistent branding
Two-way messagingNot supported in MalawiConsider alternatives
International sendingInternational long codeCross-border compatibility
High-volume OTPAlphanumeric Sender IDFast delivery, clear branding

Short Codes

Support: Not currently supported in Malawi 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 financial services
  • Political campaign messages without proper authorization
  • Cryptocurrency and investment schemes

Political Message Authorization: Political campaign messages require written authorization from:

  • The registered political party or candidate
  • MACRA (for bulk SMS campaigns exceeding 1,000 messages per day)
  • Documentation must include campaign registration details and sender identification

Penalties for Sending Restricted Content:

  • First offense: Warning and message blocking
  • Second offense: K500,000 – K1,000,000 fine
  • Repeated violations: K2,000,000 fine and up to 5 years imprisonment (under Electronic Transactions and Cyber Security Act)
  • Account suspension or permanent ban from SMS providers
  • Possible civil liability for damages

Content Filtering

Carrier Filtering Rules:

  • Messages containing certain keywords may be blocked
  • Use URLs from approved domains only
  • Ensure message content does not violate local regulations

Common Blocked Keywords (indicative list):

  • Explicit sexual content terms
  • Gambling-related terms (bet, casino, jackpot, lottery) without authorization
  • Cryptocurrency terms (Bitcoin, crypto, trading, invest) for promotional content
  • Scam-related phrases (free money, guaranteed return, act now)
  • Drug-related terms

Approved Domain Registration:

  1. Submit domain registration request to your SMS provider
  2. Provide proof of domain ownership (DNS records or SSL certificate)
  3. Demonstrate legitimate business purpose
  4. Allow 3 – 5 business days for approval
  5. Use only approved short URLs (avoid generic link shorteners)

Tips to Avoid Blocking:

  • Avoid excessive punctuation (more than one exclamation mark or question mark)
  • Use clear, straightforward language
  • Include your company name in sender ID
  • Maintain consistent sending patterns

"Excessive" Punctuation Definition:

  • ❌ More than 1 exclamation mark (e.g., "Buy now!!!")
  • ❌ Multiple question marks (e.g., "Are you interested???")
  • ❌ All caps messages (e.g., "BUY NOW GET 50% OFF")
  • ❌ Repeated special characters (e.g., "SALE")
  • ✅ Single, appropriate punctuation (e.g., "Limited offer. Buy now!")

Best Practices for Sending SMS in Malawi

Messaging Strategy

  • Keep messages under 160 characters when possible
  • Include clear call-to-action
  • Use personalization tokens thoughtfully
  • Maintain consistent brand voice

Effective Message Templates:

Example 1 – Transactional: "Hi [FirstName], your payment of K[Amount] was received. Receipt: [ShortURL]. Thank you for your business! – [CompanyName]" Example 2 – Promotional: "[FirstName], get 20% off your next purchase at [CompanyName]. Show this SMS in-store by [Date]. Shop now: [URL]" Example 3 – Reminder: "Reminder: Your appointment with [CompanyName] is tomorrow at [Time]. Reply CONFIRM or call 0888123456. – [CompanyName]"

Personalization Token Guidelines:

  • Use only tokens you have verified data for (empty tokens look unprofessional)
  • Limit to 2 – 3 tokens per message to maintain readability
  • Always include fallback text for missing data
  • Test thoroughly before sending to large lists
typescript
// Example personalization with fallbacks
function personalizeMessage(template: string, user: User): string {
  return template
    .replace('[FirstName]', user.firstName || 'Customer')
    .replace('[Amount]', user.amount?.toString() || 'your payment')
    .replace('[Date]', user.date || 'soon');
}

Sending Frequency and Timing

  • Limit to 4 – 5 messages per month per recipient
  • Respect time restrictions (8 AM – 5 PM CAT/UTC+2)
  • Consider local holidays and events
  • Space messages at least 3 – 5 days apart to avoid fatigue

Message Spacing Guidelines:

Message TypeMinimum IntervalMaximum Frequency
Promotional7 days4 messages/month
TransactionalImmediate (as needed)Unlimited
Reminders3 days8 messages/month
AlertsImmediate (as needed)Unlimited

Localization

  • Support both English and Chichewa
  • Use appropriate cultural references
  • Consider regional differences in language usage
  • Test messages with local audience

Chichewa Translation Resources:

  • Hire local translators through Malawi Translation Services Association
  • Use translation memory tools to maintain consistency
  • Avoid direct machine translation (Google Translate) for customer-facing content
  • Have native speakers review all Chichewa content
  • Consider regional variations (Northern vs. Southern Chichewa dialects)

Cultural References That Work Well:

  • Local sports teams (Big Bullets, Silver Strikers football clubs)
  • National pride references (Independence Day, national symbols)
  • Agricultural seasons (planting season: November – December, harvest: April – May)
  • Community values (family, respect for elders, Ubuntu philosophy)
  • Local landmarks and cities (Lilongwe, Blantyre, Lake Malawi)

Avoid:

  • Assumptions about literacy levels
  • Complex financial or technical jargon without explanation
  • References to seasonal events from other regions (e.g., winter, autumn)

Opt-Out Management

  • Process opt-outs within 24 hours
  • Maintain centralized opt-out database
  • Confirm opt-out status to users
  • Conduct regular audits of opt-out processes

Opt-Out Database Implementation:

typescript
// Complete opt-out management system
import { PrismaClient } from '@prisma/client';

const prisma = new PrismaClient();

interface OptOutRecord {
  phoneNumber: string;
  optOutDate: Date;
  source: 'STOP_KEYWORD' | 'WEB_FORM' | 'MANUAL';
  campaignId?: string;
}

async function processOptOut(record: OptOutRecord): Promise<void> {
  // Add to database
  await prisma.optOut.create({
    data: {
      phoneNumber: record.phoneNumber,
      optOutDate: record.optOutDate,
      source: record.source,
      campaignId: record.campaignId,
    },
  });

  // Remove from active campaigns
  await prisma.campaignRecipient.deleteMany({
    where: { phoneNumber: record.phoneNumber },
  });

  // Send confirmation
  await sendSMS({
    to: record.phoneNumber,
    message: 'You have been unsubscribed. You will not receive further messages from us.',
    senderId: 'YourBrand',
  });

  // Log for audit
  console.log(`Opt-out processed: ${record.phoneNumber} at ${record.optOutDate}`);
}

async function checkOptOutStatus(phoneNumber: string): Promise<boolean> {
  const record = await prisma.optOut.findUnique({
    where: { phoneNumber },
  });
  return record !== null;
}

Testing and Monitoring

  • Test across both TNM and Airtel networks
  • Monitor delivery rates by carrier
  • Track engagement metrics
  • Perform regular performance analysis
  • Test during different times of day

Benchmark Delivery Rates:

  • Excellent: 95%+ delivery rate
  • Good: 90% – 95% delivery rate
  • Acceptable: 85% – 90% delivery rate
  • Poor: Below 85% (investigate issues immediately)

Key Metrics to Track:

MetricTarget RangeAction if Outside Range
Delivery Rate90%+Check number validation, operator routing
Delivery Time< 30 secondsContact SMS provider about routing issues
Opt-Out Rate< 2% per campaignReview message content and frequency
Bounce Rate< 5%Clean contact list, validate numbers
Engagement Rate5% – 15%Test different CTAs and message timing

SMS API Integrations for Malawi

Twilio

Twilio provides robust SMS capabilities for sending messages to Malawi. Here's how to implement it:

typescript
import { Twilio } from 'twilio';

// Initialize Twilio client with your credentials
const client = new Twilio(
  process.env.TWILIO_ACCOUNT_SID,
  process.env.TWILIO_AUTH_TOKEN
);

async function sendSMSToMalawi(
  to: string,
  message: string,
  senderId: string
): Promise<void> {
  try {
    // Validate phone number before sending
    if (!isValidMalawiNumber(to)) {
      throw new Error(`Invalid Malawi phone number: ${to}`);
    }

    // Ensure proper formatting for Malawi numbers
    const formattedNumber = formatMalawiNumber(to);

    const response = await client.messages.create({
      body: message,
      from: senderId, // Alphanumeric sender ID
      to: formattedNumber,
      // Optional parameters for delivery tracking
      statusCallback: 'https://your-webhook.com/status'
    });

    console.log(`Message sent successfully! SID: ${response.sid}`);
  } catch (error) {
    console.error('Error sending message:', error);
    throw error;
  }
}

Webhook Implementation for Status Callbacks:

typescript
import express from 'express';

const app = express();
app.use(express.urlencoded({ extended: false }));

app.post('/status', (req, res) => {
  const {
    MessageSid,
    MessageStatus,
    To,
    ErrorCode,
    ErrorMessage
  } = req.body;

  console.log(`Message ${MessageSid} to ${To}: ${MessageStatus}`);

  // Handle different statuses
  switch (MessageStatus) {
    case 'delivered':
      // Update database, trigger follow-up actions
      break;
    case 'failed':
    case 'undelivered':
      console.error(`Delivery failed: ${ErrorCode} - ${ErrorMessage}`);
      // Queue for retry or alert admin
      break;
    case 'sent':
      // Message sent to carrier, awaiting delivery confirmation
      break;
  }

  res.sendStatus(200);
});

app.listen(3000);

Sinch

Sinch offers direct carrier connections in Malawi. Implementation example:

typescript
import { SinchClient } from '@sinch/sdk';

const sinch = new SinchClient({
  servicePlanId: process.env.SINCH_SERVICE_PLAN_ID,
  apiToken: process.env.SINCH_API_TOKEN,
  region: 'africa-1'
});

async function sendSinchSMS(
  recipientNumber: string,
  messageText: string
): Promise<void> {
  try {
    const response = await sinch.messages.send({
      from: 'YourBrand', // Alphanumeric sender ID
      to: [recipientNumber],
      body: messageText,
      // Enable delivery reports
      deliveryReport: 'summary'
    });

    console.log('Message batch ID:', response.id);

    // Parse delivery report
    const deliveryStatus = await sinch.messages.get(response.id);
    console.log('Delivery status:', deliveryStatus.status);
  } catch (error) {
    console.error('Sinch SMS error:', error);
    throw error;
  }
}

Delivery Report Parsing:

typescript
interface DeliveryReport {
  id: string;
  status: 'Queued' | 'Dispatched' | 'Delivered' | 'Failed' | 'Expired';
  recipient: string;
  timestamp: Date;
}

async function parseDeliveryReport(batchId: string): Promise<DeliveryReport[]> {
  const batch = await sinch.messages.get(batchId);

  return batch.recipients.map(recipient => ({
    id: batch.id,
    status: recipient.status,
    recipient: recipient.to,
    timestamp: new Date(recipient.deliveredAt || recipient.failedAt)
  }));
}

MessageBird

MessageBird provides reliable SMS delivery to Malawi:

typescript
import { MessageBird } from 'messagebird';

const messagebird = MessageBird(process.env.MESSAGEBIRD_API_KEY);

interface SMSResponse {
  id: string;
  status: string;
}

async function sendMessageBirdSMS(
  to: string,
  message: string
): Promise<SMSResponse> {
  return new Promise((resolve, reject) => {
    messagebird.messages.create({
      originator: 'CompanyName',
      recipients: [to],
      body: message,
      // Delivery report webhook
      reportUrl: 'https://your-domain.com/delivery-reports'
    }, (err, response) => {
      if (err) {
        reject(err);
        return;
      }
      resolve(response);
    });
  });
}

Webhook Handler for Delivery Reports:

typescript
import express from 'express';

const app = express();
app.use(express.json());

app.post('/delivery-reports', (req, res) => {
  const {
    id,
    recipient,
    status,
    statusDatetime,
    statusErrorCode
  } = req.body;

  console.log(`Message ${id} to ${recipient}: ${status}`);

  // Store delivery status in database
  db.deliveryReports.create({
    messageId: id,
    recipient,
    status,
    timestamp: new Date(statusDatetime),
    errorCode: statusErrorCode
  });

  // Handle failed deliveries
  if (status === 'failed') {
    handleFailedDelivery(id, recipient, statusErrorCode);
  }

  res.sendStatus(200);
});

API Rate Limits and Throughput

Standard Rate Limits:

  • Twilio: Varies by account type and verification (check current limits in Twilio Console)
  • Sinch: Service plan-based rate limits; batches queued in FIFO order; 10-recipient batch counts as 10 messages toward limit
  • MessageBird (now Bird): Varies by account configuration

Throughput Management Strategies:

  • Implement exponential backoff for retries
  • Use message queuing systems (Redis, RabbitMQ)
  • Batch messages in groups of 50 – 100
  • Monitor delivery rates and adjust sending speed
  • Note: Rate limits depend on service plan, account status, and routing; verify current limits in your provider's console

Exponential Backoff Implementation:

typescript
async function sendWithRetry(
  sendFunction: () => Promise<void>,
  maxRetries: number = 3
): Promise<void> {
  let attempt = 0;

  while (attempt < maxRetries) {
    try {
      await sendFunction();
      return; // Success
    } catch (error) {
      attempt++;

      if (attempt >= maxRetries) {
        throw error; // Max retries reached
      }

      // Exponential backoff: 1s, 2s, 4s, 8s...
      const delayMs = Math.pow(2, attempt) * 1000;
      console.log(`Retry ${attempt} after ${delayMs}ms`);
      await new Promise(resolve => setTimeout(resolve, delayMs));
    }
  }
}

Message Queuing Setup with Redis:

typescript
import { Queue, Worker } from 'bullmq';
import Redis from 'ioredis';

const connection = new Redis({
  host: process.env.REDIS_HOST,
  port: 6379,
  maxRetriesPerRequest: null
});

// Create SMS queue
const smsQueue = new Queue('sms-malawi', { connection });

// Add messages to queue
async function queueSMS(to: string, message: string, senderId: string) {
  await smsQueue.add('send-sms', {
    to,
    message,
    senderId
  }, {
    attempts: 3,
    backoff: {
      type: 'exponential',
      delay: 2000
    }
  });
}

// Process queue
const worker = new Worker('sms-malawi', async (job) => {
  const { to, message, senderId } = job.data;
  await sendSMSToMalawi(to, message, senderId);
}, { connection });

worker.on('completed', (job) => {
  console.log(`Job ${job.id} completed`);
});

worker.on('failed', (job, err) => {
  console.error(`Job ${job?.id} failed:`, err);
});

Error Handling and Reporting

Common Error Scenarios:

  • Invalid phone numbers
  • Network timeouts
  • Carrier rejections
  • Rate limit exceeded

Best Practices:

typescript
// Error type detection
function isTemporaryError(error: any): boolean {
  const temporaryErrorCodes = [
    429, // Rate limit exceeded
    503, // Service unavailable
    504, // Gateway timeout
    30001, // Twilio: Queue overflow
    30002, // Twilio: Account suspended
    30003, // Twilio: Unreachable destination
    30005, // Twilio: Unknown destination
    30006, // Twilio: Landline or unreachable carrier
  ];

  return temporaryErrorCodes.includes(error.code) ||
         error.status >= 500 && error.status < 600;
}

// Complete error handling implementation
async function handleSMSError(error: any): Promise<void> {
  const errorLog = {
    timestamp: new Date().toISOString(),
    errorCode: error.code,
    errorMessage: error.message,
    recipientNumber: error.recipient,
    retryCount: error.retryCount || 0
  };

  // Log to monitoring system
  await logger.error('SMS_DELIVERY_FAILED', errorLog);

  // Implement retry logic for temporary failures
  if (isTemporaryError(error) && errorLog.retryCount < 3) {
    await queueForRetry(errorLog);
  } else {
    // Permanent failure - notify admin
    await alertAdmin(errorLog);
  }
}

Malawi-Specific Carrier Error Codes:

Error CodeCarrierDescriptionAction
21614AllInvalid phone numberValidate and correct number format
30003AllUnreachable destinationCheck if number is active, verify operator
30006AllLandline or unreachableFilter landline numbers before sending
30007AllMessage blocked by carrierReview content, check for restricted keywords
30008TNM/AirtelUnknown errorRetry after 5 minutes, contact provider

Frequently Asked Questions (FAQ)

What phone number format do I need for sending SMS to Malawi?

Use the E.164 international format: +265 followed by 9 digits. For mobile numbers, the format is +265 plus the operator prefix (77 or 88 for TNM, 88 or 99 for Airtel) and subscriber number. For example: +265881234567 (TNM) or +265991234567 (Airtel). Malawi does not use geographic area codes.

What are the SMS compliance requirements in Malawi?

You must comply with MACRA regulations under three key acts: the Electronic Transactions and Cyber Security Act (2016), Data Protection Act (2024), and Communications (Consumer Protection) Regulations (2019). Obtain written or digital opt-in consent before sending marketing messages, include opt-out instructions, and respect time restrictions (send only between 8 AM – 5 PM CAT/UTC+2). Violations of the Electronic Transactions Act carry penalties of K2,000,000 fine and 5 years imprisonment.

Can I use mobile number portability (MNP) when sending SMS in Malawi?

Yes, Mobile Number Portability has been operational in Malawi since January 2020. MACRA oversees the MNP process, which typically takes 24 – 48 hours to complete. Most major SMS providers (Twilio, Sinch, MessageBird) automatically perform MNP lookups to ensure messages are routed to the correct operator. Always use current operator information rather than relying on historical data, as numbers can be ported between TNM and Airtel.

Which mobile operators support SMS in Malawi?

Malawi has two major operators: TNM (Telekom Networks Malawi) with 44% market share and Airtel Malawi with 56% market share (2024). TNM covers over 88% of the country with 2G, 3G, 4G LTE, and 5G networks (5G launched July 2025 in Lilongwe). A third operator, Malcel, received a license in 2022 and is preparing to enter the market with a $280 million investment. Test your SMS campaigns across both TNM and Airtel networks to ensure optimal delivery.

What SMS features are supported in Malawi?

Malawi supports concatenated messages (160 characters per segment with GSM-7 encoding, 70 characters for Unicode), alphanumeric sender IDs without pre-registration (max 11 characters), and international long codes. However, two-way SMS, domestic long codes, short codes, and direct MMS are not supported. MMS content is automatically converted to SMS with an embedded URL link.

What are the SMS API rate limits for Malawi?

Rate limits vary by provider and service plan. Twilio limits depend on account type (check your console), Sinch uses service plan-based limits with FIFO queuing (10-recipient batch counts as 10 messages), and MessageBird (now Bird) varies by account configuration. Implement exponential backoff for retries, use message queuing systems like Redis or RabbitMQ, and batch messages in groups of 50 – 100 for optimal throughput.

What timezone should I use for SMS sending in Malawi?

Malawi uses Central Africa Time (CAT), which is UTC+2 year-round with no daylight saving time adjustments. Restrict promotional SMS messages to between 8 AM and 5 PM CAT (UTC+2). Emergency or service-related messages (security alerts, OTP codes, critical notifications) may be sent outside these hours if necessary. Always consider cultural and religious observances, including major holidays and Ramadan, when scheduling campaigns.

How do I implement SMS in Malawi using Twilio, Sinch, or MessageBird?

All three providers support Malawi SMS. Use Twilio's Node.js SDK with proper +265 number formatting and statusCallback for delivery tracking. Sinch requires the africa-1 region configuration with service plan-based rate limits and delivery report parsing. MessageBird (now Bird) uses alphanumeric sender IDs with delivery report webhooks. Implement proper error handling for invalid phone numbers, network timeouts, carrier rejections, and rate limit exceeded scenarios.

How much does it cost to send SMS in Malawi?

SMS costs vary by provider, volume, and service plan. Typical ranges are $0.03 – $0.10 per message segment. Remember that concatenated messages count as multiple segments (e.g., a 320-character message costs 2× a single message). Contact your SMS provider for volume discounts. Most providers offer tiered pricing: higher volumes receive lower per-message rates. Factor in additional costs for delivery reports, MNP lookups, and number validation services.

How long does SMS delivery take in Malawi?

Typical SMS delivery times range from 5 – 30 seconds under normal network conditions. Factors affecting delivery time include:

  • Network congestion (higher during peak hours: 12 PM – 2 PM, 6 PM – 9 PM)
  • Operator routing efficiency (TNM vs. Airtel)
  • Message volume (bulk sends may be throttled)
  • International vs. local routing
  • MNP lookup processing time

If messages consistently take longer than 60 seconds to deliver, contact your SMS provider about routing optimizations.


Recap and Additional Resources

Quick Reference Checklist

Pre-Launch:

  • Validate all phone numbers against Malawi format (+265 + 9 digits)
  • Implement consent collection and record-keeping system
  • Register with MACRA as data controller (if applicable)
  • Configure alphanumeric sender ID (max 11 characters)
  • Set up suppression list for opt-out management
  • Implement time restrictions (8 AM – 5 PM CAT/UTC+2)
  • Configure delivery status webhooks
  • Set up error handling and retry logic
  • Create message templates with proper character limits
  • Test across both TNM and Airtel networks

Post-Launch Monitoring:

  • Track delivery rates by carrier (target: 90%+ delivery)
  • Monitor opt-out rates (target: <2% per campaign)
  • Audit consent records quarterly
  • Clean contact lists monthly (remove invalid numbers)
  • Review message performance metrics weekly
  • Update suppression list in real-time
  • Test message delivery during different times of day
  • Verify MNP lookups are functioning correctly
  • Maintain compliance documentation
  • Conduct annual compliance review with legal counsel

Compliance Essentials:

  • Obtain explicit consent before sending marketing messages
  • Support STOP/HELP keywords in English and Chichewa
  • Process opt-outs within 24 hours
  • Maintain consent records for 7+ years
  • Notify MACRA within 72 hours of data breaches
  • Avoid restricted content (gambling, adult, crypto without authorization)
  • Respect major holidays and cultural observances
  • Include clear sender identification in all messages
  • Limit promotional messages to 4 – 5 per month per recipient
  • Implement Data Protection Impact Assessments for high-risk processing

Next Steps

  1. Review MACRA regulations at macra.mw
  2. Review Electronic Transactions and Cyber Security Act (2016) for compliance requirements
  3. Review Data Protection Act (2024) and determine your classification (ordinary vs. major importance)
  4. Consult with local legal counsel for compliance review
  5. Set up test accounts with preferred SMS providers (Twilio, Sinch, or MessageBird)
  6. Implement proper error handling and monitoring systems
  7. Conduct test campaigns with small audience segments (50 – 100 recipients)
  8. Monitor delivery rates and adjust implementation based on results
  9. Scale gradually after confirming 90%+ delivery rates
  10. Schedule quarterly compliance audits

Additional Resources

Frequently Asked Questions

How to send SMS messages in Malawi?

Use a reputable SMS API provider like Twilio, Sinch, or MessageBird, ensuring correct number formatting (+265) and alphanumeric sender ID. Implement proper error handling and retry mechanisms for optimal delivery rates and monitor performance across both major Malawian carriers (TNM and Airtel).

What is the SMS market like in Malawi?

Malawi's mobile market is dominated by TNM and Airtel, with SMS being a primary communication method. While OTT apps are growing, SMS remains crucial due to broader coverage, especially in rural areas where TNM covers over 88% of the country through 2G, 3G, and 4G services.

Why does two-way SMS have limited support in Malawi?

Two-way SMS is not fully supported by most providers, meaning businesses typically cannot receive replies through standard SMS channels. This limitation affects interactive messaging services.

When should I send marketing SMS messages in Malawi?

Promotional messages are allowed between 8 AM and 5 PM local time (UTC+2). Avoid sending outside these hours unless it's an emergency or essential service-related communication. Consider local holidays and events when scheduling campaigns.

Can I use short codes for SMS in Malawi?

Short codes are not currently supported in Malawi. Consider using alphanumeric sender IDs or international long codes for your SMS campaigns, as these are the available options.

What are the character limits for SMS in Malawi?

Standard SMS messages use GSM-7 encoding with 160 characters per segment. Unicode (UTF-8) messages, often needed for local languages like Chichewa, are limited to 70 characters per segment. Concatenated messaging is supported.

How to comply with SMS regulations in Malawi?

Obtain explicit consent (written or digital) before sending marketing messages. Include clear opt-out instructions (STOP, END, CANCEL) in both English and Chichewa. Respect messaging time restrictions and adhere to content guidelines set by MACRA.

What is the role of MACRA in Malawi's SMS landscape?

The Malawi Communications Regulatory Authority (MACRA) regulates SMS communications under the Electronic Transactions and Cyber Security Act of 2016. All businesses must comply with MACRA's guidelines for SMS marketing and communications.

How to handle SMS opt-outs in Malawi?

Process opt-out requests promptly (within 24 hours) and maintain a centralized opt-out database. Send confirmation of the opt-out to the user and regularly audit your processes to ensure compliance.

What SMS content is restricted in Malawi?

Gambling, adult content, unauthorized financial services, political campaign messages without proper authorization, and cryptocurrency or investment schemes are restricted. Content filtering is also in place for certain keywords and unapproved URLs.

What are the best practices for sending SMS in Malawi?

Keep messages concise (under 160 characters), personalize content, and use a clear call to action. Send a maximum of 4-5 messages per recipient monthly, localizing content in both English and Chichewa.

How to use alphanumeric sender IDs in Malawi?

Alphanumeric sender IDs are supported and do not require pre-registration. Avoid generic terms like "InfoSMS" or "Notify" and use your company name for clear identification. Note that sender IDs are preserved.

What are the API rate limits for SMS providers in Malawi?

Typical rate limits are around 50-100 messages per second, depending on the provider (Twilio, Sinch, MessageBird). Implement strategies like message queuing and exponential backoff to manage throughput and avoid exceeding limits.

What are some common SMS error scenarios in Malawi and how to handle them?

Common errors include invalid numbers, network timeouts, and carrier rejections. Implement thorough error handling with retry logic for temporary failures, logging errors for analysis, and monitoring delivery rates.

Where can I find more information on SMS guidelines for Malawi?

Consult MACRA's official website for regulations and guidelines ([www.macra.org.mw](https://www.macra.org.mw)). Refer to SMS provider documentation (Twilio, Sinch, MessageBird) for technical implementation details and best practices.