The Brief
RoSPORT imports bikes, parts and sport gear and sells them from its own warehouse — retail to cyclists across Ukraine, wholesale to shops and repair workshops. The old site couldn't hold a catalog of this size, and wholesale partners had no place to see their own prices, so both channels were being run half-manually.
What Was Built
1. A headless storefront for two different buyers
We built the new storefront on Next.js over Medusa.js, with a faceted catalog (brand, wheel size, brake type, frame material, age group), search by name, brand or SKU, guest checkout, wishlist, compare, reviews, one-click buy and cross-sell. Two fully translated locales (uk/ru) cover content, category names and metadata with correct hreflang — a real second language for the Ukrainian market, not an auto-translated export. A separate wholesale track runs alongside retail, with partner pricing, a dedicated account manager, invoice payment and an application flow.
2. A migration that kept the search footprint intact
The store moved off its old engine with the legacy URL structure preserved, so roughly 13,000 product URLs and the old category slugs still resolve. A dynamic sitemap index (a core map plus six product maps, with lastmod refreshed daily), canonicals and hreflang on every page, and Product/Offer/BreadcrumbList structured data on product pages keep a catalog this size indexable.
3. An admin the client's team runs on its own
Both sales channels are operated from one admin: modules for editing pages, menus, filters and notification templates, plus a product-export module that generates a live Google Merchant Center feed and key-protected feed variants for other channels. Behind the same login sit a currency converter for buying from foreign suppliers, an integration with the client's accounting system, an SMS gateway, and a Telegram bot that notifies managers about new orders.
The Result
Both sales channels now run from one admin instead of two separate workflows.
- Merchandising, categories, filters and notification texts are self-serve — no developer in the loop.
- Product feeds go out automatically to Google Merchant Center and other channels.
- The catalog has room to grow past its current 13,000 items without the platform being the limit.
Stack: Next.js App Router with next-intl on the front, Medusa.js split into admin and worker services, PostgreSQL and Redis behind it, media on Cloudflare R2. Checkout runs on Nova Poshta (branch, parcel locker, courier), LiqPay, cash on delivery and bank invoice, with GA4 for analytics.
