Headless B2C e-commerce na Medusa.js: Ako composable commerce oslobodí váš marketing a predaj

Od nolimeo · 17. apríla 2026
banner image

Úspešné B2C značky sa v určitej fáze svojho rastu ocitnú pred rovnakým technologickým múrom. Predstavte si pondelkovú rannú poradu. Marketingový riaditeľ prichádza s nadšením: „Naše nové video sa stalo virálnym na sociálnych sieťach. Chceme spustiť rýchlu 24-hodinovú kampaň so špeciálnou interaktívnou landing page, na ktorej si zákazník sám vyskladá darčekový balíček produktov. Checkout musí prebehnúť na jeden klik priamo z tejto stránky, s personalizovaným odkazom pre každého verného zákazníka.“

Odpoveď IT tímu alebo externej agentúry však nadšenie rýchlo schladí: „Na našom aktuálnom krabicovom riešení to technicky nie je možné, nepovolí nám to upraviť štruktúru košíka. A ak by sme to chceli naprogramovať na našom starom e-shope na WordPress/WooCommerce, trvalo by to štyri týždne, museli by sme kúpiť tri ďalšie pluginy a bojíme sa, že nápor návštevníkov databáza nevydrží a celý web spadne, ako minule počas Black Friday.“

Tento scenár ilustruje klasickú technologickú brzdu. Tradičné monolitické e-shopy (kde sú databáza, administrácia a dizajn pevne spojené do jedného celku) alebo rigidné prenájmové SaaS šablóny nútia úspešné značky prispôsobovať svoje marketingové a biznisové nápady limitom zastaraného softvéru.

V technologickom štúdiu nolimeo pomáhame moderným B2C firmám tieto limity systematicky odstraňovať. Riešením je headless e-commerce a composable commerce architektúra postavená na modernom, modulárnom a open-source e-commerce engine Medusa.js a frontendovom frameworku Next.js.

V tomto technickom sprievodcovi si vysvetlíme, prečo tradičné platformy brzdia váš predaj, čo je to composable commerce, a ukážeme si konkrétne programátorské príklady a integrácie, ktoré vrátia slobodu vášmu marketingu a zrýchlia vašu klientsku zónu.


1. Múr tradičného e-commerce: Prečo krabice a monolity prestávajú stačiť

Aby sme pochopili výhody headless prístupu, musíme pomenovať tri zásadné problémy tradičných riešení, s ktorými sa stredne veľké a rastúce B2C firmy stretávajú každý deň:

A. SaaS platformy a "poplatková pasca" (Vendor Lock-in)

Známe globálne SaaS riešenia sú dobrý štartovací bod pre začínajúce e-shopy. Keď však prekročíte určitý obrat, začnete narážať na limity základných šablón. Upgrade na Enterprise verzie so sebou často prináša vysoké licenčné poplatky a niekedy aj percentá z predaja. Navyše ste viazaní ich ekosystémom. Neštandardné prepojenie s lokálnym ERP (napr. Pohoda, KROS) alebo slovenskými dopravcami vyžaduje zložité premostenia a ďalšie platené aplikácie.

B. WooCommerce a "databázová paralýza"

WooCommerce bežiaci na WordPress je populárny pre svoju otvorenosť. Pod kapotou je to však stále blogovací systém upravený na predaj. Veľká časť dát o produktoch, objednávkach, používateľoch a nastaveniach sa ukladá do všeobecných tabuliek v MySQL databáze (wp_posts a wp_postmeta). Keď e-shop dosiahne tisíce produktov a na web prídu stovky ľudí naraz, neoptimalizované dopyty môžu výrazne spomaliť databázu, predĺžiť checkout a znížiť konverzný pomer.

C. Uzavreté systémy a "šablónové väzenie"

Prenajímané slovenské a české krabice sú skvelé na rýchly rozbeh, ale neposkytujú prístup k zdrojovému kódu backendu. Nemôžete zmeniť logiku spracovania objednávok, nemôžete implementovať vlastný vernostný program napojený na interný CRM a ste obmedzení len na šablóny a moduly, ktoré vám platforma sama dovolí dokúpiť.


2. Composable Commerce: Skladajte technológie ako LEGO

