Klient mal Shopify Advanced za 280 EUR / mesiac, 12 000 SKU, 4 sklady, B2B + B2C dual pricing, 65 % organického traffic-u zo SK a CZ Googlu. Headless migrácia na Medusa.js sa skončila po 4 mesiacoch, dva týždne pred Black Friday-om. Žiadny organic ranking sa nestratil, žiadna nedokončená objednávka sa nestratila, a Stripe integration prešla zo 14 manuálnych krokov pri každom novom produkte na nulu. Tento článok je o tom, čo sme robili, čo sme zbabrali, a čo by sme urobili inak.
Prečo headless — a kedy NIE
Headless commerce má dva platné dôvody:
- 1.Flexibilita custom checkout / B2B / multi-storefront. Shopify (aj Advanced, aj Plus) má pevnú checkout pipeline. Pre B2B s net-60 splatnosťou, custom pricing tiers, multi-warehouse splitting alebo complex tax rules (SK-DE-AT cross-border) sa Shopify stáva fight-om s API limit-ami a Liquid template-ami.
- 2.Storefront performance + UX. Next.js storefront s ISR (Incremental Static Regeneration) + edge caching dosiahne LCP < 1,2 s na 4G. Shopify Liquid-rendered storefront má LCP 2,5–4,0 s. Pre SEO-driven biznis je to merateľný revenue rozdiel.
Kedy NIE headless: - Catalogy < 500 SKU + štandardný B2C checkout → Shopify alebo BigCommerce ostáva lacnejší a rýchlejší - Tím nemá kapacitu na vlastný Next.js storefront (custom CMS, custom checkout, integrácie) - Roadmapa platby/účtovníctvo/marketing je všetka Shopify-native (Shopify Payments, Shopify Tax, Shopify Email)
Pre tých klientov je hladší existujúci „semi-headless" — Shopify Hydrogen + Oxygen, ktorý dáva headless storefront frontend bez opustenia Shopify ekosystému.
Stack rozhodnutia v 2026
Backend: Medusa.js vs Saleor vs Commerce.js
Medusa.js v2.x - Node.js, PostgreSQL, Redis - Modulárny, plugin architecture - Najlepší developer experience v 2026 - Slabší B2B feature set out-of-the-box (treba plugin alebo vlastný kód pre quotes, approvals, customer hierarchy) - Cena: open source self-hosted, alebo Medusa Cloud od 200 EUR / mesiac - Kedy: B2C + light B2B, dev tím s Node skúsenosťou
Saleor - Python, Django, GraphQL-first - Najsilnejší B2B feature set (customer groups, channel-based pricing, quote requests) - Multilanguage + multi-currency natívne - Vyššia learning curve, GraphQL overhead - Cena: open source self-hosted, alebo Saleor Cloud od 500 EUR / mesiac - Kedy: B2B-first, multi-storefront, complex pricing
Commerce.js / Swell.is - Hosted-only, žiadny self-host - Rýchle setup, ale vendor lock-in - Kedy: PoC / MVP, malý katalóg
Pre 12 k SKU SK retailera s 30 % B2B podielom sme zvolili Medusa.js v2 — vlastný hosting cez Hetzner Cloud (CCX23, 4 vCPU + 16 GB RAM, 35 EUR / mesiac), PostgreSQL 16 na separátnom node-e, Redis pre cache + queue.
Frontend: Next.js 16 s App Router
- ISR (Incremental Static Regeneration) pre produktové stránky — revalidate every 60s
- Edge runtime pre /api routes (Cloudflare Workers alebo Vercel Edge)
- Tailwind 4 + shadcn/ui pre rýchle UI development
- Server Components pre product detail (rýchle TTFB), Client Components pre cart / interactive elements
- Bundle size target: < 180 KB shipped JS pre home page
Periférne služby
| Funkcia | Voľba 2026 | Cena |
|---|---|---|
| Search | Algolia | 0,50 EUR / 1k search ops, ~180 EUR / mesiac pre 12k SKU + 400k mesačných searches |
| Payments | Stripe (Standard + Connect pre B2B) | 1,4 % + 0,25 EUR per transakcia EU, B2B Connect 0,5 % flat |
| Email / Marketing | Klaviyo | 90 EUR / mesiac pre 10k profiles |
| Observability | Sentry + PostHog | Sentry 26 EUR / mesiac, PostHog 0 EUR (free tier do 1M events) |
| Image CDN | Cloudflare Images | 5 EUR / mesiac + 1 EUR / 100k delivery |
| DAM (Digital Asset Management) | Cloudinary alebo self-hosted Imgproxy | 90 EUR / mesiac alebo 15 EUR self-hosted |
| Tax | Avalara AvaTax (SK + EU OSS) | 250 EUR / mesiac |
| Shipping | Packeta API + Slovenská pošta API | 0 EUR (consumption-based) |
| Reviews | Trustpilot Business | 200 EUR / mesiac |
Celkový OPEX: ~750 EUR / mesiac (vs Shopify Advanced 280 EUR + nadbytočné Shopify Apps 350 EUR = 630 EUR pôvodne).
Migration plan — 4 mesiace, 6 fáz
Mesiac 1: Audit + data preparation
Týždeň 1–2: Catalog audit - Export Shopify product CSV + Metafields export - Mapping Shopify product schema → Medusa product schema (variants, options, prices, tax_rates) - Identifikácia data quality issues (chýbajúce SEO descriptions, duplicate handles, broken images) - 12 000 SKU sa rozpadlo do: 9 200 unique products × priemerne 1,3 variant = 12 100 product_variants v Medusa
Týždeň 3: URL audit pre 301 mapping - Crawl všetkých Shopify URL cez Screaming Frog → 14 800 unique URLs - Categorize: product pages (12 000), collection pages (240), CMS pages (45), pagination URLs (2 200), other (300) - Plan: zachovať product handle (URL slug) → Medusa rovnaký handle → 0 redirect potrebný pre 11 800 URL - Plan: collection pages mapping → väčšina 1:1, ale Shopify smart collections sa nemapujú na Medusa product categories priamo → 80 ručných mappings - Pagination URLs (?page=2) → Medusa rovnaká štruktúra, prirodzene zachované
Týždeň 4: Customer + order export - 18 400 customers s aktivitou za posledných 24 mesiacov → import do Medusa - 47 000 historických objednávok → migrácia do read-only archívu v Medusa (nepotrebné v aktívnom systéme, ale potrebné pre legal compliance + zákaznícky support) - B2B customer groups + pricing tiers (Bronze/Silver/Gold) → Medusa customer_group + price_list
Mesiac 2: Backend build + integrations
Týždeň 5–6: Medusa setup + custom modules - Hetzner Cloud setup, Coolify pre Docker orchestration, GitHub Actions CI/CD - Medusa modules: product, order, customer, fulfillment, payment (Stripe), tax (Avalara plugin) - Custom modules: - SK-specific tax handling (DPH 23 %, znížená 5 %, oslobodené) - SK-specific invoicing (vyžaduje IČO, DIČ, IČ DPH, dátum vystavenia, dátum dodania, splatnosť) - B2B quote request flow (custom Medusa workflow + admin UI)
Týždeň 7–8: Periferal integrations - Algolia: products + variants index, faceting (kategória, cena, značka, dostupnosť), synonyms (SK + CZ) - Klaviyo: customer + order webhook → Klaviyo events (cart_abandoned, ordered_product, etc.) - Avalara: order_placed webhook → AvaTax calculation → store tax breakdown na order - Sentry: backend + frontend error tracking, source maps upload
Mesiac 3: Frontend build + SEO continuity
Týždeň 9–10: Storefront core pages - Next.js 16 setup, Tailwind 4, shadcn/ui - Home, Category, Product Detail, Cart, Checkout (multi-step), Account, Order History - ISR pre Product + Category (revalidate 60s) - Server Components default, Client Components iba pre cart/wishlist state
Týždeň 11: SEO migration - Sitemap continuity: Next.js sitemap.xml generuje rovnaké URL ako Shopify, plus nové URL ak vznikli - 301 redirect map: /apps/customer-portal/* → /account/*, /collections/ → /c/* (sme zmenili url štruktúru kategórií) - Structured data: Product schema (price, availability, sku, brand, aggregateRating, review), Offer schema, BreadcrumbList, Organization - Open Graph + Twitter Card: og:image generovaný cez Next.js dynamic OG image route (1200×630, branding, product hero, cena) - robots.txt + meta robots: zachovať noindex pre /account/*, /cart, /checkout - Canonical URLs: explicit canonical na každú produktovú stránku, dôvod: Shopify ho používal s ?variant= parameter, Medusa to robí cez separate URL alebo client-side state, treba canonical na base product URL
Týždeň 12: Cutover plan - DNS cutover plan (TTL 60s 24h pred cutover-om) - Database snapshot Shopify → Medusa import (last delta) - Stripe webhook switch (Shopify Stripe → Medusa Stripe) - Klaviyo webhook switch - Customer notification: „v sobotu noci od 02:00 do 04:00 e-shop nedostupný"
Mesiac 4: Cutover + stabilization
Týždeň 13: Soft launch - Subdomain shop-new.domain.sk → Next.js storefront + Medusa backend - 5 % traffic-u routovaného cez Cloudflare Workers split test - Sentry watch: zero new errors za 48 h - Klaviyo monitoring: cart abandonment rate stable
Týždeň 14: Full cutover - DNS cutover (apex domain → new infra) - 301 redirect map nasadený na Cloudflare Workers (pre-DNS-cutover už running) - Shopify ostáva v read-only mode pre 30 dní (legal archive of past orders) - Customer support ticket spike monitor
Týždeň 15: Post-launch fix - 12 hodín bug fixing v prvých 72 h (žiadny critical, ale 8 minor — checkout edge cases, B2B quote workflow, niekoľko Algolia synonym issues)
Týždeň 16: Performance tuning + SEO check - Lighthouse audit, LCP target < 1,5 s (dosiahnuté 1,1 s) - Search Console: indexing status check, žiadne nové 404 errors, žiadny rank drop nad 5 % na top 50 keywords - A/B test new product detail page vs Shopify-style → +14 % conversion rate
Čo nás zranilo (a čo by sme urobili inak)
Pomalé: SK-specific invoicing
Plán: 4 dni vývoja na custom invoicing module.
Realita: 3 týždne.
Slovenská zákonná požiadavka na faktúru obsahuje 14 povinných polí (§ 74 zákona o DPH), plus electronic invoicing pre B2B nad 5 000 EUR má vlastné EDI requirements (E-faktúra Finančná správa). Plus VAT OSS pre cross-border EU sales potrebuje per-transaction reporting do MyTaxOffice. Plus rovers (rožďanský faktúrový riadok formát) pre cash transactions má vlastné požiadavky.
Lekcia: odhadnúť SK/EU compliance overhead na 3× pôvodný odhad. Žiadny EU compliance feature nie je „2-day implementation".
Rýchle: Algolia sync
Plán: 5 dní na Algolia integration + indexing.
Realita: 2 dni.
Medusa má first-party Algolia plugin (@medusajs/algolia), ktorý emit-uje webhook events (product.created, product.updated, product.deleted) → Algolia reindex. Setup bol konfigurácia API kľúčov + index schema. Reálne 2 dni.
Lekcia: najprv hľadať first-party / community plugin. Ak existuje a má 1k+ GitHub stars, nezačínajte custom integration.
Pomalé: B2B quote workflow
Plán: 1 týždeň.
Realita: 3 týždne.
B2B customer chce „quote request" pre objednávku nad 5 000 EUR. Workflow: 1. Customer pridá produkty do košíka → klikne „Žiadať cenovú ponuku" (namiesto „Pridať do košíka") 2. Quote vznikne v admin panel-i, sales rep ho schvaľuje, prípadne upravuje cenu / shipping / payment terms 3. Customer dostane email s linkom na quote → môže accept (vytvorí order s prispôsobenými conditions) alebo reject
Medusa v2 má quote module v alpha verzii v 2026, ale workflow + UI sme museli postaviť custom. Plus admin permissions pre rôzne sales reps. Plus email templates v SK.
Lekcia: B2B-specific workflows v headless commerce sú vždy custom. Saleor by tu možno ušetril 1 týždeň (má built-in quote module v stable), ale Medusa decision bol zdôvodnený developer experience-om pre zvyšok stack-u.
Rýchle: 301 redirect zachovanie SEO
Plán: 1 týždeň na 301 mapping + monitoring.
Realita: 3 dni.
Šifra: zachovať product handle (URL slug) z Shopify do Medusa. Shopify URL bol /products/produkt-handle, Medusa rovnaký pattern. 11 800 z 14 800 URL ostalo identických — žiadny redirect potrebný.
Pre zvyšok (collections, customer portal, niekoľko CMS pages) sme nasadili 301 map na Cloudflare Workers (URL Rewrite Rules) — 280 explicitných pravidiel + 12 regex patterns. Zero indexed URL stratených v Search Console po 60 dňoch.
Lekcia: ak môžete zachovať URL pattern, urobte to. Ak musíte meniť, postavte redirect map *pred* cutover-om, nie po ňom.
SEO checklist — čo overiť pred cutover-om
- 1.Sitemap parita: Next.js sitemap.xml musí obsahovať všetky URL z pôvodného Shopify sitemap. Diff cez
sitemap-diffskript v CI. - 2.301 redirect map: každý non-trivial URL change zaindexovaný v
redirects.json, validated proti production load testom. - 3.Canonical URLs: explicit canonical na každú stránku, dôvod: Shopify používal query params (?variant=), nový stack môže používať path-based URLs — canonical zabráni duplicate content penalizácii.
- 4.Structured data continuity: Product schema (offers, availability, price, sku) parita s pôvodným Shopify. Test cez Google Rich Results Test pred cutover-om.
- 5.Open Graph migration: og:image, og:title, og:description per page. Dynamic OG image generation cez Next.js dynamic route + edge runtime.
- 6.robots.txt: zachovať noindex pre admin, account, cart, checkout. Pridať
Sitemap:directive. - 7.Internal linking: breadcrumbs, related products, category navigation. Spider crawl cez Screaming Frog pre potvrdenie že žiadna page nie je orphan.
- 8.Core Web Vitals: LCP, FID/INP, CLS target pre top 50 landing pages. Lighthouse CI v deployment pipeline.
- 9.Search Console reverification: new property pre new infra (ak DNS sa nemení, žiadna nová verification needed, ale URL property sa odporúča).
- 10.Monitoring: 30-dňový post-launch watch pre indexing status, ranking changes na top 100 keywords, organic traffic delta.
ROI cutoff — kedy migrácia stojí za to
Headless migrácia tohto rozsahu stojí 40–80 k EUR v engineering nákladoch (vrátane internal time + external dev shop), plus 4 mesiace timeline.
Návratnosť cez 3 roky:
| Benefit | Roč. úspora |
|---|---|
| Shopify Advanced + Apps savings | 4 200 EUR |
| LCP improvement → +6 % conversion | 12k SKU × 20 EUR AOV × 1,2k orders/mes × 0,06 = ~17 280 EUR |
| Eliminated Shopify Plus upgrade (would be next, 25k+ USD / year) | 23 000 EUR |
| Faster B2B quote handling | 12 000 EUR (1 FTE day × 24 mesiacov) |
| Total 3-year savings | 170 940 EUR |
ROI: ~2,5 roka pri 60 k EUR investícii.
Pre koho sa to NEvráti: - < 2 000 SKU, < 500 orders / mesiac → Shopify ostáva lacnejší - Nemáte dev tím alebo committed external partner pre 3-ročnú údržbu - Roadmapa nehovorí o B2B / multi-storefront / custom checkout
Praktická rada
Migration nie je „kúpime Medusa, programátori to spravia". Je to business + tech + SEO + ops projekt na 3–6 mesiacov. Najväčšie zlyhania, ktoré sme videli:
- 1.Underestimated EU compliance. SK invoicing, OSS VAT, GDPR — všetko žerie viac času ako PoC s testovacími dátami sľubuje.
- 2.No 301 plan = lost rankings. 90 dní strát v organic traffic = 30–50 % revenue strata. Stačí jeden zlý cutover.
- 3.No customer support runbook. Cutover bez 24/7 incident plánu = panicky reštart na Shopify po prvej kríze.
- 4.Underestimated data migration. 47k historických objednávok nie je „CSV import za víkend".
---
*Robíme headless commerce migrácie pre 2k–50k SKU katalógy, full-stack (Medusa.js / Saleor + Next.js + integrácie + SEO continuity). Ak rozmýšľate o opustení Shopify alebo BigCommerce, prvý projekt assessment (4-hodinový workshop) prejde stack rozhodnutie, timeline, rozpočet a 301 redirect plán pre váš konkrétny katalóg pred tým, ako sa zaviažete k migrácii.*
