Skip to main content

Campaign Reports & Analytics

Campaign reporting gives you visibility into how your outbound voice campaigns are performing. This guide covers how to access campaign statistics, download CDRs (Call Detail Records), interpret call status breakdowns, and use webhook data for real-time monitoring.

Campaign Status Overview​

Every campaign tracks aggregate statistics that update in real time as calls are processed.

Retrieving Campaign Stats​

curl "https://<api_key>:<api_token>@api.exotel.com/v2/accounts/<account_sid>/campaigns/<campaign_id>"

The response includes a stats object:

{
"response": [{
"code": 200,
"status": "success",
"data": {
"id": "camp_abc123",
"name": "Payment Reminder Q1",
"status": "Completed",
"stats": {
"created": 2500,
"completed": 1875,
"failed": 425,
"pending": 0,
"in_progress": 0,
"busy": 87,
"no_answer": 113
}
}
}]
}

Stats Field Reference​

FieldDescription
createdTotal contacts in the campaign
completedContacts successfully reached (call answered)
failedContacts not reached after all attempts (including retries)
pendingContacts waiting to be processed
in_progressCalls currently active
busyLast attempt resulted in a busy signal
no_answerLast attempt was not answered
tip

Poll the campaign stats endpoint periodically during the campaign to build a real-time monitoring dashboard. A 30-second polling interval provides near-real-time visibility without excessive API calls.

Call Detail Records (CDRs)​

CDRs provide granular, per-call information for every attempt in your campaign, including retries.

Retrieving CDRs via API​

Use the Campaign Call Details endpoint to list all call attempts:

curl "https://<api_key>:<api_token>@api.exotel.com/v2/accounts/<account_sid>/campaigns/<campaign_id>/call-details?offset=0&limit=50"

API Reference: See Campaign Call Details for complete endpoint documentation.

CDR Fields​

Each call detail record contains:

FieldDescriptionExample
call_sidUnique identifier for the call attempta1b2c3d4e5f6
toRecipient phone number+919876543210
fromExoPhone (caller ID)0XXXXXX4890
statusCall outcomecompleted, busy, no-answer, failed
start_timeWhen the call was initiated2024-02-01T10:05:32+05:30
end_timeWhen the call ended2024-02-01T10:06:15+05:30
durationCall duration in seconds43
recording_urlURL to the call recording (if enabled)https://...
attempt_numberWhich attempt this was (1 = first, 2+ = retry)1
priceCost of this call attempt in pulses2

Pagination​

CDR results are paginated. Use offset and limit parameters to iterate through all records:

# First page
curl "https://.../campaigns/<campaign_id>/call-details?offset=0&limit=100"

# Second page
curl "https://.../campaigns/<campaign_id>/call-details?offset=100&limit=100"

Continue incrementing offset until the response contains fewer records than the limit.

Call Status Breakdown​

Understanding call status distribution helps you identify issues and optimize future campaigns.

Status Categories​

StatusCategoryDescription
completedSuccessCall was answered; IVR or greeting was played
busyRetriableRecipient's line was engaged
no-answerRetriableCall rang but was not picked up within the ring timeout
failedTerminalCall could not connect (invalid number, network error, DND)
canceledTerminalCall was cancelled before connecting (campaign paused or force-completed)

Calculating Key Metrics​

Use CDR data to calculate campaign performance metrics:

MetricFormulaHealthy Range
Connect Rate(completed / created) x 10040--70%
Answer Rate(completed / (completed + no_answer + busy)) x 10050--80%
Failure Rate(failed / created) x 100Below 15%
Retry Success Rate(completed on retries / total retried) x 10020--40%
Average Call DurationSum of durations / completed callsVaries by use case
info

Connect rates vary significantly by industry, time of day, and audience type. B2B campaigns during business hours typically achieve higher connect rates than B2C campaigns. Track your own benchmarks over time rather than relying solely on industry averages.

Real-Time Monitoring with Webhooks​

Webhooks provide push-based reporting. Configure callback URLs when creating your campaign to receive real-time updates.

