A campaign needs a list of people to call. You provide that list as a CSV file on the Upload CSV step — step 4 of the campaign wizard. This page covers that step in detail: the one column the file must have, the file limits, how every other column turns into a value the bot can speak, what the platform skips, and how to read the preview before you commit.
This page is the deep dive on the Upload CSV step only. For the whole five-step wizard — Basics, Number Pool, Dialler Config, Upload CSV, and Review — see Create a campaign.

Before you start

Prepare the file first so the upload passes in one go:
  • a phone_number column with one contact per row
  • a header row whose names exactly match the variables your bot’s prompt expects
  • numbers in the format your carrier needs (include the country code when required)
  • amount, date, and similar fields already written the way the bot should say them
  • no stray hidden characters that spreadsheet tools sometimes add to headers
Open the file in a plain text editor and eyeball the first 5 to 10 rows before uploading. A quick look catches a misnamed header or a blank phone_number faster than the preview does.

How to upload

1

Reach the Upload CSV step

In the campaign wizard, click Next through Basics, Number Pool, and Dialler Config until the step indicator highlights Upload CSV.
2

Add your file

Drag the CSV onto the dropzone, or click Browse inside the dropzone to open your computer’s file picker and choose the file.
3

Check the preview

A small preview table appears showing the header row and the first few rows. Confirm the columns and values look right.
4

Continue to Review

Click Next to move to the Review step, then Create Campaign to save. The contacts are validated and ingested at that point.

The required column

Every campaign CSV must contain a column named exactly:
phone_number
This is the only mandatory column. Each row’s phone_number is the number the dialler will call. A row whose phone_number is blank or invalid is skipped — see What gets skipped below. Numbers may be written with a leading +, spaces, or hyphens for readability. The platform cleans those out before dialling, so all of these are read as the same number:
phone_number
+91 99999 99999
+91-99999-99999
919999999999
After cleanup, what remains must be all digits and at least 8 digits long, or the row is dropped.
Include the country code whenever your carrier needs it. A number that dials fine from your phone may still fail on the trunk if the country or trunk code is missing. If a whole campaign returns failures at connect time, a missing prefix is a common cause.

Extra columns become call variables

Every column other than phone_number becomes a per-call variable. Whatever you put in a row’s cell is handed to the bot for that customer’s call, so the bot can greet them by name, quote their amount, reference their policy, and so on. The column header is the variable name. Take this file:
phone_number,CUSTOMERNAME,LOAN_NO,due_amount,CURRENT_DPD
+919999999999,Rajesh,123456,50000,32
+918888888888,Priya,789012,15000,9
The bot can then use each header inside its prompt or opening message wrapped in double curly braces:
Namaste {{CUSTOMERNAME}}, aapke loan {{LOAN_NO}} par {{due_amount}} rupaye baaki hain.
On Rajesh’s call that becomes “Namaste Rajesh, aapke loan 123456 par 50000 rupaye baaki hain.” On Priya’s call it fills in her values instead.
Header names are matched against the variables in the bot’s prompt exactly, including upper- and lower-case. If the prompt expects {{CUSTOMERNAME}} but your column is headed customername, the value will not fill in. Decide on names once and keep the CSV headers and the prompt in step.
Format amounts and dates the way you want them spoken before you upload — for example write 50000 or fifty thousand depending on how the bot should read it, and dates as the bot should say them. The bot reads the value largely as-is unless the bot’s policy is set up to transform it.
If you reference a variable in the prompt but a row leaves that cell empty, the bot has nothing to say for it. See Writing prompts and variables for how missing values behave.

File and row limits

The platform enforces these limits when it validates the file:
LimitValue
Maximum file size100 MB
Maximum rows500,000
Minimum phone digits (after cleanup)8
A file larger than 100 MB or with more than 500,000 rows is rejected. Split very large lists into separate campaigns, or — for an always-on campaign — feed contacts in over time rather than all at once.

What gets skipped

