RXed AI News

AI to the bone.
@RXed_EU
A weekend ↓ architecture v1.0 · 2026-08-13

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

Setup: A weekend (~8-16 h) Running cost: $8-15/mo (software included) Time saved: saves ~2.1-3.3 h/week for the owner at 5 quotes a week — basis After setup: You run it — the pricing and the paperwork are automatic; deciding what the job actually needs, and reading the draft before it goes, stays with whoever visited the site Data lives: Your server — Your cost prices, your margins and your customer list sit on your own box. Your price book is the most commercially sensitive file in the business, and this keeps it out of a vendor account you do not control.
GristInvoice Ninjan8nOllamaDockerInvoicingDocuments & archive
Built for small businesses in general — not a sector list.
Before you start
  • 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
What breaks first FAILS SILENTLY
the price book goes stale - supplier prices move, the list does not, and every quote is still perfectly formatted. Nothing errors. Totals look right and are wrong by whatever the increases added up to. Put a priced-on date on every material row, flag anything older than 90 days, and re-check the top twenty lines every month.
Version history
v1.0 · 2026-08-13 — First release. Grist as the price book with assemblies built from reference columns, n8n as the quote builder, Invoice Ninja for the document and the portal approval that converts to an invoice. The local model is fenced to picking line codes and is never allowed near a number.

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

Rough notes from the site visitWhat you charge for materials andtimethe notes become line items, the list sets everypriceThe quote builderquantities times this month's prices, plus your markup,minimum call-out and a validity dateA priced draft you read once and sendA supplier price change that correctsevery future quote at onceThe customer approves online, withthe date and time recordedThe approved quote becomes theinvoice, with the same numbers on itOne price list behind every quote you sendso two people quoting the same job land on the same numberThe list is the product. The software only stops you typing it out again.
the same flow as text
[ Site visit ]  rough notes: "12 m² wall tile, new mixer tap, two men half a day"
        ▼
[ 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

Grist
(Apache-2.0, 11k stars, commit today — 13/08/2026) is the price book. Three tables: materials with unit and current supplier price, labour rates per trade per hour, and assemblies that reference both. Reference columns and 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.
Invoice Ninja
(Elastic License 2.0, 10k stars, commit 12/08/2026) renders and sends. Its own licence page is explicit that self-hosting is free for your own business use; the paid pieces are the hosted plan and a $30/year white-label module that removes the footer, both optional. What earns it the container is the documented quote path: the customer approves in the client portal with one click, which gives you a timestamped record of the agreement, and the approved quote converts to an invoice carrying the same line items. Two other blueprints in this library already run on it — the quote follow-up engine and the job margin tracker — so it is one install doing three jobs.
n8n
(Sustainable Use License, free for internal business use, 200k stars, commit today) is the builder. It has a documented Grist node, so reading the price book is configuration, not code. It is also where the boring rules live that make a quote a quote: minimum call-out, rounding, validity date, payment terms.
Ollama
(MIT, 178k stars, commit today) is optional and deliberately fenced in. Its only job is turning "12 m² wall tile, new mixer tap, two men half a day" into a list of line codes and quantities. It is not allowed near a price, and it does not need to be: the price book has the numbers. If it picks the wrong code, you see a wrong line in a draft and fix it in two seconds. If it were allowed to price, you would see a plausible total and send it.
Monthly cost
Software €0 for all four. Invoice Ninja wants PHP and a MySQL database, so budget slightly more machine than a static stack needs: one VPS at roughly €8–15/month runs Grist, n8n and Invoice Ninja together for a small firm. The white-label module is $30/year if the footer bothers you. Set that against $39–199/month per person, or $599/month for a fifteen-user team plan, on the subscription route.

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

A stale price book quotes confidently, and wrong
This is the failure that matters, and it is silent: every quote still looks right, prints right and totals right, at prices that expired in spring. Put a "priced on" date on every material row, flag anything older than 90 days, and re-check your top twenty lines monthly. If you are running the supplier price-drift watcher, its output is what feeds this book — that is the pair that makes both worth having.
The model never touches a number
Worth saying twice, because it is the one shortcut people take. A language model that suggests a code is checkable at a glance. A language model that suggests €4,180 is not, because the wrong answer looks exactly like the right one.
Assemblies are where the margin hides
Waste, delivery, the half hour of setting up and cleaning up, the trip to the merchant because one fitting was wrong. If your assembly ignores those, the machine will industrialise the same underquote you have been making by hand — faster, and more consistently.
Markup is not margin
A 20% markup on cost is a 16.7% margin on the sale price. Decide which one you mean, write it in the price book, and never let the two words drift in the same business. Consistency at speed makes an arithmetic mistake permanent.
A quote with no expiry is a price you owe forever
Print a validity date — 30 days is standard — and have the flow set it automatically. Someone will accept a quote from fourteen months ago at some point, and the only question is whether it is your problem.
Fast does not mean right
When a quote takes ten minutes instead of an hour, it becomes very easy to send a price for a job nobody looked at properly. The site visit is not the part being automated. Add a hard field for who inspected it and when, and leave it blank at your own risk.
Tax is a setup decision, not a formula
Keep the price book exclusive of VAT or sales tax, apply tax at the document, and configure it once in Invoice Ninja — including reverse charge or exemption cases if you sell across borders. If you quote consumers, the number they see has to be the number they pay.
Self-hosting your invoicing means backups stopped being optional
Quotes and invoices are exactly the records a tax authority asks for years later. Restore-tested backups, not just backups — there is a blueprint in this library for it, and this is the stack that makes it non-negotiable.
The book will say no, and people will go around it
Some jobs will not fit an assembly. The rule that keeps this alive: price the odd one by hand, then add the assembly the same week. Skip that second half twice and everyone is quietly back to quoting from memory, with three containers running to watch them do it.

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.

Get the next blueprint as it publishes — free, practical, verified tooling only.

Subscribe · Want it audited or extended for your business? DM @RXed_EU