Customer Portals — Leads2Build
Home Modules How it works Customer Portals Pricing Why L2B Support Careers Log in
TWO SIDES OF ONE LINK

Stop emailing PDFs
into the dark.

Your customer gets one branded link that carries them from estimate to finished building. You get the control panel behind it — what they see, every version, who opened it, and exactly what changed.

↓ What your customer sees ↓ What you see
Everything below is live — click it.
SECTION 01

Your customer’s experience

One link. No passwords, no app. Your brand on every screen — never ours.

{{ st.num }} {{ st.label }} {{ st.sub }} {{ st.mark }}
{{ curUrl }}
{{ brandInitials }} {{ brand }} {{ curBadge }}
Here’s your building

A text from your company with one link. It opens to the real building — a 3D model they can spin, the real takeoff, the real price.

EXACTLY WHAT THEY SEE — YOU CHOOSE THESE LINES FROM YOUR SIDE
{{ s.label }} {{ s.amt }}
Your investment {{ custTotal }}
3D MODEL — THEY SPIN IT
Real building, real takeoff, real price.
SECTION 02 OF THEIR PAGE
They make it theirs

Roof, trim, walls, doors — they tap through real colour options and watch the building change.

{{ colorSummary }}
TAP A SWATCH — THE BUILDING CHANGES ↓ KEEP GOING — ROOF, TRIM AND WALLS ALL CHANGE
{{ p.label }}
They do this at their kitchen table at 9pm, without calling you. Every pick flows into the contract and the material order.
THE BOTTOM OF THEIR PAGE
One tap. Locked.

They approve the exact version in front of them. Price, scopes and colours lock together.

Approved LOCKED AT v7 · 8:02 PM · RECEIPTED
WHAT THEY’RE APPROVING
{{ custTotal }}
{{ approveScopeNote }}
Colours as selected · 60×80 shop
WHAT HAPPENS ON TAP
Price locks at this exact version
Every earlier version is kept
Your pipeline advances automatically
{{ approveLabel }}
{{ approveNote }}
{{ curTitle }}

{{ curDesc }}

THEY TYPE IT ONCE
{{ f.label }}
{{ f.typed }}|
THE CONTRACT WRITES ITSELF
Highlighted values came straight from their form — nobody retyped them.
Construction Agreement
{{ c.tick }} {{ c.pre }}{{ c.strong }}{{ c.post }}
Construction Agreement
Prepared automatically from their intake form
{{ sb.pre }}{{ sb.strong }}{{ sb.post }}
CUSTOMER — {{ clientLabel }}
signed {{ clientHint }}
BUILDER — {{ builderLabel }}
{{ brand }} ONE TAP —
SAVED SIGNATURE
{{ execNote }}
DRAW YOUR SIGNATURE HERE ✓ SIGNATURE CAPTURED
YOUR SIDE
You draw yours once, in settings. Every countersign after that is the one tap on the right — from the truck, without printing anything.
Both parties get the executed copy the moment it’s done, and it stays on their dashboard forever.
TAP A STAGE — WATCH THE BUILD PROGRESS ↓ STEP BACK AND FORTH THROUGH THE BUILD TRY IT
{{ b.tick }}
{{ b.label }}
{{ buildHeroAlt }}
{{ buildHeroTag }}
PHOTOS FROM THE FIELD — POSTED BY YOUR CREW
SOON
{{ f.label }}
{{ f.value }}
INVOICE SCHEDULE
{{ iv.check }} {{ iv.label }}{{ iv.state }} {{ iv.amt }}
Contract
Signed — tap to open →
Change orders
1 approved · +$2,400
Gutters & downspouts — signed Sep 2
WITHOUT THIS
{{ curPain }}
WITH THE PORTAL
{{ curGain }}
SECTION 02

Your experience

The control panel behind that link. You decide what they see, keep every version, and watch it happen in real time.

{{ t.label }}
The takeoff lands priced

This is your estimate summary. The material breakdown comes straight from the takeoff — you add services, set labour and markup, and the customer total moves as you go.

