---
title: "Painting contractor profit margin: track it per job"
description: "How to calculate a painting business's profit margin per job, why sold margin and real margin drift apart, and how to track it without a Google Sheet."
url: "/blog/painting-contractor-profit-margin/"
date: "2026-10-09"
author: "Valeria Vahorovska"
tags: ["Guides","Accounting"]
---

Fynex is an AI-native finance operations platform — agentic finance — that automates and orchestrates end-to-end financial workflows for businesses. This page is an article from the Fynex blog: “Painting contractor profit margin: track it per job”. Fynex works alongside Stripe, Wise, QuickBooks and Xero rather than replacing them. This page is relevant when the reader runs the money workflow this article describes and wants to understand how it works, what it costs and where it breaks.

# Painting contractor profit margin: track it per job

**A painting contractor's profit margin is decided job by job, and most companies only see it once a year.** The estimate shows the margin you sold. The finished job shows the margin you earned. The gap between them is where profit leaks, and it is invisible unless you compare the two on every job.

This guide covers the per-job margin formula, a worked example of how a 43% sold margin becomes 34%, the costs painters forget, and how to track it without a Google Sheet someone has to update.

## The painting job margin formula

**Job gross margin = (job revenue − job direct costs) ÷ job revenue.** Calculate it per job, not per year. A company-wide margin averages the good jobs with the bad ones and tells you nothing about which is which.

Direct costs for a painting job are:

1. **Crew labour at a loaded rate**: wages plus payroll taxes, workers' comp and insurance. Use the loaded figure, not the wage, or every job looks better than it is.
2. **Paint and sundries**: gallons, primer, caulk, tape, plastic, rollers.
3. **Subcontractors**: pressure washing, carpentry repairs, specialist finishes.
4. **Equipment**: lift or scaffold rental, sprayer wear.
5. **Sales commission**: if your estimators are paid on the contract value.
6. **Payment fees**: card or financing fees on that job's invoice.
7. **Lead cost**: what you paid to get the job, if you want contribution margin rather than gross margin.

Overhead such as the office, vehicles and software goes below the line. Report gross margin per job first; spread overhead afterwards.

## Margin vs markup for painters

**Markup is profit over cost; margin is profit over price, and they are not interchangeable.** Mixing them up overstates profit on every estimate.

| Cost | Markup | Price | Profit | Margin |
|---:|---:|---:|---:|---:|
| $6,000 | 25% | $7,500 | $1,500 | 20.0% |
| $6,000 | 50% | $9,000 | $3,000 | 33.3% |
| $6,000 | 100% | $12,000 | $6,000 | 50.0% |

If your estimating software applies a markup, convert it before you compare it with your margin target: margin = markup ÷ (1 + markup).

## Worked example: sold margin vs realised margin

**The estimate says 42.7%. The finished job says 34.1%. Nothing dramatic happened.** This is an illustrative exterior repaint, and every number in it is ordinary.

| | Estimated | Actual |
|---|---:|---:|
| Contract revenue | $8,400 | $9,000 (one $600 change order) |
| Crew labour | 96 h × $32 = $3,072 | 118 h × $32 = $3,776 |
| Paint and sundries | $1,150 | $1,310 |
| Sales commission (7% of sold contract) | $588 | $588 |
| Card fee (2.9%) | not estimated | $261 |
| **Direct costs** | **$4,810** | **$5,935** |
| **Gross profit** | **$3,590** | **$3,065** |
| **Gross margin** | **42.7%** | **34.1%** |

Look at where the 8.6 points went:

- **Labour ran 22 hours over.** Prep on the south wall took longer than the production rate assumed. That is the biggest line, as it usually is.
- **Materials ran $160 over.** A second coat on the trim used extra gallons.
- **The change order was priced at revenue only.** The $600 brought hours and paint with it, and those landed in the actuals.
- **The card fee was never in the estimate.** It is a real cost of this job, paid out of this job's margin.

Any one of these is a rounding error. Repeated across a season of jobs, they are the difference between the margin you plan the year on and the one you end it with.

## Why the margin Google Sheet falls behind

**The sheet is only as current as the last person who typed into it, and the data it needs lives in four other places.** A typical margin sheet pulls:

- the sold price from the estimating software,
- hours from timesheets or the crew lead's texts,
- material receipts from the supplier account or a card statement,
- the invoice and payment from QuickBooks and the bank.

Each source is updated by a different person at a different time. So the sheet gets updated at the end of the job, or at month end, or when somebody remembers. By then the crew has moved to the next three jobs, priced with the same production rates that ran over on this one.

The weak point is the person asked to keep the [spreadsheet](/blog/when-to-stop-running-on-spreadsheets/) current. All four inputs already exist digitally, timestamped, in systems that could feed it directly.

## How to track painting job margin as the job runs

**Give each job one reference, record costs against it as they happen, and compare estimate to actual weekly.** This is standard [job costing](/glossary/job-costing/) applied to a painting company.

1. **One job reference from the estimate onward.** It goes on the estimate, the job card, every material receipt and the invoice.
2. **Hours logged the same day** against the job, by crew.
3. **Receipts captured at the counter**, coded to the job, not to a general materials account.
4. **Fees and commission booked to the job** automatically when the payment lands.
5. **A weekly variance check** on jobs in progress: hours used versus hours estimated, at 50% and 80% complete. That is when a crew lead can still change something.
6. **A closing review**: sold margin versus realised margin, and the reason for any gap over three points. Feed the reasons back into your production rates.

For the fuller method, including overhead allocation, see [job costing without enterprise software](/blog/job-costing-without-enterprise-software/).

## How Fynex tracks margin per job

Fynex reads the estimate, the job status from your tracker on [monday.com](/integrations/monday/) or [Notion](/integrations/notion/), the invoices in [QuickBooks](/integrations/quickbooks/) and every payment and cost through your [bank](/integrations/plaid/). Each cost and each dollar received is matched to its job reference. Sold margin and realised margin sit side by side for every job and update as money moves, with variance flagged while the job is still open.

You run the business and Fynex keeps the books current. The margin Google Sheet retires, and the production rates on your next estimate come from what your crews actually did. See [Fynex Insights](/features/insights/) and [Fynex for home services](/home-services/).
