Explorar temas

Aún sin traducir

Este artículo todavía no está traducido a tu idioma. Estás leyendo la versión en inglés.

Labor matrices

How hour bands turn your door rate into the rate a job actually bills at, and which rate the customer sees.

Actualizado el 25 de julio de 2026

A labor matrix is a table of hour bands. Each band says: for a job of about this length, multiply the door rate by this much. It exists because a twenty-minute job and a six-hour job do not earn the same amount per hour — the short one carries the same write-up, parts lookup and paperwork over far fewer billable minutes.

Set it up in Settings → Labor matrices.

What a labor matrix is

Each band has a lower bound in hours, an upper bound, and a multiplier applied to the base rate:

effective rate = base rate × multiplier
line total     = effective rate × hours

A 3-hour job in a 3–6 hour band at ×1.30 bills at 156.00 an hour against a 120.00 door rate, so the line totals 468.00.

Bands match lowest bound first and are half-open — a band covers hours from its minimum up to but not including its maximum. A band with no upper bound runs to infinity. So 1–3 and 3–6 hand over cleanly at exactly 3 hours: that job lands in the second band.

Consejo

Multipliers are stored to four decimal places, so ×1.0833 is a legitimate band. You do not have to round your pricing to the nearest 5%.

Where the base rate comes from

The multiplier needs something to multiply. GarageFlow takes it, in order:

  1. The labor rate on the line

    If the line has a labor rate assigned, its hourly rate is the base. Rates live in Settings → Labor rates, where one is marked as the default.

  2. The line's own unit price

    A labor line with no rate assigned uses whatever unit price is typed on it. That is the manual path — the matrix still applies on top.

This matters when you read a total back: the number the matrix scaled is the line's base rate, not the shop's headline rate, and the two are only the same while the line uses the default.

Fall-through, and why coverage warnings exist

If no band matches the hours, nothing is applied. The line bills at the plain base rate — no multiplier, no error, no marker on the estimate.

That is the same footgun as on pricing matrices, and just as invisible: the line simply reads at the door rate, which looks deliberate rather than like a hole in the table.

Atención

Give every matrix an open-ended top band — a minimum with no maximum. Without one, the long jobs, where the multiplier matters most, are exactly the ones that bill unadjusted.

The matrix editor analyses coverage and flags three things:

  • Gap — a stretch of hours no band covers. Anything landing there falls through. The classic cause is the old 0–1 / 1.01–3 style of writing bands: because matching is half-open, a job of exactly 1.00 h matches neither. Bands must touch (0–1, 1–3).
  • Above range — your highest band has an upper bound, so every longer job falls through. Clear that band's maximum.
  • Overlap — two bands claim the same hours, so the winning band is not the one you would read off the table. The API refuses overlapping bands at save time, so an overlap always means older data; edit the bands and it clears.

A worked example

Switch the demo to Labor and drag the hours across the band boundaries. Push past the top band to watch fall-through happen.

Pruébalo
0,01,0 h×1
1,03,0 h×1.15
3,06,0 h×1.3
Tramo aplicado
×1.15
Tarifa base de mano de obra
120,00
Tarifa efectiva
138,00
Total de mano de obra
345,00

Los tramos terminan en 6,0 h: por encima de eso todo pasa de largo y se factura sin modificar.

Which matrix a line uses

A labor line resolves its matrix in one step, with one fallback:

  1. the matrix pinned to that line, if it has one
  2. otherwise, the shop's default matrix

Lines get pinned through canned services: a canned service's labor item can carry a specific labor matrix, and building an order from that canned service copies the pin onto the new line along with the labor rate. Everything else uses the default.

If the shop has no default matrix, nothing is applied anywhere — every labor line bills at its base rate.

What the customer sees

The customer never sees the matrix or the multiplier. On estimates, repair orders, invoices and the customer portal, a labor line shows the effective rate, so that hours × rate equals the line total.

Printing the base rate instead would put 3.00 h × 120.00 next to a total of 468.00, which reads as a maths error rather than as pricing. Your door rate and the multipliers behind it stay shop-internal.

Troubleshooting

"The rate on the estimate isn't my posted rate." That is the matrix doing its job — the line shows the effective rate for those hours. Check which band the hours land in.

"A long job billed at the plain door rate." Its hours fell outside every band. Look for a gap around that duration, or a missing open-ended top band.

"Two similar jobs priced differently per hour." They landed in different bands. Hours are matched exactly, so 2.99 h and 3.00 h can sit either side of a boundary.

"Changing the multiplier didn't change an open order." Labor pricing is computed from the line's current hours and rate, so a saved matrix change does show up on open orders — but only for lines that use that matrix. A line pinned to a different matrix, or one on an order that is already invoiced, is untouched.

¿Te ha resultado útil?