اتوماسیون فروشگاه اینترنتی؛ سفارش، موجودی و کنترل

فرض کنید درگاه پرداخت یک Webhook را دوبار می‌فرستد. Workflow ساده شما هر بار «پرداخت موفق» را می‌بیند، موجودی را دوبار کم می‌کند، دو پیامک می‌فرستد و دو مأموریت ارسال می‌سازد. اتوماسیون کار را سریع کرده است؛ اما خطا را هم سریع و مقیاس‌پذیر کرده. مسئله فروشگاه «خودکارکردن چند Click» نیست؛ ساختن فرایندی است که با Duplicate، تأخیر، قطعی، ترتیب نامطمئن، تغییر قیمت، کمبود موجودی و دخالت انسان درست رفتار کند.

این راهنما اتوماسیون فروشگاه اینترنتی را از Trigger تا Outcome طراحی می‌کند: Source of truth، State machine سفارش، Event/Command contract، Idempotency، Inventory reservation، Payment reconciliation، Fulfillment، Return/Refund، Retry و Dead-letter queue، Human escalation، Security، Observability، SLO، تست، TCO و Runbook. مثال‌ها Vendor-agnostic‌اند و برای شرایط پرداخت، پیامک، اپراتور و محدودیت ابزار در ایران نیز Gate جدا دارند.

اتوماسیون فروشگاه اینترنتی چیست؟

اتوماسیون یعنی اجرای یک تصمیم یا اقدام تکرارشونده بر اساس Trigger، Rule، State و Control مشخص؛ با Evidence نتیجه و مسیر استثنا. «اگر سفارش آمد، پیام بفرست» یک Automation ناقص است؛ چون هنوز نمی‌گوید کدام سفارش، در چه State، با چه Dedup، چه زمانی، از کدام Channel، با چه Consent و اگر Provider پاسخ نداد چه می‌شود.

سطحنمونهکنترل لازم
Assistپیشنهاد دسته تیکت به AgentHuman review و feedback
Rule automationارسال تأیید سفارش پس از State معتبرEligibility/Idempotency
Workflowپرداخت→رزرو→انبار→ارسالState/Retry/Compensation
Decision automationانتخاب مسیر FulfillmentPolicy/Explainability/Override
Autonomous agentحل چندمرحله‌ای با ToolScope/approval/audit/kill switch

اتوماسیون هدف نیست؛ وسیله‌ای برای کاهش زمان چرخه، Variance و کار دستیِ کم‌ارزش است. گاهی Checklist انسانی از Workflow شکننده بهتر است.

اتوماسیون «بدون خطا» نیست

سیستم می‌تواند خطای ورود دستی را کم کند، اما خطاهای تازه‌ای می‌سازد: Rule غلط روی همه سفارش‌ها، Integration drift، Secret منقضی، Rate limit، Event تکراری، State قدیمی یا Mapping اشتباه SKU. بنابراین ادعای «دقت ۱۰۰٪» هم فنی نادرست و هم برای بودجه خطرناک است.

خطاManualAutomatedکنترل
Entry typoنسبتاً رایجکمترValidation
Systematic rule errorScope محدودترBlast radius زیادCanary/limit/approval
Duplicate actionممکندر Retry رایجIdempotency/dedup
Stale stateقابل‌مشاهده برای Operatorپنهان در IntegrationVersion/precondition/reconcile
Silent failureکار انجام نمی‌شود و دیده می‌شودQueue/connector ممکن است خاموش بماندSLO/alert/DLQ

از Process map شروع کنید، نه ابزار

خرید Workflow tool پیش از شناخت فرایند، آشفتگی را سریع‌تر می‌کند. یک Order را از Intent تا تسویه مالی و Return دنبال کنید.

مرحلهState/ArtifactOwnerاستثنای مهم
Cart/CheckoutCart، price quote، addressCommerceتغییر قیمت/موجودی
Order createOrder ID و snapshotOrder serviceDuplicate submit
Paymentattempt/authorization/captureFinance/Paymentcallback تأخیری/مبهم
Inventoryreservation/allocationInventoryoversell/expiry
Fulfillmentpick/pack/shipWarehousepartial/backorder
Deliverytracking/proofCarrier/Opslost/returned
After-salescancel/return/refundSupport/Financepartial/dispute
Reconciliationorder/payment/inventory/ledgerFinance/Opsstate mismatch

اتوماسیون مناسب را اولویت‌بندی کنید

«تکراری بودن» تنها معیار نیست. Frequency، manual time، error cost، data readiness، reversibility و exception rate را کنار هم بگذارید.

معیارامتیاز بالا یعنیریسک
Volumeدفعات زیادBlast radius نیز زیاد
Rule clarityEligibility و Outcome روشنEdge case پنهان
Data qualityState/ID قابل‌اعتمادgarbage-in
Error costصرفه‌جویی بالقوه زیادAutomation error گران
ReversibilityRollback/compensation ممکنپیام/ارسال/Refund برگشت‌ناپذیر
Exception rateمسیر استاندارد غالبHuman queue اشباع

ابتدا Workflowی را انتخاب کنید که State روشن، Outcome قابل‌سنجش و Compensation کم‌هزینه دارد؛ نه الزاماً پرزرق‌وبرق‌ترین Use case.

