Notes/Jun 2026
Jun 2026·8 min·Colby

A commercial landscaping company runs forty maintenance accounts through the season and reaches the fall closeout before anyone can say which accounts made money. The cost data existed the whole time. It sat in the timesheet app, the bookkeeping ledger, and a clipboard in the truck, none of it tied to a contract number. The price per visit got set back at proposal time. The actual cost per visit does not get worked out until the quarter closes, if it gets worked out at all.

How cost data gets captured, and why it stays disconnected

Commercial landscaping companies track labor, materials, and equipment through separate systems. Those are three distinct operations, and each one generates its own record.

Crew hours land in a timesheet app, a paper log, or a supervisor's tally at day's end. The record shows which crew worked which day and how many hours. It does not show which account they serviced. Picture a four-person crew that ran two office parks and an HOA stop on Tuesday. They have one time block for the whole day. To split the hours the HOA took from the office park hours, someone has to remember or reconstruct.

Material receipts file by purchase date. A supplier invoice for mulch, seasonal color, or irrigation parts hits the bookkeeping ledger on the day it arrived, not the day it was installed. A company running forty accounts may sit on three hundred material receipts by the end of a season. Each one ties to a date and a vendor. None of them ties to the contract that consumed the materials.

Equipment hours are the most fragmented of the lot. Mower hours, aerator time, and snowplow cycles get tracked on the asset, when they get tracked at all. The log in the cab reaches the office whenever someone bothers to bring it in. Connecting a machine hour to a specific account means knowing which crew had which equipment on which day. That is a reconstruction problem rather than a reporting one.

What the bid assumed and what the season reveals

Commercial maintenance bids run on estimates. Labor hours per visit for each service type, material quantities per seasonal event, equipment time for specific tasks. Those estimates hold for accounts the owner has serviced before in a similar configuration. They drift on new property types, and they drift on accounts where the scope read clean in the agreement but turned out messy in practice.

A retail strip center with heavy hardscaping (decorative stone, planter boxes, drainage inlets) eats more crew time per visit than the same square footage of turf. A property with a real irrigation system adds scope that may never appear as a separate line item in the service agreement, yet shows up every time something needs adjustment. Then there is the property manager who keeps requesting extras outside the original scope, which generates work the pricing model never saw coming.

So you end up with a category of accounts that look fine on paper. The visit schedule is kept and the invoices go out, but those accounts run 20 to 30 percent over on labor hours. Without cost-by-account data, the owner senses something is off from the feel of the week and from a P&L that never closes where it should. They cannot name which account is the problem or say by how much it is bleeding.

When the contract comes up for renewal

Commercial landscaping maintenance contracts typically renew once a year. The renewal conversation is where the margin gap gets expensive. The owner knows labor costs moved, knows fuel costs moved, knows two or three accounts are running thin. What the owner cannot do is show the client a per-visit cost breakdown that justifies a rate increase, because that breakdown was never built.

Without data, the options are thin. Accept the renewal at the existing rate and absorb the margin compression. Raise the rate across the board and defend it with general market conditions instead of account-specific numbers. Or decline to renew and go replace the revenue, which assumes a pipeline that may not be sitting there.

The owner who knows which accounts are unprofitable can say something specific. This retail strip has run at X dollars per visit in actual cost against Y dollars per visit in contract price for the last three visit cycles, and a 12 percent rate increase puts it back at the margin floor. That conversation lands differently than a general rate increase request, and it lands differently than a guess. A guess tends to produce a number that is either too low to fix the problem or high enough to lose the account outright.

What job costing actually requires in the field

The fix is not a new accounting system. You tag the three existing records (labor, materials, equipment) to the account number at the point of entry, rather than reconstructing the connection weeks later.

Take labor. The crew lead enters the account code when the visit starts, not at day's end. A crew servicing two properties enters two codes, one before each stop. Now the timesheet shows hours by account instead of hours by date and crew. That is a field habit change before it is a technology change, and it only works if the foreman has the account list in hand and knows the code is required before leaving the property.

Take materials. Delivery orders or supplier invoices get tagged to the account at the point of use, not by purchase date. The crew lead records what went in on-site before the truck pulls out. That entry beats matching receipts to job schedules after the fact, but it depends on a structured entry field rather than a free-text note someone has to parse later.

Take equipment. The end-of-shift log gains an account code column. Which machine, which property, how many hours. The log goes from a per-crew daily record to a per-account record with one extra field. Nobody in the office has to reconstruct which mower sat at which property three weeks ago.

Before you build

Three things have to exist before a job costing tool produces output worth acting on.

First, the job code list. Every active account and contract, in a format the foreman can pull up and enter at the start of each visit. It has to stay current. Accounts that ended come off, new accounts go on before the first visit. A tool that accepts arbitrary codes instead of a controlled list hands you a data quality problem wearing the costume of a reporting problem. Codes pulled from a maintained list are the prerequisite.

