Der Kunde hatte Shopify Advanced für 280 EUR / Monat, 12 000 SKUs, 4 Lager, B2B + B2C Dual Pricing, 65 % Organic Traffic aus DE- und AT-Google. Die Headless-Migration zu Medusa.js endete nach 4 Monaten, zwei Wochen vor Black Friday. Kein Organic Ranking ging verloren, keine unfertige Bestellung ging verloren, und die Stripe-Integration ging von 14 manuellen Schritten bei jedem neuen Produkt auf null. Dieser Artikel handelt davon, was wir gemacht haben, was wir verbockt haben und was wir anders machen würden.
Warum Headless — und wann NICHT
Headless Commerce hat zwei valide Gründe:
1. **Flexibilität Custom Checkout / B2B / Multi-Storefront.** Shopify (auch Advanced, auch Plus) hat eine feste Checkout-Pipeline. Für B2B mit Netto-60-Zahlungsziel, Custom Pricing Tiers, Multi-Warehouse-Splitting oder komplexe Tax Rules (DE-AT-CH cross-border) wird Shopify zum Kampf mit API-Limits und Liquid-Templates. 2. **Storefront Performance + UX.** Next.js Storefront mit ISR (Incremental Static Regeneration) + Edge Caching erreicht LCP < 1,2 s auf 4G. Shopify Liquid-rendered Storefront hat LCP 2,5–4,0 s. Für SEO-getriebenes Business ist das ein messbarer Revenue-Unterschied.
**Wann NICHT headless:** - Kataloge < 500 SKUs + Standard-B2C-Checkout → Shopify oder BigCommerce bleibt günstiger und schneller - Das Team hat keine Kapazität für ein eigenes Next.js Storefront (Custom CMS, Custom Checkout, Integrationen) - Roadmap für Zahlungen/Buchhaltung/Marketing ist komplett Shopify-native (Shopify Payments, Shopify Tax, Shopify Email)
Für diese Kunden ist das bestehende „Semi-Headless" — Shopify Hydrogen + Oxygen — glatter, das das Headless-Storefront-Frontend liefert, ohne das Shopify-Ökosystem zu verlassen.
Stack-Entscheidungen 2026
Backend: Medusa.js vs. Saleor vs. Commerce.js
**Medusa.js v2.x** - Node.js, PostgreSQL, Redis - Modular, Plugin-Architektur - Bester Developer Experience 2026 - Schwächere B2B-Feature-Set out-of-the-box (Plugin oder eigener Code für Quotes, Approvals, Customer Hierarchy nötig) - **Preis:** Open Source self-hosted oder Medusa Cloud ab 200 EUR / Monat - **Wann:** B2C + leichtes B2B, Dev-Team mit Node-Erfahrung
**Saleor** - Python, Django, GraphQL-first - Stärkstes B2B-Feature-Set (Customer Groups, Channel-Based Pricing, Quote Requests) - Multilanguage + Multi-Currency nativ - Höhere Lernkurve, GraphQL-Overhead - **Preis:** Open Source self-hosted oder Saleor Cloud ab 500 EUR / Monat - **Wann:** B2B-first, Multi-Storefront, komplexes Pricing
**Commerce.js / Swell.is** - Hosted-only, kein Self-Host - Schnelles Setup, aber Vendor Lock-in - **Wann:** PoC / MVP, kleiner Katalog
Für einen 12k-SKU-DE-Retailer mit 30 % B2B-Anteil wählten wir **Medusa.js v2** — eigenes Hosting über Hetzner Cloud (CCX23, 4 vCPU + 16 GB RAM, 35 EUR / Monat), PostgreSQL 16 auf separatem Node, Redis für Cache + Queue.
Frontend: Next.js 16 mit App Router
- ISR (Incremental Static Regeneration) für Produktseiten — Revalidate every 60s
- Edge Runtime für /api-Routes (Cloudflare Workers oder Vercel Edge)
- Tailwind 4 + shadcn/ui für schnelle UI-Entwicklung
- Server Components für Product Detail (schnelles TTFB), Client Components für Cart / Interactive Elements
- Bundle-Size-Ziel: < 180 KB shipped JS für Home Page
Periphere Services
| Funktion | Wahl 2026 | Preis | |---------|------------|------| | Search | Algolia | 0,50 EUR / 1k Search Ops, ~180 EUR / Monat für 12k SKUs + 400k monatliche Suchen | | Payments | Stripe (Standard + Connect für B2B) | 1,4 % + 0,25 EUR pro Transaktion EU, B2B Connect 0,5 % flat | | Email / Marketing | Klaviyo | 90 EUR / Monat für 10k Profile | | Observability | Sentry + PostHog | Sentry 26 EUR / Monat, PostHog 0 EUR (Free Tier bis 1M Events) | | Image CDN | Cloudflare Images | 5 EUR / Monat + 1 EUR / 100k Delivery | | DAM (Digital Asset Management) | Cloudinary oder self-hosted Imgproxy | 90 EUR / Monat oder 15 EUR self-hosted | | Tax | Avalara AvaTax (DE + EU OSS) | 250 EUR / Monat | | Shipping | DHL API + Hermes API | 0 EUR (Consumption-Based) | | Reviews | Trustpilot Business | 200 EUR / Monat |
Gesamt-OPEX: ~750 EUR / Monat (vs. Shopify Advanced 280 EUR + überflüssige Shopify Apps 350 EUR = 630 EUR ursprünglich).
Migration Plan — 4 Monate, 6 Phasen
Monat 1: Audit + Data Preparation
**Woche 1–2: Catalog Audit** - Export Shopify Product CSV + Metafields Export - Mapping Shopify Product Schema → Medusa Product Schema (Variants, Options, Prices, Tax_Rates) - Identifikation von Datenqualitätsproblemen (fehlende SEO-Descriptions, Duplicate Handles, kaputte Bilder) - 12 000 SKUs zerfielen in: 9 200 Unique Products × durchschnittlich 1,3 Varianten = 12 100 Product_Variants in Medusa
**Woche 3: URL Audit für 301-Mapping** - Crawl aller Shopify-URLs über Screaming Frog → 14 800 Unique URLs - Kategorisierung: Product Pages (12 000), Collection Pages (240), CMS Pages (45), Pagination URLs (2 200), Other (300) - Plan: Product Handle (URL Slug) beibehalten → Medusa gleicher Handle → 0 Redirects nötig für 11 800 URLs - Plan: Collection Pages Mapping → meist 1:1, aber Shopify Smart Collections lassen sich nicht direkt auf Medusa Product Categories mappen → 80 manuelle Mappings - Pagination URLs (?page=2) → Medusa gleiche Struktur, natürlich beibehalten
**Woche 4: Customer + Order Export** - 18 400 Customers mit Aktivität in den letzten 24 Monaten → Import in Medusa - 47 000 historische Bestellungen → Migration in Read-Only-Archiv in Medusa (im aktiven System nicht nötig, aber für Legal Compliance + Kundensupport) - B2B Customer Groups + Pricing Tiers (Bronze/Silver/Gold) → Medusa Customer_Group + Price_List
Monat 2: Backend Build + Integrations
**Woche 5–6: Medusa Setup + Custom Modules** - Hetzner Cloud Setup, Coolify für Docker Orchestration, GitHub Actions CI/CD - Medusa Modules: Product, Order, Customer, Fulfillment, Payment (Stripe), Tax (Avalara Plugin) - Custom Modules: - DE-spezifisches Tax Handling (USt. 19 %, ermäßigt 7 %, befreit) - DE-spezifisches Invoicing (erfordert Steuernummer, USt-IdNr., Ausstellungsdatum, Lieferdatum, Fälligkeit) - B2B Quote Request Flow (Custom Medusa Workflow + Admin UI)
**Woche 7–8: Peripherie-Integrationen** - Algolia: Products + Variants Index, Faceting (Kategorie, Preis, Marke, Verfügbarkeit), Synonyms (DE + AT) - Klaviyo: Customer + Order Webhook → Klaviyo Events (Cart_Abandoned, Ordered_Product etc.) - Avalara: Order_Placed Webhook → AvaTax Calculation → Tax Breakdown auf Order speichern - Sentry: Backend + Frontend Error Tracking, Source Maps Upload
Monat 3: Frontend Build + SEO Continuity
**Woche 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 für Product + Category (Revalidate 60s) - Server Components default, Client Components nur für Cart/Wishlist State
**Woche 11: SEO Migration** - **Sitemap Continuity:** Next.js sitemap.xml generiert die gleichen URLs wie Shopify, plus neue URLs, falls vorhanden - **301 Redirect Map:** /apps/customer-portal/* → /account/*, /collections/ → /c/* (wir haben die URL-Struktur der Kategorien geändert) - **Structured Data:** Product Schema (Price, Availability, Sku, Brand, AggregateRating, Review), Offer Schema, BreadcrumbList, Organization - **Open Graph + Twitter Card:** og:image generiert über Next.js Dynamic OG Image Route (1200×630, Branding, Product Hero, Preis) - **robots.txt + meta robots:** noindex für /account/*, /cart, /checkout beibehalten - **Canonical URLs:** Explicit Canonical auf jeder Produktseite, Grund: Shopify nutzte ?variant=-Parameter, Medusa macht es über separate URL oder Client-Side State, Canonical auf Base Product URL nötig
**Woche 12: Cutover Plan** - DNS Cutover Plan (TTL 60s 24h vor Cutover) - Database Snapshot Shopify → Medusa Import (Last Delta) - Stripe Webhook Switch (Shopify Stripe → Medusa Stripe) - Klaviyo Webhook Switch - Customer Notification: „Samstagnacht von 02:00 bis 04:00 E-Shop nicht erreichbar"
Monat 4: Cutover + Stabilization
**Woche 13: Soft Launch** - Subdomain shop-new.domain.de → Next.js Storefront + Medusa Backend - 5 % Traffic über Cloudflare Workers Split Test geroutet - Sentry Watch: Zero New Errors über 48 h - Klaviyo Monitoring: Cart Abandonment Rate stable
**Woche 14: Full Cutover** - DNS Cutover (Apex Domain → New Infra) - 301 Redirect Map auf Cloudflare Workers deployed (pre-DNS-Cutover bereits running) - Shopify bleibt 30 Tage im Read-Only-Modus (Legal Archive of Past Orders) - Customer Support Ticket Spike Monitor
**Woche 15: Post-Launch Fix** - 12 Stunden Bug-Fixing in den ersten 72 h (kein Critical, aber 8 Minor — Checkout Edge Cases, B2B Quote Workflow, einige Algolia Synonym Issues)
**Woche 16: Performance Tuning + SEO Check** - Lighthouse Audit, LCP Target < 1,5 s (erreicht 1,1 s) - Search Console: Indexing Status Check, keine neuen 404-Errors, kein Rank Drop über 5 % auf Top 50 Keywords - A/B Test neue Product Detail Page vs. Shopify-Style → +14 % Conversion Rate
Was uns wehgetan hat (und was wir anders machen würden)
Langsam: DE-spezifisches Invoicing
**Plan:** 4 Tage Entwicklung für Custom Invoicing Module.
**Realität:** 3 Wochen.
Deutsche gesetzliche Anforderungen an die Rechnung umfassen 14 Pflichtfelder (§ 14 UStG), plus Electronic Invoicing für B2B (X-Rechnung, ZUGFeRD) hat eigene EDI Requirements. Plus VAT OSS für Cross-Border-EU-Sales braucht Per-Transaction-Reporting an das Bundeszentralamt für Steuern. Plus Belegausgabepflicht (Kassengesetz) für Cash-Transaktionen hat eigene Anforderungen.
**Lektion:** EU-Compliance-Overhead auf 3× der ursprünglichen Schätzung schätzen. Kein EU-Compliance-Feature ist eine „2-Day Implementation".
Schnell: Algolia Sync
**Plan:** 5 Tage für Algolia Integration + Indexing.
**Realität:** 2 Tage.
Medusa hat einen First-Party-Algolia-Plugin (`@medusajs/algolia`), der Webhook-Events emittiert (product.created, product.updated, product.deleted) → Algolia Reindex. Das Setup war Konfiguration der API-Keys + Index Schema. Real 2 Tage.
**Lektion:** zuerst First-Party / Community Plugin suchen. Wenn es existiert und 1k+ GitHub Stars hat, nicht mit einer Custom Integration anfangen.
Langsam: B2B Quote Workflow
**Plan:** 1 Woche.
**Realität:** 3 Wochen.
Ein B2B-Customer will einen „Quote Request" für Bestellungen über 5 000 EUR. Workflow: 1. Customer fügt Produkte in den Warenkorb → klickt „Angebot anfordern" (statt „In den Warenkorb") 2. Quote entsteht im Admin Panel, Sales Rep genehmigt es, passt ggf. Preis / Shipping / Payment Terms an 3. Customer erhält Email mit Link zum Quote → kann Accept (erstellt Order mit angepassten Conditions) oder Reject
Medusa v2 hat 2026 ein `quote`-Modul in Alpha-Version, aber Workflow + UI mussten wir custom bauen. Plus Admin Permissions für verschiedene Sales Reps. Plus Email Templates auf Deutsch.
**Lektion:** B2B-spezifische Workflows in Headless Commerce sind immer custom. Saleor hätte hier vielleicht 1 Woche gespart (hat eingebautes Quote Module in Stable), aber die Medusa-Entscheidung war durch Developer Experience für den restlichen Stack begründet.
Schnell: 301 Redirect SEO-Erhaltung
**Plan:** 1 Woche für 301 Mapping + Monitoring.
**Realität:** 3 Tage.
Schlüssel: Product Handle (URL Slug) aus Shopify nach Medusa beibehalten. Shopify-URL war `/products/produkt-handle`, Medusa gleiches Pattern. 11 800 von 14 800 URLs blieben identisch — kein Redirect nötig.
Für den Rest (Collections, Customer Portal, einige CMS-Pages) haben wir eine 301-Map auf Cloudflare Workers deployed (`URL Rewrite Rules`) — 280 explizite Regeln + 12 Regex-Patterns. **Null indizierte URLs verloren** in der Search Console nach 60 Tagen.
**Lektion:** wenn Sie das URL-Pattern beibehalten können, tun Sie es. Wenn Sie ändern müssen, bauen Sie die Redirect Map *vor* dem Cutover, nicht danach.
SEO-Checkliste — was vor dem Cutover zu prüfen ist
1. **Sitemap-Parität:** Next.js sitemap.xml muss alle URLs aus der ursprünglichen Shopify-Sitemap enthalten. Diff über `sitemap-diff`-Skript im CI. 2. **301 Redirect Map:** jede Non-Trivial URL Change in `redirects.json` indiziert, validiert gegen Production Load Tests. 3. **Canonical URLs:** Explicit Canonical auf jeder Seite, Grund: Shopify nutzte Query Params (?variant=), neuer Stack kann Path-Based URLs nutzen — Canonical verhindert Duplicate Content Penalty. 4. **Structured Data Continuity:** Product Schema (Offers, Availability, Price, Sku) Parität mit ursprünglichem Shopify. Test über Google Rich Results Test vor Cutover. 5. **Open Graph Migration:** og:image, og:title, og:description pro Seite. Dynamic OG Image Generation über Next.js Dynamic Route + Edge Runtime. 6. **robots.txt:** noindex für Admin, Account, Cart, Checkout beibehalten. `Sitemap:`-Direktive hinzufügen. 7. **Internal Linking:** Breadcrumbs, Related Products, Category Navigation. Spider Crawl über Screaming Frog zur Bestätigung, dass keine Seite Orphan ist. 8. **Core Web Vitals:** LCP, FID/INP, CLS Ziel für Top 50 Landing Pages. Lighthouse CI in Deployment Pipeline. 9. **Search Console Reverification:** Neue Property für neue Infra (wenn DNS sich nicht ändert, keine neue Verifikation nötig, aber URL Property wird empfohlen). 10. **Monitoring:** 30-tägiger Post-Launch-Watch für Indexing Status, Ranking Changes auf Top 100 Keywords, Organic Traffic Delta.
ROI-Cutoff — wann sich die Migration lohnt
Eine Headless-Migration dieses Umfangs kostet **40–80 k EUR** an Engineering-Kosten (inklusive Internal Time + External Dev Shop), plus 4 Monate Timeline.
**Amortisation über 3 Jahre:**
| Vorteil | Jahresersparnis | |---------|-------------| | Shopify Advanced + Apps Savings | 4 200 EUR | | LCP Improvement → +6 % Conversion | 12k SKUs × 20 EUR AOV × 1,2k Orders/Monat × 0,06 = ~17 280 EUR | | Eliminated Shopify Plus Upgrade (would be next, 25k+ USD / year) | 23 000 EUR | | Schnelleres B2B Quote Handling | 12 000 EUR (1 VZÄ-Tag × 24 Monate) | | **Total 3-year Savings** | **170 940 EUR** |
ROI: ~2,5 Jahre bei 60 k EUR Investition.
**Für wen sich das NICHT lohnt:** - < 2 000 SKUs, < 500 Orders / Monat → Shopify bleibt günstiger - Sie haben kein Dev-Team oder Committed External Partner für 3-jährige Wartung - Roadmap spricht nicht über B2B / Multi-Storefront / Custom Checkout
Praktischer Rat
Migration ist nicht „wir kaufen Medusa, die Programmierer machen das". Es ist ein **Business + Tech + SEO + Ops Projekt** über 3–6 Monate. Die größten Misserfolge, die wir gesehen haben:
1. **Underestimated EU Compliance.** DE Invoicing, OSS VAT, DSGVO — alles frisst mehr Zeit, als ein PoC mit Test-Daten verspricht. 2. **No 301 Plan = lost Rankings.** 90 Tage Verlust in Organic Traffic = 30–50 % Revenue-Verlust. Es reicht ein schlechter Cutover. 3. **No Customer Support Runbook.** Cutover ohne 24/7 Incident Plan = panischer Restart auf Shopify nach der ersten Krise. 4. **Underestimated Data Migration.** 47k historische Bestellungen sind nicht „CSV Import übers Wochenende".
---
*Wir machen Headless-Commerce-Migrationen für 2k–50k SKU-Kataloge, Full-Stack (Medusa.js / Saleor + Next.js + Integrationen + SEO Continuity). Wenn Sie überlegen, Shopify oder BigCommerce zu verlassen, durchläuft das erste Project Assessment (4-stündiger Workshop) Stack-Entscheidung, Timeline, Budget und 301 Redirect Plan für Ihren konkreten Katalog, bevor Sie sich zur Migration verpflichten.*