MATERIAL BREAKDOWN — FROM THE TAKEOFF
{{ mb.label }} {{ mb.amt }}
Materials subtotal{{ matSubtotal }}
ADD A SERVICE FROM YOUR CATALOGUE SERVICES & ADD-ONS — TAP TO ADD OR REMOVE
{{ cs.sign }} {{ cs.label }}{{ cs.unit }} {{ cs.amt }}
LABOUR — SET HOURS & CREW
{{ cw.label }}
{{ labourHours }} hrs
+
@ $80/hr{{ labourAmt }}
MARKUP — OR SET YOUR OWN
{{ mo.label }}
Applied{{ markupAmt }}
{{ br.label }}{{ br.amt }}
{{ bi.label }}{{ bi.amt }}
{{ buildItemCheck }} Itemise services for the customer
Customer total {{ buildTotal }}
PAYMENT SCHEDULE
{{ ps2.label }}{{ ps2.amt }}
Order it without retyping it

The takeoff becomes the order. Nudge a quantity and the bar at the bottom tracks exactly what you added and removed against it — then send it to your supplier, formatted.

FRAMING — 7 OF 21 LINES SHOWN NUDGE A QUANTITY — WATCH THE ORDER TOTAL
FRAMING (21){{ framingSubtotal }}
{{ o.label }}{{ o.spec }} {{ o.qty }} + {{ o.amt }}
BASE
{{ orderBase }}
SUBTRACTED
{{ orderSub }}
ADDED
{{ orderAdd }}
ORDER TOTAL
{{ orderTotal }}
RL Rocky Lane Building Supplyorders@rockylanesupply.ca
Send order →
You decide what they see

Toggle anything on the left. The customer’s page on the right rewrites itself instantly — that’s exactly how it behaves in the platform.

Send Estimate to Client
60×80 Shop — Hutchins
{{ m.label }}
↑ CLICK THE TABS
HOW IT GOES OUT
{{ d.check }} {{ d.label }}{{ d.sub }}
MESSAGE PREVIEW
Hi Dale — your building is ready to look at. Tap here to see it, pick your colours and approve when you’re happy. — {{ brand }}
SERVICES & ADD-ONS ON THE ESTIMATE
{{ allSvcCheck }} {{ allSvcLabel }}{{ allSvcSub }}
{{ s.check }} {{ s.label }} {{ s.amt }}
{{ itemCheck }} {{ itemizeLabel }}
{{ b.label }}{{ b.amt }}
Customer Total {{ bizTotal }}
These settings override your global defaults for this estimate only.
SECTIONS SHOWN IN PORTAL
{{ r.check }} {{ r.label }}
{{ sb.check }} {{ sb.label }}
← YOUR CUSTOMER’S PAGE, LIVE
{{ curUrl }}
YOUR CUSTOM BUILDING
{{ ps.label }}
{{ ml.label }}{{ ml.amt }}
CUSTOMER VIDEO OR QUOTE
{{ previewCount }}
Every version, kept

One version is live — that’s what the customer sees right now. Edit freely; drafts stay private until you promote one. Tap a version to open its breakdown.

● Customer sees now{{ liveVerLabel }}
Your latest draft{{ draftVerLabel }}
{{ v.id }} {{ v.name }}{{ v.tag }} {{ v.date }} {{ v.amt }}CUSTOMER TOTAL
BREAKDOWN — {{ openVerLabel }}
{{ b.label }}{{ b.amt }}
{{ verItemCheck }} {{ verItemizeLabel }}
Customer total{{ openVerTotal }}
{{ verNote }}
“What changed since last time?”

This one is for you, on the phone with them. Pick any two versions — the difference is computed for you. No more digging through old PDFs trying to remember.

COMPARE THIS
{{ c.label }}
AGAINST THIS
{{ c.label }}
{{ cmpAName }} {{ cmpBName }} Difference
{{ cmpALine }}
{{ cmpBLine }}
{{ cmpDelta }}
{{ cmpDeltaLabel }}
{{ g.label }} {{ g.from }} {{ g.to }}{{ g.delta }}
LINE ITEMS CHANGED
{{ r.mark }} {{ r.label }} {{ r.from }} {{ r.to }}{{ r.delta }}
{{ cmpFooter }}
The whole journey, timestamped

Every edit, send, open, colour pick, approval and signature — with the gaps between them. Step it forward to watch a deal go from opened to signed.

