← Back to Home

Roofing Company: 90 hours to 30

60 hrs/week
Time saved
$40k
Cash doubled by year two
Zero
9pm admin sessions

The phone call

"I've got some free time this week. What should I be doing?"

About nine months in, my business partner called me and asked what he should be working on. He had free time that afternoon and didn't know what to do with it.

Hallelujah! It wasn't the panic of not having work, we had jobs running, it was the sweet sweet feeling of being a useless boss. I knew we'd actually fixed something. Before, there was always a fire. Always a lead to chase, a crew to coordinate, an invoice that should have gone out last week. But that afternoon, nothing was burning.

How I got into this

I had a friend who was running a roofing company. He'd done a great job getting it off the ground. He's a natural entrepreneur. He got the contractor's license, landed initial jobs, and had a crew going. So why did he call me to join him in the business? I don't want to say floundering exactly, more like casting about. Constantly in emergency mode. He was a hero in that way, always solving problems, but the pace was gonna burn him out.

He asked me a few times to come on board. I had a very easy, very stable cybersecurity job at JP Morgan Chase, so I kept saying no. But eventually I relented, took a look at his books (they weren't done right, by the way, but I learned that later) and I thought this could be good: I actually know how to fix this.

So I quit and became a co-owner of a roofing company.

Nick doing a drone roof inspection

From cybersecurity desk job to roofing company co-owner. Drone inspections became part of the routine.

What the mess looked like

It started with the leads.

A lead could come in via email, or more often a phone call. Sometimes a text. He'd scribble something on a napkin or a notebook he kept in the truck. Maybe he'd put a calendar reminder for the inspection. Sometimes the info would make it into a Google Sheet of leads. Sometimes it would disappear and get missed entirely. There was zero criticism from my side here, because there were just SO MANY things he was juggling. The system wasn't bad because he was lazy. There was no system because he never had time to build one.

The evening admin sessions were brutal. He'd get home at 7 or 8, eat something, then sit at the kitchen table until 11pm trying to remember who called, transfer napkin notes into spreadsheets, follow up with people he should have called back yesterday, price jobs, pay subs, send invoices. Almost every night and this is not sustainable for a human being.

First thing: the lead sheet

Entering data into a Google Sheet on your phone is awful. The cells are tiny, autocorrect is a pain with addresses, and it's easy to fat-finger the wrong field. Nobody who works from a phone I know does it consistently. They promise themselves they'll enter it later and then they don't.

So the first thing I built was a Google Form: Name, Address, Phone, Roof type, Where they heard about us. Takes maybe 45 seconds and it works in the truck from the cell phone. Now he could take calls while driving, scribble in his notebook, and input it into the form when he had a minute. Or if he wasn't driving, just input it directly.

I want to be clear: this is not a complicated technical solution. It's a Google Form. But the point wasn't to be clever. The point was to help stop forgetting to call leads back. Every single lead is a precious gem.

This was a functional system for the individual leads that came in over the phone and text, but not so great for the email leads and the ones that came from other sources. Sometimes he'd buy leads and they'd email or text him info and the volume was too big to do the entry. So, and this was a little bit more work, I wrote some scripts and Zapier automations to handle the different input formats—scrub the email, pull out the relevant fields, dump it into the same lead sheet regardless of where it came from.

The nightly data entry sessions dropped by maybe 4 hours a week from this AND we stopped fumbling leads as much. We also got much better data that allowed us to do some more quantified analysis for lead purchasing business decisions, but more on that later.

First iteration of customer tracking spreadsheet

Early version of the lead tracking sheet. Simple, but it worked from a phone and nothing got lost.

Second thing: the job sheet

We did have jobs, we needed somewhere to track them.

Another spreadsheet, nothing fancy. We did have this already, but I added more fields that gave us info about job costing basics and installer details. These are not fancy things. This is one of those things that seems like extra work, but as they say, an ounce of preparation is worth a pound of cure.

The crew tracking part paid off later. We had certain installers we eventually had to let go because of callback issues, and knowing exactly which jobs they'd worked let us go back and do complimentary re-inspections for those specific customers. We caught a number of problems before they became complaints, which saved us SO much time and headache.

The lead source detail

Remember that "where did you hear about us" field on the intake form? We weren't tracking lead source all that well before. We kinda did have the data, but we weren't able to do much with it because it was scattered about and not linked to the jobs sheet. Once we joined the job details, we had enough data that we could actually do math on which lead sources were worth the money.

Here's what we found: we had one source that felt really good. Lots of calls, decent conversion rate, we were getting jobs from it. But when we ran the actual numbers—cost divided by sold leads—we were paying something like $550 per closed deal. Another source felt mediocre, some time-wasters and no-shows mixed in, but the cost per sold lead was $120.

So we killed the $550 channel completely and put all that budget into the $120 one. Volume went up, cost went down, and we had the capacity to add another crew.

This made me nervous, honestly. I don't like putting all the eggs in one basket, and I'd always preferred diversified lead sources. So I started building other channels to spread the risk. Which we did eventually with the mailer system, but first we needed standardized addresses.

Address standardization

I have a background in mapping and addresses are a lot more of a pain than you'd think.

Address validation and quality is critical for other systems. You can't pass a bad address to an automated mailer system. CompanyCam gets a little irritated if it gets bad info too. Lots of our systems relied on quality addresses. Fortunately, we were doing this for cheap—I was able to use the Google Form plus Sheets plus Google Apps Script, which allows unlimited calls to the Google Maps API for geocoding, address validation, and standardization.

So in the form, you could put "124 Main, Portland" and get back in the lead sheet: House Number, Street, City, County, State, Zip—all properly formatted and validated.

There's no way in hell I'd get anyone to input like this to Google Sheets from the truck. But the address standardization saved us SO MUCH time down the road. Knowing which county we were in let us pay taxes at the appropriate rate. In Oregon, each county has different tax rates. And if we had a job that wasn't in the county, now we wouldn't have to pay that tax and we'd know it and not worry about it. We knew we were doing good compliance.

Google Apps Script for address geocoding

The Google Apps Script that validated and standardized addresses automatically. One input, clean data out.

It also meant we could plot these points on a map effectively and see where our customers were coming from. Which neighborhoods, check for groupings and clusters, patterns and such. Also, that map was really nice for marketing. Not a huge deal, but being able to get multiple uses out of one asset is one of those small percent improvements that really adds up over time.

Map showing customer locations by neighborhood

Mapping customer locations to identify neighborhood clusters. Good for targeting mailers and understanding where work was coming from.

The thing that address standardization and validation allowed us to unlock was mailers.

The automated mailer

We had problems at times with neighbors complaining. Maybe a loose nail on the street. Some shingles escaped into their yard. They didn't like the delivery trucks, the porta potty, or well... anything to do with construction.

Most people were pretty chill. The rest could be split between those that were chill IF they knew ahead of time, and those that had zero chill. The zero chill ones I could usually get to back down if they'd been alerted ahead of time. But they had to know the job was coming.

How do we do that though? Note on their door? Tape it? Knock and say hello? It's hard to add things that take time when there's no immediate payoff. We did do it as part of our process, but it wasn't consistent. Sometimes during our pre-job inspection, we'd run out of letters so we couldn't give notice. Or we would knock and nobody would answer.

So we started using automated mailers. When we booked a job for a specific date, it triggered automatic mail to the neighbors alerting them we'd be working that week(ish). Portland rain is a thing, so schedules shift, but people like to know when there's going to be trucks and noise. The letter included our number in case they had concerns. And if they wanted a roof quote, well, now they knew exactly who to call and they could see our work firsthand on their neighbor's house.

Automated neighbor notification mailer system

The automation that sent neighbor notifications. Book a job, neighbors get a letter. Problem prevention that doubled as marketing.

Building multi-functional systems

One of my north stars was this: any time there's a problem, after dealing with it, figure out how to prevent it. And if you can build on top of that prevention to make a system that improves the business, that's the work.

If we identified it as a good neighborhood—and I ran a profit regression on which houses had the best margins with the fewest callback issues, it's single family homes 1800 square feet or more by the way—we'd do wider mailers to the whole block.

I also set up a form for the initial inspection visits. When we had time, which we did now, we'd walk the block and identify other houses that probably needed work soon, then add them to a letter campaign list and a door-knock list. Multiple soft touches over time. This takes a while to pay off, but we had breathing room to set up longer-term channels instead of just chasing whatever came in that week.

There's a literal service in the US that will write, with an actual pen using a machine, a thank-you note for you. We'd send these to customers after the job was done. Pretty cool if you ask me.

The CRM

At some point, Google Sheets wasn't cutting it.

We hired a front desk and needed to be able to pass information between multiple parties, track info more effectively, and reduce questions. I actually wrote the database schema for this on day one, but it was way too much of a lift to start and overkill for what we were doing at the time. We grew into needing this CRM.

I did some research, ran some preliminary setup trials with things like Odoo, Salesforce, HubSpot, and came to the conclusion that they were really expensive for what we needed them for. The interfaces were designed for sales teams sitting in office buildings, not roofers working from trucks. Notion, however, did a really nice job of combining tables with enriched data and being able to do permissions and sharing and SOPs. A single source of truth. So we ended up with Notion. It wasn't amazing for mobile, but it was good enough.

What made it powerful was the integrations. After the form submission, it did a lot of things: address validation, lead distribution, front desk alerts, duplicate entry checks, CompanyCam record creation, Roofr record creation, phone system contact creation... All automated. The goal was to make the whole customer flow defined, repeatable, and predictable AND to make data cleanliness easy and to make things "just work."

CRM automation workflow diagram

The automation flow after a new lead comes in. One form submission triggers address validation, record creation, alerts, and more.

One principle I operate by in admin work is "enter data once." If I have to type the same information twice, something is wrong. We were using a platform called OpenPhone at the time. I moved us off of Google Voice because OpenPhone let multiple people operate from one phone number effectively and allowed each person to have their own number too. Having a CRM means we have one source of truth, and then it pushes that contact into OpenPhone. After filling out the form, you have an OpenPhone contact created, a named person when they call, and searching for them is actually possible. It makes it easier for everyone.

This was all really important because we were now at this point working with a remote front desk, and being able to have proper handoffs was super critical.

Eventually, we moved to a phone line that had even more features, including call recording. Every call recorded and transcribed in real time. The most important part of this: we had a customer dispute about what was said to whom and when, and when we were able to show that we had recordings, transcripts, and dates for everything, they dropped the lawsuit. Saved us a major headache.

What we were actually trying to do

I should probably say this more directly: the goal was to remove ourselves from the system. This is another principle.

Not because we wanted to be lazy—my partner loves interacting with customers, running the show, developing new business. That's his thing and he's good at it. My goal was to get all the supporting pieces in place so he could focus on that. But also so that when he wanted or needed to step away, things wouldn't fall apart.

Nobody's gonna run a business exactly like the person who owns it. But being able to take two weeks off without fires? That felt like the real test of whether we'd actually built something.

He took two weeks off to redo his kitchen. Completely off, not checking email from the job site. The business kept running. Jobs happened, leads got followed up, money came in and went out. That's when I knew we'd done something real.

What didn't work

Not everything was smooth. Let me collect the failures so you know what to avoid.

Fancy CRM software. We tried HubSpot, then Salesforce. Both too complex, both abandoned. The lesson: if the person who needs to use it hates using it, it doesn't matter how powerful it is.

Automated customer scheduling. We tried letting customers pick their own install dates online, thinking it would save coordination time. Caused chaos with weather buffers and crew availability because customers don't know about those constraints. Went back to manual scheduling with a shared calendar.

Time tracking apps. Tried a clock-in app for the crews. They hated it, felt like we were policing them. Went back to trust, occasional spot checks, and end-of-day photos. Morale matters more than perfect timesheets.

Inventory tracking apps. Too much data entry and nobody kept up with it. Switched to a simpler policy: over-order common materials by 15% and keep a storage unit stocked along the crew route. Visual checks instead of apps. Sometimes dumber is better.

There were other elements to this system that did work, like leveraging Roofr, CompanyCam, SOP creation and standardization, material order improvements, photo evidence, marketing materials, branding consistency, SEO, referral systems, in-person networking, and more. I won't go into all of that now, but it was pretty fun to build out this company and for every system added, work to make it negative or zero additional time cost while still giving us the benefits of the component.

In general: if a system requires more work than the manual process it replaces or it doesn't provide tangible saved effort long term, people won't understand or want to use it and it won't stick.

By the numbers

Before After
90 hours/week 30 hours/week
$20k cash reserves $40k cash reserves
All subcontractors 2 W-2 employee crews
~30% lead leakage <1% lead leakage
$550/sold lead $120/sold lead
2-3 supply runs per job 0-1 supply runs per job
Nightly admin sessions None

The cash doubling wasn't because revenue exploded, it was because we stopped the leaks. Fewer emergency supply runs, fewer bad hires we had to redo work for, fewer wasted marketing dollars on channels that didn't convert. Chaos is expensive. Less chaos costs less money.

Where the change really shines is the hours per week. We were getting paid way more per hour. Unfortunately, we couldn't just do more admin work and get paid more, but it was in a way giving ourselves a raise. We got way more quality of life, which is really important for longevity.

What I took from it

I spent two years in that business and learned more about operations and systems than I did in any corporate job. Different kind of learning—less abstract, more "this broke and now we have to fix it by Friday."

The thing that stuck with me: contractors get a raw deal on the business side. They're doing necessary work, physical work, skilled work. But they're drowning in admin that nobody trained them for. The paperwork and coordination and follow-up isn't hard exactly, it's just endless and invisible and it never stops. Most contractors handle it by just working more hours, because that's what they know how to do.

What they actually need is systems that carry the admin load so they can focus on the work and the customer. That's what I do now.

The business is still running well. He's happy, making good money, and maybe most importantly to everyone's quality of life, he spends time with his wife.

Let's talk about your business

If this case study sounds familiar, we should have a conversation.

← Back to main page