Price Book
What it's for
Price Book is "your flat-rate catalog" — every item you sell, what it costs you, what you charge, and the margin between. Proposals, work-order line items, and invoices all price from here, so this screen sets what the whole shop quotes.
Reach it from Materials & Purchasing → Price Book in the sidebar, at
/price-book.
Tabs
The list has no tabs. Filters narrow by kind and status.
Panels and controls
The list
- Search covers the catalogue — "Search items…".
- Columns: Item · Code, Type, Category, Cost, Price, Margin, Used 90d, and Actions. Used 90d is the column worth reading before a price change — it tells you whether an item matters.
- Prices can be edited inline, so a single correction does not need a form.
Bulk actions
Archive, Move to category, Adjust price, and Set margin % for the ticked items. Adjust price takes a Direction, a By amount, and applies it across the selection; Set margin % works backward from a Target margin instead. Repricing a category to a target margin is the common case, and doing it as a bulk action beats editing rows one at a time.
Categories
Categories can be renamed and removed. Uncategorized is the fallback bucket and cannot be removed — "'Uncategorized' is the fallback bucket and can't be removed." — because items removed from a category have to land somewhere.
Import
Catalogue items can be imported from a CSV. You map your columns to Thermal's, and at minimum Code and Name must be mapped before the import will run. An import either applies or does not: "The import couldn't be saved. No changes were made — please try again."
Starting from scratch? Download template on the import screen gives you a CSV with the exact columns the importer accepts and two example rows to replace. Open Price Book and choose Import to get it.
No catalog items yet is the empty state.
What it accepts
| Field | Format | Required | Rule |
|---|---|---|---|
| Code | Free text, 60 characters or fewer — "e.g. LAB-001" | Yes | "Code is required."; "Code must be 60 characters or fewer."; "That code is already in use by another item." |
| Name | Free text — "e.g. Standard labor hour" | Yes | "Name is required." |
| Kind | Pick a kind | Yes | "Please select a valid kind." |
| Category | Free text — "e.g. HVAC Service" | Yes | "Category is required."; 120 characters or fewer |
| Unit price | Dollars, e.g. 45.00 or 0 | Yes | "Enter a valid price (e.g. 45.00 or 0)." |
| Default quantity | Greater than zero, e.g. 1 or 0.5 | Yes | "Enter a valid quantity greater than zero (e.g. 1 or 0.5)." |
| Description | Free text | No | "Optional — appears on work orders and invoices." |
| Adjustment value | A non-zero number | Yes, to bulk adjust | "Enter a non-zero adjustment value."; "Invalid adjustment mode." |
| Target margin | A percentage | Yes, to set margin | "Enter a valid margin percentage." |
| CSV mapping | Map your columns | Yes, to import | "Map at least the Code and Name columns before importing."; "The file has no data rows to import." |
An item cannot be a component of itself — "An item can't be a component of itself." — which is what stops a bundle referencing its way into a loop.
How to configure it
- Price book settings decide the tiers, the default margin, and how bundles are priced.
- Inventory settings link catalogue items to stocked parts, which is what makes cost real rather than typed.
- Job costing settings decide how a priced line lands against a job's margin.
Who can see it
This screen sits behind the Price book area.
Owners and office managers can open it. Dispatchers and technicians cannot — what the shop charges is not a field decision. The gate is checked on the server, not just hidden in the sidebar, so a direct link does not get around it.
The full role matrix is on Roles & permissions.