Source of truth را برای هر موجودیت تعیین کنید

موجودیتSource of truth نمونهReplica/Consumer
OrderCommerce/order databaseCRM، WMS، Analytics
PaymentPayment provider + internal ledgerOrder/support
InventoryInventory/WMSStorefront/marketplace
ShipmentFulfillment/carrier integrationOrder/support/customer
Customer/ConsentIdentity/CRM/consent registryMessaging/analytics
Product/PriceCatalog/pricing servicestorefront/feed/channel

یک Spreadsheet یا CRM نباید ناخواسته Source of truth سفارش شود فقط چون Connector ساختنش آسان است. هر Write باید Authority، version و Conflict policy داشته باشد.

State machine سفارش

Order status یک Label نمایشی نیست؛ قرارداد Transition و Side effect است. API رسمی WooCommerce وضعیت‌هایی مانند pending، processing، on-hold، completed، cancelled، refunded و failed دارد؛ اما کسب‌وکار شما ممکن است Stateهای داخلی دقیق‌تر لازم داشته باشد.

State داخلی نمونهورود معتبرخروج معتبرSide effect
createdOrder ID و snapshot ساخته شدawaiting_payment/cancelledهیچ Fulfillmentی
awaiting_paymentprice/inventory precheckpaid/payment_uncertain/expiredpayment attempt
paidpayment reconciledallocated/refund_pendingreserve/allocate
allocatedstock assignmentpacking/backorder/cancelwarehouse task
shippedcarrier acceptancedelivered/exception/returnedtracking notice
delivereddelivery evidence/policyreturn_window/closedafter-sales eligibility

مستند رسمی WooCommerce Orders API وضعیت‌های Platform را نشان می‌دهد؛ Mapping داخلی→Platform باید Versioned و قابل‌آزمون باشد. مستقیم‌بردن همه منطق به Statusهای افزونه‌ای، مهاجرت و Reconciliation را سخت می‌کند.

Event، Command و State را جدا کنید

نوعمعنینام خوبنام بد
Eventواقعیتی که رخ دادهpayment.succeededprocessOrder
Commandدرخواست انجام عملreserveInventoryinventoryChanged
Stateنمای جاری حقیقتorder.status=allocatedتفسیر از آخرین Email

Event گذشته و immutable است؛ Command ممکن است پذیرفته، رد یا Timeout شود. Consumer نباید از اسم مبهم حدس بزند چه چیزی قطعی شده است.

Event envelope استاندارد

CloudEvents یک مشخصات CNCF برای توصیف مشترک Metadata رویداد است. لازم نیست حتماً Platform آن را پیاده کند، اما مفاهیم ID، Source، Type، Time و Data schema برای قرارداد داخلی مفیدند.

{
  "specversion": "1.0",
  "id": "evt_01J...",
  "source": "/payments/provider-a",
  "type": "com.mindio.payment.succeeded.v2",
  "subject": "orders/84291",
  "time": "2026-08-10T09:20:31+03:30",
  "dataschema": "https://schemas.example/events/payment-succeeded-v2.json",
  "data": {
    "order_id": "84291",
    "payment_attempt_id": "pay_771",
    "amount_minor": 15800000,
    "currency": "IRT"
  }
}

نمونه فقط قرارداد را نشان می‌دهد. واحد مبلغ، Currency، timezone و اینکه IRT در تمام سیستم‌ها پشتیبانی می‌شود یا نه باید صریح باشد؛ «تومان» را با IRR یا عدد بدون واحد مخلوط نکنید.

Workflow contract

فیلدپرسش
Triggerکدام Event/زمان/Operator؟
Eligibilityکدام State/Customer/Channel مجاز است؟
Preconditionکدام Version/price/stock/consent باید برقرار باشد؟
Actionیک Command دقیق چیست؟
IdempotencyLogical operation key چیست؟
Successچه Evidenceی Outcome را اثبات می‌کند؟
Timeout/Retryکدام خطا قابل Retry و تا چه زمانی؟
Compensationاگر Step بعدی شکست خورد چه خنثی می‌شود؟
Escalationچه زمانی Human، با چه Contextی؟
Data/PolicyPII/Consent/retention/secret چیست؟
Owner/SLOچه کسی پاسخ‌گو و چه شاخصی؟

Idempotency؛ Retry امن

عمل Idempotent با تکرار همان درخواست، Outcome جدید ناخواسته نمی‌سازد. کلید باید Logical operation را مشخص کند؛ نه Timestamp تصادفی در هر Retry.

عملIdempotency key نمونهاثر Duplicate
ثبت پرداخت سفارشpayment_attempt_idLedger entry دوم ساخته نشود
رزرو SKUorder_id+line_id+reservation_vQuantity دوبار کم نشود
ارسال تأییدorder_id+template_v+channelپیام تکراری نرود
ساخت Shipmentfulfillment_id+parcel_noبارنامه دوم نسازد
Refundrefund_request_idمبلغ دوبار برنگردد

Stripe در مستند Webhook رسمی صریحاً می‌گوید Event تکراری ممکن است برسد، ترتیب تولید تضمین نیست و Handler بهتر است Asynchronous باشد. Shopify نیز در راهنمای تحویل Webhook عملیات Idempotent و Dedup بر اساس Webhook ID را توصیه می‌کند. این رفتارها را Exception ندانید؛ مبنای طراحی قرار دهید.

