Dropdown lists
The problem this solves, in plain terms
Imagine three different field teams each build their own form, and each form has a dropdown for “District”. Every one of them typed out the same 30 district names by hand. Six months later, someone notices a spelling mistake — “Vishakapatnam” should be “Visakhapatnam”. Now you have to find all three forms, edit each one separately, and hope nobody missed a fourth form you forgot existed. Worse, since each dropdown was typed independently, there is no guarantee the three lists even matched to begin with — one might have 30 districts, another 31.
A dropdown list (sometimes called a dictionary or a choice list) fixes this by moving the actual set of options out of any one form and into its own place. A form does not carry its own copy of the districts — it simply points at “the districts list”. Correct the spelling once, in the list, and every form pointing at it shows the fix the next time someone opens it. Nothing to hunt down, nothing to forget.
When you actually need one
Not every dropdown needs this. If a question only ever has two or three answers and only one form will ever ask it — say, “Yes / No / Not applicable” — just type those options directly into the question. There is nothing to share and nothing likely to change, so a managed list would be pure overhead.
Reach for a dropdown list once any of these is true: the set of options is long (dozens or hundreds of items, like schools or villages), more than one form needs the same set, or the set is likely to be corrected or extended over time (new schools open, a district is renamed).
Good fit for a dropdown list
- States, districts, blocks, schools — anything from an official register
- A list of vendors, cost centres, or job designations used by more than one form
- Anything you expect to grow or get corrected over time
Fine as typed-in options
- "Yes / No / Not applicable" on a single form
- A one-off satisfaction scale ("Poor / Fair / Good / Excellent")
- Anything invented for this one question and unlikely to be reused
Where you manage them
Look for Custom Drop Down in the sidebar. It opens a plain table listing every list you have — its id, name, the parent list it cascades from (if any), and how many options it holds. Click a row, or its View options action, to open that list in a window showing its options and the buttons to edit it or upload data to it.
| Id | Name | Parent list | Options | |
|---|---|---|---|---|
| in-states | States | — | 36 | |
| in-districts | Districts | States | 766 | |
| vendors | Vendors | — | 54 |
A list opened from the table looks like this:
Some lists carry a small globe icon — those are platform lists: reference data Vibha curates centrally and makes available to every organization, so nobody has to re-type India's states and districts from scratch. You can look at a platform list and bind questions to it, but you cannot edit it — it is read-only from an organization, the same way a public library book is yours to read but not yours to rewrite.
Creating a list, step by step
- 1Click New listand give it a plain-language name — “Districts”, “Vendors”, “Job designations”. The id underneath is generated from that name automatically (spaces become hyphens, everything is lowercased) and is what questions actually refer to behind the scenes.
- 2If this list should filter based on another one — for example, districts should only show the ones inside whichever state was picked — choose that other list under Parent list. See Cascading and lookups for the full walkthrough; you can also leave this list as a plain, independent list and come back to it later.
- 3Click Create list. The list now exists, empty, ready for you to add options to it.
Getting your options into the list
You have two ways to do this: type entries in one at a time for a short list, or — the common case — upload a spreadsheet all at once. Most real lists (a district register, a school directory) start life as a spreadsheet someone in the field office already keeps, so uploading that file directly is usually the fastest path.
- 1Open the list and click Upload CSV. In the dialog that appears, click Download template first if you are not sure what columns the file needs — this gives you a starter spreadsheet with the exact column headings this list expects (and, for a list that cascades from another, real parent values already filled in, so your first few rows are guaranteed to import cleanly).
- 2Drop your CSV file onto the upload area, or click Choose file to pick it. Up to 20,000 rows at once — since every upload replaces the whole list (see below), a larger registry needs to fit in one file rather than being split across several.
- 3You will be shown a preview of exactly what was read — see below — and asked to confirm. There is nothing to map by hand; the columns are matched automatically.
What the importer handles for you
Real spreadsheets are messy — different punctuation, exports from different tools, values with commas inside them. The importer is built to cope with the common cases without you having to clean the file up first:
| Situation | What happens |
|---|---|
| Different separators | Comma, semicolon, tab or pipe are all detected automatically from the header row — you do not have to tell it which one your file uses. |
| Exported from Excel | The invisible marker Excel writes at the start of a file is stripped automatically, so your first column name is read correctly instead of showing up mangled. |
| A value with a comma in it | A district genuinely called "Kadapa, YSR" stays one value instead of being split into two by mistake, as long as it was saved quoted (which Excel and Google Sheets do automatically). |
| Columns in the "wrong" order | Doesn't matter. Columns are matched automatically by their header name (see below) — nothing needs to be reordered in the spreadsheet first. |
| A very large file | Up to 20,000 rows in one go. Every upload replaces the whole list, so a bigger list needs to fit within that in a single file. |
Matching your columns automatically
There is nothing to map by hand. Once the file is read, its columns are matched automatically by their header name, and you are shown a plain preview of exactly what will be imported. Nothing is saved until you confirm.
| This column is recognized as | Required? | In plain terms |
|---|---|---|
| Value | Always | The code actually stored when someone picks this option — think of it as the option's permanent ID card number. Must be unique in the list, and must never change once people have started answering with it. Recognized from a header like "value", "code", "id" or "key". |
| Label | Optional | What a respondent actually reads and clicks on in the dropdown — the option's "display name". If none is recognized, the value is shown instead. Recognized from a header like "label", "name", "title" or "description". |
| Parent value | Only for a cascading list | Which item in the parent list this row belongs under — e.g. which state a district sits in. Named using the parent’s value, not its label. Recognized from a header like "parent_value", "parent", or the parent list’s own name (e.g. "state_code" for a list cascading from States). |
| Anything else | Optional | Extra columns — a pincode, a UDISE code, a category — that ride along with each option and can be pulled into a form automatically later. See Cascading and lookups. |
If a required column could not be recognized from your file's headers, that is the one thing called out — an error names exactly which column is missing (the value, or the parent for a cascading list) so you can rename that header in your file and upload it again. Otherwise there is nothing to decide: confirm, and the rows are imported as shown.
Every upload replaces the list
Uploading a file a second time is common — a new school year adds a few more schools, or someone corrects a batch of typos. There is only one behaviour, not a choice: every row in your file is added or updated, and any option that used to be in the list but is missing from this file stops being offered in dropdowns from now on. Always upload the complete, current file — not just the rows that changed — so the list ends up matching it exactly.
Deleting a list
Deleting a list is permanent, so confirming it takes an extra step: you have to retype the list's id exactly before the delete button works. This is deliberate friction for something that cannot be undone.
Connecting a question on your form to the list
Uploading the list is only half the job — a question on your form has to actually use it. Open the form in the builder, select a Choose one, Choose all that apply, or Select an option question, and in its settings switch Type your own options to Choose from a list. Pick the list by name, and that question now draws its choices from it instead of anything typed in by hand.
If you point a question at a list that has since been deleted or never existed, saving the form is refused and you are told exactly which list is missing — rather than quietly shipping a dropdown that looks fine in the builder but shows nothing at all to a real respondent, with no clue anywhere as to why.
Getting data back out
Export downloads the list in the same column layout the importer accepts, which is what makes round-tripping painless: export the list, open it in a spreadsheet, fix whatever needs fixing, and upload it straight back. No reformatting required in either direction.
Frequently asked questions
- Can I upload a dropdown list from a spreadsheet?
- Yes. Create a list and upload a CSV, then bind any question to it.
- What happens if I correct a spelling in a dropdown list?
- Fix it in one place and it is fixed on every form bound to that list.