Guide · Updated November 12, 2026

Housecall Pro reporting in Google Sheets

Housecall Pro already has a strong Reporting tab. Start there. This guide covers when a spreadsheet is the better tool, how to lay one out, and formulas for the numbers owners ask about most.

Start with what Housecall Pro gives you

Sources: Managing Reports, Reporting Dashboard, Job & Estimate List Reporting.

When Google Sheets is the better tool

A simple layout that won't break

  1. Raw tabs, one per data type: Jobs, Invoices, Estimates, Customers. Paste or import exports here, or let a sync tool fill them. Never type into raw tabs.
  2. A Settings tab for things like your monthly revenue goal and technician names.
  3. Report tabs that only contain formulas pointing at the raw tabs.

The formulas below assume the Jobs tab has these headers in row 1: A job_id, B invoice_number, C work_status, D completed_at (a real date; in the API this is work_timestamps.completed_at), E total (dollars), F outstanding_balance, G lead_source, H assigned_employees. Adjust the column letters to match your export.

Formulas for the numbers owners ask about

Revenue by month (completed jobs)

=QUERY(Jobs!A:H,
 "select year(D), month(D)+1, sum(E), count(A)
  where C starts with 'complete' and D is not null
  group by year(D), month(D)+1
  order by year(D), month(D)+1
  label year(D) 'Year', month(D)+1 'Month', sum(E) 'Revenue', count(A) 'Jobs'", 1)

In the Housecall Pro API, completed jobs have the work status complete rated or complete unrated, which is why the formula matches anything that starts with "complete". The +1 is there because QUERY numbers months from 0.

Average ticket this month

=AVERAGEIFS(Jobs!E:E, Jobs!C:C, "complete*", Jobs!D:D, ">="&EOMONTH(TODAY(),-1)+1, Jobs!D:D, "<="&EOMONTH(TODAY(),0))

Revenue by lead source

=QUERY(Jobs!A:H, "select G, sum(E), count(A) where C starts with 'complete' group by G order by sum(E) desc label G 'Lead source', sum(E) 'Revenue', count(A) 'Jobs'", 1)

Money still owed on jobs

=SUMIFS(Jobs!F:F, Jobs!F:F, ">0")

For true A/R aging, use invoice data instead (due amount and due date per invoice). With an Invoices tab where column D is due_amount and E is due_at, this gives the amount more than 30 days past due:

=SUMIFS(Invoices!D:D, Invoices!D:D, ">0", Invoices!E:E, "<"&TODAY()-30)

Estimate close rate

Housecall Pro's API links a job back to the estimate it came from (original_estimate_id on the job). If your Jobs tab includes that column (say column I) and your Estimates tab lists estimate IDs in column A, then the share of estimates that became a job is:

=SUMPRODUCT((Estimates!A2:A<>"")*(COUNTIF(Jobs!I:I, Estimates!A2:A)>0)) / COUNTA(Estimates!A2:A)

The built-in Estimates reports also show conversion. Use this formula when you need the number inside your own scorecard.

Keeping it fresh

The weak point of any spreadsheet report is the data feed. With CSV exports you redo the export → email → import loop every time (see our export guide). On the MAX plan you can use the Housecall Pro API instead, either with your own script or a tool that keeps the raw tabs filled on a schedule.

FieldSheet Sync (in development) fills Jobs, Invoices, Estimates and Customers tabs automatically every hour from a read-only Housecall Pro API key, so formulas like these stay current. Founding pre-order: $99 for the first year →

FieldSheet Sync is not affiliated with Housecall Pro. API field names are from Housecall Pro's public API docs (Get Jobs, Get Invoices).