SPD-2602 · Profitability indicators — what changed vs the V1 build
V1 build Open prototype

The v2 Work Order view as it ships (V1), plus GP$, GP%, GP-per-hour and a Below Goal flag on every group card and in the bottom bar, driven by two new shop settings. Everything below is what differs from work-order-view-v1.html; that page and every shared part are unchanged.

1Group header GP cluster New

Every group card, Ungrouped included — after the breakdown, against the subtotal Suspension Parts$1,836.90 · 23.13%Labor$1,049.00Sublets$450.00 Below GoalGP $1,26938.0%$195/hrest. $3,335.90

2Bottom bar GP New

Left of the existing stat row (labor … total unchanged) GP$2,436GP %41.8%GP / HR$244est. |  Labor $1,609.00  Parts $3,915.58  …

3My Shop › Target Margin › Profitability New

“Shop settings” in the prototype bar opens a mock of the real page (Locations / Target Margin tabs, Parts and Sublets Target Margin grids with static rows). Below them, a new Profitability card:

FieldInputBlank meansUsed for
GP% goal0–100, %, placeholder “No goal”No Below Goal anywhereBelow Goal and the red GP%
Estimated labor cost per hour$, placeholder “Not set”Estimated hours cost $0Unclocked hours and hours clocked by a tech with no pay rate

Save validates (goal > 100 or negatives are rejected inline) and the Work Order recalculates immediately.

4The maths

TermRule
RevenuePart = qty × quoted price · labor = fixed price if > 0, else hours × rate · sublet = price · warranty lines $0. WO scope only: less WO discounts. Fees, shipping and tax never count.
CostPart = qty × cost · sublet = cost · warranty lines keep their cost · labor = actual + estimate.
Labor actualPer clock entry. Hourly tech: pay rate × clocked. Flat-rate tech: pay rate × billed if the line is Done, else pay rate × min(clocked, billed). No pay rate: nothing (hours go to the estimate).
Estimated hoursClocked hours by no-pay-rate techs + (not Done, not Cancelled: max(billed − clocked, 0)) + (Done with nothing clocked: full billed). Cancelled: none. × Estimated labor cost per hour.
GP$ / GP% / GP/hrRevenue − cost · GP$ ÷ revenue, 1dp, — if revenue ≤ 0 · GP$ ÷ billed labor hours (warranty included), whole dollars.
Below GoalGoal set AND revenue > 0 AND GP% < goal.

Recalculates live on any change to qty, cost, price, hours, rate, fixed price, warranty or status (single-cell edit, group bulk edit, scenario switches).

5Seed data (Standard WO, $30/hr estimate, 40% goal)

GroupWhat it exercisesRevenueCostGPGP%GP/hr
ExhaustThe brief’s worked example, verbatim: part 1 × $1,399 / $1,050; labor 3.5 h × $160, In Progress, hourly tech at $25/hr clocked 2.0 h (labor $50 actual + $45 est.)$1,959.00$1,145.00$81441.6%$233
SuspensionJust below goal: warranty part (revenue $0, cost kept), flat-rate Done line, fixed-price $249 line clocked by a tech with no pay rate, never-clocked line, sublet$3,335.90$2,067.00$1,26938.0%$195
HVACParts only — GP/hr hidden, no est.$679.68$176.80$50374.0%—
Work OrderLines $5,974.58 less the $150 Loyalty Discount$5,824.58$3,388.80$2,43641.8%$244

The Exhaust Gasket Set line from the canonical WO was dropped so Exhaust matches the worked example exactly. “Clearly above goal” is carried by HVAC (74.0%); Exhaust sits 1.6 pts above at the brief’s own figures. Empty WO and Nothing clocked yet (no clock entries, nothing Done — every labor line fully estimated) are the other two seeds.

6Brought in line with production Fidelity

7Removed

8Prototype-only controls Not product UI

9For the PRD