Karuselle
A multilingual marketplace for curated pre-owned designer fashion: semantic search, flexible seller commissions, EU tax reporting and new payment methods on a growing Laravel codebase.

Challenge
A multilingual fashion marketplace with many sellers and several external sales channels needed to keep growing on an ageing codebase: smarter search, fair and flexible commissions, EU tax reporting, more payment methods — and a store that stays fast and safe.
Solution
Three years as the only developer:
- Framework upgrade: Laravel 5.8 → 6 → 7 → 8 → 9 → 10 → 11 with all packages and PHP 7.4 → 8.x in two weeks, plus a move to a new server.
- Semantic search in four languages: a self-hosted embedding service and vector database, incremental index sync through queues, fallback to plain search with a circuit breaker, a switch in the admin without a deploy, a deterministic colour/category/material filter, synonyms and diagnostic commands.
- Catalogue and storefront: live AJAX filters in drawers with filter counts, size conversion to EU and country size types, discount and seller filters, SEO-friendly URLs, a full redesign of cards, header, footer and mega-menu, home-page banners and sliders managed by drag and drop.
- Make an offer: shoppers propose a price, the admin counters by email even for guests, limits per person, expiry and protection against double clicks.
- Checkout and payments: Buyer Protection fee across cart, checkout, emails and VAT invoices; coupons, country-dependent shipping; Stripe with 3D Secure, Apple Pay and Google Pay, PayPal REST, Paysera with amount verification.
- Sellers and money: sales channels with their own commissions and invoices, a separate invoice per seller in one order, seller payout dates, an EU DAC7 tax report in XML, invoice numbers issued under a database lock, and a Commission Rules module with one resolver, per-channel rates, listing-age rules, preview, drag sorting and a change log.
- Feeds and marketing: Google Merchant, Facebook, partner marketplaces in CSV, Mailchimp e-commerce sync, consent mode v2.
- SEO and GEO: structured data for products, breadcrumbs and FAQ, canonical and hreflang only for existing translations, noindex for facets, robots rules for AI crawlers and llms.txt, a daily sitemap and an SEO check command.
- Languages: LT, EN, PL and RU with translation on save and weekly sync commands.
- Admin and operations: queue and jobs panels with worker heartbeat, background exports, session recovery that keeps typed text, clean-up of abandoned draft products.
- Security: a security review closed access-control and file-access gaps, added per-account and per-IP login throttling, ended sessions on password change and restricted uploaded file types.
- Tests: a test suite from zero to 239 tests, with a guard against running them in production.
Result
- Commission calculation for 50 products: from 101 database queries to 2.
- Offers list: 169 → 121 queries per page; a product with 35 offers: 92 → 64.
- Product thumbnails: 136 KB → 20 KB each (60 per category page); one product’s images 2.5 MB → 0.5 MB.
- Seller earnings in the sales history now show what was actually charged — an error affecting most historical rows was found and fixed.
- Semantic search covers about 9,000 products in production.