BUILD XPACE
FREE ESTIMATE

Know what your space
will cost — before you commit.

Tell us which pieces you need, roughly how big they are, and your budget — we'll work out a cost estimate on the spot and have a consultant follow up.

FREE ROUGH ESTIMATE TAKES 2 MINUTES NO OBLIGATION
Takes about two minutes. No payment or sign-up required.
PROJECT

What are we building?

Pick every space you'd like priced — you can select more than one.

STAY IN TOUCH

Who should we send this estimate to?

So we can save your progress and follow up if you get cut off partway through — no spam, no obligation.

Please tell us your name.
Please enter a WhatsApp number we can reach you on.
We'll only WhatsApp you about this quote.
PIECES

Which pieces do you need?

Select everything you'd like priced — you can pick more than one.

MEASUREMENTS

Give us the size & style for each piece

Measure the wall run in millimetres — a tape-measure estimate is fine, we'll confirm exactly on-site.

AREAS

Which areas are part of this project?

Select all that apply.

SCOPE

What's the scope of work?

This tells us whether to plan around structural work.

BUDGET

What's your budget for this project?

There's no wrong answer — this just helps us recommend the right finish.

TIMELINE

When are you hoping to start?

This helps us prioritise your callback.

Drafting your estimate…

Reading your measurements
YOUR ESTIMATE

Here's your itemized estimate.

Review everything you've added below — remove or go back to adjust anything before sending it to our team.

ESTIMATED RANGE (RM)
RM 00,000 – RM 00,000
No file selected
No file selected
Rough estimate only — your final quote follows a free on-site or virtual measurement.
ESTIMATE UNLOCKED

Here's your rough estimate

RM 00,000 – RM 00,000
  1. A design consultant reviews your answers, usually within a few hours.
  2. We WhatsApp or call you to confirm details, within 24 hours.
  3. If it's a good fit, we'll offer a free 3D VR walkthrough when we lock in your site visit.
Chat on WhatsApp Now
Want to add more cabinets to this quote?
For your sales team — how leads are scored

Every submission arrives already tagged, so your team can call the best-fit leads first instead of working the list top to bottom.

Hot — completed the flow and submitted the final "Request Formal Quotation" step. Arrives with the full itemized brief: every room and piece selected, each measured length in mm, the design/finish chosen per piece, scope, stated budget, timeline, and any residence/location/floor plan/reference design they gave.
Warm — gave name and WhatsApp (on the "Who should we send this to?" step, right after picking a project type) but stopped before finishing the itemized details, or used "skip the questions" partway through. Contact is already in hand — needs a qualifying call to fill in the rest.
Not captured — left before giving a name and WhatsApp number. No contact is stored; nothing to call.

Contact is now collected right after the lead picks a project type — before they start measuring cabinets — specifically so a mid-flow drop-off (losing patience partway through the pieces/measurements) still leaves your team a name and number to follow up, instead of nothing.

Full Home Renovation leads now walk through every room they pick — kitchen, wardrobe, study, living, entrance — measuring pieces in each one, so a "full house" enquiry arrives as an itemised, near-quote-ready brief instead of a single rough number. On the results screen, leads see this itemised docket directly (no gate — we already have their contact) and can remove a line or go back to fix something before they send it in; your team can also amend any line from what they keyed in during the follow-up call.

The stated budget is also compared against the calculated estimate: if a lead's number comes in above what they said they'd spend, the unlocked screen shows them a heads-up, and your team sees it as a talking point for the first call rather than a surprise mid-negotiation.

For your developer — connecting the real Xpace Calculator

Pricing comes from one function, estimateProject(), near the top of the script below. It sums rate_per_mm × length_mm for every piece across every room the lead added (one room for Kitchen / Wardrobe & Bedroom / Study / Living, several for Full Home Renovation), using the rate tables in PIECE_CATALOG. "Something Else" is the one exception — it has no defined room, so it sums a package range per selected area from AREA_PACKAGE_RANGE instead.

These rates are placeholders derived from the public vsbuild.com.my example (rows flagged REF below trace directly to a real line item there; the rest are interpolated to fill gaps). Replace every rate value in PIECE_CATALOG and every range in AREA_PACKAGE_RANGE with your real figures once the Excel rate list is available — the structure and the rest of the funnel don't need to change.

Multi-room navigation (Full Home Renovation) is driven by a flat, dynamically-built list of steps in state.virtualOrder — built once the lead picks their rooms, then walked forward and back by state.vPos. If you change which project types get itemised vs. the lighter area-based path, look at buildOrderForType() and extendOrderForRooms(). The "quickcontact" step (name + WhatsApp) is always inserted right after "type", so it's always virtualOrder[1] — that's what the "not you?" link on the results screen jumps back to.

The floor plan / reference design file inputs and the "Choose file" buttons are UI-only in this static prototype — they confirm a filename client-side (rFloorPlanName / rRefDesignName) but nothing uploads anywhere. Wire a real upload endpoint before launch, or swap them for a note asking leads to attach files over WhatsApp instead. The sticky "running estimate" bar shown during the pieces/measurements/areas steps, and the itemized docket with its per-line "Remove" button on the results screen, both just re-read estimateProject() against whatever is currently in state.answers — no separate cart state to keep in sync.

Perfex CRM handoff: set CRM_ENDPOINT_URL near the top of the script to the URL of your own receiver script (see the companion perfex-lead-intake.php file) — leave it blank to disable. sendLeadToCRM(tier) fires a fire-and-forget POST of buildLeadPayload() (full itemized brief: contact info, every room/piece/length/finish, budget, timeline, estimate range) at four points: the "quickcontact" step submit and the exit-intent modal submit (both "warm"), the final "Request Formal Quotation" submit ("hot"), and "Request a Site Visit" ("hot" again, with siteVisitRequested: true). This page never talks to Perfex directly or holds an API token — that stays in your server-side receiver script. Because the same WhatsApp number can submit more than once as a lead moves from warm to hot, have your receiver upsert on whatsapp (or email) rather than always creating a new lead.

PieceStandard specVariantRM / mm
Base CabinetD600 · H850Standard laminate top1.378
Base CabinetD600 · H850Quartz stone top REF1.912
Wall CabinetD350 · H1200Standard0.722
Wall CabinetD350 · H1200With LED lighting REF0.886
Full-Height WardrobeD600 · H3000Standard swing door1.476
Full-Height WardrobeD600 · H3000With end panel & drawer set REF1.877
Base/Shoe CabinetD400 · H850Standard REF0.706
Base/Shoe CabinetD400 · H850With curve corner REF1.290

Full rate list, all rooms/pieces/variants, is in PIECE_CATALOG in the script.