Case study · Titan · 2026Konrad Kopczynski

How we took field labor from 50% to 30% of revenue, and turned it into a system a 120+ location franchise network runs on

Our franchise locations ran on what a few people knew and five systems that didn't talk to each other. I turned that into a system that runs the day, measures itself, and leaves people the decisions that need them.

50→30%Field labor as a share of revenue
$100–150Cost per hire, down from about $1,000
~100%Of invoices collected, plus ~$20K of bad debt recovered
120+Locations licensed by a national franchise group, 70+ live so far

Watch it run: a 6-minute walkthrough

Live Titan screens, with names and dollar figures blurred. Can't see it? Watch on Loom.

The problem

Home services looks simple from the outside. A crew shows up, does the job, the customer pays. Inside, the day turns on a handful of judgment calls: which job to quote, where to send a crew, who to hire, which invoice to chase.

In the home-services franchise locations I co-owned, those calls lived in a few people's heads. The data to check them was spread across five systems. Finding out what happened yesterday meant someone pulling it together by hand.

It showed up in one number. Field labor was 50% of revenue. We knew we were overspending on labor per job, we just couldn't see where fast enough to do anything about it.

What I built

I built Titan, an AI operating system for multi-location service businesses, and ran our own locations on it first. It handles reporting, quoting, invoicing, collections, recruiting and dispatch.

Pulse: built around decisions, not dashboards

Every number that runs the day is on one screen: quotes sent, conversion, invoiced, collected, gross margin, dollars per van per day. The same numbers land in an email twice a day so nobody has to go looking. The 6pm email lists every visit from that day and which ones still need invoicing or still need paying. That email is what shortened our cash cycle.

Each view starts from the decision someone has to make, like what to invoice, what to chase, where to send an open crew. When a number would mislead, the system holds it back instead of showing it.

Titan Pulse dashboard showing quotes sent, conversion rate, invoiced and collected totals, gross margin and dollars per van per day. Titan Pulse dashboard showing quotes sent, conversion rate, invoiced and collected totals, gross margin and dollars per van per day.
Pulse. The numbers that run the day, with targets. Dollar figures are blurred here.

Agents that give our answer, not a generic one

They're built from the franchise's training, our SOPs and call transcripts, and rebuilt nightly. A crew member asks how to handle a job and gets the answer from our own training. GMs use the same tool to pull data from the P&L, bank transactions, the CRM and marketing channels.

A Titan agent answering a crew question about removing oily residue from a window, citing the company's own sales and operations training. A Titan agent answering a crew question about removing oily residue from a window, citing the company's own sales and operations training.
Agents. A crew question answered from the company's own training, with the source cited.

A recruiting agent

Someone texts the hiring line. The agent screens them on the spot and scores them against the three things we actually hire for: friendliness, hustle and quality. The GM gets a candidate and a transcript, and makes the call.

Dispatch

It finds a slot next to another job in the same area so crews drive less, or pulls a future job forward into a slot that just opened.

Titan dispatch view listing the best days to book a job in one territory, with jobs already nearby and open slots per day. Titan dispatch view listing the best days to book a job in one territory, with jobs already nearby and open slots per day.
Dispatch. Best days to book a new job, ranked by jobs already nearby and open slots.

It checks itself overnight

At 3am it reconciles our data against the source systems and backfills whatever drifted. At 4am it scans for errors and writes up what it found. By 5am the day's plan is waiting. Errors, team feedback and feature requests flow back in and become fixes, so it gets better every week without anyone kicking off a project.

The numbers

What was hard

The software was the easy part. Building has gotten cheap. I've run more than 80 coding agents at once, and the limit was never compute or headcount. It was how fast decisions got made.

The hard part was everything around the code. First, trust in the numbers. Data from the field system drifts, and if people see one wrong number they stop trusting all of them. That's why the overnight reconciliation exists, and why Pulse would rather hide a number than show a misleading one.

Second, adoption. A dashboard nobody acts on changes nothing. What moved behavior was sending people the numbers at 6pm with the specific visits to chase, not asking them to log in and look.

Third, deciding what the system should not decide. The recruiting agent screens and scores, the GM still hires. Drawing that line for each workflow is a business call, not a technical one.

How the AI acts in production

Titan doesn't just report. Its agents make decisions and take actions in a live business every day, so most of the work went into how they're run, checked and kept in bounds.

Orchestration, not prompts. The recruiting agent runs a full screening conversation by text and scores the candidate. Invoicing and collections run as multi-step workflows on a scheduler. On the build side, dozens of agents work in parallel, each in its own copy of the code, with a merge queue deciding what lands.

Tool use and workflow execution. Agents act through connectors I built into the systems the business already runs on: Jobber for jobs and invoices, QuickBooks, the bank, the phone and text system, and email.

Evaluation, before and after. Before a change ships: tests, adversarial AI review (including a reviewer built from 52 of my own review comments), 21 automated checks and a live preview on production-shaped data. After it ships: every night the system reconciles what it recorded against the source systems and writes up every error it finds.

Observability and failure handling. Health checks and a watchdog run around the clock, and the deploy tests itself and rolls back if it breaks. The lesson that cost me the most: "it reported success" isn't success. Every job has to show its effect, not just a green status.

Guardrails. Nothing merges without passing every check, every change can be rolled back, and the reporting would rather hide a number than show a misleading one.

Autonomy vs. control. I decide this per workflow. Reminders and reconciliation run on their own. The recruiting agent screens and scores, but the GM makes the hire. Anything that changes money or a customer relationship in a new way waits for a person.

What it shows

The method isn't specific to window cleaning or franchises. It's how I'd approach any operation that runs on a few people's judgment.

  1. Find the one number that matters most

    For us it was labor as a share of revenue. Everything else came after.

  2. Write down how the best operator makes the calls behind it

    What to invoice, who to hire, where to send a crew. That judgment becomes the rules, the training material and the scoring.

  3. Build the smallest system that moves the number, and prove it in production

    Ours ran in our own locations before anyone else saw it. Then widen from there.

  4. Keep people on the calls that need judgment

    Let the system do the repetitive work and check itself every night, so the numbers stay trusted and people only step in where it matters.

If you're trying to do this in your operation, I'm happy to compare notes.

More on how I work at kopczynski.us.