Our own CRM and operations platform for wallpaper contracting, live at wallflow.pro with paying customers on it. The centre of it is not a pipeline. It is arithmetic: how many rolls a room takes, and what that means for the price.
Wallpaper contracting: measure a room, work out how much paper it takes, quote it, get it signed, take a deposit, schedule the crew, install, invoice.
Everything after the measurement is ordinary business software. The measurement is the part that decides whether the job made money, and it is the part no ordinary business software has ever heard of.
The problem shape.
A roll count is not wall area divided by roll area. Wallpaper has a pattern repeat, and every cut has to be rounded up to a whole number of repeats so the pattern lines up across the seam. The waste is therefore a property of the paper, not of the room.
Done in a spreadsheet, per estimate, that is a chance to be wrong on every job, and wrong quietly, because a roll count that is one too low looks exactly as plausible as one that is right. You find out on the wall.
PRJ-01-BDetail callouts
What was built.
Each item names the file that proves it. The paths are relative to the repository.
A
The material engine, in one file
Panels per wall from the wall width and the roll width. The cut length rounded up to a whole number of pattern repeats. Panels per roll from the roll length. Rolls from the total panels, plus yardage and the pricing that follows. Openings come off either as their real measured sizes or as US-standard door and window defaults when nobody measured them. The file opens with the rule it enforces: all formulas live here, and a business rule is changed by editing this file and nothing else.
Proof
lib/calc.ts
B
Estimate, signature, deposit
The estimate goes out as a link. The client opens it, reads it, and signs on their phone. Payment runs on Stripe through the same shared module the other two systems use.
Proof
app/sign/[token], app/api/esign/, lib/stripe.ts
C
A client portal with no password to lose
The homeowner gets a tokenised page rather than an account. Nobody in this trade is going to create a login to look at their own quote, and a login they never use is a support call later.
Proof
app/p/[token]
D
The calculator, embeddable
The same engine runs as a widget on the contractor's own website, so a visitor can price a room before anyone picks up a phone. The number on the public site and the number in the estimate come from the same code, which is the only way they can agree.
A Vapi voice agent with a Telegram handoff, a follow-up engine of twelve modules, a tokenised cold-call dialer with eight endpoints behind it, and thirteen scheduled jobs of which five still run. This is the system the AI page is about.
A QuickBooks integration so the accounting side is not a second set of numbers somebody keys in from a PDF at the end of the month.
Proof
lib/quickbooks.ts, app/api/quickbooks/
PRJ-01-CReference
Where this lives.
Built, owned and run by Orium Studios, with paying customers on it. It is the system the other two were forked from, which is why the third took weeks rather than months.
Two things this sheet is careful about. WallFlow is Orium's own product, not a client's: it was built and is owned here, and a wallpaper contracting company is a paying customer running on it. A brief once said that the other way round and the site had to be rewritten, so it is stated rather than implied. And nothing here is a business result. There is no revenue figure, no conversion lift and no customer count beyond what the measured figures on this site already publish, because the only numbers worth printing are the ones a script can re-measure.
System
WallFlow
Repository
wallflow-saas
Trade
Wallpaper contracting
Files named on this sheet
wallflow-saas · lib/calc.ts, the material engine
wallflow-saas · lib/followups/, the follow-up engine
wallflow-saas · app/api/vapi/webhook/, the voice agent handoff
wallflow-saas · lib/stripe.ts, byte-identical in all three systems
Three separate deployments, three separate databases, and no shared data of any kind between clients. What they do share is the code that was proven in one of them first: lib/stripe.ts is byte-for-byte identical in all three repositories.