--- name: ecommerce-expert description: "Expert guide for e-commerce architecture (Shopify Storefront, Medusa.js, Saleor), product catalogs, cart/checkout UX, and order management / Panduan ahli arsitektur e-commerce (Shopify, Medusa.js, Saleor), katalog produk, UX keranjang/checkout, dan manajemen pesanan." author: "Roedy Rustam" version: "4.4.2" --- # E-Commerce Architecture & Modern Storefront Expert (2026 Edition) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Description Production guide for high-converting e-commerce architectures, headless storefronts (Medusa.js v2, Shopify Storefront API, Saleor), inventory atomicity, and multi-rail payment integrations (DOKU Checkout, SNAP BI, Stripe). Covers atomic stock reservations to prevent race-condition overselling during flash sales, cart session state machines, structured schema markup (`Product`, `Offer`, `BreadcrumbList`), and localized checkout workflows. ### Trigger Conditions - Designing or developing an e-commerce platform, marketplace, or custom storefront. - Integrating headless commerce engines (Medusa.js v2, Shopify Storefront API). - Preventing inventory race conditions during high-concurrency checkout traffic. - Integrating localized Indonesian payment methods (DOKU Virtual Account, QRIS, Direct Debit). - Optimizing product page Core Web Vitals and SEO schema. ### Atomic Inventory Reservation Pattern (PostgreSQL / Drizzle) Prevents overselling during high-concurrency flash sales using row-level pessimistic locking (`FOR UPDATE`): ```typescript // src/services/inventory.service.ts import { db } from '@/lib/db'; import { sql } from 'drizzle-orm'; export interface ReserveStockResult { success: boolean; orderId?: string; errorMessage?: string; } export async function reserveProductStockAtomic( productId: string, requestedQuantity: number, orderId: string ): Promise { return await db.transaction(async (tx) => { // 1. Lock the inventory row strictly for update const [product] = await tx.execute(sql` SELECT id, stock_quantity, price_cents, is_active FROM products WHERE id = ${productId} FOR UPDATE `); if (!product || !product.is_active) { return { success: false, errorMessage: 'Product is unavailable.' }; } if (product.stock_quantity < requestedQuantity) { return { success: false, errorMessage: 'Insufficient stock remaining.' }; } // 2. Decrement available inventory atomically await tx.execute(sql` UPDATE products SET stock_quantity = stock_quantity - ${requestedQuantity}, updated_at = NOW() WHERE id = ${productId} `); // 3. Create provisional stock reservation record (15-minute TTL) await tx.execute(sql` INSERT INTO stock_reservations (order_id, product_id, quantity, expires_at) VALUES (${orderId}, ${productId}, ${requestedQuantity}, NOW() + INTERVAL '15 minutes') `); return { success: true, orderId }; }); } ``` ### Medusa.js v2 Workflow Engine Integration ```typescript // src/workflows/create-order-workflow.ts import { createWorkflow, WorkflowResponse, StepResponse, createStep } from '@medusajs/framework/workflows-sdk'; const reserveInventoryStep = createStep( 'reserve-inventory-step', async ({ orderId, items }: { orderId: string; items: any[] }, { container }) => { // Execute atomic reservation return new StepResponse({ status: 'reserved', orderId }, { orderId, items }); }, async (compensatingData, { container }) => { // Compensation logic if downstream payment fails: roll back reserved stock console.log(`[Compensation] Releasing reserved stock for order ${compensatingData.orderId}`); } ); export const placeAtomicOrderWorkflow = createWorkflow( 'place-atomic-order', function (input: { orderId: string; items: any[]; paymentDetails: any }) { const reservation = reserveInventoryStep(input); return new WorkflowResponse(reservation); } ); ``` ### E-Commerce SEO Schema Markup (JSON-LD) ```tsx // src/components/seo/ProductSchema.tsx export function ProductSchema({ product }: { product: any }) { const schema = { '@context': 'https://schema.org', '@type': 'Product', name: product.title, image: product.thumbnailUrl, description: product.description, sku: product.sku, offers: { '@type': 'Offer', price: (product.priceCents / 100).toFixed(2), priceCurrency: 'IDR', availability: product.inStock ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock', url: `https://vibesstore.internal/products/${product.handle}`, }, }; return