# Monthly ServiceM8 job margin and underquoting report

> Find out which job types you consistently underquote, with a month by month margin tracker in Sheets and a plain summary in Slack.

- Workflow type: agent
- Services: ServiceM8, Google Sheets, Slack
- Categories: Operations, Finance
- Published: 2026-08-09

## What it does

- Reviews every job you finished last month and works out what each one actually earned, after the materials it consumed and the hours your team logged against it
- Groups results by job type and by the staff member who ran the job, so you see repeatable patterns instead of one off bad jobs
- Adds a row per job to a Google Sheets tracker so margin can be trended month over month
- Posts a short written summary to Slack calling out the job types that keep running over, the jobs missing labour records, and a suggested price change for your worst category

## What you'll need

- A ServiceM8 account where jobs, material lines, labour time and staff are recorded
- A Google Sheets spreadsheet to act as the margin tracker
- A Slack workspace and a channel for the monthly summary
- An hourly labour cost figure for your team, so margins can be calculated from logged hours

## Prompt

On the first business day of each month, review job profitability across the ServiceM8 jobs I completed in the month that just ended, and tell me where I am systematically underquoting. I care about the pattern far more than any single job.

Start with List Jobs in ServiceM8 and narrow to jobs that were finished inside the previous calendar month. ServiceM8 deletes are soft, so records with active set to 0 still come back over the API. Filter those out everywhere, on jobs, material lines and labour records alike, or the numbers will be wrong. Job lists are cursor paginated, so page through until you have the whole month rather than stopping at the first batch.

For each job, build the real margin rather than trusting the invoice total. Call List Job Materials for the job. Each material line carries both a charge out price and a cost price, so sum the charge out side for revenue and the cost side for what the materials actually cost me. Then call List Job Admin Activities for the same job to get the labour time actually logged against it. Convert those logged hours into a labour cost using an hourly cost rate I can set at the top of the workflow, defaulting to 75 per hour if I have not set one. Job margin is revenue minus material cost minus labour cost, and I want it as both a currency figure and a percentage.

Group the results two ways. Use List Categories to resolve each job's category so I can see margin by job type, and use List Staff Members to resolve the staff member who ran the job so I can see margin by person. Roll up average and median margin for each category and each staff member, and always note how many jobs sit behind each number, so I know which groupings are meaningful and which rest on one or two jobs.

Append one row per job to my Google Sheets margin tracker using Append Values, so margin can be trended month over month. Each row should carry the month, job number, client, job category, staff member, revenue charged, material cost, labour hours logged, labour cost, margin in currency, margin percentage, and a flag for any job where materials were logged but no labour was recorded at all. Always append rather than overwrite, so history builds up in the same sheet.

Then post a narrative summary to Slack with Send a Message. Lead with the overall picture for the month: total revenue, total cost, blended margin, and how that compares with the previous months already sitting in the tracker. Then give me the three things I actually care about. First, the job categories that consistently run over the hours I charged for, judged across the whole category rather than on a single bad job. Second, the jobs where materials were logged but no labour was recorded at all, because those jobs look artificially profitable and their real cost is unknown. Third, one concrete suggested price adjustment for the worst performing category, expressed as the percentage increase or the extra quoted hours needed to bring that category back to a healthy margin, with the arithmetic shown so I can sanity check it.

Keep the Slack message short enough to read on a phone. Call out patterns and name the categories and people involved rather than listing every job, since the per job detail already lives in the spreadsheet. If a month has too few completed jobs to say anything meaningful, say so plainly instead of inventing a trend.

## How to customize

- Change the schedule, for example run it quarterly instead of on the first business day of each month
- Set your own hourly labour cost rate and the margin percentage that counts as underquoting
- Choose which Slack channel gets the summary and whether specific people are tagged
- Narrow the review to certain job types or a single crew

## Example output

March margin review: 34 jobs completed, $128,400 charged, 61% blended margin, down from 66% in February.

Where the money is going:
• Hot water replacements are the problem category. 9 jobs, average margin 31%, and on 7 of the 9 we logged more hours than we charged for, an average of 2.4 hours over. This is the third month running.
• Switchboard upgrades held up well at 68% across 6 jobs.
• Sam ran the 4 lowest margin jobs this month, all hot water. Worth checking whether the quoting template he is working from is out of date.

Missing labour: 5 jobs have materials logged but no hours recorded at all, covering $8,200 of charged work. Their real margin is unknown and they are inflating the blended number above.

Suggested adjustment: hot water replacements are quoted at an average of 3.5 hours but consistently take 5.9. Moving the standard quote to 6 hours, or lifting the category price by roughly 18%, brings it back to about 60% and in line with the rest of the book.

## FAQ

### Do I need to invoice through ServiceM8 for this to work?

No. It reads the material and labour records kept against each job rather than the final invoice total, so it still works if you raise invoices somewhere else.

### What if my team does not always log their hours?

Those jobs are flagged separately as materials logged with no labour recorded. Their true cost is unknown and they make your overall margin look better than it is, so the report calls them out rather than quietly averaging them in. On a first run this flag is often the most useful part of the report.

### Will this change anything in my ServiceM8 account?

No. It only reads from ServiceM8. The only things it writes are the new rows in your spreadsheet and the message in Slack.

### How does it know what my labour actually costs?

You give it an hourly cost rate for your team and it applies that to the hours logged against each job. You can change the rate at any time, and you can set different assumptions if your crews cost different amounts.

### Do I need a lot of job history before it is useful?

One month is enough to spot jobs with missing labour and obvious loss makers. The category trends get more reliable after a few months, because the tracker keeps building history in the same spreadsheet.

Use this prompt in General Input: https://www.generalinput.com/prompts/monthly-servicem8-job-margin-and-underquoting-report