Inbox، Dedup و Ack سریع

  1. Raw body و Signature را طبق Provider و قبل از Parse نامناسب Validate کنید.
  2. Event ID، source، type، received_at و payload hash را در Inbox پایدار ثبت کنید.
  3. Unique constraint/Dedup را پیش از Side effect اعمال کنید.
  4. پس از پذیرش پایدار، پاسخ موفق سریع بدهید؛ Business logic سنگین را Queue کنید.
  5. Worker با State/Version تازه Eligibility را دوباره بررسی کند.
  6. نتیجه، attempts، next_retry و terminal status ثبت شود.

اگر ابتدا Side effect و بعد Dedup record ثبت شود، Crash بین این دو نقطه Duplicate می‌سازد. Transaction boundary یا Pattern مناسب Storage را طراحی کنید.

Ordering را فرض نکنید

Event «ارسال شد» ممکن است پیش از «پرداخت ثبت شد» به Consumer خاص برسد، یا Event قدیمی پس از جدید برسد. راهکارها:

  • Sequence/version را در Aggregate نگه دارید و Event قدیمی را رد یا Reconcile کنید.
  • برای تصمیم حساس، State جاری را از Source معتبر Retrieve کنید.
  • Transition را با Expected version/State شرطی کنید.
  • Buffer کوتاه فقط وقتی SLA اجازه می‌دهد؛ ترتیب جهانی نسازید.
  • Missing dependency را Retry محدود یا به Reconciliation بسپارید.

Outbox؛ Event و Write با هم

اگر Order را Update و سپس Event publish کنید، Crash میان دو عمل State بدون Event می‌سازد. Transactional outbox، تغییر Domain و رکورد Event-to-publish را در یک Transaction می‌نویسد؛ Publisher جدا آن را ارسال می‌کند. این Pattern «Exactly once» جادویی نمی‌سازد، اما شکاف Dual-write را کم و Replay را ممکن می‌کند.

Exactly once را وعده ندهید

در زنجیره HTTP، Queue، Worker و Provider، تحویل معمولاً Retry و دست‌کم‌یک‌بار است. هدف عملی:

  • Delivery قابل‌Retry؛
  • Processing Idempotent؛
  • State transition شرطی؛
  • Side effect قابل‌تشخیص؛
  • Reconciliation و Compensation؛
  • Audit trail قابل‌Replay.

Orchestration یا Choreography؟

مدلمزیتریسکمناسب
OrchestrationState/Timeout/Compensation مرکزی و قابل‌دیدنCoordinator coupling/bottleneckOrder workflow چندمرحله‌ای حساس
ChoreographyConsumer مستقل و توسعه توزیع‌شدهFlow پنهان، loop و debugging دشوارNotification/analytics side effects
HybridCore flow هماهنگ، side effect event-drivenBoundary نیازمند Governanceبیشتر فروشگاه‌های متوسط

برای Payment→Inventory→Fulfillment معمولاً Visibility و Compensation مهم است؛ برای Analytics یا اطلاع‌رسانی، Consumer مستقل مناسب‌تر است. Tool نباید معماری را به‌جای نیاز انتخاب کند.

Saga و Compensation

Transaction توزیع‌شده میان درگاه، انبار و شرکت حمل معمولاً در اختیار شما نیست. اگر پرداخت موفق و رزرو موجودی ناموفق شد، «Rollback database» کافی نیست؛ Business compensation لازم است.

StepActionCompensation احتمالینکته
Payment authorizeHold/authorizevoid/releasePolicy Provider
Inventory reserveQuantity holdrelease reservationTTL و owner
Captureدریافت وجهrefund requestبرگشت فوری/قطعی فرض نشود
Shipment createبارنامه/ماموریتcancel shipmentبعد از pickup شاید ناممکن
Customer messageاعلام وضعیتپیام اصلاحیارسال‌شده پاک نمی‌شود

Compensation همیشه معکوس ریاضی نیست؛ ممکن است هزینه، تأخیر یا دخالت انسان داشته باشد. State آن نیز باید Observable باشد.

Inventory؛ Available با On-hand یکی نیست

مفهومتعریفریسک
On-handفیزیکی ثبت‌شدهخرابی/کسری ثبت‌نشده
Reservedبرای Order/Cart نگه‌داشتهReservation منقضی‌نشده
AvailableOn-hand منهای Reservation/BufferReplication lag
Allocatedبه Location/Order تخصیص‌یافتهwarehouse mismatch
In-transitدر مسیر تأمینETA نامطمئن

رزرو باید ID، Quantity، Location، TTL، Reason، Order version و Release rule داشته باشد. Cron آزادسازی بدون Idempotency می‌تواند Reservation تازه را اشتباه آزاد کند.

Overselling را با یک Sync لحظه‌ای حل نکنید

  • Authority موجودی مشخص باشد؛ چند Channel هم‌زمان Write نکنند.
  • Reservation با Atomic/conditional update یا Lock مناسب ساخته شود.
  • Safety stock برای Lag/خرابی/کانال‌های کند قابل‌تنظیم باشد.
  • Channel update دارای version و stale-event protection باشد.
  • Reconciliation دوره‌ای Physical/WMS/Storefront اختلاف را کشف کند.
  • Backorder/preorder policy برای Customer شفاف باشد.

