> ## Documentation Index
> Fetch the complete documentation index at: https://www.bolna.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Handle failures and retries at scale

> Run large Bolna Voice AI campaigns: classify failures by status, set retry policy, respect guardrails and concurrency, and monitor batches efficiently.

At a few calls a day, failures are anecdotes. At tens of thousands, they are a distribution you have to manage. This page is the operational view; the diagnostic view is [Calls fail or drop early](/docs/troubleshooting/calls-fail-or-drop-early).

## Classify before you retry

Not every non-success is retryable.

| Class | Statuses | Action |
| - | - | - |
| **Retryable** | `no-answer`, `busy` | Retry on a schedule — the contact exists and was unavailable |
| **Sometimes retryable** | `failed`, `error`, `stopped` | Retry once, then quarantine. Repeats point at a provider or number problem |
| **Never retry** | `balance-low` | Fix the wallet. Retrying burns the queue against a hard stop |
| **Not a failure** | `rescheduled` | Guardrails deferred the call to your allowed window |
| **Completed but unsuccessful** | `completed` with a negative outcome | A business problem, not a delivery problem — handle it in [extractions](/docs/prompting/using-extractions) and dispositions |

***

## Configure retries once, in the call

Set `retry_config` on the [Make call API](/docs/api-reference/calls/make) or the [Create batch API](/docs/api-reference/batches/create) rather than rebuilding retry logic in your own scheduler:

```json theme={"system"}
{
  "retry_config": {
    "enabled": true,
    "max_retries": 3,
    "retry_on_statuses": ["no-answer", "busy", "failed"],
    "retry_intervals_minutes": [30, 60, 120]
  }
}
```

Widening intervals is deliberate: three attempts inside ten minutes annoy the same unavailable person, while 30/60/120 minutes samples different parts of their day. See [Retry calls that did not connect](/docs/outbound/auto-retry) for every option, including prioritizing retries ahead of fresh contacts.

<Warning>
  Retries consume concurrency and wallet balance like any other call. A campaign sized for 5,000 contacts with three retries each must be planned as up to 20,000 calls.
</Warning>

***

## Respect the two limits that bite at scale

<CardGroup cols={2}>
  <Card title="Concurrency" icon="scale-balanced" href="/docs/enterprise/concurrency-management">
    Your account has a floor and, optionally, a ceiling on simultaneous calls. Sub-accounts share one organization envelope, so one team's campaign can starve another's unless minimums are set.
  </Card>

  <Card title="Calling hours" icon="clock" href="/docs/outbound/calling-guardrails">
    Guardrails evaluate the **recipient's** local time. A campaign spanning several countries will legitimately reschedule large portions of itself.
  </Card>
</CardGroup>

Also mind [API rate limits](/docs/api-reference/rate-limiting) when enqueuing: submit a [batch](/docs/outbound/batch-calling) rather than thousands of individual `POST /call` requests.

***

## Monitor without polling everything

* Take results from **webhooks** as the primary channel — [Get results with webhooks](/docs/post-call/polling-call-status-webhooks) — and poll only for executions you never heard about.
* For a batch, read [`GET /batches/{batch_id}/executions`](/docs/api-reference/batches/executions) rather than fetching each execution individually. It returns a bare array.
* Treat only terminal statuses as final: `completed`, `no-answer`, `busy`, `failed`, `canceled`, `stopped`, `error`, `balance-low`.
* Watch the mix, not the total. A rising share of `failed` in one country is a carrier incident; a rising share of `no-answer` across the board usually means the calling window drifted.

***

## Before the next big campaign

<CardGroup cols={3}>
  <Card title="Readiness checklist" icon="clipboard-check" href="/docs/production/readiness-checklist">
    Pre-launch verification
  </Card>

  <Card title="Control cost per call" icon="scissors" href="/docs/production/control-cost-per-call">
    Retries multiply spend
  </Card>

  <Card title="Call a contact list in bulk" icon="list" href="/docs/outbound/batch-calling">
    How batches work
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.