From twilio-developer-kit
Send RCS Business Messages via Twilio. Covers compliance onboarding (7-part US process), sender profile setup, sending rich cards and carousels, SMS fallback, device support (Android + iOS 18 caveats), and common errors. Use this skill when building RCS messaging or onboarding an RCS sender.
npx claudepluginhub twilio/ai --plugin twilio-developer-kitThis skill uses the workspace's default tool permissions.
RCS (Rich Communication Services) Business Messaging delivers branded, rich messages natively in the phone's default messaging app — no separate app needed. Messages show your brand logo, colors, and verified sender name. Supports rich cards, carousels, suggested actions, and media.
Guides Next.js Cache Components and Partial Prerendering (PPR): 'use cache' directives, cacheLife(), cacheTag(), revalidateTag() for caching, invalidation, static/dynamic optimization. Auto-activates on cacheComponents: true.
Guides building MCP servers enabling LLMs to interact with external services via tools. Covers best practices, TypeScript/Node (MCP SDK), Python (FastMCP).
Share bugs, ideas, or general feedback.
RCS (Rich Communication Services) Business Messaging delivers branded, rich messages natively in the phone's default messaging app — no separate app needed. Messages show your brand logo, colors, and verified sender name. Supports rich cards, carousels, suggested actions, and media.
RCS uses the same messages.create() API as SMS and WhatsApp. For the full channel comparison and onboarding sequence, see twilio-messaging-overview.
| Platform | Support | Notes |
|---|---|---|
| Android | Most devices via Google Messages | Carrier must also support RCS in the region |
| iOS | iOS 18+ | P2P RCS is not the same as RCS Business Messaging. A device that sends RCS to other people may not receive RCS Business Messages — this depends on both Apple and the carrier. Check via RcsCapabilityFetcher before sending. |
RCS availability depends on carrier approval per country. See RCS regional availability for the current list. US carriers (T-Mobile, AT&T, Verizon) are supported. Global support is expanding.
TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN
— See twilio-iam-auth-setup for credential setuppip install twilio / npm install twilioRCS onboarding takes 4-6 weeks minimum. A Twilio onboarding specialist reviews everything before carrier submission. You won't be charged until you go live.
Create your RCS Sender in Console with:
| Asset | Requirements |
|---|---|
| Display name | Must be unique — carriers reject identical names + logos |
| Logo | 224x224px, max 50KB, PNG/JPEG |
| Banner | 1140x448px, max 200KB |
| Accent color | Hex code, must have 4.5:1 contrast ratio vs white |
| Description | What your business does and why you're messaging |
| Phone number | Customer support contact number |
| Website | Must match business identity |
For US-specific compliance details, see the RCS Compliance Onboarding Guide.
US carriers require:
| Rejection reason | Fix |
|---|---|
| Display name not unique | Choose a distinct name — carriers reject duplicates |
| Logo/banner don't meet specs | Check dimensions and file size exactly |
| Privacy policy doesn't mention messaging | Add RCS/SMS data handling section |
| Sample messages don't match use case | Align samples with campaign description |
| Opt-in process too vague | Show specific UI/flow for consent collection |
| Business info doesn't match EIN | Legal name and EIN must match IRS records exactly |
| Media URLs not publicly accessible | All images/videos must be on public URLs — carriers verify during review |
RCS uses the same messages.create() API. No address prefix needed — Twilio routes based on the sender type.
Python
import os
from twilio.rest import Client
client = Client(os.environ["TWILIO_ACCOUNT_SID"], os.environ["TWILIO_AUTH_TOKEN"])
message = client.messages.create(
messaging_service_sid="MGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
to="+15558675310",
body="Your order has shipped! Track it here: https://example.com/track/12345"
)
print(message.sid, message.status)
Node.js
const twilio = require("twilio");
const client = twilio(process.env.TWILIO_ACCOUNT_SID, process.env.TWILIO_AUTH_TOKEN);
const message = await client.messages.create({
messagingServiceSid: "MGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
to: "+15558675310",
body: "Your order has shipped! Track it here: https://example.com/track/12345",
});
console.log(message.sid, message.status);
Use Content Templates for rich RCS messages (cards with images, titles, descriptions, and action buttons). Create templates via twilio-content-template-builder, then send with contentSid:
Python
message = client.messages.create(
messaging_service_sid="MGxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
to="+15558675310",
content_sid="HXxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
content_variables='{"1": "Order #12345", "2": "$49.99"}'
)
When a recipient's device doesn't support RCS Business Messaging, Twilio automatically falls back to SMS — no code changes needed. This is handled at the Messaging Service level.
messagingServiceSid, Twilio checks RCS capability first, then falls back to SMSA single brand can have multiple RCS senders, but each must have a distinct use case (e.g., one for transactional, one for marketing). The use case must be clearly different — carriers reject duplicate-purpose senders for the same brand.
ISVs (Independent Software Vendors) registering RCS senders for client businesses:
| Error | Meaning | Fix |
|---|---|---|
| Sender not approved | RCS sender hasn't completed carrier approval | Complete compliance onboarding; use test devices in the meantime |
| Device not capable | Recipient can't receive RCS Business Messages | Twilio falls back to SMS automatically if fallback is configured |
| Media URL inaccessible | Rich card image/video not publicly accessible | Host media on public URLs |
| Display name rejected | Name conflicts with existing RCS sender | Choose a unique display name |
twilio-messaging-overviewtwilio-content-template-buildertwilio-messaging-servicestwilio-compliance-onboardingtwilio-numbers-senders