Home
cd ../playbooks
Developer ToolsAdvanced

Twilio SMS Integration

Automate SMS communications, two-way messaging, notifications, and voice workflows with Twilio

10 minutes
By communitySource
#twilio#sms#messaging#notifications#voice

Adding SMS notifications or two-way messaging to your app means wrestling with Twilio's API documentation, webhook handling, and phone number provisioning. This playbook automates Twilio SMS integration — sending notifications, handling inbound messages, building conversational flows, and managing voice workflows.

Who it's for: developers adding SMS notifications to web applications and SaaS products, operations teams building automated SMS alert systems for monitoring and incidents, marketing engineers implementing SMS campaign delivery and opt-in management, healthcare developers building appointment reminder and patient communication systems, e-commerce developers adding order status SMS notifications and delivery updates

Example

"Add SMS order notifications and delivery updates to our app" → Twilio pipeline: phone number provisioning and Twilio account configuration, outbound SMS notification system for order confirmations and shipping updates, webhook handler for inbound customer SMS replies, opt-in/opt-out management for compliance, and delivery receipt tracking with retry logic for failed messages

CLAUDE.md Template

New here? 3-minute setup guide → | Already set up? Copy the template below.

# Twilio SMS Automation

Comprehensive workflow for automating SMS, voice, and verification workflows with Twilio.

## Core Workflows

### 1. SMS Messaging Flow

```
SMS AUTOMATION FLOW:
┌─────────────────┐
│    Trigger      │
│  (Event/API)    │
└────────┬────────┘
         ▼
┌─────────────────┐
│  Message Build  │
│  - Template     │
│  - Personalize  │
└────────┬────────┘
         ▼
┌─────────────────┐
│  Number Lookup  │
│  - Validate     │
│  - Format       │
└────────┬────────┘
         ▼
┌─────────────────┐
│     Send        │
│  - Twilio API   │
│  - Queue        │
└────────┬────────┘
         ▼
┌─────────────────┐
│    Delivery     │
│  - Status       │
│  - Callback     │
└─────────────────┘
```

### 2. Message Configuration

```yaml
sms_config:
  sender:
    phone_number: "+1234567890"
    messaging_service_sid: "MG..."  # For higher throughput
    
  defaults:
    status_callback: "https://api.example.com/sms/status"
    validity_period: 14400  # 4 hours
    
  rate_limiting:
    messages_per_second: 10
    daily_limit_per_recipient: 5
    
  compliance:
    opt_out_keywords: ["STOP", "UNSUBSCRIBE", "CANCEL"]
    opt_in_required: true
    quiet_hours:
      start: "21:00"
      end: "09:00"
      timezone: "America/New_York"
```

## Message Templates

### Notification Templates

```yaml
templates:
  order_confirmation:
    content: |
      {{company}}: Your order #{{order_id}} has been confirmed!
      Total: ${{total}}
      Track: {{tracking_url}}
      Reply HELP for assistance.
    max_length: 160
    
  shipping_update:
    content: |
      {{company}}: Your order #{{order_id}} has shipped!
      Carrier: {{carrier}}
      Tracking: {{tracking_number}}
      Delivery: {{estimated_date}}
    
  appointment_reminder:
    content: |
      Reminder: Your appointment with {{provider}} is tomorrow at {{time}}.
      Location: {{address}}
      Reply C to confirm or R to reschedule.
    
  two_factor:
    content: |
      Your {{company}} verification code is: {{code}}
      This code expires in 10 minutes.
      Don't share this code with anyone.
```

### Conversational Templates

```yaml
two_way_messaging:
  welcome:
    trigger: opt_in
    response: |
      Welcome to {{company}} updates! 
      You'll receive order and shipping notifications.
      Reply HELP for commands or STOP to unsubscribe.
      
  help:
    trigger: ["HELP", "?", "INFO"]
    response: |
      {{company}} SMS Commands:
      STATUS - Check order status
      TRACK - Get tracking info
      SUPPORT - Contact support
      STOP - Unsubscribe
      
  status_inquiry:
    trigger: ["STATUS", "ORDER"]
    action: lookup_order
    response: |
      Order #{{order_id}}: {{status}}
      {{#if tracking}}
      Tracking: {{tracking_url}}
      {{/if}}
      
  unsubscribe:
    trigger: ["STOP", "UNSUBSCRIBE"]
    action: opt_out
    response: |
      You've been unsubscribed from {{company}} messages.
      Reply START to resubscribe anytime.
```

## Verification (2FA)

### Verify API Integration

```yaml
verification_config:
  channel: sms  # or: call, email, whatsapp
  
  code_settings:
    length: 6
    expiry_minutes: 10
    
  rate_limits:
    max_attempts: 5
    lockout_minutes: 30
    
  templates:
    sms: "Your {{company}} code is {{code}}"
    call: "Your verification code is {{code_spoken}}"
```

### Verification Flow

