Skip to content

Bulk Edit and Bulk Add

Bulk Edit and Bulk Add are the spreadsheet route through Bulk Actions. You download the platform’s own view of the records, change it in a spreadsheet, and upload it back. The platform works out what changed, tests every row, and applies only what you approve.

This works the same way everywhere it appears:

  • Expert > Bulk Actions > Edit (or Add) on a customer, number or service page
  • Bulk Edit and Bulk Add on a settings list page, such as ticket types or locations
  • The checkbox selection page for a named action also offers “Download CSV” and “Upload CSV”, using the same conventions

You need Expert Mode, the Bulk Action Files permission, and edit (or add) permission for the records themselves.


“Download CSV” produces a file with one row per record:

  • An id column and a revisionNumber column, which identify the record and protect against clashing edits
  • Every editable column, pre-filled with the current values

Values appear exactly as you would see them on the record’s form. Dropdown fields show their display names rather than internal codes, and yes/no fields show Yes or No.

Change only what you want to change. The rules are simple, and worth remembering:

  • A blank cell clears that field. Blanking a cell is an instruction, not an omission.
  • A column you remove is left unchanged. Delete whole columns you are not updating; this is the safest way to work.
  • Unchanged rows are skipped. You do not need to trim rows you have not touched. The platform detects them and reports “No changes”.

You can also delete rows you do not want to process at all.

Upload the file from the same page you downloaded it. The platform tests every row for real, inside a transaction it then rolls back, so the test catches everything a live save would: required fields, invalid values, unknown dropdown names and permission problems. Review the results, then apply. See Test, Then Apply for the lifecycle.


“Download template” produces a header-only CSV of the columns you can set when creating a record. There is no id or revisionNumber column, and no parent column: records created under a customer, number or service are linked to it automatically.

Add one row per record to create. Blank cells take the field’s default value, the same defaults a new-record form would offer. Upload, test and apply as for an edit.

Rows without an id in an edit file are treated as adds too, so one file can update some records and create others.


These conventions apply to every bulk CSV, whichever page it came from.

  • id: identifies the record to change. Never edit this column.
  • revisionNumber: a safety check. If someone else changes the record between your download and your upload, the row fails with “Record changed since export” rather than silently overwriting their work. Remove the column if you deliberately want to override this check.

Named-action exports include context columns suffixed (Information Only), such as “Number (Information Only)”. They help you decide which rows to keep and are ignored on upload, so you can leave them in place.

Add optional Update Reason and Update Details columns to any bulk CSV. A filled cell overrides the file-level audit reason or details for that row only. The reason must match one of your configured update reasons; an unknown name fails just that row.

Renaming: “Existing” and “Current” columns

Section titled “Renaming: “Existing” and “Current” columns”

Records in an upload are found by their identifying field, such as a number’s Number or a location’s name. That column normally cannot itself carry a new value, because it is busy finding the record.

To rename, use two columns: head the locating column with Existing or Current (for example “Existing Description” or “Description (Current)”), and add a plain column with the new value. The platform also accepts Old, Previous and Original as marker words. Edit exports that need this produce the “Current” column for you.

A field that holds several values, such as a call type’s custom groups, appears as a single cell of comma-separated display names, quoted as needed. Edit the list in place: the platform resolves each name on upload. A blank cell clears the whole list.

UK-format dates (dd/mm/yyyy, and variants with . or - separators) are accepted and converted automatically. ISO dates (yyyy-mm-dd) also work. Two-digit years read as 20xx.

Named-action CSVs include the action form’s fields as columns, for example “Drop Date”. A blank cell uses the value from the shared form; a filled cell overrides it for that row. This lets one file drop different numbers on different dates.


Each failed row shows a message in the results grid. The common ones:

MessageWhat it means
”Record changed since export”The record was edited after you downloaded the file. Re-download, re-apply your change, and upload again.
”Record does not belong to this customer”The row’s id belongs to a different customer than the file was launched from. Check the id column has not been edited.
”Unknown value for [field]“A dropdown cell does not match any existing name. Check spelling against the record’s form.
”Ambiguous value for [field]“A name matches more than one record. Use a more specific value.
”Permission denied”You do not have permission for that record, or the record is no longer eligible for the action.
”Record not found”The id no longer exists, usually because the record was deleted after export.
”Add would fail - check required fields”An add row is missing a required value. The message usually names the field.
”No changes” (Skipped)Not a failure. The row’s values already match the record, so nothing was saved.

A failed row never blocks the rest of the file. Fix the flagged rows and re-upload, or apply the passing rows and deal with the failures separately.