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

# CSV upload

> Add broadcast recipients and template parameters from a spreadsheet

Upload a CSV in the dashboard to add recipients to a `draft` or `scheduled` broadcast. One row per recipient.

## Targeting columns

Each row needs one of these:

| Column                           | Use                                                                                             |
| -------------------------------- | ----------------------------------------------------------------------------------------------- |
| `phone_number`                   | The recipient's number. Normalized automatically                                                |
| `recipient`                      | Alternative to `phone_number`                                                                   |
| `business_scoped_user_id`        | Target a [business-scoped user ID](/docs/whatsapp/business-scoped-user-ids) instead of a number |
| `parent_business_scoped_user_id` | Target a parent BSUID                                                                           |

Rows without a valid target are skipped and reported back with the row that failed. The rest of the file still imports.

## Template parameters

**Every other column becomes a template parameter**, keyed by its header name.

```csv theme={null}
phone_number,first_name,discount
14155550123,John,50%
14155550124,Ana,30%
```

That file fills `{{first_name}}` and `{{discount}}` per recipient. Header names are matched after trimming whitespace, so `first_name` and `first_name` are the same parameter.

## File format

* Separators are detected automatically: comma, semicolon, tab, or pipe
* The file must be UTF-8. Other encodings are rejected with an encoding error
* The first row is the header row

## Limits

Recipients can only be added while the broadcast is `draft` or `scheduled`. To replace a list, clear the existing recipients first — clearing a `scheduled` broadcast returns it to `draft`.
