Case Study · Construction · Document Automation

From a wishlist of supplier names to a self-updating price database.

A working proof-of-concept that reads the crumpled receipts, emailed PDFs and phone photos a contractor already has — and lands clean, priced rows in their own Google Sheet.

Working demo · pilot in scoping
One document inClean rows out
SupplierItemPrice
SIKASikaflex 1A$11.42
SimpsonStrong-Drive SDS$0.62
Home Depot2×4×8 SPF stud$4.27
1,000
Suppliers in scope
20
Columns auto-filled / row
~4 hrs
Saved / week · illustrative
PDF · Photo
Inputs handled today
01The problem

A sheet full of names. No prices.

suppliers · master.gsheet1,000 rows
#SupplierItemUnit price
1Home Depot
2SIKA
3GAF
4Simpson Strong-Tie
5Ferguson
6White Cap
1,000 suppliers listed · prices mostly blank
…meanwhile the prices arrive as
Emailed PDF quote
multi-page · line items
Phone photo of a receipt
crumpled · glare
Forwarded spec sheet
SIKA · GAF
Printed lumber-yard slip
handwritten totals

The PM retypes them one by one — when there's time, which is rarely. So bids run on stale pricing.

02The pipeline

One watched folder does the rest.

Drive folder
Watched
Classifier
Doc type
Model router
6 models
Extraction
20 fields
Fuzzy match
Confidence
Dedup
Composite key
Review queue
Human OK
Their Sheet
Approved rows
Model router picks cheap / strong / strongest per document type

No new app to learn. It lives in the Drive and Sheet they already use.

03Before → After

Three messy inputs. Four clean rows.

In
Home Depot photo
JPG · crumpled
SIKA quote
PDF · 3 pages
Lumber-yard slip
scan · handwritten
Out
SupplierItemPrice
SIKASikaflex 1A$11.42
GAFTimberline HDZ$38.50
Home Depot2×4×8 SPF stud$4.27
SimpsonStrong-Drive SDS$0.62

Clean rows in their sheet, tagged to the job — no retyping.

04Review-first

AI extracts. The human approves.

Original document
ItemAmount
Sikaflex 1A · 10.1 oz$11.42
Timberline HDZ bundle$38.50
2×4×8 SPF stud$4.27
Subtotal$54.19
Freight$12.00
Sales tax$3.79
Extracted rowsPM review
SIKA · Sikaflex 1A
10.1 oz · sealant
$11.42
GAF · Timberline HDZ
shingle bundle
$38.50
Home Depot · SPF stud
2×4×8
$4.27
Subtotal
not a line item
rejected
Freight · Sales tax
noise
rejected
Only signed-off rows land in the sheet

Original on the left, extracted rows on the right. The PM keeps what's real, drops the noise.

05Smart by design

The boring parts, handled.

Fuzzy supplier matching

Three spellings of one vendor collapse into a single supplier — with a confidence score on every match.

HOME DEPOT
Home Depot, Inc.
HD #4321
Home Depot98% match

Deduplication

A composite key means a repeat receipt updates the existing row — it never doubles it.

company | item | size
Same key → row updated, not added

Source archive

Every row links straight back to the original document. "Where did this price come from?" is one click.

$11.42 · SIKA → receipt_0418.jpg
06What we did not build
Cheap and useful, not overengineered.
No custom database in v1
The Google Sheet stays the source of truth. Postgres is Phase 2.
No QuickBooks integration yet
Sheet-first today; sync comes once the upstream data is clean.
No mobile app
A phone photo into Drive already works — a native app added weeks for zero new value.
07Where it stands

An honest line, not a launch.

Done
Demo signed off
The client's PM approved the working demo. NDA in place.
Now
Paid pilot being scoped
Pricing and scope for a paid pilot, in progress.
Pilot
Real hosting + auth
Multi-user auth, email ingestion, mobile upload for the crew.
Phase 2
Postgres + alerts
Audit log and price-anomaly alerts on top of clean data.
08Beyond one client

The same shape — unstructured docs into structured rows.

AccountantsLaw firmsLogisticsInsuranceProperty managementMedical billing
Get started

Recognize this in your own business?

We map your workflow, find the slowest, most expensive piece of someone's week, and tell you up front whether it's worth automating.

Custom-scoped · no off-the-shelf pricing