Gross margin = (revenue − cost of goods sold) ÷ revenue. For a field-service shop, the dominant component of COGS is labor. Servicio computes labor cost at the most granular level — per visit — and rolls up from there.
Per-visit labor cost
Every completed visit has a labor_minutes column populated from the time entry. The employee has an hourly_rate_cents on their profile. Labor cost for the visit = (labor_minutes ÷ 60) × hourly_rate_cents.
Rolling up to margin
Revenue for the visit is the invoice total. Materials (if logged separately) are subtracted. Result: gross margin for that visit.
The Reports page aggregates across the last 90 days of completed, paid-and-invoiced visits that have non-null labor_minutes.
What's NOT in the margin calc today
- Payroll burden — employer taxes, workers' comp, benefits. About 18-22% on top of wages.
- Materials — chemicals, fertilizer, mulch. Logged separately as visit line items but not yet rolled into margin report.
- Vehicle cost — fuel, maintenance, depreciation.
- Equipment depreciation — see Your mowers are a P&L line.
Margin by service
On the Reports page, the "revenue by service" chart can be toggled to "margin by service" (coming Q3). Until then, eyeball the labor cost per visit for each service in the Visits index — the services with the longest average labor minutes are usually the lowest margin.