Composable Commerce je filozofia, pri ktorej sa vzdávate jedného obrovského, ťažkopádneho systému a namiesto toho si e-shop poskladáte zo špecializovaných služieb na trhu (tzv. best-of-breed prístup). Tieto komponenty medzi sebou komunikujú cez API.

       ┌────────────────────────────────────────────────────────┐
       │             Frontend Layer: Next.js Storefront         │
       └──────────────────────────┬─────────────────────────────┘
                                  │ (API komunikácia)
         ┌────────────────────────┼────────────────────────┐
         ▼                        ▼                        ▼
 ┌───────────────┐        ┌───────────────┐        ┌───────────────┐
 │  Medusa.js    │        │  Payload CMS  │        │  Meilisearch  │
 │ (Objednávky,  │        │ (Marketingový │        │ (Vyhľadávanie │
 │ Košík, Ceny)  │        │    Obsah)     │        │ s nízkou lat.)│
 └───────────────┘        └───────────────┘        └───────────────┘

V composable architektúre nolimea používame tri základné stavebné kamene:

  1. Frontend (Next.js): Používateľská vrstva. To, čo vidí zákazník. Next.js generuje statické a dynamické stránky s rýchlou odozvou pri správnom cacheovaní, čo pomáha Core Web Vitals aj SEO.
  2. Headless CMS (Payload CMS / Strapi): Sem chodí váš marketingový tím písať blogy, meniť bannery, upravovať texty alebo skladať nové landing pages. Obsah sa ukladá bezpečne a je doručovaný do frontendu cez API bez rizika rozbitia dizajnu.
  3. Commerce Engine (Medusa.js): Mozog e-shopu. Beží na pozadí, spracováva košíky, objednávky, zľavové kupóny, platobné brány, sklady a zákaznícke účty.

Prečo práve Medusa.js?

Medusa.js je moderná open-source alternatíva ku komerčným SaaS platformám postavená na Node.js. Pri self-hosted nasadení neplatíte licenčné poplatky z predaja, máte kontrolu nad kódom a môžete ju hostovať na infraštruktúre, ktorú máte pod kontrolou alebo zmluvne zabezpečenú. Na rozdiel od starších monolitických systémov je navrhnutá modulárne a je typovaná v TypeScripte.


3. Technická implementácia: Vlastný API endpoint v Medusa.js a integrácia v Next.js

Pozrime sa, ako vyzerá skutočný vývoj na mieru v headless architektúre. Vytvoríme vlastný API endpoint v backendovom jadre Medusa.js, ktorý na základe ID košíka vygeneruje a uplatní dynamický vernostný darček (napr. produkt zadarmo), ak celková hodnota košíka presiahne určitú sumu.

Krok 1: Tvorba API Route na backendovom jadre Medusa.js

V Medusa.js vytvoríme vlastnú trasu (Route Handler) pomocou TypeScriptu. Tento kód beží v izolovanej backendovej Node.js mikroslužbe.

// src/api/store/carts/[id]/loyalty-gift/route.ts
import { MedusaRequest, MedusaResponse } from "@medusajs/medusa";
import { EntityManager } from "typeorm";

/**
 * Vlastný POST endpoint pre uplatnenie vernostného darčeka v košíku
 */
