Skip to content

How to Diagnose Amazon Connect Outbound Campaign Throttling Using CloudWatch and CloudTrail

8 minute read
Content level: Intermediate
0

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
  • DisconnectReason shows 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

MetricWhat it reveals
ThrottledCallsDirect count of calls rejected due to campaign rate limiting. If this is nonzero, you are hitting a campaign quota.
CallsBreachingConcurrencyQuotaCalls rejected because the concurrent limit was reached.
ConcurrentCallsCurrent active calls. Compare peak to your campaign active calls quota.
ConcurrentCallsPercentageHow close you are to your configured concurrent call limit.
CallsPerIntervalTotal 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

SignalMeaning
Throttle events concentrated in specific hoursCampaign schedule overlap is causing contention
Error code is LimitExceededExceptionConfirms a hard quota ceiling, not a transient error
High ratio of throttled to total StartOutboundVoiceContact callsSignificant portion of dial attempts are being dropped

Step 3: Identify the Binding Constraint

Overlay your CloudWatch and CloudTrail findings to determine the root cause:

ObservationBinding constraintRecommended action
ThrottledCalls high, ConcurrentCalls well below quotaCPS rate limitReduce concurrent campaigns or request CPS increase
CallsBreachingConcurrencyQuota high, ConcurrentCalls at quotaConcurrent active calls limitRequest concurrent campaign calls increase
Both metrics elevated simultaneouslyBoth limitsAddress CPS first (upstream gate), then reassess concurrency
CloudTrail LimitExceededException but CW metrics are zeroAPI-level throttleCheck 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):

  1. Open the AWS Support Center and create a service limit increase case
  2. Select Amazon Connect as the service
  3. Specify the instance ARN and production account ID
  4. Include the following data points:
Data pointWhere to find it
Current daily outbound call volumeConnect admin console or CallsPerInterval metric
Number of concurrent campaignsCampaign management page
Campaign operating hours per dayCampaign schedule configuration
Peak concurrent calls observedCloudWatch ConcurrentCalls (Maximum statistic)
Daily throttle volumeCloudWatch 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:

  • ThrottledCalls daily sum reduced by 70% or more
  • CallsBreachingConcurrencyQuota near zero
  • ✅ Campaign connect time returning to expected values (check via outbound campaign metrics in the Connect admin console)

Quick Reference

StepToolPurpose
1CloudWatch MetricsQuantify throttling and identify which quota type
2CloudTrail + AthenaGet precise timestamps and confirm error codes
3CorrelationDetermine binding constraint (CPS vs. concurrency)
4Console + SupportApply immediate fixes and request quota increases
5CloudWatch MetricsValidate 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