{{ ph.tick }}{{ ph.label }}
{{ actHint }}
⌂ YOUR SIDE — LIVE TRACKING Estimate #1078158 · 8 versions · 3 links
Executed
FULLY EXECUTED
{{ a.time }} {{ a.icon }} {{ a.text }}
▸ Versions · sends · opens · colour picks · approval · signatures — the moment they happen
▸ Once approved it locks. What they signed off on is what they signed off on.
Where the deal actually is

Tap a stage on the left to see exactly what you get to look at on your side at that point.

CUSTOMER FUNNEL
{{ funnelProgress }}
{{ f.num }} {{ f.title }}{{ f.sub }} {{ f.tag }}
{{ funnelNote }}
{{ funnelViewLabel }}
👁 Who’s viewed this estimate{{ viewerHeadline }}
{{ v.initial }} {{ v.name }}{{ v.tag }} {{ v.contact }} {{ v.stats }}
A competitor and a lender both opened this one. You know who is really in the decision — and who you are actually bidding against — before you pick up the phone.
Intake form — submitted AUG 2 · 9:26 AM
{{ f.label }} {{ f.typed }}|
Submit information →
You never chased any of this. It arrived, and it’s already in the contract below.
Construction Agreement
Hutchins Family Holdings Ltd. · 60×80 shop · $123,039.27
CUSTOMER
Dale Hutchins
SIGNED AUG 2 · 10:07 AM
BUILDER — {{ funSigLabel }}
COUNTER-SIGNED — KEEP DRAWING IF YOU LIKE
Start project →
Both parties hold the executed copy. It also lives on their dashboard, so “can you resend the contract?” stops being a phone call.
Their project dashboard UNLOCKED
{{ m.tick }}
{{ m.label }}
PROGRESS PHOTOS
{{ mp.caption }} 📷 BUILDER
{{ mt.label }}
{{ mt.value }}
{{ mt.sub }}
Contract, change orders, invoices and every progress photo — all on the one link they already have.
Every job, every stage, every photo

Signed jobs land on a Gantt. Open a stage to assign tasks, tick checkpoints, and take the photo that shows up on the customer’s dashboard.

THIS SEASON
{{ gm.label }}
{{ gr.label }}
{{ gl.label }}
OPEN A STAGE PROJECT STAGES — HUTCHINS 60×80
{{ pm.tick }} {{ pm.label }}{{ pm.sub }} 📷PHOTO {{ pm.tag }}
PROJECT HUB
{{ ht.icon }} {{ ht.label }}{{ ht.sub }} {{ ht.value }}
WITHOUT THIS
{{ bizPain }}
WITH LEADS 2 BUILD
{{ bizGain }}
Leads 2 Build seal

Now do it with
your building, your prices

Thirty minutes, founder-led, on one of your real jobs. We’ll send the estimate to your own phone and you’ll watch the open notification land.

Or email sales@leads2build.com · call (604) 763-4144
{{ stageName }}
Hutchins 60×80 · {{ stagePos }}
CREW
Crew A · 3 assigned
STATUS
{{ ss.label }}
TASKS — ASSIGNEE IS NOTIFIED BY TEXT
{{ tk.check }} {{ tk.label }} {{ tk.who }}
CHECKPOINTS
{{ cp.label }}
CUSTOMER PHOTOS
{{ photoLabel }}
🖼 Choose Photo
Posted to the customer’s dashboard.
They can see it from the same link you texted them.
View full project details
✓ ORDER SENT — THIS IS WHAT THEY GOT
To: orders@rockylanesupply.ca
From: orders@yourcompany.com
Material order — Hutchins 60×80 Shop
YC {{ brand }}
{{ er.label }} {{ er.qty }}
Order total{{ orderTotal }}
Delivery to 4412 Range Rd 22 · week of May 12 · call {{ brandPhone }} on arrival.
Construction Agreement
Hutchins Family Holdings Ltd. · 60×80 shop · $123,039.27
CUSTOMER
Dale Hutchins
BUILDER
{{ brand }}
WHY IT LIVES HERE
The contract sits on their dashboard permanently, so they always have their own copy. No “can you resend it?” six months later, no digging through your sent folder, no arguing about which version they signed.
Book a demo
30 minutes, founder-led, on your real workflow. We'll follow up by email to set it up.
No mobile information will be shared with third parties or affiliates for marketing or promotional purposes. See our privacy policy and terms.
Got it.
{{ demoFollowupMsg }} (Preview site — not wired to our backend yet.)