Skip to main content

Auto Retry on Busy

Auto retry automatically redials a phone number when the initial call attempt fails due to a busy signal, no answer, or network failure. This is essential for outbound campaigns and callback scenarios where reaching the customer is critical.

How Auto Retry Works​

Call attempt 1 → Customer busy / no answer
|
v
Wait (retry interval, e.g., 30 minutes)
|
v
Call attempt 2 → Customer busy / no answer
|
v
Wait (retry interval)
|
v
Call attempt 3 → Customer answers → Connected
(or max attempts reached → Mark as unreachable)

Retry Triggers​

Auto retry activates based on the call outcome:

OutcomeShould Retry?Reason
BusyYesCustomer is on another call; they may be free later
No answerYesCustomer may have been away from the phone
FailedYes (once)Network issue may be temporary
CompletedNoCall was successful
CanceledNoCall was canceled by the system or user
Invalid numberNoNumber does not exist; retry will not help
DNDNoNumber is on the Do Not Disturb registry

Configuring Auto Retry​

For Outbound Campaigns​

When setting up a campaign via the dashboard or Campaigns API, configure the retry settings:

SettingDescriptionRecommended Value
Max retry attemptsMaximum number of additional attempts after the first2-3
Retry intervalTime between retry attempts30-60 minutes
Retry on busyRetry when the line is busyYes
Retry on no answerRetry when no one answersYes
Retry on failedRetry on network/connection failureYes (1 attempt)
Retry time windowRestrict retries to certain hours9 AM - 9 PM
Total attemptsFirst attempt + retries3-4 total

Via Dashboard​

  1. Go to Campaigns > Create Campaign (or edit existing).
  2. In the Retry Settings section:
    • Enable Auto Retry.
    • Set Max Retry Attempts (e.g., 2).
    • Set Retry Interval (e.g., 60 minutes).
    • Select which outcomes trigger a retry.
  3. Save.

Via API​

curl -X POST 'https://<api_key>:<api_token>@api.exotel.com/v1/Accounts/<account_sid>/Campaigns' \
-H 'Content-Type: application/json' \
-d '{
"name": "Payment_Reminders",
"caller_id": "<exophone>",
"call_flow_id": "<flow_id>",
"numbers": ["+919876543210", "+919876543211"],
"retry": {
"max_attempts": 3,
"interval_minutes": 60,
"retry_on": ["busy", "no-answer", "failed"]
},
"schedule": {
"daily_start": "09:00",
"daily_end": "21:00"
}
}'

For Individual API Calls​

When using the Connect Two Numbers API or Connect to Flow API, implement retry logic in your application:

import time
import requests

def call_with_retry(customer_number, max_retries=3, interval_seconds=1800):
for attempt in range(1, max_retries + 1):
response = exotel_api.connect_call(
from_number=agent_number,
to_number=customer_number,
caller_id=exophone
)

call_sid = response['Call']['Sid']

# Wait for call to complete
call_status = wait_for_completion(call_sid)

if call_status in ['completed', 'in-progress']:
print(f"Call connected on attempt {attempt}")
return call_sid

if call_status in ['busy', 'no-answer']:
if attempt < max_retries:
print(f"Attempt {attempt} failed ({call_status}). Retrying in {interval_seconds}s...")
time.sleep(interval_seconds)
else:
print(f"All {max_retries} attempts exhausted. Customer unreachable.")
return None

if call_status == 'failed':
# Only retry once for failures
if attempt == 1:
time.sleep(60)
continue
return None

return None

Using Status Callbacks for Retry Triggers​

Instead of polling for call status, use Status Callbacks to trigger retries:

# Your webhook endpoint
def handle_call_callback(request):
call_sid = request.POST['CallSid']
status = request.POST['Status']
customer_number = request.POST['To']

if status in ['busy', 'no-answer']:
# Check retry count
retry_count = db.get_retry_count(customer_number)

if retry_count < MAX_RETRIES:
# Schedule retry
scheduler.schedule(
func=make_call,
args=[customer_number],
delay=timedelta(minutes=60)
)
db.increment_retry_count(customer_number)
else:
db.mark_as_unreachable(customer_number)

