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

# Campaigns

> Campaigns are used to run outbound calls to your contacts at scale.

## Preparation

Outbound campaigns are available from the **Business** plan - on Pro the
agent answers calls and dials one person at a time; dialling a whole
contact list starts here.

Before launching a campaign, make sure the agent has a number to dial
from - its own, or one picked in the **Dials from number** field. You buy and
set up numbers in the dashboard, in the **Numbers** tab; see
[Phone numbers](/en/features/phone-numbers).

## The campaign agent

In the **Campaign agent** step you pick the agent that runs the calls. If you
pick one built to answer the phone (a receptionist), the wizard notices: in
a campaign the agent does the calling, and the receptionist's greeting and
prompt assume somebody rang it. **Make an outbound version** creates a
separate outbound agent on top of the one you have.

That agent takes over the company name, form of address, voice,
knowledge-base documents, the calendar it books into and the CRM. The
conversation prompt, greeting, schedule, retries and SMS come from the
campaign template (appointment reminder, cash-on-delivery confirmation,
payment reminder, NPS survey). It is named after its family and its job,
e.g. "LadiesGym - Appointment reminders". The same template also works
without a base agent - in **New agent from a template** under the list,
choosing "a brand-new agent".

## Contact list

You can add contacts in four ways: manually, by uploading a **CSV** file,
by connecting a **Google Sheet**, or by pointing the campaign at a
**Calendar** of booked appointments.

For a file or a sheet, the first row is the column headers and every row
below it is one contact. One column has to hold the phone numbers -
`phone_number`, `Phone`, `Telefon`, `Mobile` or anything similar; a column
named something unguessable still works when its values look like phone
numbers. Numbers are normalised before dialling, so `600 123 456`,
`+48 600-123-456` and `0048600123456` are all the same number, and a row
whose number cannot be made sense of is skipped rather than dialled wrong.

Every other column is passed into the call as a variable under its own
name, so `{{first_name}}` in the prompt or the first message greets the
person by name. That also means the lead sheet an agent writes itself can
be handed straight to a campaign - its "Telefon" column is found like any
other.

### Keeping the list alive

A Google Sheet campaign can keep watching its sheet: switch on **Keep
watching this sheet** when creating the campaign (or change it later on the
campaign page) and pick how often it is re-read - every 15 minutes, hourly,
every 6 hours or once a day. Rows added afterwards are queued and called
without starting a second campaign, and a campaign that had already finished
goes back to running when somebody new turns up.

Only new numbers are queued: a contact already on the list is never called a
second time, whether the row moved, was duplicated, or the number is written
differently ("600 123 456" and "+48 600-123-456" are one person). A paused
campaign still collects the new contacts but dials nobody until it is
resumed, and a sheet that cannot be read (unshared, renamed) leaves the
campaign alone and is tried again on the next interval.

This is what turns an agent's own lead sheet into a callback loop: point the
campaign at a sheet the lead agent feeds, and every lead written there is
called on the interval you chose. The whole setup, including how to avoid
calling people the agent already reached, is in
[The lead loop](/en/integrations/leads/callback-loop).

### A calendar as the contact list

An appointment-reminder campaign needs no spreadsheet: pick **Calendar** as
the source and choose a panel calendar or a connected Google / Outlook one
(the same calendar the agent books into - see
[Panel calendar](/en/integrations/calendar/panel)). The campaign reads the
appointments from now to the end of the chosen day - today, through
tomorrow, through the day after, the next 3 days or the next week - and
queues one call per appointment that has a phone number.

* The number comes from the appointment's **Phone** field. In Google and
  Outlook it is read from a `Phone:` line in the event description, which is
  how the agent writes it and how you can type it in by hand.
* **Cancelled** appointments (and declined invitations) are skipped, as are
  ones that have already started. An appointment without a number is not
  queued.
* The calendar is re-read once a day (hourly or every 6 hours are also
  available). Every appointment gets one call, even when the same person has
  two in the window. A day without appointments is not an error - the
  campaign waits for the next read.
* The call receives the variables the "Appointment reminders" template
  uses: `name`, `first_name`, `appointment_date`, `appointment_time`,
  `appointment_end_time`, `appointment_type` (the event title),
  `appointment_location`, `email`, `notes`. An agent built from that template
  works unchanged.

The wizard picks **Calendar** on its own when you start from the reminders
template and have at least one calendar.

## Schedule

A campaign does not have to start the moment you click, and it does not have
to dial at any hour. The **Call settings** step holds two things:

* **Campaign start** - the date and time the campaign starts on its own.
  With no date it waits for the *Start* button. If at that moment the agent
  has no phone number assigned or the balance is empty, the start is
  postponed and retried every minute; after 24 hours the campaign is marked
  failed, with the reason shown on its page. The balance is also checked
  before every batch of calls: if it runs out mid-run, the campaign is
  paused (the queue is kept) and you get a notification and an e-mail. Top
  up and click *Resume*.
* **Calling hours** - the weekdays and the hours, in your own timezone
  (Mon-Fri, 9:00-17:00 by default). Outside that window the campaign places
  no calls - it is not paused and nothing is lost: the queue waits, and
  dialling resumes on its own within a minute of the window opening. Retries
  follow the same rule, so one scheduled for 22:00 is placed in the morning.
  In the Europe/Warsaw timezone the campaign also skips Polish public
  holidays (e.g. 1 and 11 November, Christmas Eve, Corpus Christi).

You can change the window at any time - narrowing it mid-campaign simply
holds the next batch until the window opens again.

## Call settings

When creating a campaign you configure automatic retries:

* **number of attempts** - 1 to 5 extra tries per number,
* **interval between attempts** - 15 minutes, 30 minutes, one hour
  (the default), 2 hours, 4 hours or a day,
* when to retry: missed, busy, voicemail,
* **Smart callback timing** - retries are scheduled during the hours when
  your calls historically get answered most often (based on the last 30
  days).

Combined with [SMS after a missed call](/en/voice-agent/agent-editor)
(the agent's SMS settings), a campaign closes the loop by itself: it
calls, retries at a good time, and after the final failed attempt sends an
SMS.

### Voicemail

Every campaign call listens for a voicemail box, whatever the agent's
"Enable Voicemail Detection" switch says. When a mailbox answers, the agent hangs up at
once instead of reading the reminder to it. The attempt gets the outcome
*voicemail* (or your own code for `voicemail_detected` from the outcome
mapping), it does not count as answered in the campaign report, and if the
campaign retries on voicemail the contact gets another attempt.

### Campaign progress

The "processed" counter goes up by one per contact: called, skipped because
it is on the do-not-call list, or failed. A retry of the same contact does
not count it twice. When every channel on the line is busy, the contact is
not marked as failed: it goes back to the queue and is picked up by the next
batch.

### Missed calls in the history

Every attempt, including the ones nobody picked up, gets its own entry in
**Call history** with a status saying how it ended: *No answer*, *Busy*,
*Canceled* or *Failed*, with a duration of 0:00. Those statuses are ordinary
call outcomes, so you can filter CRM and spreadsheet pushes and the after-call
SMS on them - they appear in the outcome list next to the outcomes the agent
works out during a conversation. If your organization uses its own outcome
codes, a missed call gets the code from your mapping.


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