The final stage of the funnel. It reads the project's synced Gantt phases, milestone completions, stage logs and customer photos and refreshes every 30 seconds. The header carries an underway-now and next-milestone banner, a segmented progress bar and an action rail for anything that needs the customer. Every block below is individually switchable by the builder.
Also called: customer build tracker · project status page · client dashboard · track my build
The first thing they read is what is happening this week
The header names the phase underway and the next milestone due, above a bar with one segment per phase, weighted so a twelve-step framing phase reads as a longer stretch of the build than a three-step one. A single percentage does not answer where is my building; framing half done, siding not started does. The customer answers their own status question at nine on a Sunday night instead of calling you on Monday.
Every phase opens into the checkpoints your crew actually ticks
Permitting, dirt work, concrete, materials, framing, siding and roofing, final payment — each expands into its checklist with completion dates and the site photos posted to that phase. If you renamed a stage or added one for a particular build, the customer sees your names, not a generic default set. Milestone photos your crew took as internal documentation stay internal.
Photos in one place, forever, instead of one text at a time
Published site photos land in a grid with a full-screen viewer, arrow-key paging and a position counter, and they also appear inside the phase they belong to. This is the update customers ask for most and the thing they forward to family. Only photos you publish reach them, so crew documentation shots stay on your side of the wall.
An unpaid invoice or an unsigned change order surfaces at the top
A compact rail in the header states how many invoices are due and the total balance, and how many change orders need a signature, and jumps to the real card lower down. When nothing is outstanding it renders nothing at all, so the dashboard never nags a customer who is square with you. Before it existed, a customer with a due invoice could scroll straight past it.
Project total, current stage, approval date, milestones completed
Four tiles at the top of the page, so the questions customers phone about — what was the total again, what stage are we on — are answered without scrolling. The status tile names the phase that is actually running rather than a generic label.
A history that does not bury the rest of the page
Completed milestones, stage changes and photo days in one feed, newest first, five at a time, with reveal five more, reveal all, and collapse back to five. A finished build logs around forty milestones plus stage completions and photo days; unbounded, that feed turns the dashboard into a wall nobody reads.
The signed agreement stays retrievable, without leaving the page
A card on the dashboard opens the fully executed agreement in a modal over the project, keeping the print action and never navigating them away. It appears only once the contract is genuinely counter-signed, so a half-executed agreement is never handed over as the final copy. Customers ask for their contract months later, and this is where it lives.
The customer knows the exact day their build started
The first time you click Start Project, the page they bookmarked greets them with confetti in your brand colours and a card telling them the project is underway and this is now their dashboard. It fires once per browser, so somebody checking progress daily is not celebrated every visit. Breaking ground is the peak of their year; otherwise it is just another email.
- 1The dashboard only mounts once the project_started_at gate is set
- 2/api/client-portal/project returns phases, milestones, milestone config, stage logs and photos
- 3Phases are ordered by the Gantt's own startDay, with a stable sort as belt-and-braces
- 4Milestone lookups key on the unique task id; stage status, photos and fallbacks key on the stage type
- 5dash: keys from the shared sections map decide which blocks render, all defaulting ON
Once the contract was signed, a customer's only source of progress was phoning the builder, and "any update?" calls are the tax a builder pays for a page that does not exist. The same link becomes a live dashboard carrying phase progress, milestones, photos, invoices and change orders, and any block can be added or removed at any time without resending anything. Two faults had to go first: custom phases collapsed into one another and lost their milestones, and stages could render out of sequence, putting permitting last on a job whose permit was pulled first. A progress bar that reads out of order is worse than no progress bar, because the customer trusts it.
- Status update calls and texts during a months-long build
- Customers with no visibility after they sign
- Progress presented out of sequence and undermining trust
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 →