A token-gated web portal at /client/[id]. The same URL renders whichever stage the customer is actually at: sign-in, estimate, intake form, contract, a builder hold screen, or the live project dashboard. There are no passwords by default because the emailed link is the credential. The whole route subtree is wrapped in a tenant-branded theme provider.
Also called: customer portal · client login · estimate link · project portal · customer dashboard link
One link, sent once, that carries the job from quote to keys
The customer gets a single URL when you send the estimate, and it is still the right URL when they are watching the roof go on. The same address renders whichever stage they are actually at — quote, details form, agreement, or live dashboard — so there is no second link to send and no wrong link for them to open. The alternative is what most shops do now: email a PDF, then a form, then a contract, then take the phone calls for four months.
The quote link turns into their project dashboard
When you click Start Project, the page the customer bookmarked months ago stops being an estimate and becomes a live view of their build. Nothing is resent and nothing is re-bookmarked. The customer who was checking their price in June is checking their framing milestones in August, at the same address.
There is no password, because the link is the credential
Nobody creates an account to look at a quote you emailed them, and account creation is where a buyer who only wanted to see a number gives up. When a sign-in is shown at all it asks for name, email and phone — not to keep anyone out, but so you learn who actually opened it, including the spouse or the lender the buyer forwarded it to. A customer who wants privacy can set their own password from that card, and once it is set nobody else can change it.
You never sign in to a document you wrote
A builder or agency user opening their own customer link is admitted straight through, password or not. That preview is also excluded from the tracking, so a first-open alert and a read time on a quote always mean a real customer looked, not you checking your own work.
The customer can always see what is still ahead of them
A hairline rail across the top of every customer page names the four stages — Estimate, Your Details, Agreement, Live Project — and which one they are on. It is deliberately not clickable; nobody skips ahead. It exists because a customer who has just approved an estimate otherwise assumes the job is booked, and calls a week later to ask why nothing has happened.
Nothing reaches the customer until you release it
After the contract is signed the customer sits on a branded your-build-is-being-planned screen — not a dashboard full of stages that may not apply to their job — until you click Start Project. The agreement works the same way: their details land with you first, and they wait on a screen that says so. Without that gate a customer signs and then watches an empty progress bar for two weeks, wondering what they paid for.
Fix a number and it reaches the tab they already have open
The estimate re-reads its live fields every ten seconds, so a corrected payment stage, an edited spec, a colour restriction or a cleared warning shows up on the customer's screen without a resend and without asking anyone to refresh. Hold screens poll too, which is why the page becomes the dashboard on its own the moment you start the project. Resending a whole quote to fix one number is how a customer ends up reading the wrong version.
- 1The builder sends an estimate; an estimate_links row is created and its unguessable id becomes the URL
- 2GET /api/client-portal?id= loads the link, its branding, and the two builder gate flags
- 3The page tries an automatic sign-in and lets the SERVER decide whether the visitor may skip the form
- 4A render switch picks the branch: login form, estimate view, hold screen, or ProjectDashboard
- 5Background polls refresh the gate flags so the page advances itself when the builder acts
Every customer who reached a quote was asked to type back the name and email the builder had already put on their row in order to send them the link in the first place. It was a wall in front of a document the buyer had been invited to read, and builders arriving from their own dashboard hit the same wall on their own estimate. The portal opens straight from the link — the link itself is the credential, and no customer ever gets a password to lose.
- Customers lose emailed PDF estimates and ask for them again
- Account creation kills conversion on a quote a customer wants to look at once
- A separate link per stage means the customer holds four URLs and uses the wrong one
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 →