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

# Campaigns

> Run calling operations at scale — upload contacts, schedule windows, and let agents work the list

A campaign is how you point an agent at a *list* of people instead of one number at a time. You upload contacts, set a calling window and retry policy, assign agents, and OSVI manages the queue.

## Creating a campaign

Go to **Campaigns → Create Campaign**:

<Steps>
  <Step title="Setup">
    Name the campaign and pick its type:

    * **Outbound** — call a list of contacts you upload.
    * **Inbound** — receive calls on the campaign's assigned numbers (and track the ones you miss).
  </Step>

  <Step title="Timing and retries">
    * **Schedule** — start **immediately**, or pick a date with a **start and end time**. Calls are only placed inside the window; anything unfinished waits for the next one.
    * **Retry settings** — when a contact doesn't pick up, retry after a wait (5 min, 10 min, 30 min, 1 hour, or a custom interval) up to a **max attempts** count (default 2).
  </Step>
</Steps>

Campaigns can be **activated and deactivated** at any time from the list — deactivating pauses calling without losing queue state.

## Assigning agents

On the campaign's **Agents** tab, add one or more agents to handle the calls. Each assigned agent has its own **start/stop** control, so you can pause one agent's calling without touching the rest. Assigning multiple agents spreads the list across them for more concurrent calling.

## Uploading contacts

On the **Contacts** tab, upload a CSV with two columns:

```csv theme={null}
phone, person_name
9876543210, Ravi Kumar
9876501234, Anita Desai
```

* A **sample CSV** is downloadable from the same tab.
* Tick **No header** if your file starts directly with data.
* Any extra columns are carried along as contact metadata, available to the agent's prompt via `{{variable}}` templating and echoed back in webhook results as trigger data.

On upload, OSVI flags **duplicate phone numbers** within the file and **skips numbers on the DND list**, showing you exactly what was excluded.

An upload doesn't start calling by itself — press **Upload to Queue** to release it (optionally scheduling the release for a specific date and window). **Flush Queue** clears pending calls if you need to stop a release.

## Monitoring a running campaign

* **Queue tab** — live counts of queued, in-progress, and completed calls, with per-contact status.
* **Conversations** — every campaign call lands in the [call log](/platform/conversations); filter by campaign or by a specific upload to review outcomes.
* **Missed Calls tab** (inbound campaigns) — every call you didn't answer, with an export button.

## Practical tips

<AccordionGroup>
  <Accordion title="Pick the window from your data">
    The **Calls by hour** chart on the dashboard shows when people in your list actually answer. A 10:00–13:00 window typically outperforms a full-day spray.
  </Accordion>

  <Accordion title="Test with a small upload first">
    Upload a 10-row CSV of your own team's numbers, run it end-to-end, and check the analysis results before releasing the full list. Uploads are released to the queue individually, so a pilot costs nothing.
  </Accordion>

  <Accordion title="Retries are per contact, not per list">
    A contact who doesn't pick up is retried after the wait interval up to the max attempts — there's no need to re-upload non-answers.
  </Accordion>
</AccordionGroup>
