Bulk edit lets you update a shared set of fields on many rows at once. It's available on transactions, subscriptions, tasks, time entries, clients, projects, documents, and invoices.
Tags, shared data and MCP tokens carry a selection column too, but only for removing rows — see Bulk delete only below.
How it works
- On the list page, select multiple rows with the checkboxes.
- A bulk action toolbar appears at the bottom; click Edit to open the bulk-edit wizard.
- Edit step — the selected rows appear in a table with editable cells. A top apply-to-all row lets you set a value once and push it to every selected row for fields that support it (press Enter to apply). You can also remove a row from the table to exclude it from this edit — that only drops it from the operation, it doesn't delete the record. Cells you change are highlighted so you can see exactly what you've touched.
- Column actions — each column header carries a Clear and a Revert button. Clear empties that column on every selected row at once; Revert puts the column back to the stored values, dropping any edits you made to it — including a clear. Revert stays greyed out until that column actually has an edit. Required columns (names, statuses, a task's type, an amount) have no Clear button, because they cannot be left blank. Both act on the whole selection, not just the page you are looking at, and neither touches a row you have removed from the edit.
- Confirm step — review what will change, then submit to apply it. For entities that keep a history, each row records one entry per field you modified.
Your selection isn't kept when you leave the list. If you navigate away before opening the wizard, the selected rows reset.
Supported fields per entity
Transactions — open Bulk edit transactions:
- date, description, type (income/expense), amount, currency, tags.
Subscriptions — open Bulk edit subscriptions:
- name, cost, tax rate, billing period, billings per period, currency, billing date, type (income/expense), tags, active. Leaving the tax rate blank on a row clears its split.
Tasks — open Bulk edit tasks:
- name, project, status, type, priority, start date, deadline.
Time entries — open Bulk edit time entries:
- name, task, tags, start time, end time (with the rule that end time must be after start time).
Clients — open Bulk edit clients:
- name, status, probability, estimated value, follow-up date, source, tags. Client names are unique, so name has no apply-to-all.
Projects — open Bulk edit projects:
- name, clients, status, start date, end date, tags. The client picker replaces the whole set — clearing it detaches the project from every client.
Documents — open Bulk edit documents:
- name, description, clients, projects, tags. The document body is never editable here, so a bulk save never writes a new version.
Invoices — open Bulk edit invoices:
- invoice number, status, issue date, due date, amount, tags. An invoice whose total comes from line items shows that total read-only.
Descriptions, sub-tasks, line items, document bodies, and other complex fields are intentionally left out of bulk edit — change those one row at a time.
Rows held back from a save
Some rows can't be saved as edited. Those stay in the wizard, are flagged on the confirm step, and are skipped — everything else still saves:
- a blank name, or a blank invoice number;
- an amount or estimate that isn't a number;
- an end date before its start date, or a due date before its issue date;
- two clients in the same edit given the same name. Client names are unique, so both rows are held back. A clash with a client outside your selection is only caught when you save.
What's recorded in the change history
Tasks, clients, projects, and invoices keep a changelog, and bulk edits show up there as per-row entries; see Entity changelog. Transactions, subscriptions, time entries, and documents don't write to the per-entity changelog.
Tips and edge cases
- One row, one changelog entry. A bulk run on five rows produces five separate entries, not one grouped event.
- Empty values vs. unchanged. Leaving a cell untouched in the wizard means "don't change this". Clearing a cell on purpose is what writes a blank value.
- Cross-field validation still applies. A time entry's end time must stay after its start time; the wizard rejects the confirmation if the combination is invalid for any row.
- Bulk delete sits next to bulk edit. The toolbar also offers a bulk delete action with a count-confirmation prompt.
Bulk delete only
Three lists carry a selection column with a single destructive action and no edit wizard, because there is nothing worth changing across many rows at once:
- Tags (
/tags) — Delete. Everything carrying a deleted tag loses it; the entities themselves are untouched. A tag's only other field is its name, which is unique, so a shared value would clash on every row but the first. - Shared data (
/share-links) — Revoke. Anyone holding a revoked link loses access immediately, and this can't be undone. Links already revoked can't be selected. A link's only editable field is its expiry, which the per-row editor already covers. - MCP tokens (Settings → Integrations) — Revoke. Anything using a revoked token stops working immediately. Editing a token's tool access or scope stays a one-at-a-time action.
What bulk delete removes
Deleting clients or projects in bulk detaches their records rather than deleting them, and the confirmation says what that touches before you commit:
- linked projects and documents are unlinked, and the count of those left with no other link is called out;
- invoices and transactions keep their rows, with the client or project cleared.
To delete a client or project together with its records, delete it on its own — the guided delete offers that; bulk delete does not.
Other bulk actions
The toolbar is not only bulk edit. It also carries:
- Delete on every list that supports selection, with a count-confirmation prompt.
- Create invoice on tasks and time entries, which turns the selection into a prefilled invoice rather than changing anything. See Invoicing workflow.
On mobile
Not available on the mobile app — manage from the web app.