Automated Calls
Automated calls (also known as robocalls or voice broadcasts) are outbound calls initiated programmatically without a live agent on the line. When the recipient answers, they hear a pre-recorded message or interact with an IVR flow. Automated calls are used for appointment reminders, payment notifications, surveys, alerts, and marketing messages.
How Automated Calls Work
Your application triggers a call via API
|
v
Exotel calls the customer
|
v
Customer answers
|
v
Pre-recorded message plays (or IVR flow starts)
|
v
Customer interacts (presses keys) or listens
|
v
Call ends → Status callback sent to your server
Unlike agent-assisted calls, automated calls do not involve a human agent. The entire interaction is handled by the call flow.
Common Use Cases
| Use Case | Description | Example Message |
|---|---|---|
| Appointment reminders | Remind customers of upcoming appointments | "Your appointment is tomorrow at 3 PM. Press 1 to confirm, 2 to reschedule." |
| Payment reminders | Notify about due or overdue payments | "Your payment of Rs. 500 is due on January 20. Press 1 for payment options." |
| Order updates | Inform about order status changes | "Your order #1234 has been shipped and will arrive by January 22." |
| Delivery notifications | Alert about upcoming deliveries | "Your delivery is scheduled between 2-4 PM today. Press 1 if someone will be available." |
| OTP / Verification | Deliver one-time passwords via voice | "Your verification code is 4-5-7-8. Repeating: 4-5-7-8." |
| Surveys | Collect customer feedback via DTMF | "How would you rate your experience? Press 1 for excellent, 2 for good, 3 for poor." |
| Emergency alerts | Broadcast urgent notifications | "Severe weather alert for your area. Stay indoors and follow safety guidelines." |
| Marketing promotions | Promote offers to opted-in customers | "Exclusive offer: 30% off on all electronics this weekend. Press 1 for details." |
| Event reminders | Remind about upcoming events | "Reminder: The webinar starts in 1 hour. Join at example.com/webinar." |
Setting Up Automated Calls
Method 1: Single Automated Call (API)
Use the Connect to Flow API to call a single number and connect them to an IVR flow:
curl -u '<api_key>:<api_token>' -X POST 'https://api.exotel.com/v1/Accounts/<account_sid>/Calls/connect.json' \
-d 'From=<customer_number>' \
-d 'CallerId=<exophone>' \
-d 'Url=http://my.exotel.com/exoml/start/<app_id>' \
-d 'StatusCallback=https://your-app.com/call-status'
Parameters:
| Parameter | Required | Description |
|---|---|---|
From | Yes | Customer's phone number |
CallerId | Yes | ExoPhone to display as caller ID |
Url | Yes | The call flow (App) URL to execute when the customer answers |
StatusCallback | No | URL to receive call completion details |
TimeLimit | No | Maximum call duration in seconds |
TimeOut | No | Time in seconds to ring the called party before treating the call as unanswered. The timer runs only during ringing and stops once the call is answered. |
Method 2: Bulk Automated Calls (Campaign)
For calling large lists, use the Campaigns API:
curl -u '<api_key>:<api_token>' -X POST 'https://api.exotel.com/v1/Accounts/<account_sid>/Campaigns' \
-H 'Content-Type: application/json' \
-d '{
"name": "Appointment_Reminders_Jan20",
"caller_id": "<exophone>",
"call_flow_id": "<flow_id>",
"type": "automated",
"numbers": [
"+919876543210",
"+919876543211",
"+919876543212"
],
"schedule": {
"start_time": "2025-01-20T09:00:00+05:30",
"end_time": "2025-01-20T18:00:00+05:30"
},
"retry": {
"max_attempts": 2,
"interval_minutes": 60
},
"concurrency": 10
}'
See: Outbound Dialer for detailed campaign setup.
Method 3: Event-Triggered Automated Calls
Trigger automated calls from your application when specific events occur:
# Example: Trigger appointment reminder 24 hours before
def send_appointment_reminder(appointment):
if appointment.datetime - now() <= timedelta(hours=24):
exotel_api.connect_to_flow(
from_number=appointment.customer_phone,
caller_id=exophone,
flow_url=f"http://my.exotel.com/exoml/start/{REMINDER_FLOW_ID}",
status_callback="https://your-app.com/reminder-status"
)
Common event triggers:
| Event | Automated Call Action |
|---|---|
| Appointment created | Schedule reminder call 24 hours before |
| Payment overdue | Trigger payment reminder call |
| Order shipped | Call with delivery ETA |
| Account activity detected | Security alert call |
| Subscription expiring | Renewal reminder call |
Designing Automated Call Flows
Informational Call (No Interaction)
A simple call that plays a message and hangs up:
Greeting ("Your order #1234 has been shipped. Expected delivery: January 22.")
→ Hangup
Interactive Call (With DTMF Input)
A call that collects caller input via keypress:
Greeting ("Your appointment is scheduled for tomorrow at 3 PM.")
→ IVR Menu ("Press 1 to confirm, Press 2 to reschedule, Press 3 to cancel.")
→ 1: Greeting ("Thank you for confirming.") → Hangup
→ 2: Greeting ("We will call you to reschedule.") → SMS (reschedule link) → Hangup
→ 3: Greeting ("Your appointment has been cancelled.") → Hangup
Survey Call
Collect structured feedback:
Greeting ("Thank you for being our customer. We would like your feedback.")
→ IVR Q1 ("How would you rate your experience? 1 for excellent, 2 for good, 3 for poor.")
→ IVR Q2 ("Would you recommend us? 1 for yes, 2 for no.")
→ Greeting ("Thank you for your feedback!") → Hangup
OTP Delivery Call
Deliver a verification code via voice:
Greeting ("Your verification code is 4. 5. 7. 8. Repeating: 4. 5. 7. 8.")
→ Hangup
When delivering OTPs via voice, read each digit individually with a pause between them. Repeat the code at least once. This ensures the listener can note it down accurately.
Personalized Automated Calls
For personalized messages (e.g., including the customer's name, order number, or balance), use the Passthru applet to dynamically generate greetings:
Using Dynamic TTS
- Add a Passthru applet at the start of the flow.
- Your server returns personalized text.
- A TTS Greeting applet reads the personalized message.
Passthru → Your server returns: "Hello Rahul, your balance is Rs. 1,500."
→ Greeting (TTS, dynamic text) → Hangup
Using Pre-Recorded Audio with Variables
- Pre-record common message segments.
- Use Passthru to determine which segments to play.
- Chain multiple Greeting applets with the appropriate segments.
Greeting ("Your order") → Greeting (order number audio) → Greeting ("has been shipped") → Hangup
Handling Call Outcomes
Use Status Callbacks to track the outcome of each automated call:
| Status | Meaning | Your Action |
|---|---|---|
completed | Customer answered and heard the message | Mark as delivered |
no-answer | Customer did not answer | Schedule retry (see Auto Retry) |
busy | Customer's line was busy | Schedule retry |
failed | Call could not be placed | Check number validity |
canceled | Call was canceled before connection | Review campaign settings |
Capturing IVR Responses
When the automated call includes an IVR, capture the customer's DTMF input via the Passthru applet or status callback:
# Status callback with IVR response
POST https://your-app.com/call-status
CallSid=<call_sid>&Status=completed&Digits=1&From=<customer_number>
Store the response in your database for follow-up actions:
def handle_reminder_response(request):
digits = request.POST.get('Digits', '')
customer = request.POST['From']
if digits == '1':
db.confirm_appointment(customer)
elif digits == '2':
db.flag_for_reschedule(customer)
elif digits == '3':
db.cancel_appointment(customer)
Scheduling Automated Calls
| Scheduling Method | How It Works |
|---|---|
| Immediate | Call is placed as soon as the API request is made |
| Scheduled (campaign) | Campaign starts at a specified date/time |
| Event-triggered | Call is triggered by an application event (cron job, webhook, etc.) |
| Recurring | Set up a recurring schedule (daily, weekly) for regular reminders |
Timing Best Practices
| Time Window | Call Type | Notes |
|---|---|---|
| 9:00 AM - 10:00 AM | Appointment reminders | Start of day, high attention |
| 10:00 AM - 12:00 PM | Surveys, general notifications | Peak answer rates |
| 2:00 PM - 4:00 PM | Payment reminders | Afternoon follow-ups |
| 4:00 PM - 6:00 PM | Delivery confirmations | Before end of business |
| 6:00 PM - 9:00 PM | Marketing, promotions | Evening availability (respect limits) |
Comply with TRAI regulations by restricting automated calls to 9 AM - 9 PM IST. Calls outside this window may result in penalties. Always filter out DND-registered numbers unless you have explicit prior consent.
Compliance for Automated Calls
| Requirement | Details |
|---|---|
| TRAI calling hours | 9:00 AM - 9:00 PM IST only |
| DND compliance | Must not call DND-registered numbers without consent |
| Consent | Obtain prior consent for promotional automated calls |
| Opt-out | Provide an option to opt out (e.g., "Press 9 to stop receiving these calls") |
| Caller ID | Must display a valid registered ExoPhone |
| Frequency limits | Avoid calling the same number more than 2-3 times per day |
Adding an Opt-Out Option
Include an opt-out key in your IVR:
IVR ("Press 1 to confirm, Press 2 to reschedule, or Press 9 to stop receiving these calls.")
→ 9: Greeting ("You have been removed from our call list.") → Hangup
→ Webhook: remove customer from future campaigns
Monitoring and Analytics
Track automated call performance:
| Metric | Description | Target |
|---|---|---|
| Delivery rate | Calls where the customer answered | Above 50% |
| Completion rate | Calls where the full message was heard | Above 40% |
| IVR response rate | Calls where the customer pressed a key | Above 30% |
| Action rate | Calls that resulted in the desired action | Depends on use case |
| Opt-out rate | Customers who opted out | Below 2% |
See: Call Analytics
Best Practices
- Keep messages under 30 seconds -- Automated calls with long messages have high hang-up rates.
- Get to the point immediately -- State the purpose within the first 5 seconds.
- Always provide IVR options -- Let customers interact rather than just listen.
- Offer opt-out -- Include a way to stop receiving automated calls.
- Personalize when possible -- Include the customer's name or relevant details.
- Test before mass deployment -- Call yourself first to verify the message, audio quality, and IVR flow.
- Monitor and iterate -- Review delivery and response rates after each campaign and optimize.
- Combine with SMS -- For critical notifications, send an SMS as a backup in case the call is not answered.
Troubleshooting
| Issue | Cause | Solution |
|---|---|---|
| Customer hears nothing | Flow has no Greeting applet | Add a Greeting as the first step |
| Call drops after greeting | No IVR or Hangup applet after greeting | Add the next applet in the flow |
| IVR responses not captured | Passthru or callback not configured | Set up a Passthru or status callback URL |
| Low answer rate | Unknown caller ID | Enable Truecaller Verification |
| Calls placed outside allowed hours | Schedule not configured | Set daily start/end times in campaign |
| Too many concurrent calls | Concurrency too high | Reduce concurrency setting |