Call Status Callback​

Fires after each individual call attempt:

{
"CallSid": "a1b2c3d4e5f6",
"To": "+919876543210",
"From": "0XXXXXX4890",
"Status": "completed",
"Duration": "43",
"RecordingUrl": "https://...",
"DateCreated": "2024-02-01T10:05:32+05:30"
}

Use cases: Real-time dashboard updates, immediate follow-up actions (send SMS after completed call).

Call Schedule Callback​

Fires when all retry attempts for a specific contact are exhausted:

{
"To": "+919876543210",
"FinalStatus": "no-answer",
"AttemptCount": 3,
"CampaignSid": "camp_abc123"
}

Use cases: Trigger fallback actions (send SMS if voice failed), flag contacts for manual follow-up.

Campaign Status Callback​

Fires when the entire campaign transitions to a new status (e.g., Completed, Paused):

{
"CampaignSid": "camp_abc123",
"Status": "Completed",
"Stats": {
"created": 2500,
"completed": 1875,
"failed": 425
}
}

Use cases: Generate final campaign report, trigger post-campaign workflows, notify stakeholders.

API Reference: See the Campaign Webhooks reference for complete payload specifications.

Dashboard Reports​

The Exotel dashboard provides visual reporting for campaigns without requiring API calls.

Accessing Campaign Reports​

  1. Log in to my.exotel.com
  2. Navigate to Campaigns in the left sidebar
  3. Click on a specific campaign to view its details
  4. The campaign detail page shows statistics, contact status breakdown, and call logs

Dashboard Report Features​

FeatureDescription
Status pie chartVisual breakdown of completed, failed, busy, no-answer, and pending contacts
Timeline graphCalls processed over time, showing throughput and patterns
Contact listSearchable list of all contacts with their current status and attempt count
Export to CSVDownload the full campaign report as a CSV file

Exporting Campaign Data from Dashboard​

  1. Open the campaign detail page
  2. Click the Export button in the top-right corner
  3. Select the date range and fields to include
  4. Download the CSV file

The exported CSV contains one row per contact with columns for phone number, final status, attempt count, last call duration, and timestamps.

Building Custom Reports​

For advanced reporting needs, combine CDR data with your CRM or analytics platform.

Step 1: Collect Data via Webhooks​

Configure call_status_callback to send per-call data to your data warehouse or analytics endpoint.

Step 2: Enrich with Contact Metadata​

If you uploaded contacts via CSV with metadata columns (name, email, tag), join CDR data with your contact list to create enriched reports.

Step 3: Calculate Business Metrics​

Business MetricData SourceCalculation
Cost per connected contactCDR price fieldTotal campaign cost / completed calls
Average attempts to connectCDR attempt_numberSum of attempt_number for completed / total completed
Revenue per campaignCRM + CDRRevenue attributed to campaign contacts / campaign cost
Best time to callCDR timestampsGroup completed calls by hour; find peak connect hours

Analyzing Retry Effectiveness​

Compare connect rates across attempt numbers to evaluate whether your retry configuration is effective:

AttemptContactsConnectedConnect Rate
1st attempt2,5001,50060%
1st retry1,00025025%
2nd retry75012517%
Total2,5001,87575%

In this example, retries improved the overall connect rate from 60% to 75%, adding 375 connected contacts.

tip

If your retry connect rate drops below 10% on a specific retry attempt, the additional retries may not be cost-effective. Consider reducing number_of_retries or increasing interval_mins to space retries further apart.

Troubleshooting Report Issues​

IssueCauseSolution
CDR counts do not match campaign statsPagination not exhaustedIterate through all pages using offset and limit
Webhook events missingEndpoint returned non-200 responseEnsure your webhook endpoint returns HTTP 200 within 5 seconds
Recording URL returns 404Recording retention expiredDownload recordings promptly; default retention is 90 days
Status shows "pending" after campaign completedCampaign was force-completedPending contacts in a force-completed campaign are marked as failed
CSV export is emptyNo contacts processed yetWait until the campaign has started processing contacts

Next Steps​