How to Diagnose Amazon Connect Outbound Campaign Throttling Using CloudWatch and CloudTrail
Step-by-step diagnostic methodology for identifying which campaign quota causes outbound call failures, using metric correlation and event analysis.
How to Diagnose Amazon Connect Outbound Campaign Throttling Using CloudWatch and CloudTrail
Introduction
When Amazon Connect outbound campaigns experience longer-than-expected connect times or silently fail to dial contacts, the root cause is often throttling at the campaign level rather than a flow logic issue. Standard troubleshooting focuses on contact flows and agent availability, but campaign-level rate limits operate beneath that layer and produce symptoms that are easy to misattribute.
This article provides a step-by-step diagnostic methodology to identify which campaign quota is being hit, quantify the impact, and resolve it.
Understanding Campaign Throttle Types
Amazon Connect enforces two distinct campaign-level quotas that interact with each other:
1. Concurrent campaign active calls per instance
The maximum number of simultaneous active calls that campaigns can sustain. When this limit is hit, new campaign dial attempts receive a fast busy tone. This quota is shared across all campaigns running on the instance.
2. Campaign calls per second (CPS) rate
The maximum number of new outbound calls that campaigns can initiate per second. When this limit is hit, excess dial requests are throttled and not placed. This quota is also shared across all campaigns on the instance.
These are separate from the instance-level concurrent calls quota. You can have plenty of instance-level capacity but still hit campaign-specific limits.
💡 Key insight: If you run multiple campaigns simultaneously, they collectively consume the shared CPS allocation. Five campaigns running at once do not each get the full CPS limit — they share it.
Symptoms
Look for these indicators that campaign-level throttling may be occurring:
- ⏱️ Outbound campaign connect time exceeds expected values (for example, 4-5 seconds instead of under 2 seconds)
- 📞 Contacts are dialed but receive fast busy tones
- 📊 Campaign throughput plateaus despite available agents
- ❌
DisconnectReasonshows connection failures not attributable to the destination number - 📉 Campaign dials per minute metric is lower than expected given available agent capacity
Step 1: Check CloudWatch Metrics
Open the CloudWatch console and navigate to Metrics → All metrics → AWS/Connect. Select your instance ID and graph the following metrics over a 24-hour period with 1-minute granularity.
Primary indicators
| Metric | What it reveals |
|---|---|
ThrottledCalls | Direct count of calls rejected due to campaign rate limiting. If this is nonzero, you are hitting a campaign quota. |
CallsBreachingConcurrencyQuota | Calls rejected because the concurrent limit was reached. |
ConcurrentCalls | Current active calls. Compare peak to your campaign active calls quota. |
ConcurrentCallsPercentage | How close you are to your configured concurrent call limit. |
CallsPerInterval | Total calls (inbound + outbound) per second. Reveals if inbound traffic consumes campaign capacity. |
Pattern recognition
🔴 Pattern A — CPS throttling
ThrottledCalls is consistently nonzero throughout campaign operating hours, but ConcurrentCalls never reaches your concurrent quota.
→ The per-second dial rate is the binding constraint, not total active calls.
🟠 Pattern B — Concurrency throttling
CallsBreachingConcurrencyQuota spikes correlate with ConcurrentCalls peaks touching or exceeding your campaign active calls limit.
→ Calls are failing because too many are active simultaneously.
🟡 Pattern C — Mixed
Both metrics are nonzero but at different times. CPS limits during ramp-up (morning), concurrency limits during steady-state (midday peak).
→ You may need to address both.
CloudWatch Metrics Insights query
Quantify daily throttled calls:
SELECT AVG(ThrottledCalls) as avg_throttled,
SUM(ThrottledCalls) as total_throttled,
MAX(ConcurrentCalls) as peak_concurrent
FROM SCHEMA("AWS/Connect", InstanceId)
WHERE InstanceId = 'YOUR_INSTANCE_ID'
GROUP BY BIN(1d)
ORDER BY BIN(1d) DESC
Step 2: Correlate with CloudTrail Events
CloudTrail captures the specific API-level rejections that CloudWatch aggregates. This gives you timestamps, error codes, and request context.
Create an Athena table for CloudTrail logs
If you do not already have CloudTrail logs queryable in Athena, create a table:
CREATE EXTERNAL TABLE cloudtrail_logs ( eventVersion STRING, eventTime STRING, eventSource STRING, eventName STRING, awsRegion STRING, sourceIPAddress STRING, userAgent STRING, errorCode STRING, errorMessage STRING, requestParameters STRING, responseElements STRING, userIdentity STRUCT< type: STRING, principalId: STRING, arn: STRING, accountId: STRING > ) PARTITIONED BY ( account STRING, region STRING, year STRING, month STRING, day STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://YOUR_CLOUDTRAIL_BUCKET/AWSLogs/'
Query for campaign throttle events
SELECT date_trunc('hour', from_iso8601_timestamp(eventTime)) AS hour, errorCode, count(*) AS throttle_count, json_extract_scalar(requestParameters, '$.instanceId') AS instance_id FROM cloudtrail_logs WHERE eventSource = 'connect.amazonaws.com' AND eventName = 'StartOutboundVoiceContact' AND errorCode = 'LimitExceededException' AND from_iso8601_timestamp(eventTime) >= current_timestamp - interval '7' day GROUP BY 1, 2, 3 ORDER BY 1 DESC
What to look for
| Signal | Meaning |
|---|---|
| Throttle events concentrated in specific hours | Campaign schedule overlap is causing contention |
Error code is LimitExceededException | Confirms a hard quota ceiling, not a transient error |
High ratio of throttled to total StartOutboundVoiceContact calls | Significant portion of dial attempts are being dropped |
Step 3: Identify the Binding Constraint
Overlay your CloudWatch and CloudTrail findings to determine the root cause:
| Observation | Binding constraint | Recommended action |
|---|---|---|
ThrottledCalls high, ConcurrentCalls well below quota | CPS rate limit | Reduce concurrent campaigns or request CPS increase |
CallsBreachingConcurrencyQuota high, ConcurrentCalls at quota | Concurrent active calls limit | Request concurrent campaign calls increase |
| Both metrics elevated simultaneously | Both limits | Address CPS first (upstream gate), then reassess concurrency |
CloudTrail LimitExceededException but CW metrics are zero | API-level throttle | Check Outbound Campaigns API rate limits (PutDialRequestBatch: 10 TPS) |
Step 4: Remediate
⚡ Immediate fixes (no quota change required)
Reduce per-campaign bandwidth allocation
Each campaign's dialing configuration includes a BandwidthAllocation setting (0.0 to 1.0). Reducing this from the default spreads the shared CPS budget more evenly across campaigns and prevents any single campaign from starving others.
Stagger campaign start times
If campaigns all start simultaneously (for example, 8:00 AM), they ramp together and spike CPS usage. Offset start times by 10-15 minutes to smooth the demand curve.
Reduce concurrent campaign count
If you run more campaigns simultaneously than your CPS allocation can support, consolidate contact lists into fewer campaigns during peak hours.
📋 Strategic fix (requires quota increase)
To request a campaign quota increase (requires Business, Enterprise On-Ramp, or Enterprise Support plan):
- Open the AWS Support Center and create a service limit increase case
- Select Amazon Connect as the service
- Specify the instance ARN and production account ID
- Include the following data points:
| Data point | Where to find it |
|---|---|
| Current daily outbound call volume | Connect admin console or CallsPerInterval metric |
| Number of concurrent campaigns | Campaign management page |
| Campaign operating hours per day | Campaign schedule configuration |
| Peak concurrent calls observed | CloudWatch ConcurrentCalls (Maximum statistic) |
| Daily throttle volume | CloudWatch ThrottledCalls (Sum statistic) |
⚠️ Note: Campaign-specific quotas (CPS rate, burst capacity, active campaign calls) may not appear in the Service Quotas console. Contact AWS Support to confirm your current values and request increases.
Step 5: Verify the Fix
After implementing changes, monitor the same metrics for a full business week:
SELECT SUM(ThrottledCalls) as daily_throttled,
MAX(ConcurrentCalls) as peak_concurrent,
SUM(CallsBreachingConcurrencyQuota) as daily_breaches
FROM SCHEMA("AWS/Connect", InstanceId)
WHERE InstanceId = 'YOUR_INSTANCE_ID'
GROUP BY BIN(1d)
ORDER BY BIN(1d) DESC
LIMIT 14
Success criteria
Compare the 7 days before your change to the 7 days after:
- ✅
ThrottledCallsdaily sum reduced by 70% or more - ✅
CallsBreachingConcurrencyQuotanear zero - ✅ Campaign connect time returning to expected values (check via outbound campaign metrics in the Connect admin console)
Quick Reference
| Step | Tool | Purpose |
|---|---|---|
| 1 | CloudWatch Metrics | Quantify throttling and identify which quota type |
| 2 | CloudTrail + Athena | Get precise timestamps and confirm error codes |
| 3 | Correlation | Determine binding constraint (CPS vs. concurrency) |
| 4 | Console + Support | Apply immediate fixes and request quota increases |
| 5 | CloudWatch Metrics | Validate resolution |
Key Takeaway
Campaign-level throttling operates below the flow layer. Standard Connect troubleshooting — reviewing flows, checking agent availability, examining disconnect reasons — will not surface campaign CPS exhaustion. You must check ThrottledCalls and CallsBreachingConcurrencyQuota explicitly, then correlate with CloudTrail to confirm which specific limit is being hit.
Related Resources
- Language
- English
Relevant content
asked 2 years ago
AWS OFFICIALUpdated 4 years ago
AWS OFFICIALUpdated 5 months ago