What controls dialing pressure

Campaign dialing pressure is limited by several layers:
LayerMeaning
Campaign concurrency (seats)Max simultaneous connected conversations configured on the campaign. Feeds the pacing formula.
Carrier CPSPer-carrier limit on new SIP dials per second (token bucket). Distinct from seats.
Time windowCalls only launch inside the configured local time window.
Fleet availabilityCXB Dialler only dispatches when CXB Core has free worker slots.
SIP/LiveKit capacityCarrier and LiveKit must accept the call volume.
Circuit breakersRepeated infra failures temporarily stop use of unhealthy dependencies.
The smallest available capacity wins.

How predictive pacing decides dial rate

CXB Dialler uses an industry-standard predictive formula:
target_dial_rate = min(carrier_cps_cap, seats / (AHT × answer_rate))
  • seats = campaign concurrency limit (clamped to actual fleet capacity).
  • AHT = average handle time (seconds) of connected calls.
  • answer_rate = rolling answered / dialled.
The rate is then converted to a ringing pool sized to keep seats fed through one ring cycle.

Cold start

Until the campaign has at least 20 completed calls (COLD_START_THRESHOLD), there is no over-dial. The dialler just fills free fleet slots one-for-one. This avoids over-dialing before there is a stable answer-rate signal.

Carrier CPS rate limiter

Each carrier has its own token bucket keyed by trunk. New SIP invites wait for a token, so a single campaign cannot exceed the carrier’s configured CPS / burst even if the seat math asks for more. This is the carrier-protection layer and is separate from seat concurrency.

Abandon-rate brake

The formula handles the average; an abandon-rate feedback loop handles spikes. It only applies once at least 30 answered calls (ABANDON_MIN_SAMPLE) exist, so early noise does not trigger it.
Abandon rateAction
≤ 3% (ABANDON_TARGET)No brake.
> 3% and ≤ 5%Proportional adapt — scale the dial rate down toward the 3% target.
> 5% (ABANDON_HARD_THRESHOLD)Hard brake — halve the dial rate immediately.

Lease priority (what gets dialled first)

Within a campaign, CXB Dialler leases due work in a strict priority order:
1

Callbacks

callback_scheduled contacts whose scheduled time is due — customer explicitly asked to be called back.
2

Pending

Fresh pending contacts that have never been dialled. This guarantees every number is reached at least once before any retry fires.
3

Retries

retry_scheduled contacts whose next_retry_at has elapsed.

Retry rules

Campaign retry config contains:
FieldMeaning
Max AttemptsMaximum attempts per contact.
Retry DelayDelay before next eligible retry.
Retry on SystemSystem outcomes eligible for retry.
Retry on CustomBusiness dispositions eligible for retry.
Default system retry outcomes:
no_answer, rejected, RNR, error, timeout
Custom retry outcomes are usually values generated by post-call analysis, such as:
callback_requested, not_available, asked_to_call_later
Only configure custom retries when the post-call prompt reliably emits those exact values.

Time windows

Use the customer’s legal/contactable timezone. For India campaigns this is normally:
Asia/Kolkata
Avoid windows that extend beyond approved calling hours. CXB Dialler will not start new calls outside the window, but already-running calls may still finish.

Practical concurrency guidance

Start conservative:
  • first live campaign: low concurrency
  • after stable test: increase gradually
  • watch no-answer/rejected spikes
  • watch provider errors
  • watch fleet availability
  • watch recording/result delivery
Do not set campaign concurrency to 500 just because the CSV has 500,000 rows. Concurrency must fit fleet, SIP trunks, provider rate limits, and client tolerance.

When to pause

Pause the campaign when:
  • wrong bot/config was selected
  • CSV variables are wrong
  • too many calls fail with the same SIP/provider error
  • customers report incorrect script or language
  • fleet health is unstable
  • CRM push is failing repeatedly