export async function POST(
  req: MedusaRequest,
  res: MedusaResponse
): Promise<void> {
  const { id } = req.params;
  const cartService = req.scope.resolve("cartService");
  const lineItemService = req.scope.resolve("lineItemService");
  const manager: EntityManager = req.scope.resolve("manager");

  // Predvolené ID darčekového produktu (v reálnej aplikácii načítané z DB / CMS)
  const GIFT_VARIANT_ID = "variant_01J8F912N8SZX81Y1";
  const MINIMUM_AMOUNT = 8000; // 80.00 EUR (v Medusa.js sa sumy ukladajú v centoch)

  try {
    await manager.transaction(async (transactionManager) => {
      // 1. Načítame aktuálny košík vrátane už pridaných položiek
      const cart = await cartService
        .withTransaction(transactionManager)
        .retrieve(id, { relations: ["items"] });

      if (!cart) {
        return res.status(404).json({ message: "Košík nebol nájdený." });
      }

      // 2. Overíme, či hodnota košíka spĺňa minimálny limit
      const subtotal = cart.items.reduce((sum, item) => sum + (item.unit_price * item.quantity), 0);

      if (subtotal < MINIMUM_AMOUNT) {
        // Ak nespĺňa podmienku, uistíme sa, že v košíku darček nie je (ak bol pridaný predtým a zákazník odobral produkty)
        const existingGift = cart.items.find(item => item.variant_id === GIFT_VARIANT_ID);
        if (existingGift) {
          await lineItemService
            .withTransaction(transactionManager)
            .delete(cart.id, existingGift.id);
        }

        return res.status(400).json({
          success: false,
          message: "Pre získanie darčeka musíte nakúpiť aspoň za 80 EUR."
        });
      }

      // 3. Overíme, či už darček v košíku náhodou nie je, aby sme ho nepridali duplicitne
      const hasGift = cart.items.some(item => item.variant_id === GIFT_VARIANT_ID);

      if (!hasGift) {
        // Pridáme darčekový produkt s nulovou cenou
        await lineItemService.withTransaction(transactionManager).create(cart.id, {
          variant_id: GIFT_VARIANT_ID,
          quantity: 1,
          unit_price: 0, // Produkt zadarmo
          title: "Vernostný darček k nákupu",
          metadata: { isLoyaltyGift: true }
        });
      }
    });

    // Získame aktualizovaný košík pre návratovú odpoveď
    const updatedCart = await cartService.retrieve(id, { relations: ["items"] });
    res.status(200).json({ success: true, cart: updatedCart });

  } catch (error) {
    console.error("Chyba pri aplikovaní vernostného darčeka:", error);
    res.status(500).json({ success: false, message: "Interná chyba servera." });
  }
}

Krok 2: Volanie endpointu z Next.js frontendu (Server Action)

Na klientskej Next.js aplikácii vyvoláme tento endpoint bezpečne cez React Server Actions, čím zabezpečíme, že citlivé API kľúče a komunikácia s backendom ostanú skryté na serveri a nezaťažujú prehliadač používateľa.

// src/app/actions/checkout-actions.ts
"use server";

import { z } from "zod";

const ApplyGiftResponseSchema = z.object({
  success: z.boolean(),
  message: z.string().optional(),
  cart: z.any().optional()
});

/**
 * Server Action pre aplikáciu vernostného darčeka vyvolaná priamo z košíka
 */
export async function applyLoyaltyGift(cartId: string) {
  const MEDUSA_BACKEND_URL = process.env.MEDUSA_BACKEND_URL;

  if (!MEDUSA_BACKEND_URL) {
    throw new Error("Chýba konfigurácia MEDUSA_BACKEND_URL.");
  }

  try {
    const response = await fetch(`${MEDUSA_BACKEND_URL}/store/carts/${cartId}/loyalty-gift`, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
      },
      next: { revalidate: 0 } // Vypnutie cache pre reálne výpočty košíka
    });

    const rawData = await response.json();

    // Prísna typová validácia odpovede pred odoslaním do UI komponentu
    const validatedData = ApplyGiftResponseSchema.parse(rawData);

    return {
      success: validatedData.success,
      message: validatedData.message || "Košík bol úspešne aktualizovaný.",
      cart: validatedData.cart
    };

  } catch (error) {
    console.error("Zlyhalo volanie Server Action applyLoyaltyGift:", error);
    return {
      success: false,
      message: "Nepodarilo sa spojiť s obchodným serverom. Skúste to prosím neskôr."
    };
  }
}

4. Výzvy rastu: Multi-warehouse, multi-currency a omni-channel synchronizácia

Úspešný B2C e-commerce neznamená len pekný web. Znamená to zvládnutú logistiku a synchronizáciu. Ak predávate cez web, máte kamennú predajňu, vlastnú mobilnú aplikáciu a predávate aj na zahraničných trhoch, narážate na zložité hraničné stavy:

4.1. Multi-warehouse (Viacero skladov)