Payment state؛ Success صفحه مرورگر کافی نیست

بازگشت کاربر از درگاه ممکن است قطع شود، تکرار شود یا با Callback/Settlement اختلاف داشته باشد. Order را بر اساس Redirect UI نهایی نکنید. Payment attempt باید Provider reference، amount/currency، status، timestamps و reconciliation evidence داشته باشد.

حالتتصمیمCustomer UX
initiatedمنتظر نتیجه معتبرشناسه و امکان ادامه
succeededReconcile amount/order؛ transition idempotentتأیید واحد
failedدلیل امن و Retry policyراه تلاش دوباره
uncertainQuery provider/reconciliation؛ Fulfillment holdپیام «در حال بررسی»، نه پرداخت مجدد کور
refundedRefund ID/amount/stateزمان و Scope روشن

پرداخت ناموفق و Retry انسانی

Auto-retry پرداخت بدون Contract ممکن است Duplicate charge یا تجربه نگران‌کننده بسازد. برای هر روش پرداخت مشخص کنید آیا Retry خودکار مجاز است، User action لازم است، Token/Consent وجود دارد و چه فاصله/حدی رعایت می‌شود. در پرداخت یک‌باره ایرانی، اغلب مسیر امن «ساخت تلاش تازه با Order ثابت و Attempt ID تازه» است.

Fulfillment و ارسال

AutomationPreconditionException
ساخت Pick taskpaid+allocatedhazmat/oversize/manual review
انتخاب انبارstock/capacity/cutoffsplit shipment
ساخت Labeladdress/weight/service validprovider timeout/invalid address
اعلام Trackingcarrier acceptance نه فقط labellabel cancelled
Delivery updatecarrier event versionout-of-order/false delivered

Label creation با Shipment pickup برابر نیست. Customer message باید Stage واقعی را منتقل کند و Provider mapping versioned باشد.

Cancellation، Return و Refund

این مسیرها را بعداً وصله نکنید؛ همان State machine اصلی‌اند.

درخواستEligibilityAutomation boundary
Cancel before fulfillmentState/warehouse cutoffrelease reserve + void/refund
Cancel after labelcarrier/warehouse capabilityhuman/compensation ممکن
Partial returnline/quantity/window/conditionline-level state
Refundapproved amount/methodrequest≠settled
Restockinspection/dispositionفوری پس از درخواست نه

Notification؛ نتیجه State، نه Source of truth

Email/SMS/Push باید از Transition معتبر مشتق شود. Message status نباید Order status را تعیین کند.

فیلدنمونه
PurposeTransactional یا Marketing
EligibilityState، consent/channel، quiet rule
Template versionorder-confirmed.fa.v4
Idempotencyorder+transition+channel+template
Provider stateaccepted/delivered/failed/unknown
Fallbackin-app/account page/human contact
PIIکمینه داده در متن/Log

Accepted توسط Provider برابر Delivered یا خوانده‌شدن نیست. اطلاعات حساس سفارش را بی‌دلیل در Notification یا URL قرار ندهید.

پشتیبانی؛ Triage خودکار، خروج انسانی

Chatbot نباید «پاسخ ۲۴ساعته» را با حل مسئله اشتباه بگیرد. Automation خوب Context جمع می‌کند، پاسخ قطعی ساده می‌دهد و مسئله حساس/نامطمئن را با History کامل Escalate می‌کند.

درخواستخودکارHuman gate
وضعیت سفارشLookup احرازشدهMismatch/exception
سیاست مرجوعیPolicy نسخه‌داراستثنای حقوقی/حساس
تغییر آدرسفقط پیش از cutoff و احرازبعد از fulfillment
Refund disputeجمع‌آوری Evidenceتصمیم مالی
آسیب/ایمنیفوری flagPriority human escalation

Confidence پایین، شکایت تکراری، احساسات شدید، مبلغ بالا و Risk flag باید مسیر انسانی داشته باشند. Agent بتواند Automation را Pause و Reason ثبت کند.

بازاریابی را از عملیات سفارش جدا کنید

Order confirmation پیام Transactional است؛ Win-back یا پیشنهاد محصول Marketing. Consent، Suppression، Frequency و Holdout دو مسیر متفاوت دارند. معماری State/Cohort/Contact policy در راهنمای بازاریابی چرخه عمر مشتری مالکیت دارد.

یادآوری سبد خرید نیز «بهترین شروع برای همه فروشگاه‌ها» نیست. ابتدا باید علت Abandonment، Identity/Consent، Eligibility و Incrementality روشن شود؛ راهنمای سبد خرید رهاشده مرز تشخیص و Recovery را پوشش می‌دهد.

درخواست Review؛ زمان تحویل را حدس نزنید

  • Trigger از Delivery evidence یا Window مناسب، نه صرف Shipment.
  • Refund/return/open complaint و لغو را Suppress کنید.
  • برای هر Order/line Dedup و Frequency cap داشته باشید.
  • مشوق را شفاف کنید و Review مثبت را شرط پاداش نگذارید.
  • امکان Unsubscribe/Channel preference و Human complaint فراهم باشد.

Pricing و Promotion automation

