Skip to content
online
env0.46.1 · 1d135e2
Active

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.

Karuselle home page: a curated designer fashion reseller with a full-width photo of a silver handbag, a Sell with us button, menus by brand and category, search and a language switch

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.

Screenshots