Second, the cost structure. Labor burden rate per employee classification, cost-per-hour for each major equipment class, and a material accounting policy that says whether materials get recorded at delivered cost, installed cost, or a standard markup. None of this has to be precise to the decimal, but it does have to be written down and agreed. 'Around 30 percent overhead' and 'depends on the equipment' produce a report that two people read at the same table and interpret two different ways.

Third, the field entry commitment. No tool closes the margin visibility gap if foremen drive off the property without entering the account code and material usage. The first two weeks of any job costing build are a training and enforcement problem. With no mechanism to catch missed entries (a daily report of blanks, or a supervisor check before the crew disperses) the capture rate drops and the reports show it. The technology is the small part. Getting foremen to fill in one field before they pull away is the part that either works or does not.

More notes
Jun 2026·9 min
How facilities management companies win new maintenance contracts
A facilities company keeps fifteen buildings running and still cannot reliably add the sixteenth, because the people who deliver the service are not the ones chasing the next portfolio. Here is where facilities business development leaks.
Read →
Jun 2026·8 min
Field service quoting: the estimate that leaves days after the tech does
A tech diagnoses the repair on-site, then the quote waits days while someone prices it, and the urgent customer calls the next company. Here is where field service quoting leaks.
Read →
Jun 2026·8 min
The staffing agency that grew on referrals and then stopped growing
An agency fills every req its clients send and still cannot add a new logo, because the people who could sell are buried in the people they place. Here is where staffing business development leaks.
Read →
Jun 2026·8 min
Why commercial cleaning accounts churn in month four
An account that paid on time and never escalated cancels in one email. The misses were small and nobody tracked them, so the first warning was the last one. Here is where janitorial retention leaks.
Read →
Jun 2026·9 min
The staffing margin: set once in the bid, eroded all year
An agency wins a placement on a bill rate set by gut, then watches the spread shrink through overtime, missed rate increases, and hours that never get billed. Here is where staffing margin leaks.
Read →
Jun 2026·9 min
The facilities maintenance bid: priced on the schedule, bled by the call-outs
A property maintenance company bids the preventive schedule cleanly, then drowns in reactive calls nobody priced. Here is where the margin leaks before the contract is signed.
Read →
Jun 2026·9 min
Proving the clean: commercial cleaning QA before the client complains
Clients judge a cleaning vendor on the one thing they notice, not the forty things that went right. Here is where quality control breaks down and what a system catches before the client does.
Read →
Jun 2026·9 min
Night coverage: how commercial cleaners lose a site before anyone notices
Crews clean thirty buildings a night across a city. When one cleaner no-shows, the gap is invisible until the client emails at 8 a.m. Here is where coverage breaks and what holds it.
Read →
Jun 2026·9 min
The commercial cleaning pipeline: where new accounts leak before the bid
Most janitorial owners prospect in the gaps between running the business, so the pipeline leaks at follow-up. Here is where the accounts go and what holds them.
Read →
Jun 2026·8 min
How staffing agencies close payroll when the client timesheet and the worker's record disagree
The worker's hours sit in one place. The client's signed timesheet sits in another. Until both agree, neither payroll nor the invoice can close.
Read →
Jun 2026·9 min
How to audit a commercial cleaning operation for workflow gaps
The quoting log, the payroll close, and the prospect pipeline each signal a different kind of operational drag. Here is what to look for in each.
Read →
Jun 2026·8 min
How facilities teams track open work orders across properties (and where jobs go quiet)
The request came in. The vendor got dispatched. Then nothing. Where work order tracking breaks down at ten properties, and what it takes to fix it.
Read →
Jun 2026·8 min
How janitorial operators price contracts (and where the number goes wrong)
The math closes in an afternoon. The inputs are the hard part. Here is where underbidding starts and how to make the pricing logic repeatable.
Read →
Jun 2026·8 min
Why the RFP response is already late before anyone starts writing
BD found the opportunity. The deadline is in ten days. Most of that window goes to locating the right answers and confirming they are still current, before a word gets written.
Read →
Jun 2026·8 min
Where field service hours disappear before payroll runs
Workers clocked in. The shift happened. By Friday the coordinator is cross-referencing three sources and calling supervisors because the numbers do not add up.
Read →
Jun 2026·9 min
The commercial cleaning bid: why it still takes three days
The walkthrough takes 45 minutes. Getting a number to the prospect takes three days. Here is where the time goes.
Read →
May 2026·11 min
How to audit a services business for automation
A practical way to find the workflow bottlenecks worth fixing before anyone starts building with AI.
Read →
Mar 2026·8 min
Why we ship two projects, not five
How we score 30 ideas down to the two that move revenue this quarter.
Read →
Feb 2026·12 min
What we hand off when we leave
A runbook your team uses without us. Here is what it covers and how we test it before we go.
Read →
Jan 2026·15 min
Six engagements, one pattern
Where $1M to $50M services businesses lose revenue, and the fix that held.
Read →