Not every row in your file necessarily becomes a call. The platform quietly drops rows it cannot use and ingests the rest. It does not fail the whole upload because of a few bad rows.
SituationWhat happens
phone_number is blank or, after cleanup, is not all digits / under 8 digitsThat row is skipped.
The same number appears twice in the fileThe duplicate rows are skipped; the number is dialled once.
A variable cell is emptyThat cell is ignored; the rest of the row is kept.
The row is validIt is added to the campaign as a pending contact, ready to dial.
Because invalid and duplicate rows are skipped silently, the number of contacts the campaign ends up with can be smaller than the number of rows in your file. Always compare the contact count on the campaign after upload against the row count you expected. A large gap usually means a column was misnamed or numbers are missing their prefix.

The preview table

As soon as a file is selected, the step shows a preview table so you can confirm you picked the right file and the columns landed where you expect. It displays the header row plus roughly the first four data rows — about five rows in total. It is a visual check only; it does not ingest or save anything. Use the preview to confirm:
  • phone_number is present as a column header
  • your variable columns line up under the headers you intend
  • numbers and values are not shifted into the wrong columns (a sign of stray commas or quoting in the file)

Replacing or locking contacts

Whether you can upload at all, and what an upload does to existing contacts, depends on the campaign’s state.
Campaign stateUpload behavior
New campaign (creating)The CSV is required (unless the campaign is always-on). Your file becomes the contact list.
Draft or paused, never runThe CSV is optional on edit. Uploading a new, valid file replaces the existing contact list. The old list is only swapped out after the new file validates and contains at least one valid row.
Always-on campaignThe CSV is optional. You can start with no file and add contacts later, over time.
Started, completed, or restarted campaignThe CSV is locked. You cannot replace the contact list. To run a different set of contacts, Clone the campaign and upload to the copy.
The wizard shows you which situation applies with an on-screen notice:
“Optional. Uploading a CSV on a draft campaign replaces the existing contact list.” You may leave the file unchanged to keep the current contacts, or upload a new one to swap them all out.
“CSV contacts are locked for this campaign. Use Clone if you need a different contact set.” This appears once a campaign has run, alongside the wider lock on the campaign name and bot. These fields stay fixed so past and future attempts remain audit-safe.
Contact locking is part of the campaign’s identity lock, which switches on after the first run. From that point you can still rotate the outbound numbers and adjust dialler settings before pressing Start, but the name, bot, and contact list are frozen. To add more contacts to a campaign that is already running, use Add contacts (CSV) on the campaign monitor rather than the wizard — it appends rather than replaces.

Buttons on this step

ButtonWhat it doesWhen it shows
BrowseOpens your computer’s file picker so you can select a CSV. Sits inside the dropzone alongside the drag-and-drop area.On the Upload CSV step.
BackReturns you to the previous step (Dialler Config) without losing your file.On steps 1 through 4, including this one.
NextAdvances to the Review step. It is disabled until the step’s requirements are met — for a non-always-on campaign that means a valid file must be present.On steps 0 through 3.
Create CampaignSubmits the campaign. This is where contacts are actually validated and ingested. It appears on the Review step, not here. On success you land on the campaign detail page.Review step only.
Back link (arrow at the top)Leaves the wizard and returns to the campaign list or the campaign detail page. Work in the wizard is not saved.Throughout the wizard.
The Next button gives no error toast when it is disabled — it simply stays greyed out until the step is valid. If you cannot move forward from the Upload CSV step, the most common reason is that no valid file is attached (and the campaign is not always-on).

Quality checklist

Run through this before you upload:
  • the header row contains phone_number, spelled exactly
  • every row has a non-blank phone_number
  • numbers include the country code when the carrier requires it
  • amount and date fields are already formatted the way the bot should speak them
  • variable column headers match the bot prompt’s {{...}} names exactly, including case
  • there are no hidden characters in the headers from a spreadsheet export
  • you have spot-checked 5 to 10 rows by eye

Create a campaign

The full five-step wizard, including Basics, Number Pool, Dialler Config, and Review.

Monitor a campaign

Watch a running campaign, read the contact count, and append more contacts with Add contacts (CSV).

Prompts and variables

How the bot uses your CSV columns as variables in the prompt and opening message.

Pacing and retries

How the dialler paces calls to your uploaded contacts and when it retries them.