```javascript
// Start Verification
const verification = await twilio.verify.v2
  .services('VA...')
  .verifications
  .create({
    to: '+1234567890',
    channel: 'sms',
    customCode: '123456', // Optional
    locale: 'en'
  });

// Check Verification
const check = await twilio.verify.v2
  .services('VA...')
  .verificationChecks
  .create({
    to: '+1234567890',
    code: '123456'
  });

// Result
if (check.status === 'approved') {
  // Verification successful
} else {
  // Invalid code
}
```

## Voice Automation

### Outbound Calls

```yaml
voice_config:
  outbound_call:
    from: "+1234567890"
    twiml_url: "https://api.example.com/voice/script"
    status_callback: "https://api.example.com/voice/status"
    timeout: 30
    record: true
    
  twiml_script: |
    <?xml version="1.0" encoding="UTF-8"?>
    <Response>
      <Say voice="alice">
        Hello {{name}}, this is a reminder about your
        appointment tomorrow at {{time}}.
      </Say>
      <Gather numDigits="1" action="/handle-response">
        <Say>Press 1 to confirm, 2 to reschedule.</Say>
      </Gather>
    </Response>
```

### IVR Menu

```yaml
ivr_menu:
  greeting: |
    Thank you for calling {{company}}.
    For sales, press 1.
    For support, press 2.
    For billing, press 3.
    To speak with an operator, press 0.
    
  routing:
    - digit: "1"
      action: transfer
      destination: "+1987654321"
      queue: "sales"
      
    - digit: "2"
      action: transfer
      destination: "+1876543210"
      queue: "support"
      
    - digit: "3"
      action: transfer
      destination: "+1765432109"
      queue: "billing"
      
    - digit: "0"
      action: operator
      fallback: voicemail
```

## Bulk Messaging

### Campaign Configuration

```yaml
bulk_campaign:
  name: "Holiday Promotion"
  
  audience:
    source: segment
    filter:
      opted_in: true
      last_purchase: "> 30_days"
      
  message:
    template: holiday_promo
    variables:
      discount_code: "HOLIDAY20"
      
  schedule:
    start_time: "2024-11-25T10:00:00"
    timezone: "America/New_York"
    batch_size: 100
    delay_between_batches: 60  # seconds
    
  tracking:
    delivery_report: true
    click_tracking: true
    conversion_tracking: true
```

### Broadcast Status

```
CAMPAIGN STATUS: Holiday Promotion
═══════════════════════════════════════

Progress: ████████████████░░░░ 78%

DELIVERY STATS:
Sent:        7,800
Delivered:   7,450 (95.5%)
Failed:      125 (1.6%)
Pending:     225 (2.9%)

ENGAGEMENT:
Clicks:      1,245 (16.7%)
Replies:     89 (1.2%)
Opt-outs:    23 (0.3%)

ERRORS:
Invalid Number:  45
Unsubscribed:    52
Carrier Block:   18
Rate Limited:    10

ESTIMATED COMPLETION: 25 minutes
```

## Phone Number Management

### Number Lookup

```yaml
number_lookup:
  capabilities:
    - carrier_info
    - caller_name
    - line_type
    
  validation:
    - check_format
    - verify_active
    - detect_landline_vs_mobile
    
  example_response:
    phone_number: "+14155551234"
    country_code: "US"
    carrier:
      name: "Verizon"
      type: "mobile"
    caller_name: "John Doe"
    valid: true
```

### Number Provisioning

```yaml
number_management:
  search_criteria:
    country: "US"
    area_code: "415"
    capabilities: ["SMS", "MMS", "Voice"]
    
  purchase:
    phone_number: "+14155559999"
    friendly_name: "Marketing Line"
    sms_url: "https://api.example.com/sms/incoming"
    voice_url: "https://api.example.com/voice/incoming"
```

## Analytics Dashboard

```
SMS ANALYTICS - LAST 30 DAYS
═══════════════════════════════════════

VOLUME:
Sent:        45,230
Delivered:   43,456 (96.1%)
Failed:      1,774 (3.9%)

BY TYPE:
Notifications  ████████████░░░░ 62%
Marketing      ██████░░░░░░░░░░ 23%
2FA            ████░░░░░░░░░░░░ 15%

DELIVERY BY CARRIER:
Verizon     ████████████████ 97%
AT&T        ███████████████░ 95%
T-Mobile    ██████████████░░ 94%
Sprint      █████████████░░░ 92%

COST:
Total Spend:     $1,245.67
Per Message:     $0.0275
Per Delivered:   $0.0287

ENGAGEMENT:
Link Clicks:     3,456 (7.9%)
Replies:         892 (2.1%)
Opt-outs:        56 (0.1%)
```

## API Examples

### Send SMS

```javascript
// Simple SMS
const message = await twilio.messages.create({
  body: 'Hello from Twilio!',
  from: '+1234567890',
  to: '+0987654321',
  statusCallback: 'https://api.example.com/sms/status'
});

// With Messaging Service (recommended for scale)
const message = await twilio.messages.create({
  body: 'Order confirmed!',
  messagingServiceSid: 'MG...',
  to: '+0987654321'
});

// MMS with Media
const mms = await twilio.messages.create({
  body: 'Check out this image!',
  from: '+1234567890',
  to: '+0987654321',
  mediaUrl: ['https://example.com/image.jpg']
});
```