تغییر خودکار قیمت و تخفیف High-risk است. Floor/margin، stock، campaign overlap، coupon stacking، customer fairness، approval و rollback باید Contract داشته باشند. Price در Order snapshot ثبت و Checkout با Version معتبر تأیید شود؛ نمایش یک قیمت و Capture قیمت دیگر Incident است.

Retry policy؛ همه خطاها Retryپذیر نیستند

خطاRetry؟اقدام
Timeout/5xx موقتبله، محدودBackoff+jitter+idempotency
429طبق Retry-After/Quotathrottle/queue
401/403کور نهcredential/permission incident
400/schemaنه تا اصلاحDLQ/contract alert
404 eventualبسته به Providerکوتاه و محدود
Business rejectionنهhuman/compensation

Retry storm می‌تواند Provider و سیستم خودتان را بدتر کند. Per-tenant/provider concurrency، circuit breaker و Queue age guard بگذارید.

Dead-letter queue و Quarantine

DLQ قبرستان پیام نیست. هر مورد باید Reason، payload reference امن، schema/version، attempts، last error، owner، severity و reprocess eligibility داشته باشد.

حالتتصمیم
Transient exhaustedبررسی Provider و replay محدود
Schema unknowndeploy compatible consumer یا transform
Business invalidاصلاح Source/Manual resolution؛ replay کور نه
Security suspectQuarantine، عدم پردازش، incident
DuplicateMark deduped؛ موفقیت منطقی

Replay یک عملیات تولیدی است

  • Scope با Query و Preview Count مشخص شود.
  • Dry run اثر احتمالی را نشان دهد.
  • Idempotency و State precondition دوباره اجرا شوند.
  • Rate limit و ترتیب Aggregate رعایت شود.
  • Operator، reason، time و result Audit شوند.
  • Kill switch و rollback/compensation آماده باشد.

Reconciliation؛ کشف اختلاف خاموش

حتی Workflow سالم نیاز به Reconciliation دارد. چند Query نمونه:

کنترلMismatchاقدام
Payment↔Orderpaid provider / unpaid orderhold fulfillment، reconcile
Order↔Inventorypaid / no reservationallocate یا compensate
Shipment↔Ordercarrier delivered / order shippedversion check/update
Refund↔Ledgerrequested / not settledfollow-up/escalate
Channel↔Catalogprice/stock stalerepublish/quarantine

Reconciliation باید Watermark، completeness و false-positive policy داشته باشد. «هیچ Alertی نداریم» اثبات سازگاری نیست.

Rate limit، Quota و Backpressure

  • Quota هر Provider/credential/tenant را ثبت کنید.
  • Queue priority برای Payment/Order در برابر Marketing جدا باشد.
  • Batch و concurrency را با SLA و Provider limit تنظیم کنید.
  • Queue age و estimated drain time را Alert کنید.
  • Load shedding برای Side effect کم‌اهمیت داشته باشید.
  • Backfill بزرگ را از Traffic زنده جدا کنید.

زمان، تقویم و Cutoff

«سه روز بعد» بدون timezone و Calendar contract مبهم است. Event time، received time، processed time و business time را جدا کنید. برای ایران، UTC و Asia/Tehran، تاریخ شمسی نمایشی، تعطیلی/روز کاری، cutoff انبار و Provider settlement باید روشن باشند. Logic را به متن تاریخ شمسی وابسته نکنید؛ Machine timestamp و Locale presentation را جدا نگه دارید.

Data contract و Schema evolution

تغییرسازگار؟Gate
افزودن Field اختیاریاغلبconsumer ignores unknown
تغییر معنی Fieldخیرversion جدید
تغییر unit/currencyخطرناکexplicit field/version
Enum value جدیدممکن است بشکندunknown handling
حذف/renameشکنندهdeprecation/migration

Producer و Consumer compatibility test، Schema registry یا Contract artifact و Deprecation window بسازید. Event گذشته با Version خودش باید قابل‌تفسیر بماند.

Identity و Data join

Order ID، payment attempt ID، customer ID، fulfillment ID و message ID را جدا نگه دارید. Email/phone را Primary key پایدار ندانید. Join marketing/analytics باید Consent/Purpose و Identity provenance داشته باشد. معماری Event/GA4/Warehouse و Attribution در راهنمای تحلیل داده‌های بازاریابی آمده است.

امنیت اتوماسیون

سطحتهدیدکنترل
Webhookجعل/replay/body tampersignature/raw body/timestamp/dedup
Credentialنشت/دسترسی زیادsecret manager/rotation/least privilege
Workflow UIتغییر Rule بدون reviewRBAC/MFA/approval/audit
PayloadPII در Log/DLQminimize/redact/encrypt/retention
Connectorsupply-chain/permission driftinventory/review/revoke
ReplaySide effect گستردهdry run/scope/approval/kill switch
Agent/AItool misuse/prompt dataallowlist/approval/context boundary

برای API authentication/authorization/rate limiting و input contract از راهنمای امنیت API و برای پنل‌های Workflow از راهنمای MFA مدیران استفاده کنید.

Human-in-the-loop و Override

GateمثالContext لازم
Riskمبلغ/تخفیف/Refund بالاorder/payment/history
Confidenceدسته‌بندی تیکت نامطمئنsuggestion+reasons
Exceptionآدرس/موجودی/حمل غیرعادیfailed steps+options
Customer harmایمنی/شکایت حساسpriority+contact
Policyقیمت/کمپین ویژهrule/version/approver

