ServiceM8 how-to
How do you report profit by job category per quarter in ServiceM8?
ServiceM8 reports profit by Job Category through Custom Reports in the Advanced Reporting Pack, but only once the Job Costing add-on is on, which needs the Premium plan or higher. The report's preset periods, such as last 3 months, are not financial quarters, so a July to September table comes from a CSV export or the API.
Last checked 25 Sep 2026 against the sources listed at the end of this page.
Partly: Custom Reports show profit by Job Category on Premium plans with Job Costing, but only for rolling periods; a true quarterly table needs a CSV export or the API.
Step by step
- In Settings, Job Categories, set a short list of categories, then add a category to every Job Template and Service.
- Check your Materials list: every item needs a Purchase Cost, and labour items need 'labour' in the item number or name.
- Confirm you are on the Premium plan or higher, then switch on Job Costing and the Advanced Reporting Pack in Settings, ServiceM8 Add-ons.
- Go to Reports and click Create Report in the left menu.
- Add a Jobs metric, a filter of Job Status equals Completed, and a breakdown by Category.
- Open the metric's menu, choose Aggregate by field, and pick Total Invoice Amount. Duplicate the metric and set the copy to Total Cost.
- Pick the time frame and switch to the table view, then click Export for a CSV.
- Save the report so it is one click next quarter.
- For exact quarters, export the Job List or pull jobs and job materials through the API, filtered by completion date, and group them by category and quarter in a spreadsheet.
Gotchas
- Job Costing is only on Premium and Premium Plus. On Growing or below, Custom Reports can show revenue by category but not profit.
- Revenue By Category only counts jobs that have been Approved in Invoicing, by the month they were Completed. Jobs waiting for approval are missing.
- Admin time is costed at $20 an hour by default. Change the Admin Time item to your real office cost or leave it out of your comparison, or it will skew categories with lots of office handling.
- Uncategorised jobs are easy to miss. Add a 'No category' row to your table so the total reconciles with Revenue By Month.
- Only the Business Owner role can see the Reports tab by default, and only Business Owners and Finance staff can see cost and profit figures.
- The ServiceM8 API has no 'greater than or equal' filter and allows up to 10 conditions per request. Off by one date filters are the usual reason a quarter does not add up.
What the official help article misses: It shows invoice and cost side by side, but does not say profit needs the Job Costing add-on on the Premium plan, that the time frames are not financial quarters, or how labour naming and admin time feed the cost figure. Read ServiceM8's article.
What ServiceM8 records, and what it guesses
Profit per category is only as good as three pieces of data on each job.
The category. Job Categories are set in Settings, Job Categories and chosen on the job card next to the status. Put the category in every Job Template and Service so jobs are never created without one. If you rename a category, every old job shows the new name, because jobs link to the category record. To keep history clean, create a new category rather than renaming one.
Material cost. Each material has a Price and a Purchase Cost. If ServiceM8 is connected to Xero, the Purchase Cost syncs from your accounting items. Items with no purchase cost count as pure profit.
Labour and admin cost. Job Costing treats any item with "labour" or "labor" in its item number or name as labour, and uses its Purchase Cost as the hourly cost. Hours come from check in time or from the labour quantity billed. It also counts admin time spent in the job card at a default of $20 an hour, which you can change on the Admin Time item. If your labour items are called something else, such as "Electrician hourly", they are costed as materials, not labour.
Where the native reports stop
Without Job Costing, the nearest native report is Revenue By Category: revenue from Completed jobs that have been Approved in Invoicing, by the month they were completed. That is revenue, not profit, and an unapproved job does not appear at all.
With Job Costing on (Premium plan and up) and the Advanced Reporting Pack switched on (available on all plans), Custom Reports can show Jobs Profit and Jobs Cost broken down by Job Category. ServiceM8's own example puts Total Invoice Amount and Total Cost side by side, and the Smart Reporting Helper will build a report from a plain request such as average job cost per category.
The gap is the date range. ServiceM8 lists periods such as last month, this month, this year, last 3 months, last 12 months and year on year. None of them is an Australian financial quarter (July to September, October to December, and so on), and "last 3 months" is a moving window. You can export the report table to CSV, but you still have to check which dates it covered.
The export or API method for a real quarterly table
For a table with categories down the side and quarters across the top, pull the jobs yourself.
The simple route is the Job List export (Advanced Reporting Pack), a CSV of job details that can be segmented by category in Excel. ServiceM8 notes that CSV exports are text only and do not include all job data, so check it has the cost columns you need before building on it.
The reliable route is the ServiceM8 API. Each job record carries its category_uuid, completion_date and total_invoice_amount, and each job material line carries its cost, price and quantity. Pull Completed jobs by completion date, add up price and cost per job, then group by category and quarter. The API's filters support greater than and less than but not greater than or equal, so filter on the day before the quarter starts and the day after it ends. A script can run this on the first day of each quarter and drop the table into a spreadsheet.
If your categories also exist as Xero tracking categories, Xero's Profit and Loss report can be run by quarter and filtered by tracking category. See ServiceM8 Xero tracking categories for that setup.
Sources
- Job Costing uses each material's Purchase Cost, treats items with 'labor' or 'labour' in the item number or name as labour, and tracks admin time at a default rate of $20 an hour. ServiceM8 Help Center, checked 25 Sep 2026.
- On ServiceM8's Australian pricing, Job Costing is available on the Premium plan and up. ServiceM8, checked 25 Sep 2026.
- Custom Reports can report Jobs Profit and Jobs Cost by Job Category over last month, this month, this year, last 3 months, last 12 months or year on year, and profit and cost reports require the Job Costing add-on. ServiceM8 Help Center, checked 25 Sep 2026.
- Custom Reports are part of the Advanced Reporting Pack, which can be activated on all plans; metrics can be aggregated by fields such as Total Invoice Amount and Total Cost, and report tables export to CSV. ServiceM8 Help Center, checked 25 Sep 2026.
- Revenue By Category reports revenue from Completed jobs approved in the Invoicing workflow, by calendar month of completion; the Reports tab is available to the Business Owner role by default. ServiceM8 Help Center, checked 25 Sep 2026.
- Renaming a Job Category changes the label on jobs already assigned to it; removing a category makes it inactive without changing existing jobs. ServiceM8 Help Center, checked 25 Sep 2026.
- The ServiceM8 API supports eq, ne, gt and lt filters but not ge or le, with up to 10 conditions per request. ServiceM8 Developer, checked 25 Sep 2026.
- ServiceM8 job records include category_uuid, completion_date and total_invoice_amount fields. ServiceM8 Developer, checked 25 Sep 2026.