### Handle Incoming SMS

```javascript
// Express webhook handler
app.post('/sms/incoming', (req, res) => {
  const { From, Body } = req.body;
  
  const twiml = new twilio.twiml.MessagingResponse();
  
  if (Body.toUpperCase() === 'STATUS') {
    twiml.message('Your order is on the way!');
  } else {
    twiml.message('Thanks for your message. We\'ll respond shortly.');
  }
  
  res.type('text/xml');
  res.send(twiml.toString());
});
```

## Best Practices

1. **Get Consent**: Always have opt-in before messaging
2. **Include Opt-Out**: STOP keyword in every message
3. **Respect Quiet Hours**: Don't message late night
4. **Validate Numbers**: Use Lookup API before sending
5. **Handle Failures**: Retry logic for transient errors
6. **Monitor Delivery**: Track delivery rates by carrier
7. **Stay Compliant**: Follow TCPA/CTIA guidelines
8. **Use Templates**: Consistent, tested messages

Get new playbooks like this one

One email a week with new Claude Code workflows. Free, like everything here.

No spam. Unsubscribe anytime.

README.md

What This Does

Comprehensive workflow for automating SMS, voice, and verification workflows with Twilio.


Quick Start

Step 1: Create a Project Folder

mkdir -p ~/Documents/TwilioSms

Step 2: Download the Template

Click Download above, then:

mv ~/Downloads/CLAUDE.md ~/Documents/TwilioSms/

Step 3: Start Working

cd ~/Documents/TwilioSms
claude

Best Practices

  1. Get Consent: Always have opt-in before messaging
  2. Include Opt-Out: STOP keyword in every message
  3. Respect Quiet Hours: Don't message late night
  4. Validate Numbers: Use Lookup API before sending
  5. Handle Failures: Retry logic for transient errors
  6. Monitor Delivery: Track delivery rates by carrier
  7. Stay Compliant: Follow TCPA/CTIA guidelines
  8. Use Templates: Consistent, tested messages

$Related Playbooks

Developer Tools

Webhook Automation Builder

Build and manage webhook-based integrations for real-time event processing and API connections

10 minutes
Advanced
Developer Tools

Web App Testing

Test local web applications with Playwright automation for frontend verification, UI debugging, and screenshot capture.

15 minutes
Intermediate
Developer Tools

Agent DX CLI Scale

A 7-axis, 0-21 scoring scale for evaluating how well a CLI is designed for AI agents rather than humans — machine-readable output, raw payload input, schema introspection, context-window discipline, input hardening, safety rails, and agent knowledge packaging.

5 minutes
Intermediate
Developer Tools

Agent Design Philosophy

A mental model for designing AI agents in any domain — the model already knows how to be an agent, so design is about capabilities, knowledge, and context, added only as far as a Progressive Complexity ladder (basic → planning → subagents → skills) that real usage actually demands.

10 minutes
Intermediate
Developer Tools

Documentation Review System

Mode-routed documentation review that diagnoses a page against its doc type and seven quality dimensions before touching a sentence, then picks the intervention level — maintenance, improve, rewrite, author, or strategy — that actually matches what's wrong.

10 minutes
Intermediate
Developer Tools

Writing for AI Agents: A Craft Reference

A theory of writing any document an agent consumes — skills, CLAUDE.md, reference docs — built on context pointers, an information hierarchy of steps versus disclosed reference, completion criteria, and leading words that anchor behavior in the fewest tokens.

10 minutes
Advanced
Developer Tools

Agent Prompt Architect

A compact seven-field skeleton (Role, Goal, Inputs, Constraints, Process, Output, Verification, Fallback) and a fast refinement loop for turning vague intent into a prompt an agent can execute reliably every time.

5 minutes
Beginner
Developer Tools

CEO-Mode Plan Review

Review a technical or product plan the way a great CEO would — pick a mode (expand scope, cherry-pick expansions, hold scope, or cut ruthlessly), then apply nine prime directives and eleven cognitive patterns to catch every silent failure, missing edge case, and unnamed error before it ships.

10 minutes
Advanced
Developer Tools

Designer's Figma-to-Production Workflow

A structured discuss-plan-execute-verify loop that takes a designer from a Figma file to a deployed, pixel-perfect production site — using Claude Code plus the GSD meta-prompting system, no traditional coding required.

20 minutes
Intermediate
Developer Tools

Agent SDK App Builder

Scaffold new Claude Agent SDK applications in TypeScript or Python, and verify existing ones against official SDK patterns before you ship.

10 minutes
Intermediate
Developer Tools

Distinctive Frontend Design

Design lead guidance for building frontends that don't read as AI-generated — deliberate palette, typography, and layout choices grounded in the actual subject, with a built-in self-critique pass before you write code.

5 minutes
Intermediate
Developer Tools

Brandkit Generator: Premium Identity Board Creator

An image-direction rule set that produces a complete brand-guidelines board in one image: logo concept, color system, typography, and applications, grounded in brand strategy instead of random logo generation

5 minutes
Beginner

Browse all Developer Tools playbooks →