Override باید State معتبر بسازد، Reason و Actor را ثبت کند و Workflow را از آن نقطه ادامه دهد؛ تغییر مستقیم Database بدون Audit، مشکل را پنهان می‌کند.

ابزار را با Capability انتخاب کنید

Capabilityسؤال
State/DurabilityWorkflow و Timer پس از Crash ادامه می‌یابد؟
IdempotencyDedup و logical key چگونه است؟
Retry/DLQPolicy، replay و audit دارد؟
VersioningWorkflow در حال اجرا با Deploy جدید چه می‌شود؟
Secrets/RBACscope/rotation/MFA/approval؟
Observabilitytrace/state/attempt/payload redaction؟
Testingfixture/sandbox/clock/failure injection؟
Export/Exitdefinition/history/data portable؟
Iran fiteligibility/payment/latency/support/mirror؟

نام ابزارها و پلن رایگان سریع عوض می‌شوند. خرید را با Pilot روی یک Workflow سخت، Export test و TCO سه‌ساله انجام دهید.

Build یا Buy یا Low-code؟

مدلمناسبریسک
Built-in platformFlow ساده نزدیک Platformمحدودیت/lock-in
Low-code/iPaaSIntegration سبک و سرعت Pilotstate/debug/cost/secret sprawl
Workflow engineFlow طولانی/Timer/compensationoperational complexity
Custom serviceCore differentiation/high scaleمالکیت کامل maintenance
HybridCore durable، peripheral low-codeboundary/governance

شرایط ایران

  • درگاه، پیامک، حمل، مارکت‌پلیس و حسابداری ممکن است API/Callback/SLA متفاوت یا مستندات محدود داشته باشند؛ Contract test و Reconciliation ضروری است.
  • ریال/تومان را با Field/Unit صریح و amount minor/major قراردادی نگه دارید.
  • UTC، Asia/Tehran، شمسی نمایشی، تعطیلی و cutoff انبار را تفکیک کنید.
  • Phone را با +۹۸/۰۹ normalize کنید و شماره بازیافتی را Identity قطعی ندانید.
  • Provider/SaaS خارجی را از نظر Eligibility، پرداخت، Rate limit، Data export و Exit بررسی کنید.
  • SMS accepted/delivered و ISP/operator failure را جدا Observe کنید.
  • Manual fallback برای قطعی Provider/اینترنت و Queue backlog مستند باشد.
  • الزامات قانونی/قراردادی/صنفی را با مشاور و Provider مرتبط مشخص کنید؛ الگوی GDPR را کور کپی نکنید.

SLI و SLO اتوماسیون

SLIتعریفSlice
Accepted latencyTrigger→durable inboxsource/type
Completion latencyeligible trigger→business outcomeworkflow/stage
Success rateterminal success ÷ eligible runsprovider/version
Duplicate suppressiondeduped ÷ receivedsource/type
Queue ageoldest actionable messagepriority/provider
DLQ rateterminal failures ÷ runsreason/schema
Reconciliation mismatchinconsistent entities ÷ checkedpair/state
Human exceptionescalated ÷ runs + resolution timereason/team

Success فنی 2xx با Outcome کسب‌وکار یکی نیست. «پیام پذیرفته شد» ممکن است Delivery نباشد؛ «Shipment ساخته شد» ممکن است Pickup نباشد.

Observability و Trace

هر Run باید workflow_run_id، business IDs، event ID، idempotency key hash/reference، workflow version، stage، attempt، provider request ID، timestamps و terminal reason داشته باشد. PII/Secret را در Log نریزید.

Viewپرسش
Run timelineکدام Step چه زمانی و چرا؟
Aggregateیک Order در تمام سیستم‌ها چه Stateی دارد؟
ProviderLatency/error/rate-limit کدام Integration؟
QueueAge/depth/drain/priority چگونه است؟
Businessکدام Outcome/guardrail متاثر است؟
Changeکدام version/deploy/rule تغییر کرد؟

اصول Log/Metric/Trace/SLO و Incident در راهنمای Observability تفصیل داده شده‌اند.

تست اتوماسیون

تستسناریو
Contractschema/version/enum/unknown field
State transitionvalid/invalid/concurrent/stale version
Idempotencysame event/request ۲/۱۰/۱۰۰ بار
Orderingout-of-order/missing/late
Failuretimeout/5xx/429/401/400/partial
ClockTTL/cutoff/timezone/holiday/late callback
Compensationهر Step پس از Side effect شکست بخورد
Replaydry-run/scope/dedup/kill
Loadsale spike/backlog/provider quota
Securitybad signature/replay/permission/secret rotate
Humanoverride/escalate/resume/audit

Shadow، Canary و Feature flag

  1. Shadow: Event را بخوانید اما Side effect نکنید؛ تصمیم پیشنهادی را با واقعیت مقایسه کنید.
  2. Dry-run: اثر هر Command را Preview کنید.
  3. Canary: درصد کوچک یا Store/Provider محدود.
  4. Guardrail: error/duplicate/queue age/customer harm.
  5. Kill switch: توقف Side effect با حفظ Inbox.
  6. Rollback: workflow version و compensation plan.

