The price book that does the quoting: every price from one list, none from memory
Your materials, labour rates and standard jobs live in one table that every quote reads, so a quote takes ten minutes instead of an evening and it is priced at this month's costs rather than the ones you happen to remember
- A price list that already exists somewhere, even if it is a spreadsheet and three supplier emails. This blueprint files your prices, it does not invent them
- A decision, written down, on your labour rate per trade and whether your number is a markup on cost or a margin on the sale price
- The ten jobs you quote most often, broken into their parts - this is the work, and it is what makes a quote take ten minutes
- Ten past quotes to rebuild as an acceptance test, because the differences tell you where you have been underpricing
- One person who owns the price book and updates it when a supplier price moves
- A machine that stays on with a real database, since Invoice Ninja is PHP and MySQL rather than a static site
- Restore-tested backups before the first real quote goes out - these files are your tax records now
Version history
Quoting is the job you do after the job, on a Sunday, from memory. The fix is not software. The fix is a price book — one list where every number lives once. The software only stops you retyping it.
The architecture
the same flow as text
▼
[ n8n — the quote builder ]
│ optional: a small local model maps the notes onto line codes
│ codes only — it never sees a price and never invents one
▼
[ Grist — the price book ] materials · labour rates · assemblies
│ every line: quantity × today's unit price, looked up
│ assembly "1 m² wall tile" = tile + adhesive + grout + 0.6 h tiler
▼
[ n8n ] markup, minimum call-out, validity date, payment terms
▼
[ Invoice Ninja ] PDF + client portal
├─ customer approves with one click, timestamped
└─ approved quote converts to the invoice — same numbers, nothing retyped
One rule holds the whole thing up: a number lives in the price book or it does not exist.
Three containers on one box. The price book is the source of truth, the builder assembles, the invoicing tool presents and collects. Keep those separate and you can change any one of them later without losing the other two — and the price book, the part that is actually yours, is a table you can export in thirty seconds.
The problem
You have quoted this job twenty times. A bathroom, a service contract, a two-day install. And you will still spend forty minutes tonight rebuilding it line by line, because the prices are in your head, in an old email from the supplier, and in a quote you sent in March that you now have to find. Then you retype the whole thing into a document, because the quote you send has to look like a quote.
Two things go wrong, and only one of them is the typing. The typing is annoying. The pricing is expensive. Prices from memory are last year's prices, and supplier increases do not arrive with a letter — they arrive as a slightly different number on a delivery note that nobody reads (that is a separate blueprint in this library, the supplier price-drift watcher). So the quote goes out at a number that was correct once, you win the job, and the margin you thought you had was spent before you started.
One honest note before the architecture. There are figures everywhere about what slow quoting costs — first-to-quote win rates, revenue lost to quotes that were never followed up. Every one I could trace back ends at a software vendor's own blog. I am not anchoring a blueprint on those. What is verifiable is the price of the alternative and your own arithmetic. The category tools that own this workflow list, on 2026 third-party pricing pages, at roughly $39/month solo, $119–199/month with the useful features, and up to $599/month for a fifteen-user team plan. They do far more than quoting, and for some businesses they are worth it. But the thing you are renting in there is your own price book.
Tool choices — and why
lookupOne are documented Grist features, which is the mechanic that matters here: an assembly row does not store a price, it pulls today's price from the material row. Change one supplier price and every quote you build tomorrow is correct. It also has access rules, so an estimator can see prices without seeing your margins. A spreadsheet does this well for the first hundred lines, and then somebody makes a copy "just for this quote" and you have two price books.Setup outline
1. Write the price book before you touch any software. A spreadsheet is fine for this step. Materials with unit and current price, labour rate per trade per hour, and the ten jobs you quote most often broken into their parts. This is the work. Everything after it is plumbing, and if you skip it you will have automated nothing.
2. Turn those ten into assemblies. "One square metre of wall tiling" is tile, adhesive, grout, waste factor and 0.6 hours of a tiler — one line you can quote in a second, priced from parts that update themselves.
3. Deploy Grist, n8n and Invoice Ninja with Docker behind HTTPS on your own domain.
4. Load the price book into Grist. Assemblies use reference columns to the material and labour tables, so no assembly ever stores a number of its own.
5. Rebuild your last ten quotes from the book and compare each total against what you actually charged. This is the acceptance test, and the gaps are the most useful thing you will read this month: where the book is wrong, and where you were quoting below your own costs.
6. Build the n8n flow: a short form (customer, line codes, quantities) → look up current prices → apply markup, minimum call-out and validity date → create the quote in Invoice Ninja as a draft.
7. Send drafts for two weeks before automating anything else. You are checking that the totals hold on jobs you did not design the assemblies around.
8. Only then add the optional drafting step, and switch on portal approval with auto-conversion to invoice. Point the sent quotes at the follow-up engine so the ones that go quiet get chased.
Pitfalls — the real ones
Verified repos
Grist — Apache-2.0, 11.4k stars, commit today (13/08/2026)
Invoice Ninja — Elastic License 2.0, 10.0k stars, active (12/08/2026)
n8n — Sustainable Use License (free self-hosted internal use), 200k stars, commit today
Ollama — MIT, 178k stars, commit today
Claims checked against primary sources: the Invoice Ninja licence page (self-hosting free for your own business; white-label module paid) and its quotes documentation (portal approval, conversion to invoice); the n8n Grist node docs; Grist's references and lookups guide. Subscription figures are 2026 third-party pricing listings for the category leader in field-service quoting, not vendor marketing pages, and are quoted as a range because plan names change faster than the prices do. Repo figures verified 13/08/2026.