Which crew owns which stage

Each stage of a job is assigned to a labour source, which decides whose portal shows the work and whose rate prices it.

What it is

Project_stage_assignments rows keyed `${projectId}::${taskId}` carry the crew, plus the stage type and name for display. Reassignment is an upsert on the same key.

Also called: assign a stage to a sub · who is doing the concrete · stage ownership

See it
Which crew owns which stage
🔒ridgelinepostframe.com/project/stage-319
Hobby Shop
Framing · on schedule
The stage list in the Labor & Costs panel with a crew selector on each row. Sample data — no customer information appears here.
How it works
  1. 1The project's Labor & Costs panel assigns each stage to a crew.
  2. 2The subcontractor portal lists exactly the stages assigned to that crew, grouped by project.
  3. 3The in-app field view lists the signed-in worker's own crew's assignments.
  4. 4The worker log endpoint reads crew_id from the stage's assignment rather than trusting the client.
Why we built it

Hours logged on a job with three crews on it price differently depending on whose rate they take, so anything that lets the phone doing the logging decide is an invitation to cost labour at the wrong rate. Each stage of a project is assigned to a crew, and hours logged against that stage take that crew's rate, decided on the office side and never accepted from the field. Assigning stages to crews is also what makes the schedule and the labour costs agree about who is doing what.

The problem
  • No record of which labour source owns a given stage.
  • Hours priced at the wrong crew's rate.
  • Portals showing work belonging to somebody else.
Sound familiar?
What you get
Each portal shows exactly the work that belongs to it.
Costs are priced by the crew that actually did the work.

See it on your own jobs

Twenty minutes, your numbers, no slide deck. We’ll build one of your real buildings in front of you and send you the estimate link at the end — yours to keep either way.

or keep browsing features →