Pipeline، Artifact، Provenance، Canary و Rollback در راهنمای CI/CD امن آمده است.

TCO و ROSI اتوماسیون

Bucketهزینه
Build/licenseengine/iPaaS/plugin/development
IntegrationAPI mapping/sandbox/certification
Runexecutions/compute/queue/SMS/email/API
Qualitytest data/failure injection/security
Operationsmonitoring/on-call/DLQ/reconciliation
Changeprovider/schema/business-rule migration
Exceptionhuman handling/compensation/support
Exitexport/rebuild/history/credential rotation

Benefit را با manual minutes، cycle time، error-loss range، capacity و customer outcome بسنجید. فرض «نیروی انسانی حذف می‌شود» را مستقیم به Savings تبدیل نکنید؛ کار به Exception handling، QA و improvement منتقل می‌شود.

RACI

کارResponsibleAccountableConsulted
Process/PolicyOps/ProductBusiness ownerSupport/Finance
State/Event contractEngineeringArchitecture ownerOps/Data
Payment/RefundFinance/EngineeringFinance ownerSupport/Risk
Inventory/FulfillmentWarehouse/OpsOperations ownerCommerce
Security/PrivacySecurity/LegalPublisherEngineering/Marketing
SLO/IncidentSRE/EngineeringEngineering leadOps/Providers
MeasurementAnalytics/FinanceProduct ownerOps/Support

Runbook: Webhook تکراری Side effect ساخته

  1. Consumer/Workflow Side effect را Pause؛ Inbox را نگه دارید.
  2. Scope را با event/object/type و logical idempotency key پیدا کنید.
  3. Payment/inventory/shipment/message را جدا Reconcile کنید.
  4. Compensation را بر اساس Harm و Reversibility اجرا کنید.
  5. Dedup boundary/unique constraint/transaction ordering را Fix و Backfill تست کنید.
  6. Replay را Dry-run و سپس محدود اجرا کنید.

Runbook: Payment موفق است اما Order پرداخت‌نشده

  1. Fulfillment را تا تعیین تکلیف Hold کنید؛ از پرداخت مجدد کور جلوگیری کنید.
  2. Provider reference، amount/currency/order ID و attempt را Validate کنید.
  3. Webhook Inbox/signature/dedup/worker/DLQ و ordering را بررسی کنید.
  4. با Conditional transition و Audit، Order را Reconcile کنید.
  5. پیام دقیق برای Customer/Support و Query جلوگیری از تکرار بسازید.

Runbook: Queue عقب افتاده است

  1. Age/depth/arrival/drain و Provider quota را اندازه بگیرید.
  2. Payment/Order/Fulfillment را از Marketing/Review اولویت دهید.
  3. Poison message، retry storm، downstream outage و deploy را تفکیک کنید.
  4. Concurrency را تا حد Safe بالا یا Side effect کم‌اهمیت را Shed کنید.
  5. بعد از Drain، State و missed SLA را Reconcile و مشتری متاثر را مدیریت کنید.

Runbook: موجودی منفی یا Oversell

  1. Channel write و فروش SKU متاثر را موقت محدود کنید.
  2. On-hand/reserved/allocated/available و versionها را بازسازی کنید.
  3. Duplicate reservation، stale event، TTL race و sync lag را بررسی کنید.
  4. Orderها را بر اساس Policy allocate/backorder/cancel و Customer را آگاه کنید.
  5. Atomic condition، safety stock، version guard و reconciliation را اصلاح کنید.

Runbook: Provider خارجی/داخلی قطع شده

  1. Circuit breaker؛ درخواست تازه بی‌پایان نفرستید.
  2. Inbox/Queue پایدار، TTL و ظرفیت را بررسی کنید.
  3. Fallback/manual route و Customer message را بر اساس Stage فعال کنید.
  4. Recovery را با Canary و Rate محدود آغاز کنید.
  5. Reconciliation کامل و Provider SLA/Exit plan را بازبینی کنید.

Backup/restore، RPO/RTO و Disaster Recovery زیرساخت در راهنمای بازیابی فاجعه سایت مالکیت دارد.

برنامه ۹۰روزه

روز ۱ تا ۳۰: Map و Contract

  • Order-to-cash/return map، Owner و Exceptionها را ثبت کنید.
  • Source of truth، State machine و Event/Command/Data contract را تصویب کنید.
  • یک Workflow با Rule روشن و Compensation کم‌هزینه انتخاب کنید.
  • Baseline زمان، خطا، حجم، exception و هزینه را اندازه بگیرید.

روز ۳۱ تا ۶۰: Build و Failure test

  • Inbox/outbox، Idempotency، Retry/DLQ، audit و secrets را بسازید.
  • Duplicate/out-of-order/timeout/۴۲۹/schema/clock/compensation را تست کنید.
  • SLI/SLO، trace، reconciliation و Human queue را متصل کنید.
  • Shadow/Dry-run را با داده Sanitized اجرا کنید.

روز ۶۱ تا ۹۰: Canary و Operate

  • Canary محدود با Feature flag، guardrail و kill switch منتشر کنید.
  • Outcome و customer/finance/inventory guardrail را بسنجید.
  • چهار Runbook را Drill و Replay محدود را تمرین کنید.
  • Scale/iterate/kill، TCO، RACI و backlog Workflow بعدی را تصمیم بگیرید.

