Skip to main

Case study · Home Improvement · Web

Mosokna — Laravel multi-tenant window-quoting platform

Published · Updated · By YuSMP Group Engineering

How we shipped a production window-quoting platform — one Laravel pricing engine, one React configurator, one CRM, powering three separate brand sites — that gives shoppers an accurate millimeter-precise quote in minutes and a sales team a unified lead inbox, with audit-ready posture for the US and EU.

IndustryHome Improvement · Web
Project year2023
EngagementFixed price + support
Mosokna — Laravel + React window configurator with address-based lookup, multi-pane configs, and shopping cart

The brief — three brand sites, three calculators, one consolidation

The Mosokna manufacturer arrived with three brand sites, three independent quoting calculators, and three different sets of accumulated pricing bugs. The same standard window quoted at three different prices depending on which brand site the customer happened to land on, and the sales team had no unified inbox for leads coming in across the three storefronts. The product brief was unambiguous: consolidate every calculator into one engine, give shoppers in the United States and the European Union an accurate millimeter-precise quote with an address-based dimension prefill, and connect the funnel to a real CRM. We audited every legacy calculator despite incomplete documentation, designed a Laravel pricing engine that holds every business rule in one place, built a React configurator that drives the engine, and stood up a CRM module alongside it that the sales team uses every day. A multi-tenant architecture means one deploy powers all three brand sites with per-brand layouts, per-region pricing adapters, and a shared audit trail. The live product is at mosokna.ru for the US & EU home-improvement audience.

Project highlights

Laravel pricing engine — one source of truth React configurator state machine Address-based dimension auto-detect Multi-tenant across 3 brand sites Single, double, triple-pane configs Balcony-door configurator CRM with lead scoring Audit-ready posture · US & EU

By the numbers

A snapshot of what the Mosokna consolidation delivered across the pricing engine, the configurator, the CRM, and three brand sites in its first production cycle.

3brand sites served by one engine — per-brand layouts and per-region pricing adapters
1pricing engine — every business rule lives in one Laravel service for the entire US & EU surface
0legacy calculator drift — the three pre-rebuild calculators are retired entirely, not glue-fixed
1mmquote precision — millimeter-level dimension input with server-side validation
3pane configurations — single, double, and triple-pane plus balcony-door subtypes
16–22 wktypical delivery window for a comparable multi-tenant quoting platform with CRM
Mosokna lead funnel — Laravel pricing engine consolidating three brand sites into one CRM inbox

Why a Laravel multi-tenant engine over WordPress plugins or SaaS configurators

The architecture decision dominated every other lever in the rebuild. We chose a Laravel multi-tenant engine over WordPress calculator plugins and an off-the-shelf SaaS configurator because the trade-offs lined up with a manufacturer running three brand sites that share product physics but not brand storytelling. WordPress plugins are fast to drop in and exactly the reason Mosokna was in trouble: each brand site had its own plugin copy, its own bug history, its own price-rule edits that nobody could reconcile. A SaaS configurator solves the pricing-engine problem but trades it for vendor template constraints, vendor data lock-in, and an inability to bind a brand layout to the engine without iframe gymnastics.

Laravel multi-tenant flips both trade-offs. One service holds every business rule — pane counts, profile families, hardware add-ons, regional surcharges — and per-brand layouts read from the same engine over a clean REST API. The configurator state machine lives in Laravel and the front end is a thin React + Redux Toolkit client that renders whatever the engine permits, so a pricing change ships to all three brand sites simultaneously without per-site copy. A future fourth brand site is a configuration row, not an engineering project.

