← Work/Case study
How a family-owned HVAC contractor in the Midwest got 8 hours a week back.
A custom hosted web app that turns one paste of a job number into a print-ready rebate filing.
At a glance
- Industry
- HVAC contractor, family-owned
- Team
- One operations manager, one owner, field technicians
- Workflow
- Rebate program filings (residential clean-and-checks + equipment replacements)
- Hours saved
- ~8 / week
The problem
Their operations manager spent roughly eight hours a week re-keying data from their field-service platform into a contractor-portal web form, then printing, signing, and mailing the result. The data already existed — it just lived in two different systems that didn't talk to each other. No off-the-shelf rebate software covered the program their company files into, so the work was permanent.
What we built
A hosted web app at a subdomain of their company's URL. The operations manager signs in with an emailed code, pastes a job number from their field-service platform, and reviews a prefilled form. One click composes a print-ready double-sided PDF — rebate form on the front, paid invoice on the back — drops it into cloud storage, and opens it in a new tab.
Behind the button, four layers do the work
Application
A custom Next.js app the team uses in their normal browser. Authentication, audit history, an admin view for elevated access, and a workflow picker so additional automations can slot in without redesign. Their team holds no AI subscriptions, installs nothing, and the data stays on infrastructure we control.
Classification
Job records arrive with messy line-item naming — “Maintenance — Clean and Check / AC” in one template, “Clean and Check / Furnace” in another. We built a classifier that keys off stable internal identifiers (not the human-readable names that drift across templates), validated it against a corpus of 400 real jobs, and shipped an override queue. Every override the operations manager makes becomes a regression test fixture, so the next refactor can't re-break the case.
Automation
A cloud browser fills the third-party rebate portal end-to-end — login, the right form for the right rebate type, the right line items, submission. We capture the new submission's identifier with a pre/post diff, prime the portal's session correctly, and verify the rendered customer name on the printable receipt before saving the PDF. The class of bug where a wrong-customer PDF reaches storage was eliminated by design.
Generation
A two-page PDF assembled with pdf-lib — the rebate form rendered to a print-ready preview on the front, the paid invoice rendered at half scale and rotated 180° on the back so the operations manager can print double-sided and mail. Files land in cloud storage with human-readable names — last name plus job number — so any past filing is searchable by typing.
The result
A working custom application, in production, that the operations manager opens every week. Eight hours of weekly data entry collapsed into “click a button, review, print.” The owner now has the option to fold additional workflows into the same app — the workflow picker is already there, waiting.
Tech stack
Next.js (App Router) · TypeScript · Tailwind · Supabase (auth, storage, Postgres) · Browserbase + Playwright · pdf-lib · Anthropic API for classification.
Have a workflow that looks like this?
If your team is moving data between two systems by hand, there's probably a button to be built. Tell me about it.