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-diff` skript 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.*