Price Book
Your own list of codes for the things you buy and the labour you sell — 4x2 timber, 90mm nails, a box of glue, a carpenter's hourly rate — each with the price you're paying today. Available on every plan.
Find it under Work → Price Book.
Adding your codes
Each item has:
- Code — your shorthand, e.g.
TIMBER-4X2. It has to be unique in your
company, because it's what a price update matches on later.
- Description — what it actually is: "4x2 framing timber".
- Type — Material or Labour.
- Unit —
m,ea,hr,m2. Optional, but it's what shows on the quote. - Category — optional. If you set one, items land in that section of an
estimate automatically.
- Unit cost — what one of them costs you.
Fill the bottom row of the table and hit + Add. Edit any row later with Edit, or Archive an item you've stopped using — archived items stay in your history but drop out of the picker.
Renaming a code is safe. Estimate templates remember the code a line came from, so changing TIMBER-4X2 to TIMBER-4X2-H3 renames it on those template lines at the same time. The next price load for the new code still finds them.
Changing a price here changes it on your templates too — exactly like loading a price list for that one code. Type $9.25 over $8.40 and every template line tagged with that code quotes $9.25 from then on, so a template and a direct pick can't disagree about today's price. Estimates you've already built keep the price they were quoted at, as always.
Quoting from the book
Two places have an Add from Price Book button:
- a deal's Estimate tab, while the estimate is still a draft, and
- the Estimate Templates page.
Search for what you need, type a quantity next to it, and hit Add. Each pick becomes a normal line item — description, code, unit and price filled in — that you can edit like any other.
If someone else changes one of the items you picked while the dialog is open — a price load, a rename, an archive — the Add is refused and the list refreshes. Check the quantities and add again; you never get a price nobody saw.
Picks are added one line at a time. If something goes wrong part way through a batch, the dialog tells you which ones did land ("Added 1 of 2: TIMBER-4X2") and the estimate behind it refreshes to show them, so you can see what you're being charged for. The ones that landed drop out of the selection — hitting Add again retries only the rest.
Two people can work the book at once. Changes to it happen one at a time, so a price load that arrives while someone is renaming or adding an item simply waits its turn instead of half-landing — the book and the templates never end up quoting different prices for the same code. Edits are quick, so the wait isn't something you'll notice. If your own edit loses that race (someone renamed the item out from under you), you get "This item was changed by someone else. Reload and try again."
If a price is blank or unreadable, saving is refused — the price book never fills one in as $0.00 for you. A genuinely free item is fine; type 0.
Quantities go to three decimal places — 1.235, not 1.2345. A finer number is refused rather than rounded down to three places behind your back, so the quantity on the quote is always the one you typed.
Loading a new price list
When your supplier sends through new pricing, paste it into the Load prices box at the bottom of the Price Book page, one line per item:
`` TIMBER-4X2,8.40 NAILS-90MM,32.00 ``
A description column between the code and the price is fine too, which is how most supplier exports come:
`` TIMBER-4X2,4x2 framing timber,8.40 NAILS-90MM,90mm nails,32.00 ``
Commas, tabs or semicolons all work, and a dollar sign or a comma in the thousands is fine. The price is read from the last column that is *entirely* a number, so a number sitting inside a description is never mistaken for one: 4x2 framing timber loads $8.40, not $4.00, and NAILS-90MM,32,4.8m long loads $32.00, not $324.80. A line with no price column at all is skipped rather than guessed at.
Anything the box can't read is counted as a skipped line and told to you rather than quietly ignored — including a price with more than two decimal places, because prices are held to the cent and a loader that quietly rounded your supplier's number would be worse than one that says it couldn't read it.
What loading prices does — and deliberately doesn't:
| | | |---|---| | Your price book | ✅ updated to the new prices | | Your estimate templates | ✅ updated, so every new estimate you start quotes the new price | | Estimates you've already built | ❌ untouched — a quote keeps the price you quoted it at, draft or sent |
That last row is the point of the feature. A price rise shouldn't quietly change a number a client has already seen. If you *do* want an existing estimate at the new price, add the line again from the book (or delete and re-add it).
Templates are matched by supplier code. Items you added from the price book already carry theirs; a template item you typed in by hand only picks up new prices if you put the code in its "Supplier code" field.
Loading the same list twice changes nothing the second time, and says "no price changes" — so if you're not sure whether a load went through, just run it again.
Importing a whole file (CSV or Excel)
For a full supplier export — hundreds or thousands of rows, with a header row and several columns you'd like to keep, not just a price — use Import file, further down the Price Book page, instead of the paste box.
Choose a .csv or .xlsx file. Common exports (an ITM price list is the one this was built against) already have headers like Supplier Code, Description, Cost Item Type, Category, Subcategory, UOM and Unit Cost — the import recognises those, and a good few synonyms besides (SKU, Part No, Price, Unit, Rate, and so on), so most files just work without you touching anything.
If it can't figure out which column is the code and which is the price, it tells you and shows you the file's own column headers — pick the right one for each field from the dropdowns (Code, Description, Unit cost, Unit, Category, Subcategory, Type), and it re-reads the file straight away. You only need to map Code and Unit cost; everything else is optional. Correcting one column doesn't lose the others — the rest of your mapping (including Subcategory, even though it isn't a column on the item itself) carries forward.
Category and Subcategory are combined into one category, "Category / Subcategory", the same as loading a price list where the file has both.
Prices can use either a dot or a comma for the decimal point, and the import works out which is which per price rather than assuming one convention for the whole file — 1,250.50, 1.250,50 and a semicolon-delimited file's 8,40 all read as the same number. A number with both a comma and a dot uses whichever one comes LAST as the decimal point and expects the other to be a normal 3-digit grouping. A price with just one comma and no dot is read as a decimal comma (8,40 → $8.40) unless it groups into 3-digit chunks like a thousands separator (1,250 → $1,250, matching the paste box's own rule); anything that's neither is skipped and reported rather than guessed at.
Before anything is imported you get a preview: how many rows were read, how many are ready to import, how many were skipped (and why — no code, no price, a price it couldn't read, a negative or too-large price, or a code too long to store), how many prices were rounded to the nearest cent, how many duplicate codes it found (the last row for a code wins, same as the paste box), and how many descriptions, units or categories had to be shortened to fit. A sample of the first ten rows is shown so you can check it read the file the way you expected — and it always shows exactly what will be saved, never something a row might still fail on when you hit Import.
While a re-read is in progress (after you change a mapping) the Import button is disabled, so you can't accidentally commit the mapping you're in the middle of changing.
A file that's unreadable, corrupted, or unreasonably large/complex for a price list is refused with a message telling you so, rather than hanging or crashing the page.
Hit Import N items to commit. Exactly like Loading a new price list above:
| | | |---|---| | A code you don't have yet | ✅ added, with its description/type/unit/category from the file | | A code you already have | ✅ price updated only — description, type, unit and category stay exactly as you set them, even if the file's columns disagree | | Your estimate templates | ✅ updated, so every new estimate quotes the new price | | Estimates you've already built | ❌ untouched, as always |
That middle row is deliberate: once you've curated an item's description or category in your own book, a supplier's export re-labelling it doesn't get to overwrite your work — only the number that supplier actually controls, the price, moves.
A new code needs a description to be created at all — if a row has no description and isn't already in your book, it's skipped and listed as "no description" rather than added with a blank one. An existing code doesn't need a description in the file; its price still updates.