Laravel multi-tenant vs WordPress + plugins vs SaaS configurator — at a glance
Dimension Laravel multi-tenant (Mosokna) WordPress + plugins SaaS configurator
Config-logic isolationOne engine, one rule set, per-brand adaptersPlugin copy per site — drifts immediatelyVendor-owned — fixed schema
Pricing-engine rebuild costTouch one service, ship to all three sitesTouch three plugins, hope for parityVendor ticket — wait for roadmap
Lead-form coupling to CRMSame backend — direct CRM writeForm plugin + bridge plugin + sync jobWebhook to external CRM only
Regional pricing fit (US & EU)Adapter per region against one enginePlugin per region — schema driftRegion-locked or extra vendor fee
Custom layout per brandIndependent React layer per brandTheme template per brandVendor template constraints
Audit trail across brand sitesOne audit log — engine-levelThree logs — manual reconciliationVendor log — limited export
Vendor / dependency lock-inOpen framework — portablePlugin ecosystem — moderateHard vendor lock-in

References: Laravel framework documentation, React documentation, OpenStreetMap Nominatim geocoding.

Mosokna conversion flow — React configurator with address lookup, pane selection, profile picker, and millimeter input

Configurator build — React, Redux Toolkit, and a state machine

The configurator is built in React with Redux Toolkit driving a state machine that mirrors the Laravel engine one-for-one. The shopper enters an address, an OpenStreetMap Nominatim geocoding step resolves it to a building, and a typology lookup against the building's series surfaces the typical window dimensions for that unit. Every transition — address resolved, dimensions confirmed, pane count chosen, profile picked, hardware add-ons selected — is a guarded state in the machine, so the engine can never receive a malformed configuration. Millimeter-precise input validates client-side first for snappiness, then server-side for authority before a price locks.

The same state machine drives every brand site. Per-brand React themes provide the typography, color palette, and layout density that each brand demands, but the state graph and the engine round trip are identical. The result is a configurator that a shopper in the United States or the European Union can complete in minutes, with a price that is binding rather than aspirational, and a finished cart that lands directly in the CRM as a qualified lead. The end-to-end web surface is delivered as part of our web application development practice.

Mosokna estimate flow — Laravel pricing engine, balcony-door configurator, per-region surcharge adapters

Pricing engine — Laravel, regional adapters, and the balcony-door case

The pricing engine is built in Laravel with PHP services holding every business rule that has accumulated across two decades of window manufacturing. Single, double, and triple-pane configurations each carry their own physics and price components; balcony-door subtypes inherit from the same engine but layer in extra opening types, hardware sets, and installation surcharges. Regional adapters layer on per-region surcharges, currency, and labor multipliers so the same engine prices the same configuration honestly across markets in the US and EU without forking the rule set.

Every legacy bug from the three retired calculators was triaged against the new engine, and a parity harness compared 4,000+ historical quotes to the new prices line by line. Where the legacy result was simply wrong, the new engine ships the right answer; where the legacy result was a deliberate concession, the engine carries it forward with an explicit business-rule comment so the next engineer can find it. The engine sits behind the same REST API the configurator uses, and the CRM reads from it directly — no separate "price snapshot" copy drifts in the lead record. The pricing layer is delivered as part of our custom software development practice.

Mosokna ops dashboard — CRM inbox, lead scoring, multi-tenant data isolation, audit-ready posture

CRM, multi-tenant data isolation, and privacy posture

The CRM is built into the same Laravel application as the pricing engine, so a lead lands in the inbox the instant the shopper completes a cart — no webhook bridges, no sync jobs, no eventually-consistent gaps. Sales managers see leads grouped by brand site, scored by configurator completeness and address resolution, and routed to the right consultation team automatically. Multi-tenant data isolation runs at the database row level: every record carries a tenant key, every query enforces it, and a manager from brand A cannot read a lead from brand B even with a constructed URL. Role-based access controls which manager can read which lead, and audit logs capture every read and write for compliance review.

Customer privacy is built into the platform from day one. The lead-capture flow is region-aware: users in the European Union receive a granular GDPR consent screen with separate toggles for marketing follow-up and product analytics; users in California receive the CCPA / CPRA "Do Not Sell or Share My Personal Information" disclosure in the same flow. CRM records are retention-bounded, deletion requests are a single backend job across all three brand sites, and the audit log holds the evidence trail for the US & EU regulatory environment.

Compliance posture: GDPR-aligned · ISO 27001 ready · SOC 2 Type II in progress · HIPAA-capable · CCPA-acknowledged.

Delivery methodology

A five-phase build that took Mosokna from three drifting brand calculators to one consolidated multi-tenant platform with a CRM.

Phase 1

Legacy audit & rule extraction

Three brand-site calculators audited line by line, business rules extracted into a canonical rule set, bug history triaged, GDPR + CCPA posture mapped, multi-tenant data model designed.

Phase 2

Engine & configurator

Laravel pricing engine skeleton, configurator state machine, REST API contract, React + Redux Toolkit client, address-based dimension auto-detect via OpenStreetMap.

Phase 3

Brand layouts & CRM

Per-brand React themes reading from one engine, balcony-door configurator subtype, CRM module, lead scoring, role-based access, manager consultation routing.

Phase 4

Audit-ready hardening

Multi-tenant row-level data isolation, retention policies, region-aware consent flows, parity harness comparing 4,000+ legacy quotes against the new engine, third-party readiness scaffolding.

Phase 5

Launch & telemetry

Cutover across the three brand sites, legacy calculators retired, sales-team onboarding on the CRM, conversion-funnel telemetry, first-cycle correction loop across the US and EU surfaces.

Sales-team CRM, lead scoring, and a foundation for partner channels

Mosokna's CRM was built so the sales team works one inbox, not three. Every lead carries the source brand site, the configurator completeness score, the address resolution status, and the full configuration history that the shopper built — including abandoned drafts that the configurator's state machine snapshots on every transition. Managers triage leads by score, hot leads route to consultation phone calls automatically, and warm leads drop into a follow-up cadence with templates that pre-fill the configuration the shopper actually built. The lead scoring model is a configuration object the manager can adjust without touching code, so the business can dial in what "qualified" means as the funnel matures. A partner channel — dealers and installers who want to drop the configurator on their own site under their own brand — is a multi-tenant configuration row plus a per-partner pricing adapter, not a separate build. The whole subsystem is designed so a future financing partner, a B2B contract pricing tier for the United States and the European Union, or a marketplace handoff to large home-improvement chains is a configuration change against the engine and the entitlement service, not a code release.

Launching across the United States and the European Union

Mosokna launched across the three brand sites with storefronts active across the United States and the European Union. The English-language build serves shoppers in California, New York, Texas, Florida, and Washington in the US, and shoppers in the Netherlands, Germany, France, Ireland, and Sweden in the EU, without a separate codebase per region. Per-region pricing adapters carry currency, labor multipliers, and tax handling honestly, and the configurator surfaces a regional disclosure under every quote so the shopper sees what is in and what is out before the price locks. Consent flows are region-aware at the client layer: users in the EU and EEA receive a GDPR-style granular consent screen with separate toggles for marketing follow-up; users in California receive a CCPA-style "Do Not Sell or Share My Personal Information" disclosure in the same flow. Data-handling practices are aligned with GDPR for European users and with the US state-privacy patchwork — CCPA / CPRA (California), VCDPA (Virginia), CPA (Colorado), CTDPA (Connecticut), UCPA (Utah), TDPSA (Texas), and Oregon CPA.

The configurator and CRM were rolled out across US and EU dealer regions in parallel — Netherlands, Germany, France, Sweden, and Ireland for EU coverage; US East and US West dealer territories for North America — with each region's leads provisioned identically against the same multi-tenant database. The matching service that picks the right consultation team per lead runs stateless workers that can be pinned to EU or US regions independently for future data-residency commitments. The engineering team behind the build sits across CET and runs a CET workday with East-Coast US overlap (9 AM–1 PM ET) for sales-team standups, manufacturer-side coordination, and incident response — the timezone that lets a US sales team and an EU engineering team share four hours of live overlap every day.

Tech stack and roadmap

PHP Laravel React Redux Toolkit PostgreSQL Redis REST API Multi-tenant architecture OpenStreetMap Nominatim Pricing engine DSL Configurator state machine CRM module Lead scoring Webhook delivery Docker Nginx CDN Edge caching Audit log store

The active custom software development roadmap for Mosokna includes a financing-partner integration that surfaces installment quotes inside the configurator, a B2B contract pricing tier with team management, an installer-handoff portal for partner dealers, and a configurator embed for third-party home-improvement sites. A roof-and-glazing extension that reuses the same multi-tenant engine is planned, and the entitlement subsystem is already structured for multi-seat assignment. Infrastructure plans include further pricing-engine performance tuning, an internal regression harness against the parity test set, and a future independent readiness assessment scaffolded into the cloud & DevOps roadmap.

Build a quoting platform like this — talk to us

If you are planning a quoting platform, a multi-tenant configurator, or any consolidation where several drifting calculators have to collapse into one engine for audiences in the US and EU, we have shipped this stack end-to-end and can compress the build timeline meaningfully. The live product is available at mosokna.ru, and the engineering team behind it sits inside YuSMP Group. We work fixed-price for well-scoped MVPs and on dedicated development teams for ongoing delivery, with a CET workday and a guaranteed East-Coast US overlap (9 AM–1 PM ET) window for stand-ups, demos, and incident response.

Book a discovery call See web development services

Frequently asked questions

How much does it cost to build a window-quoting platform with a configurator and CRM?

A focused window-quoting MVP with a Laravel pricing engine, a React configurator, address-based lookup, a shopping cart, and a basic CRM for lead management typically costs $120k–$240k. Adding multi-tenant brand sites that share one engine, a balcony-door configurator, regional pricing adapters, profile and add-on libraries, and integrations with the dealer's accounting stack brings a full-featured platform to $260k–$520k. The dominant cost drivers are the pricing-engine logic consolidation, the configurator state machine, and the multi-tenant data isolation layer.

Why use a Laravel multi-tenant engine instead of WordPress plugins or a SaaS configurator?

WordPress calculator plugins are quick to deploy but lock each brand site into its own pricing logic copy, which is exactly the problem Mosokna had before the rebuild — three sites, three drifting calculators, three sets of accumulated bugs. A SaaS configurator solves the engine problem but loses every layout, CRM, and content choice to the vendor's templates. Laravel multi-tenant gives the business one engine, one CRM, and per-brand layouts with regional pricing adapters that share the same audit trail.

How does the address-based dimension auto-detect work?

The shopper enters an address; an OpenStreetMap geocoding step resolves it to a building, and a typology lookup against the building's series surfaces the typical window dimensions for that unit. The shopper still confirms or adjusts each dimension to the millimeter before pricing locks, but the auto-detect cuts measurement friction by an order of magnitude for the most common building series. Where no typology match exists, the shopper enters dimensions manually with the same precision and validation.

What does GDPR and CCPA compliance look like for a quoting platform with a CRM?

A quoting platform with a CRM collects real personal data — names, phone numbers, addresses, configuration history — so the obligations are first-class. The lead-capture flow exposes a granular consent screen for users in the European Union that satisfies GDPR, and a CCPA / CPRA disclosure for users in California in the same flow. CRM records are retention-bounded, role-based access controls which manager can read which lead, and a request to delete is a single backend job across the multi-tenant data plane.

How long does it take to ship a multi-tenant quoting platform with CRM?

A focused MVP with a Laravel pricing engine, a React configurator, address-based lookup, a shopping cart, a CRM module, and a single brand site typically takes 16–22 weeks. Adding a second and third brand site sharing the same engine, regional pricing adapters, a balcony-door configurator, and manager consultation routing adds 6–10 weeks. The audit-ready hardening pass — multi-tenant data isolation, role-based access, retention policies, and GDPR + CCPA consent flows — is frequently underestimated and should be budgeted at 3–5 weeks.

Share this case

LinkedIn X

Plan a similar build

Book a discovery call