Bulk imports
Load destinations, origins, vehicles and drivers from a spreadsheet, using the template Cooriroo generates for your tenant.
Bulk import loads records into Cooriroo from a file instead of a form. Four entities can be imported today — destinations, origins, vehicles and drivers — and each has its own downloadable template. The import runs against the same service the forms use, so the same validation, quotas and permissions apply to every row.
Who can do this
- Role
- Administrators
- Permission
imports:readimports:writedestinations:write
Running an import needs imports:write plus the target entity’s own write permission. Downloading a template needs imports:read plus that same entity permission. Substitute origins:write, vehicles:write or drivers:write for the other entities.
Run an import
The import dialog opens from the Import button on the entity’s list page.
- 1
Download the template
Destinations → Import → Download templateThe template is generated for your tenant at the moment you download it. It carries your configured location or vehicle types as the allowed values, one extra column per custom field you have defined, and your own terminology in its title and filename. A template downloaded before you added a custom field will not have a column for it.
- 2
Fill in one row per record
Leave the lines starting with
#where they are — they are the column guide, and the importer skips them, so a filled-in template re-imports without editing. Required columns must have a value. Optional columns may be left blank. - 3
Choose an import mode
Import → Import modeAll or nothing is the default. Best effort keeps the rows that worked. See the comparison below before switching.
- 4
Validate before you commit
Import → Validate onlyValidate only runs the whole import — header check, per-row parsing, and the lookups that decide create versus update — and reports exactly what would happen, without saving anything. It is the cheapest way to find a bad column name or a malformed date.
- 5
Run the import
Import → ImportThe result panel counts the rows as Total, Created, Updated, Failed, Skipped and Warnings, and lists the failed rows and the warned rows on separate tabs with the field each problem belongs to.
- 6
Follow up on anything that failed
When import history is enabled the result panel carries an Open in Import History link. From there you can edit a failed row in place and retry it rather than re-uploading the whole file.
What is inside the template
A template is a CSV in three parts: a commented column guide, the machine header row, and one example row. The guide names every column, says whether it is required, and describes what the cell accepts. The header row uses the machine column names, not your terminology, so renaming an entity never breaks a file that already works. Header matching is case-insensitive, and an unknown, duplicated or missing-required column rejects the whole file before any row runs.
A destinations template
name,type,status,address_line_1,address_line_2,city,state,postal_code,country,latitude,longitude,contact_name,contact_phone,contact_email,operating_hours,window_open,window_close,driver_emails,notes# Destination import template
# Fill in one row per record below the column header.
# Lines starting with '#' are comments and are ignored on import.
# Required columns must have a value; optional columns may be left blank.
#
# Columns:
# name required text
# address_line_1 required text -> Address Line 1
# latitude optional coordinate (decimal degrees) -> Latitude
# window_open optional time of day (HH:MM, 24-hour) -> Window Open
# operating_hours optional JSON object -> Operating HoursThe guide block above is an extract — the real file lists every column, and appends one line per custom field you have defined for that entity. The arrow shows the human label, which follows your terminology; the name to the left of it is what the header row must say.
All or nothing, or best effort
| All or nothing | Best effort | |
|---|---|---|
| Default | Yes | No |
| One row fails | Nothing is saved | Every valid row is still saved |
| Rows that were rolled back | Reported as skipped | Not applicable |
| Best for | A file you expect to land whole | A large file you will fix in passes |
How rows are matched to existing records
Every import is an upsert. Each row is looked up by one business key inside your tenant; a match is updated, and anything else is created. Change the value in the match column and you have described a different record, not a rename.
| Entity | Matched on | Template also covers |
|---|---|---|
| Destinations | name | Driver assignment by email, custom fields |
| Origins | name | Pickup instructions, custom fields |
| Vehicles | license_plate | Features, labels, custom fields |
| Drivers | Training certifications, custom fields |
File formats and limits
- Formats:
.csv,.xlsxand.json. - Rows: 500 data rows per file. Split anything larger.
- Size: 10 MB per upload.
- Workbooks: only the first sheet is read. A CSV template opened and re-saved as a workbook still imports, guide lines and all.
- JSON: an array of flat objects. Nested objects and arrays are rejected rather than flattened, because there is no single right way to flatten them.
Terminology
Your organisation can rename these. If your screens say something else, this is what they mean here.
- Destination
- The template’s title and filename follow your term for this — a tenant using "Client" downloads a client import template.Rename it in Settings → Terminology
- Driver
- Renaming drivers changes the labels in the template guide, not the machine column names your file must use.Rename it in Settings → Terminology