Upload leads (CSV)
How the Upload CSV step of the campaign wizard works in the Ori console — the required phone_number column, size and row limits, how extra columns become per-call variables, what gets validated or skipped, and the preview table.
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_numbercolumn 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
Tip
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
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.
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.
Check the preview
A small preview table appears showing the header row and the first few rows. Confirm the columns and values look right.
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_numberThis 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
919999999999After 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,9The 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.
Tip
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:
| Limit | Value |
|---|---|
| Maximum file size | 100 MB |
| Maximum rows | 500,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.
| Situation | What happens |
|---|---|
phone_number is blank or, after cleanup, is not all digits / under 8 digits | That row is skipped. |
| The same number appears twice in the file | The duplicate rows are skipped; the number is dialled once. |
| A variable cell is empty | That cell is ignored; the rest of the row is kept. |
| The row is valid | It 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_numberis 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 state | Upload behavior |
|---|---|
| New campaign (creating) | The CSV is required (unless the campaign is always-on). Your file becomes the contact list. |
| Draft or paused, never run | The 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 campaign | The CSV is optional. You can start with no file and add contacts later, over time. |
| Started, completed, or restarted campaign | The 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:
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
| Button | What it does | When it shows |
|---|---|---|
| Browse | Opens 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. |
| Back | Returns you to the previous step (Dialler Config) without losing your file. | On steps 1 through 4, including this one. |
| Next | Advances 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 Campaign | Submits 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
Related pages
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.
Create campaign
Build an outbound calling campaign in the Ori console using the five-step wizard, from bot selection to review.
Monitor a campaign
Read live status, drive a campaign with the action bar, inspect per-attempt history, pull reports, and reference the API integration and read-only config panels.