Kyle Seyler
December 03, 2025

TL;DR: Twilio now supports typing indicators for WhatsApp. When your backend takes a few seconds to generate a response, you can show users that something's happening instead of leaving them staring at a silent chat.
This guide covers what's new, how to implement it, and when you should (and shouldn't) use it.
As of October 2025, Twilio's WhatsApp API includes a new endpoint for triggering typing indicators. When you call it, two things happen:
The indicator disappears when you send your actual response or after 25 seconds, whichever comes first.
This is currently in Public Beta, which means a few things: the API could change before GA, it's not covered by Twilio's SLA, and it's not HIPAA-eligible or PCI-compliant. Don't use it in healthcare or payment workflows.
Users hate silence. When someone sends a message to your support bot or order lookup system, every second of no response feels like something broke. Research consistently shows that perceived wait times drop significantly when users see visual feedback that something's happening.
Typing indicators solve this by mimicking human conversation patterns. Your AI chatbot might need 3-4 seconds to process a query, call an external API, and format a response. Without a typing indicator, that gap feels like an eternity. With one, it feels like talking to someone who's thinking.
This is especially valuable for:
AI chatbots and LLM-powered responses where inference time creates noticeable delays. GPT-style responses don't generate instantly, and users need to know you haven't dropped the connection.
Order status lookups that query external systems. Database calls, inventory checks, shipping API requests, all of these take time.
Customer support workflows where context retrieval or human handoff decisions happen server-side.
Multi-step automations where you're coordinating between services before responding.
The API is straightforward. You POST to Twilio's typing indicator endpoint with the message ID you're responding to:
Copied!
curl -X POST https://messaging.twilio.com/v2/Indicators/Typing.json \-u $TWILIO_ACCOUNT_SID:$TWILIO_AUTH_TOKEN \--data-urlencode "messageId=SMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" \--data-urlencode "channel=whatsapp"
Two required parameters:
| Parameter | Description |
|---|---|
messageId | The SID of the message you're responding to. Must be a valid Twilio Message SID (starting with SM) or Media SID (starting with MM). |
channel | Must be whatsapp. |
Success returns:
Copied!
{"success": true}
That's it. No complex setup, no additional webhooks to configure.
Here's a practical pattern for a webhook that handles incoming WhatsApp messages and uses typing indicators for slower responses:
Copied!
const express = require('express');const axios = require('axios');const app = express();app.use(express.urlencoded({ extended: true }));const accountSid = process.env.TWILIO_ACCOUNT_SID;const authToken = process.env.TWILIO_AUTH_TOKEN;async function sendTypingIndicator(messageSid) {try {await axios.post('https://messaging.twilio.com/v2/Indicators/Typing.json',new URLSearchParams({messageId: messageSid,channel: 'whatsapp'}),{auth: {username: accountSid,password: authToken}});} catch (error) {console.error('Failed to send typing indicator:', error.message);}}app.post('/webhook/whatsapp', async (req, res) => {const incomingMessage = req.body.Body;const messageSid = req.body.MessageSid;const from = req.body.From;// Trigger typing indicator immediatelyawait sendTypingIndicator(messageSid);// Do your slow processing here (LLM call, database lookup, etc.)const response = await generateResponse(incomingMessage);// Send the actual replyawait sendWhatsAppMessage(from, response);res.status(200).send();});
Same pattern in Python using the requests library:
Copied!
import osimport requestsfrom flask import Flask, requestapp = Flask(__name__)account_sid = os.environ['TWILIO_ACCOUNT_SID']auth_token = os.environ['TWILIO_AUTH_TOKEN']def send_typing_indicator(message_sid):try:response = requests.post('https://messaging.twilio.com/v2/Indicators/Typing.json',data={'messageId': message_sid,'channel': 'whatsapp'},auth=(account_sid, auth_token))response.raise_for_status()except requests.RequestException as e:print(f'Failed to send typing indicator: {e}')@app.route('/webhook/whatsapp', methods=['POST'])def handle_whatsapp():incoming_message = request.form.get('Body')message_sid = request.form.get('MessageSid')from_number = request.form.get('From')# Trigger typing indicator immediatelysend_typing_indicator(message_sid)# Do your slow processing hereresponse_text = generate_response(incoming_message)# Send the actual replysend_whatsapp_message(from_number, response_text)return '', 200
Use them when:
Don't use them when:
The 25-second timeout is a hard limit. If your processing takes longer, the indicator vanishes and you're back to silence. For operations that might exceed this, consider sending a preliminary acknowledgment message before diving into the heavy processing.
A few things to keep in mind during Public Beta:
No SLA coverage. If the feature breaks, Twilio support won't prioritize it. Build graceful degradation into your error handling.
Not HIPAA/PCI compliant. If you're in healthcare or handling payment data, skip this feature until GA (and verify compliance then).
API may change. The endpoint, parameters, or behavior could shift before general availability. Keep an eye on Twilio's changelog.
Test thoroughly. Beta features can behave inconsistently. Validate in your staging environment before production.
Typing indicators are part of a broader trend: business messaging is getting more conversational. The WhatsApp Business Platform has been steadily adding features that make automated interactions feel more human, including read receipts, reactions, and now typing indicators.
Meta's Conversations 2025 conference in Miami this past July signaled where things are heading. They announced voice and video calling on the WhatsApp Business Platform (now generally available), letting customers tap a button to call directly from a chat and businesses call customers who've opted in. Business AIs are rolling out to more markets, and Status ads are coming to Ads Manager.
Looking ahead to 2026, expect AI-enabled voice support to move from experimental to production-ready. Meta has been clear that they're building toward AI agents that can handle voice interactions, not just text. For developers, this means planning for richer, multi-modal conversations where typing indicators are just one piece of a larger conversational toolkit.
For developers working directly with Meta's API rather than through Twilio, the WhatsApp Cloud API also supports typing indicators with similar functionality.
If you're building WhatsApp notifications through Courier, you can layer typing indicators into your existing workflows. Courier handles the orchestration and routing logic while Twilio provides the WhatsApp delivery, and adding a typing indicator trigger before slow message sequences becomes a simple addition to your automation flow.
This is especially useful for complex workflows where messages might depend on data from multiple sources, AI-generated content, or conditional routing. Rather than managing typing indicator timing manually across every integration point, you can coordinate it through Courier's automation engine alongside your existing notification logic.
The pattern is straightforward: when Courier receives a trigger that will result in a WhatsApp message with processing delay, fire the typing indicator call before kicking off the content generation. Your users see the typing animation while the real work happens in the background.
For teams already using Courier with Twilio for multi-channel notification orchestration, this fits naturally into your existing architecture without adding another integration to maintain.
WhatsApp typing indicators are available now in Twilio's Public Beta. Check Twilio's documentation for the latest API details.

Expo Push Notifications: The Complete Implementation Guide (SDK 52+)
Expo push notifications are alerts sent from a server to a user's phone, even when the app isn't open. To set them up, install the expo-notifications library, ask the user for permission, and get a unique push token for their device. Your server sends a message to Expo's push service with that token, and Expo delivers it through Apple or Google. Push notifications only work on real phones, not simulators. Local notifications are different — they're scheduled by the app itself for things like reminders. You can also route Expo push through services like Courier to add email, SMS, and Slack fallbacks.
By Kyle Seyler
February 24, 2026

Best Email API Providers for Developers in 2026: SendGrid vs Postmark vs Mailgun vs SES vs Resend
Your email provider sticks with you longer than most technical decisions. Courier handles notification infrastructure for thousands of teams, so we went deep on the six email providers that show up most: SendGrid, Postmark, Mailgun, Amazon SES, Resend, and SMTP. This guide covers real API primitives, actual code from each provider's docs, Courier integration examples with provider overrides, and an honest read on where each developer experience holds up and where it breaks down. We also asked Claude to review every API and tell us which one it would wire up first. The answer surprised us.
By Kyle Seyler
February 23, 2026

A Resilient Notification Strategy for Regulated Industries
Notification compliance isn't a legal checklist—it's an infrastructure problem. In 2026, Reg E deadlines, HIPAA content rules, and TCPA consent requirements dictate your system architecture. This guide breaks down the engineering constraints of regulated notifications for fintech, healthcare, and insurance. Learn why hard-coded deadlines fail, how "alert without disclosing" works in practice, and why the smart escalation pattern (Push → SMS → Email) is the only way to satisfy both user urgency and regulatory documentation. Build systems that absorb complexity, not application code that breaks every time a state law changes.
By Kyle Seyler
February 11, 2026
© 2026 Courier. All rights reserved.