اشتباه‌های پرتکرار

اشتباهپیامداصلاح
اتوماسیون = بدون خطاBlast radius پنهانguardrail/reconcile/human
ابزار پیش از Processآشفتگی سریع‌ترmap/state/contract
Redirect پرداخت = successOrder غلطwebhook/query/reconciliation
Webhook دقیقاً یک‌بار و مرتبDuplicate/stale stateidempotency/version
Retry همه خطاهاstorm/duplicateerror taxonomy/backoff
DLQ بدون Ownerlost ordersSLO/runbook/replay
Email source of truthstate driftdomain state
Marketing و Transactional یکیconsent/frequency harmpurpose boundary
Low-code بدون Governancesecret/rule sprawlRBAC/version/audit
ROI فقط کاهش نیروهزینه Ops پنهانTCO/outcome/range

چک‌لیست Production

  • Process map، Source of truth، State machine و Owner مصوب‌اند.
  • Trigger/Eligibility/Precondition/Action/Success/Timeout/Compensation روشن‌اند.
  • Event/Command، ID/source/type/time/schema/version قرارداد دارند.
  • Inbox/outbox، Signature، Dedup و Idempotency پیش از Side effect هستند.
  • Duplicate، out-of-order، missing، late و stale version تست شده‌اند.
  • Inventory reservation/TTL/release و Payment reconciliation وجود دارد.
  • Retry taxonomy، Backoff/jitter، Circuit breaker، DLQ و Replay امن‌اند.
  • Notification/Marketing purpose، Consent، Suppression و PII جدا هستند.
  • Secret/RBAC/MFA/least privilege/audit/retention پیاده شده‌اند.
  • Human gate، Override، reason و resume path تست شده‌اند.
  • SLI/SLO، Trace، Queue age، mismatch و Business outcome Observable هستند.
  • Provider/Device/Operator/Timezone/Currency/ریال-تومان ایران تست شده‌اند.
  • Shadow/Canary/feature flag/kill/rollback و Runbook آماده‌اند.
  • TCO، RACI، Export/Exit و برنامه ۹۰روزه تصویب شده‌اند.

پرسش‌های متداول

اتوماسیون فروشگاه اینترنتی را از کجا شروع کنیم؟

از Process map و Baseline شروع کنید، نه خرید ابزار. یک Workflow پرتکرار با State و Rule روشن، داده قابل‌اعتماد، Exception کم و Compensation ساده انتخاب کنید. تأیید سفارش پس از پرداخت Reconcileشده می‌تواند مناسب باشد؛ سبد رهاشده لزوماً بهترین شروع همه فروشگاه‌ها نیست.

Idempotency در اتوماسیون سفارش چیست؟

یعنی تکرار همان Logical operation نتیجه ناخواسته تازه نسازد؛ مثلاً Webhook تکراری موجودی را دوبار کم یا Shipment دوم ایجاد نکند. کلید باید Payment attempt، Order transition یا Refund request مشخص را نمایندگی و در Storage پایدار Dedup شود.

آیا Webhookها فقط یک‌بار و به‌ترتیب می‌رسند؟

نباید چنین فرضی کنید. مستندات رسمی Providerهای بزرگ Duplicate و ترتیب نامطمئن را ذکر می‌کنند. Handler باید Signature را بررسی، Event را در Inbox پایدار ثبت، سریع Ack و پردازش را Idempotent و مقاوم به Event قدیمی/ناقص اجرا کند.

Low-code برای اتوماسیون فروشگاه کافی است؟

برای Pilot و Side effect ساده ممکن است کافی باشد؛ اما Workflow حساس Order/Payment/Inventory به State پایدار، Idempotency، Versioning، Retry/DLQ، Audit، Security، Observability و Exit نیاز دارد. Capability و سخت‌ترین Failure را در Pilot بسنجید، نه فقط ساخت Demo را.

چگونه ROI اتوماسیون را محاسبه کنیم؟

Benefit را از زمان دستی، Cycle time، ظرفیت، Error-loss range و Outcome مشتری بسازید؛ سپس License/Build، Integration، Execution، Message/API، Testing، Monitoring، Exception handling، Migration و Exit را به TCO اضافه کنید. نتیجه را Range و همراه Guardrail گزارش کنید، نه صرفاً «تعداد نیروی حذف‌شده».

جمع‌بندی: اتوماسیون خوب استثنا را پنهان نمی‌کند

فروشگاه مقیاس‌پذیر با چند Connector ساخته نمی‌شود؛ با حقیقت روشن، Transition معتبر، Retry امن، Compensation و عملیات قابل‌دیدن ساخته می‌شود. اتوماسیون باید Happy path را سریع و Exception را سریع‌تر آشکار کند، نه اینکه خطا را پشت Dashboard سبز پنهان سازد.

این هفته یک Order واقعی را از پرداخت تا تحویل و Refund روی کاغذ دنبال کنید. هر State، Owner، Event، Side effect و استثنا را بنویسید. سپس فقط یک Step را با Idempotency، SLO، Human fallback و Reconciliation خودکار کنید. اگر نمی‌توانید شکست آن را توضیح و بازیابی کنید، هنوز آماده Scale نیست.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *