Madison runs a regional retail network with both B2C storefront and B2B wholesale operations. They came to us with a working but slow Bitrix-based site, fragmented inventory, and a B2B portal duct-taped on top of the consumer catalog. The brief: redesign for speed and conversion, separate B2B/B2C flows cleanly, hit Lighthouse 90+ on mobile.

The brief

Madison's previous setup couldn't serve both audiences without compromising one. B2B buyers needed price-list exports, line-item bulk add-to-cart, and account-tier discounts. B2C shoppers needed a fast catalog with clean filters, accurate stock, and a checkout under 60 seconds. Forcing both into one UI was hurting both.

Approach

Two-week Discovery: we mapped the actual journeys (5 B2B accounts + 3 B2C personas), audited inventory sync (1C → site every 4 hours, sometimes failing silently), and benchmarked competitors on Lighthouse and Core Web Vitals. The output: a single-codebase storefront with two routing trees — guest/B2C public, account-gated B2B with per-tier pricing.

Stack

  • Bitrix24 backend kept (data layer, ERP integration cost would not justify migration)
  • Custom storefront UI rebuilt — cleaner templating, async price loads, no jQuery legacy
  • Catalog: faceted search rebuilt with debounced filters, instant product count updates
  • Checkout: 3-step flat (cart → contact → confirm), no account required for B2C
  • B2B portal: tier-aware pricing, CSV export, line-item bulk add, saved order templates
  • Performance: critical CSS inlined, lazy-loaded images via native loading="lazy", font-display: swap

Build

5 sprints of 2 weeks each. Sprint 1 — design system and B2C catalog skeleton. Sprint 2 — search and filters with real 1C data. Sprint 3 — checkout flow + payment. Sprint 4 — B2B portal scaffold + tier pricing logic. Sprint 5 — polish, A/B-test setup, performance pass.

Tricky bits: tier pricing display had to be lazy because computing wholesale prices for a 1000-SKU catalog server-side blew TTFB. Solved by displaying retail price first, then fetching tier price client-side per visible card with a debounced batch endpoint. Saved ~600ms LCP.

Outcomes

  • Mobile Lighthouse Performance: 92 (up from 64)
  • B2C checkout completion rate: +18-25% range across the 90 days post-launch
  • B2B portal active accounts: 60+ within first quarter, replacing email/phone orders
  • B2B average order value: ~3x B2C — so even modest portal adoption hits revenue meaningfully
  • Page load on 4G mid-tier mobile: 2.1s LCP (was 5.4s)

What we'd do differently

We kept Bitrix at the data layer because migrating a populated regional e-commerce was out of scope. In retrospect, a headless Medusa.js or Saleor migration would have been cleaner and we'd have been faster on subsequent feature work. We'd at least scope a phased migration plan in Discovery next time.

Bottom line

Madison demonstrates one of our core engagement patterns: rebuild the experience without rebuilding the foundation. When the ERP/data layer is heavy and works, replacing only the storefront gets you 80% of the wins for 30% of the cost.

Need a similar audit on a B2C/B2B hybrid e-commerce? Drop us a line — we'll review your numbers and tell you what we'd build.