Ask a small maintenance business owner whether last month's jobs made money and the honest answer is often "I think so". Revenue is easy to see. Costs are scattered across supplier invoices, fuel receipts and whatever the engineers remember.
Why costs get lost
- Parts are bought on a card and the receipt lives in the van.
- Subcontractor invoices turn up weeks after the job.
- Time on site isn't recorded properly.
- Nobody links a cost back to the job it belongs to.
Every cost belongs to a job
The single most useful change is making every cost belong to a job. Buy a part, add it as a cost line on that job. A subcontractor invoices, link it to the job they did. The engineer closes the job and the time on site is already known.

See the margin before you invoice
With costs on the job, you can see the margin before the invoice goes out. That's your chance to check you've charged for everything and to spot the jobs that ran over.
Look for patterns
Once costs sit against jobs, patterns start to show:
- certain kinds of job always run over
- some customers are consistently less profitable
- particular sites need more return visits
- some suppliers cost more than you thought
That's where real improvements come from, not from the monthly total.

Not everyone needs to see the numbers
Cost and margin information is sensitive. Engineers need to record costs, but they don't need to see margins across the business. Keep that view for the people who set prices.
OmniSchema's Cost Report kit records cost lines against work orders and shows costs by job, site and month. Any column can be marked as cost data so only the roles you choose can see it, and the owner's dashboard puts revenue and costs side by side.