# Audiences

> Where a campaign's recipients come from, what an uploaded file needs, why the count is lower than your list, and how to personalise each message without sending anyone a sentence with a gap in it.

Source: https://docs.amomic.in/campaigns/audiences

---

The **Audience** step of the [campaign wizard](/campaigns/create) offers three ways to say who a campaign is for. All three end up in the same place: a list of people the campaign may message, after every rule has had its say. **Check audience** shows you that list's size, and why it is smaller than what you started with.

## Picking contacts

**Pick contacts** shows a checklist of your first 100 contacts, with no search. Tick the people you want.

On a WhatsApp broadcast, a contact who has explicitly opted out of WhatsApp is captioned **opted out of WhatsApp**. You can still tick them, but they will be removed when you check the audience.

For more than a handful of people, use a tag or upload a list.

## Segments and tags

**By tag** lists every tag in use with its number of contacts. Tag your contacts under **Contacts**, then send to a tag.

Choose several tags and a contact needs **every** one of them to be included: an AND, not an OR. *pune* plus *amc-active* means active AMC customers in Pune, not everyone in either group. Narrowing is the safer default when the mistake is messaging people who shouldn't get it.

A tag is resolved **at launch**, not when you build the draft. A contact tagged an hour before you launch is included, which is why the launch re-confirms the count.

## Uploading a file

**Upload a list** takes a CSV or plain text file, up to **5 MB** and **50,000 rows**, one row per person. **Download sample** gives you a file in the right shape.

- **Phone, required.** The column is found by its header, in any position: `phone`, `phone number`, `mobile`, `mobile number`, `contact`, `contact number`, `whatsapp`, `whatsapp number`, `number`, `msisdn` and `cell` all work.
- **Name, optional.** `name`, `full name`, `customer`, `customer name`, `first name`, `contact name`, and person headers such as `guest name`, `member name`, `client name` or `lead name`.
- **Email, optional.** `email`, `email address`, `e-mail` or `mail`.
- **Everything else** becomes a value you can use in the message, under a key made from the header: `Service Due` becomes `{{csv.service_due}}`. Up to 50 columns are read.
- **Separators:** commas, semicolons, tabs and pipes. UTF-8 files with the byte-order mark Excel adds on Windows are fine.

A header row is strongly recommended. Without one, the first column is read as the phone number and the second as the name, and no other columns are available. If there is a header row but no phone header, the first column whose first row holds a usable number is used.

After the upload a toast says how many rows were read, and how many couldn't be used because the phone number wasn't usable. Those rows are left out; fix them in the file and upload it again if they matter.

::: warning Over 50,000 rows
A file with more than 50,000 rows is read up to row 50,000 and the rest is ignored, rather than refused. If your list is that long, split it into separate campaigns. Your plan may also allow fewer recipients per campaign; see [Limits & plans](/operate/limits#campaign-recipients).
:::

The file is read on the server, not in your browser, so the count you see is the count the campaign uses.

## Phone numbers

Every destination is normalised to international format (`+919876543210`) before anything is sent.

A number that carries its own country code is taken at its word. A number without one is read as a **local number in your workspace's country**, the country chosen when the workspace was created, and checked against that country's numbering plan.

These all work for a workspace based in India:

| What you have | What it becomes |
|---|---|
| `9876543210` | `+919876543210` |
| `09876543210` | `+919876543210` |
| `+91 98765 43210` | `+919876543210` |
| `91-98765-43210` | `+919876543210` |
| `0091 9876543210` | `+919876543210` |
| `+44 20 7946 0958` | `+442079460958` |

The first two rows depend on where your workspace is. For a workspace in the United States, `4155552671` becomes `+14155552671`; for one in Singapore, `81234567` becomes `+6581234567`.

Anything that isn't a real number in that country is rejected rather than guessed. Completing a short number with a guess sends a stranger the message meant for your customer.

::: tip Mixed-country lists
If your audience spans countries, write every number in full international form with a `+`. That skips the workspace-country step, and each row means exactly what it says.
:::

## Why my audience is empty

**Check audience** shows what is left after the exclusions, for example *1,162 recipients · 16 excluded: 11 opted out, 5 duplicate*. Every exclusion is also listed underneath with what it means. They are applied in this order:

::: steps
::: step Unusable numbers
Rows or contacts whose phone number couldn't be normalised.
:::
::: step Opted out of this channel
A contact whose record says they opted out of this channel, such as WhatsApp. A contact with no consent recorded either way is **included**: only an explicit opt-out excludes. Uploaded rows aren't matched to contact records for this step.
:::
::: step Duplicates
One message per person per campaign, however many times they appear.
:::
::: step Missing personalisation
Someone with no value for a placeholder your message uses. See below.
:::
::: step Opt-outs
Anyone on the channel's opt-out list, such as someone who asked you to stop messaging them on WhatsApp. This applies to uploaded rows too. Always removed, with no override.
:::
:::

If the count is zero, one of these is why, and the final check refuses the launch with *Nobody in this audience can be messaged*.

No consent statement or lawful basis is asked for, and none affects who is included.

## Duplicates

Duplicates are found by contact id where there is one, and by phone number otherwise. The same customer appearing in two rows, or under `9876543210` and `+91 98765 43210`, is one recipient and gets one message.

## Personalising each message

A WhatsApp template's placeholders (`{{1}}`, `{{2}}`, …) are filled on the **Message** step, each with a fixed value or a token resolved for each person:

| Token | Value | Available when |
|---|---|---|
| `{{csv.<column>}}` | That person's value in the column, for example `{{csv.service_due}}` | The audience is an uploaded list |
| `{{contact.name}}` | The contact's name | The audience is contacts or a tag |
| `{{contact.phone}}` | Their phone number | The audience is contacts or a tag |
| `{{contact.email}}` | Their email | The audience is contacts or a tag |

With an uploaded list, the **Insert…** menu lists your columns with a sample value from the file, so it's easy to see which column holds what. **Show example** previews the message with a sample value from each column (the first non-empty one in your file).

::: danger A missing value skips the recipient
If a token has no value for someone, such as an empty cell or a contact with no name, that person is **skipped**, not sent a message with a gap in it. "Hi , your service is due" is worse than no message at all, and it gets a WhatsApp number reported.
:::

They show in the campaign as **Not sent**, with the reason *Missing a personalised value*.

A **call batch** works differently. Every column of an uploaded list is available to the agent, and a blank value doesn't skip the call. See [Call scripts and variables](/campaigns/call-scripts).

## Limits

| Limit | Value |
|---|---|
| Recipients per campaign | 50,000 at most, and your plan may allow fewer (5,000 on Growth). Over the limit, the launch is refused, not truncated. |
| Uploaded file | 5 MB and 50,000 rows; rows beyond 50,000 are ignored |
| Columns read from a file | 50 |
| **Pick contacts** | Your first 100 contacts |