Predstavte si, že máte hlavný sklad v Žiline a menší príručný sklad pre kamennú predajňu v Bratislave. Klient si objedná 3 položky, z ktorých 2 sú v Žiline a 1 iba v Bratislave.

  • Ako to rieši Medusa.js: Medusa.js disponuje Multi-Warehouse modulom. Pri správnom nastavení vie systém pracovať so stavom zásob na jednotlivých skladoch, rozdeliť objednávku na čiastkové zásielky alebo poskytnúť dáta pre optimalizáciu trasovania dopravcu. Schvaľovanie výnimiek pritom môže zostať na operátorovi.

4.2. Omni-channel synchronizácia (Web, App, Kamenná predajňa)

Ak používate šablónový systém, každá nová predajná cesta (napr. mobilná aplikácia) vyžaduje samostatné prepojenia. Ak predáte produkt v kamennej predajni, trvá desiatky minút, kým sa sklad zosynchronizuje s webom, čím vzniká riziko, že iný zákazník si na webe kúpi produkt, ktorý už fyzicky neexistuje.

  • Ako to riešime: Vďaka headless architektúre môže byť databáza Medusa.js hlavným zdrojom pravdy (Single Source of Truth). Vaša Next.js webová aplikácia, React Native mobilná aplikácia a pokladničný systém (POS) v predajni sú pripojené k rovnakému API. Predaj na pokladni spustí event na backend, ktorý odpočíta kus zo skladu a cez WebSockets alebo inú event-driven vrstvu rýchlo aktualizuje dostupnosť na webe aj v appke.

5. Prečo visual page builders zabíjajú SEO a rýchlosť košíka

Mnohé B2C e-shopy trpia syndrómom pomalého načítania. Marketingový tím chce pekný dizajn, a tak do WooCommerce nainštaluje Elementor, Divi alebo rôzne vizuálne „klikacie“ šablóny.

Tieto nástroje však často generujú veľké množstvo nadbytočného kódu (tzv. DOM bloat). Na zobrazenie jednoduchého tlačidla vie šablóna vygenerovať viacero vnorených <div> značiek a načítať zbytočné JavaScript knižnice alebo CSS súbory.

Dôsledky pre biznis:

  1. Prepady v Google rebríčkoch: Google zohľadňuje Core Web Vitals (najmä parametre LCP, INP a CLS). Pomalý web môže zhoršiť SEO výkon, najmä v konkurenčných kategóriách.
  2. Vyššie náklady na reklamu (PPC): Google Ads a Meta Ads hodnotia kvalitu cieľovej stránky. Pomalý web môže znížiť skóre kvality, zvýšiť cenu za preklik (CPC) a predražiť kampaň.

V headless architektúre s Next.js nepoužívame šablónový balast. Frontend je napísaný vo forme čistého, optimalizovaného kódu. Next.js pomáha optimalizovať obrázky, rozdeľovať kód na menšie balíčky (code splitting) a predpripravovať stránky cez CDN. Výsledkom je rýchlejšia odozva a lepšia šanca na dobré Core Web Vitals.


Záver: Investujte do technológie, ktorá nekladie limity vášmu rastu

B2C e-commerce trh je dnes silno saturovaný a konkurenčný. Rozhodujú sekundy načítania, bezproblémový checkout a schopnosť marketingu rýchlo reagovať na nové trendy bez toho, aby musel prosiť IT oddelenie o zložité úpravy.

Ak vaša značka prerastá možnosti bežného krabicového prenájmu alebo zápasíte s nestabilitou monolitického e-shopu, prechod na Headless Composable Commerce s Medusa.js a Next.js môže byť veľmi silné inžinierske rozhodnutie. Získate väčšiu kontrolu nad kódom, rýchlejšie načítanie, slobodu dizajnu a architektúru pripravenú na nákupné špičky počas roka.

Sme technologické štúdio nolimeo, špecializovaná butiková vývojárska skupina senior programátorov. Nezaúčame sa na vašich projektoch, nepredávame predražené krabicové riešenia a nelepíme zložité systémy cez krehké no-code nástroje. Každé headless riešenie navrhujeme a vyvíjame na mieru s premyslenou TypeScript architektúrou.

Napíšte nám a prejdeme si limity vášho e-shopu, marketingové scenáre aj vhodnú headless commerce architektúru na Medusa.js.

Máte záujem posunúť váš projekt vpred?