SheetVan is in beta and free to use. Businesses that join during the beta keep $10/month for life.

Pricing

Jobber custom reports in Google Sheets: five formulas to start with

Updated · By Sanjay Khadka

Build Jobber custom reports in Google Sheets: revenue by month, top clients, overdue invoices, win rate and revenue by service, with how each works.

Jobber's built-in Financial reports, such as Invoices and Aged receivables, each show one fixed view of your data. Its Custom Report Builder is available on the Plus plan, and its reports stay inside Jobber. If you'd rather work in Google Sheets, where you can share a report with a bookkeeper or change it whenever you like, these five formulas answer the questions most service businesses ask first.

SheetVan Dashboard for a sample lawn care business with revenue, outstanding, overdue and quote win rate cards, a revenue by month chart, overdue invoices and top clients
The Dashboard SheetVan builds, shown with a sample business. Each formula below rebuilds one part of it.

They're written for the tabs SheetVan creates: Invoices, Quotes and Line items. With a CSV export from Jobber the logic is the same, but you'll need to change the column letters to match your file.

Paste each formula into cell A1 of a tab you add yourself. SheetVan rewrites its own data tabs on every refresh but never touches tabs you add, and because the formulas use whole columns, new invoices are included automatically.

Revenue by month

=QUERY(Invoices!A:P, "select year(G), month(G)+1, sum(L) where G is not null and D <> 'Draft' and D <> 'Bad debt' group by year(G), month(G)+1 order by year(G), month(G)+1 label year(G) 'Year', month(G)+1 'Month', sum(L) 'Revenue'", 1)

QUERY reads the Invoices tab with its first row as headers; that's the 1 at the end. month() counts from 0, so January comes back as 0, and the +1 turns it into a normal month number. Drafts and bad debt are left out because neither is money you expect to collect.

Revenue by month formula result with Year, Month and Revenue columns for twelve months
The result on the sample business. The totals match the Dashboard's monthly revenue.

This is revenue invoiced, grouped by issue date. For cash actually received, swap the Issued column (G) for Paid date (I) and Total (L) for Paid (M).

To chart it, select only the Month and Revenue columns, then choose Insert, then Chart. If the Year column is included, Sheets draws the year as its own set of bars next to the revenue.

Top 10 clients

=QUERY(Invoices!A:P, "select F, sum(L) where F is not null and D <> 'Draft' and D <> 'Bad debt' group by F order by sum(L) desc limit 10 label F 'Client', sum(L) 'Revenue'", 1)

The same filter as above, grouped by client name and sorted highest first. Two different clients with the same name would be added together; if that's possible in your business, group by the Client ID column instead and look the names up afterwards.

Overdue invoices

=IFERROR(SORT(FILTER({Invoices!F2:F, Invoices!N2:N, TODAY()-Invoices!H2:H}, Invoices!H2:H<TODAY(), Invoices!H2:H<>"", Invoices!N2:N>0, Invoices!D2:D<>"Draft", Invoices!D2:D<>"Bad debt"), 3, FALSE), "Nothing overdue")
Overdue invoices formula result listing client, balance and days overdue, oldest first
Four overdue invoices on the sample business, oldest first. Headers typed in row 1, formula in A2.

FILTER keeps invoices whose due date has passed and that still have a balance, again skipping drafts and bad debt. That's the same rule the SheetVan Dashboard uses, so the two agree. The third column is days overdue, worked out from TODAY(), so it goes up each day the sheet is opened. When nothing is overdue, FILTER would normally return an error; IFERROR shows "Nothing overdue" instead.

Quote win rate

=IFERROR((COUNTIFS(Quotes!D2:D,"Approved",Quotes!G2:G,"<>")+COUNTIFS(Quotes!D2:D,"Converted",Quotes!G2:G,"<>"))/COUNTIF(Quotes!G2:G,"<>"),"")

Only quotes with a Sent date count, on both the top and the bottom of the fraction. A quote approved in person without ever being sent would otherwise push the rate above 100%. Format the cell as a percentage. For a single period, add a date condition on the Sent column to each COUNTIFS. If no quotes have been sent yet, the cell stays blank rather than showing a divide-by-zero error.

Revenue by service

=QUERY('Line items'!A:J, "select F, sum(J) where F is not null and C <> 'Draft' and C <> 'Bad debt' group by F order by sum(J) desc label F 'Service', sum(J) 'Revenue'", 1)

This one reads the Line items tab, where each invoice line has its own row, and adds up the line totals for each item. It tells you which services bring in the money, which the invoice totals alone can't show.

The same thing with a pivot table

If you'd rather click than type, select a cell in the Invoices tab and choose Insert, then Pivot table. Change the data range to Invoices!A:P so that invoices added later are included; by default Sheets picks a fixed range that stops at the last row. Put Client in Rows and Total in Values, then add a filter on Status to hide Draft and Bad debt, like the formulas above.

Google Sheets pivot table of revenue by client, sorted highest first, with the pivot table editor showing Client in Rows, Total in Values and a Status filter
Revenue by client as a pivot table on the sample business. The grand total matches the Dashboard's 12-month total.

Sources

Checked on the date above. Menus in Calendly, Jobber and Zapier change from time to time; if a button has moved, their help pages have the current steps.

SheetVan copies Jobber clients, jobs, invoices, quotes and line items into a Google Sheet every night. How SheetVan works

More guides

Questions or corrections? Email support@sheetvan.com.