راهنمای تصمیم، معماری و مهاجرت فروشگاه Headless
یک Storefront سریع که قیمت قدیمی نشان میدهد، موجودی را دوبار میفروشد یا پس از برگشت از درگاه سفارش را گم میکند، فروشگاه خوبی نیست. Headless Commerce میتواند آزادی تجربه و کانال بدهد، اما با جداکردن Front-end، مسئولیت Integration، State، Cache، امنیت و عملیات را به تیم شما منتقل میکند.
پرسش درست «آیا Headless آینده فروشگاه است؟» نیست؛ پرسش این است که کدام محدودیت مدل فعلی ارزش این پیچیدگی را دارد، Source of truth هر داده کجاست و چگونه قیمت، موجودی، Cart و Order در خطا هم سازگار میمانند. این راهنما از Business case تا Reference architecture، PoC و مهاجرت مرحلهای را پوشش میدهد.
Headless Commerce چیست؟
در معماری Headless Commerce، Commerce backend—Catalog، Price، Cart، Promotion، Inventory و Order—بهصورت مستقل از لایهٔ نمایش کار میکند. Storefront وب، اپ موبایل، کیوسک یا کانال دیگر از طریق API و Event با آن ارتباط میگیرد.
این تعریف فقط «جدا بودن Front-end» را تضمین میکند. ممکن است Backend همچنان یک پلتفرم یکپارچه باشد؛ ممکن است ده سرویس مستقل داشته باشید. Headless با Microservices و Composable مترادف نیست.
| اصطلاح | مرز اصلی | مزیت محتمل | پیچیدگی منتقلشده |
|---|---|---|---|
| Monolithic commerce | Storefront و Commerce capability در یک پلتفرم/Release | راهاندازی و عملیات سادهتر | محدودیت Template و Coupling |
| Decoupled/Hybrid | بخشی از تجربه جدا؛ Checkout یا Admin روی پلتفرم میماند | آزادی هدفمند با ریسک کمتر | مرز Session، Navigation و Design |
| Headless commerce | Storefront مستقل و Commerce core API-driven | چند Storefront و کنترل تجربه | Front-end، BFF، Integration، SEO و Ops |
| Composable commerce | Capabilityهای Catalog/Search/Cart/OMS/CMS قابل ترکیب/تعویض | Best-fit در هر Domain | Contract، Vendor، Data و Incident چندسامانهای |
| Microservices commerce | Decomposition فنی به سرویسهای مستقل | Scale/Release مستقل در صورت Domain بالغ | Distributed data، Observability و Platform engineering |
Headless CMS نیز فقط مدیریت محتوا را از Presentation جدا میکند؛ Commerce rule، Inventory یا Order را فراهم نمیکند مگر محصول صریحاً آن قابلیتها را داشته باشد.
Headless چه چیزی را حل میکند و چه چیزی را نه؟
| مسئله | Headless چگونه کمک میکند؟ | چرا کافی نیست؟ |
|---|---|---|
| محدودیت تجربه | کنترل کامل Component، Route و Interaction | تحقیق، Design system و QA هنوز لازماند |
| چند کانال | API مشترک برای Web/App/Kiosk | Identity، Price، Inventory و Order policy باید مشترک شوند |
| تغییر Front-end | Release مستقل از Commerce backend | API breaking change و Contract testing باقی است |
| Performance | امکان SSR، Edge cache و Payload هدفمند | JS، Waterfall و API latency میتواند بدتر شود |
| SEO | کنترل URL، HTML، Metadata و Schema | تیم باید همه را درست بسازد و Sync قیمت/موجودی را حفظ کند |
| Vendor lock-in | تعویض Storefront آسانتر میشود | Data model، API، Promotion و Checkout همچنان Lock-in دارند |
معماری ابزار کاهش یک محدودیت مشخص است؛ پروژهٔ «Headless شویم چون مدرن است» Business case ندارد.
چه زمانی Headless Commerce ارزش بررسی دارد؟
- دو یا چند کانال واقعاً فعال دارید که Catalog، Price، Cart یا Account مشترک میخواهند.
- Template و Release cycle پلتفرم فعلی مانع Outcome اندازهگیریشده شده است.
- Content و Commerce باید در تجربهای غنی و چندبرندی ترکیب شوند.
- چند Market/Brand/Locale با Rule و Storefront مستقل دارید.
- تیم Front-end و Platform توان مالکیت CI/CD، Observability و On-call را دارد.
- حجم تغییر یا درآمد، هزینهٔ ساخت و عملیات چندسامانهای را توجیه میکند.
نشانههای No-Go یا انتخاب Hybrid
- مسئله با Theme، Plugin، CDN یا بهینهسازی Checkout حل میشود.
- تنها یک کانال و فرایند استاندارد دارید.
- تیم برای API، Security، SRE و Test automation مالک مشخص ندارد.
- بودجه فقط Launch را پوشش میدهد، نه Run و Upgrade.
- Source of truth محصول، قیمت و موجودی بین ERP، فروشگاه و فایل دستی مبهم است.
- هدف «سریعتر شدن» است اما Baseline و Performance budget ندارید.
قبل از تغییر معماری، مسئلهٔ Journey را در راهنمای UX فروشگاه اینترنتی ریشهیابی کنید؛ اصطکاک فرم یا سیاست مرجوعی با Headless رفع نمیشود.
Monolith، Hybrid، Headless یا Composable؟
| شرایط | Monolith | Hybrid | Headless | Composable |
|---|---|---|---|---|
| Time-to-market اولیه | کوتاه | متوسط | متوسط تا بلند | بلند |
| تجربهٔ اختصاصی | محدود به Extension | زیاد در بخش هدف | زیاد | زیاد |
| تعداد Runtime/Vendor | کم | متوسط | متوسط | زیاد |
| توان Platform لازم | کمتر | متوسط | زیاد | بسیار زیاد |
| Blast radius Integration | داخل پلتفرم | مرزهای محدود | API و Storefront | چند Capability و Event |
| Exit complexity | کل پلتفرم | بخشبهبخش | Storefront جدا، Core دشوار | قابل تعویض اما Contract-heavy |
Hybrid اغلب نقطهٔ شروع خوب است: صفحات محتوا و Product discovery را جدا کنید، ولی Checkout را تا زمان اثبات نیاز روی مسیر بالغ پلتفرم نگه دارید.
Snapshot گزینهها در اوت ۲۰۲۶
این جدول رتبهبندی نیست و قابلیتها با Plan، Region و نسخه تغییر میکنند. تاریخ، API version و مسیر Upgrade را در Architecture decision record ثبت کنید.
| گزینه | قابلیت رسمی در Snapshot | ریسک/آزمون مهم |
|---|---|---|
| WooCommerce Store API | Store API رسمی WooCommerce Endpointهای عمومی برای Product، Cart و Checkout میدهد؛ دادهٔ حساس/Admin در API جداست | Session، Plugin compatibility، Scale، Checkout extension و Ownership عملیات WordPress را PoC کنید |
| WooCommerce Headless Cart | Cart-Token میتواند بهجای Cookie session برای تعامل Headless با Cart/Checkout استفاده شود | Token را Secret حساب نکنید؛ Expiry، theft، CSRF/CORS، cart merge و logout را تست کنید |
| Shopify Storefront API | GraphQL Storefront API نسخهٔ ۲۰۲۶-۰۷ Product/Collection، Cart و Checkout flow را برای Storefrontهای سفارشی عرضه میکند | API version، rate/cost limits، Customer account، Market، Checkout customization و دسترسی منطقهای را بررسی کنید |
| Shopify Hydrogen | نسخهٔ پایدار مستند، Stack مبتنی بر React Router است؛ Developer preview ژوئن ۲۰۲۶ به Toolkit framework-agnostic تغییر جهت داده و صریحاً امکان تغییر API را اعلام میکند | Preview را Production default نکنید؛ نسخه، Migration path، Runtime و Upgrade budget را مشخص کنید |
| API-first Composable | Commerce capability از طریق API و Extension قابل ترکیب است | ادعای «قابل تعویض» را با Export، Contract test و جایگزینی یک Capability در PoC ثابت کنید |
| Custom core | کنترل کامل Domain و Rule | Tax/Price/Promotion/Order/Refund پیچیدهاند؛ فقط با مزیت واقعی و تیم بلندمدت بسازید |
Reference Architecture پیشنهادی
Browser / App / Kiosk
│
CDN / WAF / Edge
│
Storefront SSR + BFF ─── CMS / Search / Personalization
│
Commerce API Gateway
│
Catalog ─ Price ─ Cart ─ Checkout ─ Order ─ Customer
│ │ │ │ │
PIM Promo Session Payment OMS/ERP
└────────── Event bus / Webhook ──────────┘
│
Analytics / Logs / Traces / Auditاین Diagram محصول نیست؛ مرز مسئولیت است. هر Arrow باید Contract، Authentication، Timeout، Retry، Idempotency، Observability و Owner داشته باشد.
| Component | مسئولیت | نباید مالک چه چیزی شود؟ |
|---|---|---|
| Storefront | Presentation، Navigation، Interaction و Accessibility | قیمت نهایی، موجودی قطعی یا Authorization |
| BFF | ترکیب API، Session facade، Policy و Payload مناسب کانال | کپی دائمی همهٔ Domain ruleها |
| Commerce core | Cart، Promotion، Checkout و Order invariant | محتوای Editorial کامل |
| PIM/Catalog | ویژگی، Taxonomy، Media reference و Product enrichment | موجودی لحظهای یا Order |
| OMS/ERP | Fulfillment، Inventory source و مالی/عملیاتی | State تعاملی مرورگر |
| CMS | Landing، Story، Navigation editorial و Preview | محاسبهٔ Price/Discount |
| Search | Index و Ranking discovery | Source of truth قیمت/موجودی Checkout |
Source of truth و Data ownership را پیش از کدنویسی تعیین کنید
در Headless، یک Product ممکن است همزمان در ERP، PIM، Commerce، Search و Cache حضور داشته باشد. بدون Ownership map، Conflict در قیمت و موجودی حتمی است.
| داده | Source of truth نمونه | نسخهٔ قابل نمایش | نسخهٔ قطعی |
|---|---|---|---|
| عنوان/ویژگی محصول | PIM | Search/CDN cache | PIM/Commerce sync policy |
| قیمت پایه | ERP یا Commerce pricing | Storefront cache با TTL | محاسبهٔ Server هنگام Cart/Checkout |
| Promotion | Commerce promotion engine | Preview تقریبی | Server-side evaluation |
| موجودی | OMS/Inventory service | Available-to-promise با Timestamp | Reservation/Commit در Checkout |
| Order | Commerce/OMS با State machine روشن | Read model حساب مشتری | Order ledger/audit |
| Customer identity | IdP/Customer account | Session claims | Authoritative identity store |
برای هر Field، Owner، Schema، ID، Version، Freshness، Conflict rule و Retention را در Data contract ثبت کنید.
چرا BFF در Storefront مهم است؟
Backend for Frontend بین Browser و سرویسها قرار میگیرد تا Token خصوصی در Client افشا نشود، چند API را ترکیب کند، Policy و Timeout یکسان بدهد و Waterfall را کم کند. BFF نباید Monolith جدیدی شود که همهٔ Business ruleها در آن کپی شدهاند.
- Public و Private API را جدا و Allowlist کنید.
- Payload را به حداقل Field لازم برای همان Route محدود کنید.
- Timeout و Budget کلی Request را بین Dependencyها تقسیم کنید.
- Trace ID را از Edge تا Commerce/Payment عبور دهید.
- Error را به State قابل فهم Storefront نگاشت کنید، نه Stack trace.
- Fallback فقط برای دادهای باشد که Stale بودن آن بیخطر است.
برای انتخاب GraphQL یا REST و کنترل N+۱، Complexity و Versioning، راهنمای GraphQL و REST را ببینید.
Contract و Versioning؛ استقلال تیم بدون قرارداد توهم است
| کنترل | هدف | شاهد |
|---|---|---|
| Schema/OpenAPI/GraphQL | قرارداد Type و Error | Versioned source و CI validation |
| Consumer-driven contract | تشخیص شکست Storefront پیش از Deploy | Test هر Consumer در Pipeline |
| Deprecation policy | زمان امن مهاجرت | Owner، Deadline و Usage telemetry |
| Idempotency | جلوگیری از Order/Payment تکراری | Key، persistence، response replay |
| Concurrency control | جلوگیری از overwrite State | Version/ETag و Conflict handling |
| Event schema | سازگاری Producer/Consumer | Registry، version و replay test |
«تیمها مستقل Deploy میکنند» فقط وقتی درست است که Dependency و Contract failure از قبل دیده و Rollback مستقل ممکن باشد.
Cache؛ قیمت و موجودی را مثل تصویر Cache نکنید
Catalog content خواندنی و Asset نسخهدار Cacheپذیرند؛ Price، Promotion، Inventory، Cart و Account به Market/User/Time وابستهاند. یک Policy واحد برای همهٔ دادهها خطرناک است.
| داده | سیاست نمونه | Invalidation | Fallback |
|---|---|---|---|
| تصویر/JS نسخهدار | Public، TTL بلند، immutable | URL fingerprint | نسخهٔ قبلی سالم |
| محتوای Product | Public/Surrogate cache | PIM event + TTL | Stale محدود |
| قیمت نمایشی | کوتاه و Key بر اساس Market/Segment | Price event | علامت «در سبد محاسبه میشود» |
| موجودی نمایشی | کوتاه با Timestamp | Inventory event | وضعیت نامشخص، نه عدد ساختگی |
| Cart/Account | Private/no-store متناسب | Session mutation | Recovery از Server state |
| Checkout total | Server authoritative؛ Cache عمومی ممنوع | Recalculate | Block با پیام قابل اقدام |
Cache key باید Locale، Currency، Market، Customer group و Permission لازم را لحاظ کند؛ در غیر این صورت نشت داده یا قیمت رخ میدهد.
Cart و Session؛ State را کجا نگه داریم؟
Local storage برای UX optimistic مفید است، اما Cart معتبر باید Server-side قابل بازیابی و Reconcile باشد. Anonymous cart، login merge، چند دستگاه، Expiry، coupon و price change را طراحی کنید.
- Storefront Cart ID/Token opaque میگیرد و آن را امن نگه میدارد.
- Mutation با Idempotency و Version مورد انتظار ارسال میشود.
- Server Product/Price/Inventory را دوباره اعتبارسنجی میکند.
- پاسخ State کامل یا Delta versioned میدهد.
- در Conflict، UI بهجای overwrite کور، تغییر قیمت/موجودی را توضیح میدهد.
در WooCommerce Store API، Endpointهای نوشتن Cart و Checkout به Nonce یا Cart token نیاز دارند؛ غیرفعالکردن کنترل Nonce که برای Development مستند شده، راهحل Production نیست.
Checkout را یک State machine ببینید
| State | Invariant | خطای محتمل | Recovery |
|---|---|---|---|
| Cart | Item معتبر و Total قابل محاسبه | قیمت/کالا تغییر کرده | Reprice و تأیید کاربر |
| Address | محدوده و فیلدهای لازم معتبر | سرویس آدرس/پست قطع | ورود دستی کنترلشده |
| Shipping | Rate برای Cart/Address فعلی | Rate stale | Requote با Version |
| Inventory reserve | Reservation زماندار | رقابت آخرین کالا | Release/Out-of-stock message |
| Payment initiated | Order draft و مبلغ Freeze شده | Redirect/timeout | Verify از Server |
| Paid | Verification معتبر و یکبار Transition | Callback تکراری | Idempotent replay |
| Fulfillment | Order committed و قابل Audit | ERP/OMS موقتاً قطع | Queue، retry و reconciliation |
هر Transition باید Command، Event، Actor، Timestamp و Audit trail داشته باشد. UI نباید «بازگشت موفق از درگاه» را بهتنهایی پرداخت قطعی بداند.
درگاه پرداخت ایرانی در Headless
Payment initiation و Verification باید Server-to-server انجام شوند. Secret در Browser قرار نمیگیرد و مبلغ از Cart معتبر Server محاسبه میشود.
- Server Order draft و شناسهٔ یکتا میسازد.
- مبلغ نهایی با واحد قراردادی—ریال یا تومان—Normalize و Freeze میشود.
- درخواست درگاه با Idempotency داخلی ثبت میشود.
- کاربر Redirect میشود؛ State/nonce و Return URL کنترل میشوند.
- پس از بازگشت، Server تراکنش را از درگاه Verify میکند.
- Transition Paid فقط یکبار و داخل Transaction/Lock مناسب انجام میشود.
- Callback تکراری همان نتیجه را برمیگرداند؛ Order تکراری ساخته نمیشود.
- Job reconciliation تراکنشهای Pending/Unknown را تطبیق میدهد.
Timeout به معنی شکست قطعی نیست. وضعیت Unknown باید قابل بازیابی باشد. جزئیات کامل در راهنمای اتصال امن درگاه پرداخت و UX خطا/بازگشت در راهنمای بهینهسازی Checkout آمده است.
موجودی؛ نمایش، Promise و Reservation را جدا کنید
عدد موجودی در Product page معمولاً Read model است؛ تضمین فروش نیست. Available-to-promise باید سفارشهای Pending، Reservation، کانال حضوری، مرجوعی و زمان Sync را در نظر بگیرد.
| مفهوم | کاربرد | مالک |
|---|---|---|
| On-hand | موجودی فیزیکی ثبتشده | ERP/WMS |
| Reserved | نگهداشت موقت برای Cart/Order | Inventory/Order service |
| Available-to-promise | مقدار قابل وعده پس از Ruleها | Inventory policy |
| Display availability | پیام UX مانند «موجود» | Storefront از Read model |
برای Flash sale، Bot، Oversell و Hot SKU، Atomicity و Queue/partition strategy را PoC کنید؛ اضافهکردن Cache بدون Reservation مشکل را پنهان میکند.
قیمت، تخفیف و واحد پول؛ Server authoritative
قیمت نمایش میتواند Estimate باشد، اما Cart و Checkout باید Rule را Server-side با Context کامل اجرا کنند: Market، Customer group، Coupon، Quantity، Shipping، Tax و زمان.
- واحد Minor/Major و تفاوت ریال/تومان را در Contract صریح کنید.
- از Float برای پول استفاده نکنید؛ Integer minor unit یا Decimal مناسب.
- Rounding و ترتیب Discount/Tax/Shipping را تست جدولی کنید.
- Promotion stacking و Exclusivity باید Rule واحد داشته باشد.
- قیمت Schema، Feed، Product page و Checkout با Source/Refresh مشترک همگام شود.
- در تغییر قیمت، Cart کاربر با پیام روشن Reprice شود؛ Silent change اعتماد را میشکند.
Omnichannel با API بهتنهایی ساخته نمیشود
یک API مشترک، کانالها را متصل میکند؛ تجربهٔ Omnichannel به Identity، Order history، Inventory، Pricing، Loyalty، Consent و Service policy مشترک نیاز دارد.
| سناریو | نیاز مشترک | شکست رایج |
|---|---|---|
| خرید وب، مرجوعی شعبه | Order/Payment/Fulfillment قابل دسترس | شناسه و سیاست کانال ناسازگار |
| سبد App و ادامه در Web | Identity و Cart merge | دو Cart و Coupon متفاوت |
| موجودی شعبه | ATP نزدیک Real-time | Cache قدیمی و وعده غلط |
| قیمت کمپین | Promotion context واحد | قیمت Feed، صفحه و POS متفاوت |
پیش از اضافهکردن «بینهایت Head»، سه Journey واقعی و Source of truth آنها را End-to-end اجرا کنید.
CMS، Preview و استقلال تیم محتوا
Headless ممکن است Preview و WYSIWYG را از تیم محتوا بگیرد، مگر از ابتدا طراحی شود. Content model باید Component slot، Validation، Locale، Schedule، Reference و Workflow را پوشش دهد.
- Preview با Draft token کوتاهعمر و محیط غیرقابل Index بسازید.
- Component و Content schema را version کنید.
- ویرایشگر نباید HTML/Script دلخواه را بدون Policy وارد کند.
- Fallback locale، Slug، Redirect و Archive را تعریف کنید.
- Release محتوا و Code باید قابل هماهنگی و Rollback باشند.
استقلال Marketing زمانی واقعی است که تغییر کمریسک بدون Ticket مهندسی، با Preview و Guardrail منتشر شود.
SEO در Headless Commerce؛ کنترل بیشتر، مسئولیت بیشتر
Headless ذاتاً برای SEO بهتر یا بدتر نیست. معماری Rendering، URL و Sync داده تعیینکنندهاند. راهنمای Merchant listing گوگل توصیه میکند Product structured data برای بهترین نتیجه در HTML اولیه باشد؛ دادهٔ JavaScript برای قیمت و موجودی سریعالتغییر میتواند Crawl shopping را کمدفعاتتر و کماتکاتر کند.
| حوزه | معیار پذیرش |
|---|---|
| Rendering | نام، توضیح، قیمت/موجودی قابل نمایش و لینک اصلی در HTML قابل Crawl |
| URL | محصول، Category، Pagination و Variant policy پایدار و مستند |
| Status | ۲۰۰/۳۰۱/۴۰۴/۴۱۰ واقعی؛ Out-of-stock با Policy، نه Soft ۴۰۴ تصادفی |
| Canonical | Self-reference برای صفحه Indexable؛ Variant/Filter مطابق Strategy |
| Schema | Product/Offer با قیمت، Currency و Availability همسان محتوای دیدهشده |
| Discovery | لینک <a href>، Pagination، Sitemap و Feed بهروز |
| Migration | URL map، ۳۰۱ مستقیم، Canonical، Sitemap و پایش ۴۰۴ |
Faceted navigation، Infinite scroll، Locale و Cache stale را روی خروجی عمومی تست کنید. برای Render و Index، راهنمای سئو PWA و JavaScript را اجرا کنید.
Performance؛ Headless میتواند سریعتر یا کندتر باشد
SSR و Edge cache فرصتاند، نه نتیجه. چند API، Hydration، Client SDK، Personalization و Tagها میتوانند TTFB و INP را خراب کنند. Performance budget را بر اساس Route و State تعریف کنید.
| مسیر | Budget/کنترل | Failure test |
|---|---|---|
| PLP | HTML اولیه، Pagination، Image و Search latency | Search کند/خالی |
| PDP | LCP image، Variant interaction، Price/stock freshness | Price API timeout |
| Cart | Mutation latency و optimistic reconciliation | Conflict و double click |
| Checkout | INP، Validation و dependency budget | Shipping/payment timeout |
| Account | Auth latency و private caching | Token expiry |
RUM را بر اساس Route، Device، ISP، Cache state، Release و Conversion segment کنید. روش کامل در راهنمای Core Web Vitals و RUM آمده است.
RTL و Accessibility را در Design system قفل کنید
Front-end سفارشی یعنی مسئولیت کامل Componentها با شماست. Cart drawer، Variant selector، Autocomplete، Modal، Toast و Checkout را با Keyboard، Screen reader، Zoom، Error summary و RTL واقعی تست کنید.
- Tokenهای Direction-aware برای spacing و icon بسازید.
- عدد، واحد پول، کد کالا و متن انگلیسی را در Bidirectional layout آزمایش کنید.
- Focus پس از Mutation و Error قابل پیشبینی باشد.
- Loading/Skeleton تغییر Layout یا مخفیشدن Label ایجاد نکند.
- عملکرد بحرانی بدون Hover و Gesture پیچیده در دسترس باشد.
امنیت API در Headless Commerce
Storefront عمومی سطح حملهٔ API را آشکارتر میکند. OWASP API Security ریسکهایی مانند Broken object authorization، مصرف نامحدود منابع، Business flow abuse، Inventory ناقص API و مصرف ناامن API ثالث را برجسته میکند.
| ریسک | کنترل | تست |
|---|---|---|
| دسترسی به Cart/Order دیگران | Opaque ID کافی نیست؛ AuthZ object-level | تغییر ID/Token و Cross-user test |
| Scalping/Coupon abuse | Rate، quota، risk signal و business limit | Bot و distributed flow |
| GraphQL complexity | Depth/cost limit، timeout و persisted query | Expensive nested query |
| Secret در Client | BFF و secret manager | Bundle/source map scan |
| Webhook جعلی/replay | Signature، timestamp، replay window و idempotency | تکرار/تغییر body |
| Third-party response | Validate، timeout، size limit و redirect allowlist | Malformed/slow/redirect response |
| API قدیمی | Inventory، owner، version و retirement | External attack surface scan |
Controlهای جامع REST/GraphQL/Webhook و OAuth/JWT در راهنمای امنیت API آمدهاند.
Resilience؛ Dependency failure را طراحی کنید
در Composable، Availability کل Journey از زنجیرهٔ Dependencyها اثر میگیرد. Retry کور میتواند Retry storm بسازد و Checkout را بدتر کند.
| Dependency | Fallback مجاز | Fallback غیرمجاز |
|---|---|---|
| CMS | نسخهٔ آخر محتوای عمومی | محتوای Draft یا شخصی |
| Search | Category cached یا پیام قابل اقدام | نتیجهٔ ساختگی |
| Price | نمایش «در سبد محاسبه میشود» | Checkout با قیمت stale |
| Inventory | وضعیت نامشخص و Recheck | فروش قطعی بدون Reservation |
| Payment | Pending/Unknown و Verification later | فرض Paid یا Retry خودکار Charge |
| Analytics | Queue/buffer با Consent | Block کردن Checkout |
Timeout budget، Circuit breaker، Bulkhead، Queue، Dead-letter، Replay و Manual recovery را برای هر مسیر مشخص کنید.
Observability؛ Order ID باید از کلیک تا ERP دیده شود
- Trace ID و Cart/Order correlation ID را در BFF، Commerce، Payment و OMS عبور دهید.
- Log ساختیافته بدون Token، PII یا اطلاعات پرداخت بنویسید.
- Metric فنی را به Funnel وصل کنید: Add-to-cart، Checkout start، Payment verified، Order committed.
- SLI را برای Availability، Latency، Freshness و Correctness تعریف کنید.
- Deployment annotation و Feature flag را در Dashboard نشان دهید.
- Synthetic journey جدا از Health endpoint اجرا کنید.
| SLI | تعریف نمونه | چرا مهم است؟ |
|---|---|---|
| Checkout success | Order معتبر ÷ تلاش واجد شرایط | Availability واقعی Journey |
| Price correctness | Mismatchهای PDP/Cart/Checkout | اعتماد و Margin |
| Inventory freshness | Age/lag Read model | Oversell |
| Payment unknown rate | Pending نامشخص ÷ initiation | نیاز reconciliation |
| API contract failure | Schema/semantic error | Release safety |
Analytics و Attribution؛ Event را دوبار نشمارید
SSR، Client hydration، Retry و چند کانال میتوانند Purchase event تکراری بسازند. Event contract شامل نام، Trigger، ID، Timestamp، Amount، Currency، Consent، Producer و Deduplication key باشد.
- Purchase را از Order committed یا Payment verified با تعریف واحد تولید کنید.
- Client event را برای UX نگه دارید، نه Source of truth درآمد.
- Order ID و Event ID برای Deduplication بفرستید.
- Refund/Cancel را در Revenue attribution لحاظ کنید.
- Server-side tracking هم Consent و Data minimization میخواهد.
TCO معماری Headless Commerce
هزینهٔ Commerce license فقط یک جزء است:
TCO = Commerce + Storefront + BFF + Hosting/CDN + CMS/PIM/Search + Integration + Observability + Security/QA + Content ops + On-call + Upgrade + Migration/Exit
| ردیف | هزینهٔ پنهان | محرک |
|---|---|---|
| Build | Design system، Preview، SEO، Account و Checkout state | تعداد Route/Market/Channel |
| Integrate | Mapping، Retry، reconciliation و sandbox | تعداد Vendor/Legacy |
| Run | SRE، Alert، Incident، Dependency upgrade | SLO و Release frequency |
| Quality | Contract/E2E/Load/Security/Accessibility | ترکیب State و کانال |
| Content | Model، Migration، Preview و localization | Editor و Locale |
| Exit | Data export، API replacement و URL migration | Lock-in هر Capability |
مثال فرضی سهساله با واحد هزینه
| مدل | Build | License/Infra | Integration | Run/QA | Exit reserve | TCO |
|---|---|---|---|---|---|---|
| Monolith بهینه | ۲۰ | ۲۴ | ۱۲ | ۲۶ | ۸ | ۹۰ |
| Hybrid | ۳۴ | ۳۰ | ۲۲ | ۳۶ | ۱۰ | ۱۳۲ |
| Headless | ۵۰ | ۳۶ | ۳۲ | ۵۰ | ۱۴ | ۱۸۲ |
| Composable چندVendor | ۶۰ | ۴۵ | ۴۸ | ۶۰ | ۲۰ | ۲۳۳ |
این عددها Quote بازار نیستند؛ ساختار مقایسهاند. منفعت باید از Incremental contribution، Cycle time یا هزینهٔ اجتنابشده با شواهد بیاید. «Headless Conversion را بالا میبرد» بدون Experiment، Benefit قطعی نیست.
Scorecard تصمیم معماری
| معیار | وزن نمونه | شاهد | Kill criterion |
|---|---|---|---|
| Outcome و نیاز چندکانال | ۲۰٪ | Journey و محدودیت فعلی | مسئله با تنظیم ساده حل میشود |
| Commerce correctness | ۱۵٪ | Price/Inventory/Order tests | Oversell/Double charge کنترل نمیشود |
| UX/SEO/Performance | ۱۵٪ | RUM، Crawl و Task test | مسیر بحرانی بدتر از Baseline |
| Security/Privacy | ۱۵٪ | Threat model و test | Data/Payment control ناکافی |
| Operations/Resilience | ۱۵٪ | Failure/restore/rollback drill | Owner/On-call یا Recovery ندارد |
| TCO و ظرفیت تیم | ۱۰٪ | سه سناریو و staffing | Run budget تأمین نیست |
| Portability/Upgrade | ۱۰٪ | Export، version و replacement test | دادهٔ حیاتی قابل خروج نیست |
امتیاز ۱ تا ۵ را در وزن ضرب کنید، ولی Kill criterion را با میانگین پنهان نکنید.
PoC ششهفتهای Headless
هفته ۱: Baseline و Contract
یک Category، Product پیچیده، Promotion، درگاه Sandbox و Inventory flow انتخاب کنید. KPI و Guardrail فعلی، API schema، Source of truth و Failure case را ثبت کنید.
هفته ۲ و ۳: Vertical slice
PLP→PDP→Cart→Checkout→Payment verify→Order/ERP را End-to-end بسازید. دادهٔ واقعی Sanitized، فارسی/RTL و Mobile را استفاده کنید؛ Prototype فقط Product card کافی نیست.
هفته ۴: Quality و Failure
SEO HTML، RUM/Lab، Keyboard، Contract، Load، Bot، AuthZ، Timeout، Callback تکراری، Inventory conflict و Restore را تست کنید.
هفته ۵: Operations و Content
Preview، Release، Rollback، Alert، Trace، On-call و یک تغییر Schema/API را تمرین کنید.
هفته ۶: TCO و تصمیم
زمان ساخت/Review/Incident، Cost و Risk را با Baseline مقایسه کنید. خروجی Go، Go Hybrid، Extend یا No-Go است.
| Test اجباری | معیار |
|---|---|
| Price change هنگام Cart | Reprice روشن و Total server-authoritative |
| آخرین موجودی با دو کاربر | حداکثر یک Commit معتبر |
| Callback پرداخت تکراری | یک Transition و یک Order |
| Search/Price timeout | Fallback امن در Budget |
| API breaking change | Contract test قبل از Production |
| JS خاموش/Crawler | محتوا و لینک/Schema لازم قابل مشاهده |
| Rollback | بازگشت زیر RTO بدون فساد Cart/Order |
مهاجرت با الگوی Strangler، نه Big Bang
- Baseline و freeze URL: Inventory Route، SEO، Event، Integration و KPI.
- Edge routing: Reverse proxy/route map برای انتقال بخشبهبخش.
- Read-only discovery: ابتدا Content/Category/Product با Commerce core فعلی.
- Cart bridge: Session و Cart transfer با Contract و fallback.
- Checkout: آخرین مرحله، پس از Payment/Inventory/reconciliation test.
- Canary: درصد محدود Traffic، Feature flag و Rollback سریع.
- Decommission: فقط پس از Window، Log/Redirect/Data retention و Owner removal.
| Wave | ریسک | شرط عبور |
|---|---|---|
| Content/Landing | SEO و Preview | HTML/URL/Workflow پاس |
| PLP/PDP | Price/stock stale | Freshness و Schema پاس |
| Search/Account | Identity و private data | AuthZ و fallback پاس |
| Cart | Session/merge | Cross-device و conflict پاس |
| Checkout/Payment | درآمد و سفارش | Idempotency/reconciliation/rollback پاس |
مثال فرضی فروشگاه ایرانی
فروشگاهی با وب و اپ، ۴۰هزار SKU، ERP داخلی، سه انبار و کمپینهای پرترافیک از محدودیت Theme شکایت دارد. بهجای بازنویسی کامل:
- مشخص میکند مشکل اصلی Release کند Landing و Search ضعیف است، نه Commerce core.
- Storefront وب و CMS را جدا میکند؛ Checkout موجود را در Wave اول نگه میدارد.
- BFF برای Catalog/Search میسازد، ولی Price/Promotion را در Cart دوباره محاسبه میکند.
- Inventory read model با Lag نمایش میدهد و Reservation در Server باقی میماند.
- درگاه با Order draft، Verify و reconciliation فعلی حفظ میشود.
- پس از سه ماه داده، دربارهٔ مهاجرت Cart/Checkout تصمیم میگیرد.
این Hybrid میتواند ۷۰٪ آزادی تجربه را بدون انتقال فوری پرریسکترین Stateها بدهد. عدد ۷۰٪ فرضی است؛ هر تیم باید Scope و Outcome خودش را بسنجد.
برنامه ۳۰/۶۰/۹۰روزه تصمیم Headless
| بازه | اقدام | خروجی |
|---|---|---|
| روز ۱ تا ۳۰ | Problem framing، Baseline، Domain/Data map، Vendor/API snapshot | ADR، Scorecard، Source-of-truth و PoC brief |
| روز ۳۱ تا ۶۰ | Vertical slice، Contract/Security/SEO/Performance tests | Evidence، TCO، Risk register و Failure results |
| روز ۶۱ تا ۹۰ | Hybrid/Headless decision، Wave ۱ Canary و Runbook | Roadmap، SLO، Ownership، Rollback و Budget run |
چکلیست نهایی Headless Commerce
- محدودیت فعلی و Outcome مالی/کاربری اندازهگیری شده است.
- Monolith، Hybrid، Headless، Composable و Microservices خلط نشدهاند.
- Source of truth محصول، قیمت، موجودی، مشتری و سفارش روشن است.
- Storefront به قیمت/موجودی/پرداخت قطعی اعتماد نمیشود.
- BFF، Secret، Token و Session policy تعریف شدهاند.
- API/Event contract، Version، Deprecation و Owner دارند.
- Idempotency و Concurrency برای Cart، Order و Payment آزموده شدهاند.
- Cache بر اساس Market/User/Freshness تفکیک و Invalidation تست شده است.
- Checkout به State machine با Unknown/Recovery تبدیل شده است.
- درگاه با Verify Server-side و reconciliation کار میکند.
- Oversell، Reservation و آخرین کالا در Load/Concurrency تست شدهاند.
- RTL، Keyboard، Error و Mobile در Componentها پاس شدهاند.
- HTML اولیه، URL، Status، Canonical، Schema و Sitemap صحیحاند.
- RUM و Trace مسیر Order را End-to-end پوشش میدهند.
- Fallback دادهٔ stale فقط برای Domain کمخطر مجاز است.
- TCO سهساله شامل Run، Upgrade، On-call و Exit است.
- Migration موجی، Canary و Rollback زیر RTO تمرین شدهاند.
پرسشهای متداول Headless Commerce
معماری Headless Commerce چیست؟
مدلی است که Storefront از Commerce backend جدا میشود و از طریق API/Event به Catalog، Cart، Checkout و Order متصل است. این جداسازی با Microservices یا Composable بودن یکسان نیست.
آیا Headless Commerce همیشه سریعتر است؟
خیر. SSR و Cache میتوانند کمک کنند، اما Hydration، JavaScript، API waterfall و Third-partyها ممکن است آن را کندتر کنند. سرعت باید با RUM روی Route و Device واقعی سنجیده شود.
آیا Headless برای سئو بهتر است؟
ذاتاً نه. کنترل بیشتری میدهد، ولی تیم باید HTML قابل Crawl، URL، Status، Canonical، Pagination، Product schema و همگامی قیمت/موجودی را خودش درست پیاده کند.
WooCommerce را میتوان Headless کرد؟
بله؛ Store API رسمی Product، Cart و Checkout را برای تجربهٔ مشتری ارائه میکند و Cart token برای تعامل Headless دارد. سازگاری Plugin، Session، Checkout extension، Scale، امنیت و عملیات WordPress باید در PoC واقعی بررسی شوند.
هزینه Headless Commerce چه زمانی توجیه دارد؟
وقتی منفعت افزایشی قابلاندازهگیری از چند کانال، تجربه یا Cycle time از TCO ساخت، Integration، عملیات، QA، Upgrade و Exit بیشتر باشد. برای فروشگاه استاندارد و تیم کوچک، Hybrid یا Monolith اغلب منطقیتر است.
جمعبندی؛ Headless را برای محدودیت واقعی انتخاب کنید
Headless Commerce «آیندهٔ اجباری» نیست؛ قراردادی است که آزادی Storefront را با مالکیت Integration و عملیات معاوضه میکند. موفقیت آن به Framework خاص وابسته نیست؛ به Source of truth، Contract، Correctness قیمت/موجودی، Checkout امن، SEO قابل Crawl، Observability و Recovery وابسته است.
اگر Vertical slice کامل از Product تا Order و ERP نتواند Failureها را کنترل کند، Demo زیبا دلیل مهاجرت نیست. ابتدا Hybrid و Wave کوچک را امتحان کنید، TCO و Benefit را بسنجید و فقط Capabilityهایی را جدا کنید که ارزش استقلالشان از هزینهٔ توزیع بیشتر است.






