How to see which recurring commercial maintenance contracts lose money

The short answer. To see which recurring maintenance contracts lose money, set what each contract earned over a season or a year against three costs: labor on site, drive time and materials. Cost labor and drive time at a loaded hourly rate, meaning wages plus payroll taxes, insurance and benefits, the employer costs the Bureau of Labor Statistics Employer Costs for Employee Compensation release measures per hour worked. Then compare the crew hours each visit actually takes with the hours the price assumed, which shows not only that a site loses money but why: slopes priced as flat lawn, a long drive, or scope added by phone and never repriced.

Most commercial grounds, cleaning and specialty service firms have a feeling about which sites are bad. The crew groans when the HOA with the hills comes up on the schedule. The office manager knows one property manager calls every week with "just one more thing." But a feeling isn't a number, and contracts get renewed at the same price year after year because nobody can show what the site actually costs.

The reason is simple: the price lives in the contract, the hours live on timesheets or in a crew lead's head, drive time lives nowhere, and materials live on supplier invoices. They never meet on one page. This article shows the arithmetic that brings them together, a worked example, and how to keep it up, in a spreadsheet or in a system.

Last reviewed: November 11, 2026

The arithmetic of margin by contract

For each contract, over a period, margin is what it earned minus what its visits cost.

Earned is the contract price for the period, plus any extra work done and billed. Most commercial contracts are a yearly price billed in equal monthly amounts, while the work is seasonal. So judge a contract over the season or the year, or spread the price by the day. Look at July alone and every mowing contract looks terrible; look at January and they all look wonderful.

Cost has three parts, and the one people leave out is usually the one that matters:

  • Labor on site: hours at each visit times a loaded hourly rate (wages plus payroll taxes, insurance and benefits).
  • Drive time: the hours your crew spends getting there, at the same loaded rate. A crew of three on a 45-minute drive is over two paid hours before anyone starts a mower.
  • Materials: mulch, pine straw, fertilizer, plants, chemicals.

Then compare the hours each visit actually takes with the hours the price assumed. That ratio tells you not just that a site loses money but why.

A worked example

The figures here are illustrative, made up for this article.

Say a site's contract is $800 a month, $9,600 a year. When it was priced, the estimate assumed 34 visits a season, two people for two hours each, so 4 crew hours a visit. Your loaded labor rate is $34 an hour.

What the price assumed:

  • Labor: 34 visits times 4 hours is 136 hours, times $34, or $4,624.
  • Drive: 15 minutes each way, so half an hour a visit per person: 34 visits times 2 people times 0.5 hours is 34 hours, or $1,156.
  • Materials: $1,200.
  • Total cost $6,980, leaving $2,620, a margin of about 27%.

Now the real season. The site has steep slopes that were priced as flat lawn, and each visit takes 6.5 crew hours instead of 4, about 62% over.

  • Labor: 34 times 6.5 is 221 hours, times $34, or $7,514.
  • Drive and materials as before: $2,356.
  • Total cost $9,870 against $9,600 earned: a loss of $270.

Nothing about this contract looks wrong on an invoice. The client pays every month. The loss only shows when hours are set against the price, site by site.

The same arithmetic finds the other usual suspects: the site an hour away, where drive time eats the margin, and the site whose scope grew by a phone call ("can you do the beds by the side entrance too?") and was never repriced.

Doing it better in a spreadsheet

You can get most of the way there with a workbook, if the crews record time by site.

  • One row per contract, with the annual price, the visits per season, and the crew hours per visit the price assumed.
  • A time log with a site on every line: date, crew, hours on site, and drive hours as their own column, not folded into the day.
  • A materials log by site, filled from supplier invoices or the crew's sheet.
  • A summary tab that totals, per contract, earned against labor, drive and materials, and shows actual hours per visit against the assumed hours.
  • A margin floor, say 15%, with anything below it in red and a short "why" column the owner fills in.

The weak point is the time log. If crews write hours on paper or screenshots and somebody types them in at the end of the week, the hours arrive late, lumped together, or not by site at all. Drive time is the first thing to disappear.

How a system does it

The demo is Fernway Grounds, a fictional grounds maintenance company with crews, recurring contracts and client sites. Each site's yearly contract, billed monthly, lays out its visits on the dispatch board, so nobody retypes the schedule. Crew leads mark visits started and done on their phones, with time on site, materials used and extra work found, so the hours arrive by site the same day.

Job costing by contract then sets what each contract earned against the labor, drive time and materials its visits cost, with hours against what the price assumed. The owner's screen lists the contracts under the margin floor, with the reason. In the demo's season, three contracts fall under its 15% floor, each for a reason an owner will recognize: an HOA whose slopes were priced as flat lawn, with hours 62% over; a site an hour's drive away, where drive time is nearly half the cost; and an office park where two bed areas were added by phone and never repriced, now about break-even. The margin table exports to Excel.

The system shows the numbers and the reasons. Whether to reprice, renegotiate or walk away from a contract is still the owner's call.

See it for yourself

The field service page covers the whole system, from contracts and dispatch to the crew phone view and client reports. The live demo lets you finish a visit as a crew lead, on your own phone if you like, and then see which contracts lose money, and why. Sign in with one click, with no account; the data resets every night, so you can't break anything.

A typical build costs $8,000 to $25,000 at a fixed price, hosting and support start at $350 a month, and there's no fee per user.

Questions

How do I calculate the margin on a grounds maintenance contract?

Take what the contract earned over the season or year, including billed extra work, and subtract labor on site, drive time and materials, with labor and drive time at a loaded hourly rate. Judge it over the season or year, because a yearly price billed in equal months against seasonal work makes any single month misleading.

Should drive time count as a cost for each maintenance site?

Yes. Drive time is paid crew time: a crew of three on a 45-minute drive is over two paid hours before anyone starts work, and on a distant site it can eat the margin.

Why can a contract that pays every month still lose money?

Because the loss only shows when crew hours are set against the price, site by site. Steep slopes priced as flat lawn, long drives, and extra work added by phone and never repriced are the usual causes.