elif status == 'completed':
db.mark_as_contacted(customer_number)

return Response(status=200)

Retry Interval Strategies​

StrategyInterval PatternBest For
Fixed interval60 min, 60 min, 60 minSimple, predictable
Increasing interval30 min, 60 min, 120 minAvoids annoyance from frequent retries
Time-of-day basedRetry at 10 AM, 2 PM, 5 PMTargets different parts of the day
Smart intervalBased on past answer patternsData-driven, highest connection rate

Fixed Interval​

Retries happen at consistent intervals:

Attempt 1: 10:00 AM → No answer
Attempt 2: 11:00 AM → Busy
Attempt 3: 12:00 PM → Connected

Increasing Interval (Exponential Backoff)​

Each retry waits longer than the previous:

Attempt 1: 10:00 AM → No answer
Attempt 2: 10:30 AM → No answer (30 min later)
Attempt 3: 11:30 AM → No answer (60 min later)
Attempt 4: 1:30 PM → Connected (120 min later)

This reduces the risk of annoying customers with frequent calls.

Time-of-Day Based​

Retry at specific times known for higher answer rates:

Attempt 1: 10:00 AM → No answer
Attempt 2: 2:00 PM → Busy
Attempt 3: 5:00 PM → Connected
tip

Data from most outbound campaigns shows that answer rates are highest between 10-11 AM and 4-6 PM on weekdays. Schedule your retries to target these windows.

Retry Limits and Safety​

Maximum Attempts​

ContextRecommended MaxReason
Payment reminders3-4 attemptsImportant but not urgent
Delivery confirmations2-3 attemptsTime-sensitive
Sales outreach2-3 attemptsAvoid appearing aggressive
Appointment reminders2 attemptsSingle reminder is usually sufficient
Emergency notifications5-6 attemptsCritical to reach the person

Regulatory Limits​

RegulationLimit
TRAI (India)Maximum calls during 9 AM - 9 PM only
General best practiceNo more than 3-5 call attempts per number per day
DND complianceDo not retry DND-registered numbers
warning

Excessive retries can lead to complaints and your ExoPhone being flagged as spam. Limit total attempts to 3-4 per number per day, and always respect the customer's right to opt out.

Monitoring Retry Performance​

Track these metrics to optimize your retry strategy:

MetricDescriptionTarget
First-attempt connection rateCalls connected on the first tryAbove 40%
Retry connection rateCalls connected on retry attemptsAbove 30% per retry
Total connection rateCalls connected across all attemptsAbove 70%
Average attempts to connectMean number of attempts before connectionUnder 2
Unreachable rateNumbers that could not be reached after all retriesUnder 20%
Retry ROIAdditional connections gained from retriesPositive (each retry should add >10% connections)

Diminishing Returns​

Track whether additional retries are worth the cost:

AttemptConnection Rate (Cumulative)Incremental Gain
1st attempt40%--
2nd attempt60%+20%
3rd attempt70%+10%
4th attempt73%+3%
5th attempt74%+1%

In this example, the 4th and 5th attempts yield diminishing returns and may not justify the cost and annoyance.

Best Practices​

  • Start with 2-3 retries -- This reaches most available customers without excessive attempts.
  • Use increasing intervals -- Give customers time between attempts.
  • Vary the time of day -- If the first attempt was morning, retry in the afternoon.
  • Respect opt-outs -- If a customer indicates they do not want to be called, stop retrying immediately.
  • Monitor connection rates per retry -- If the 3rd retry adds less than 5% connections, it may not be worth the cost.
  • Combine with SMS -- After 1-2 failed call attempts, send an SMS asking the customer to call back at their convenience.
  • Filter invalid numbers -- Do not retry numbers that are invalid, disconnected, or on DND.

Troubleshooting​

IssueCauseSolution
Retries not happeningAuto retry not enabledEnable in campaign settings
Too many retriesMax attempts set too highReduce to 2-3
Retries at wrong timesRetry window not configuredSet daily start/end times
Same number retried after connectionStatus not updated correctlyCheck status callback handling
Retries flooding agentsToo many concurrent retriesLimit concurrency in campaign settings