فرض کنید درگاه پرداخت یک 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 | پیشنهاد دسته تیکت به Agent | Human review و feedback |
| Rule automation | ارسال تأیید سفارش پس از State معتبر | Eligibility/Idempotency |
| Workflow | پرداخت→رزرو→انبار→ارسال | State/Retry/Compensation |
| Decision automation | انتخاب مسیر Fulfillment | Policy/Explainability/Override |
| Autonomous agent | حل چندمرحلهای با Tool | Scope/approval/audit/kill switch |
اتوماسیون هدف نیست؛ وسیلهای برای کاهش زمان چرخه، Variance و کار دستیِ کمارزش است. گاهی Checklist انسانی از Workflow شکننده بهتر است.
اتوماسیون «بدون خطا» نیست
سیستم میتواند خطای ورود دستی را کم کند، اما خطاهای تازهای میسازد: Rule غلط روی همه سفارشها، Integration drift، Secret منقضی، Rate limit، Event تکراری، State قدیمی یا Mapping اشتباه SKU. بنابراین ادعای «دقت ۱۰۰٪» هم فنی نادرست و هم برای بودجه خطرناک است.
| خطا | Manual | Automated | کنترل |
|---|---|---|---|
| Entry typo | نسبتاً رایج | کمتر | Validation |
| Systematic rule error | Scope محدودتر | Blast radius زیاد | Canary/limit/approval |
| Duplicate action | ممکن | در Retry رایج | Idempotency/dedup |
| Stale state | قابلمشاهده برای Operator | پنهان در Integration | Version/precondition/reconcile |
| Silent failure | کار انجام نمیشود و دیده میشود | Queue/connector ممکن است خاموش بماند | SLO/alert/DLQ |
از Process map شروع کنید، نه ابزار
خرید Workflow tool پیش از شناخت فرایند، آشفتگی را سریعتر میکند. یک Order را از Intent تا تسویه مالی و Return دنبال کنید.
| مرحله | State/Artifact | Owner | استثنای مهم |
|---|---|---|---|
| Cart/Checkout | Cart، price quote، address | Commerce | تغییر قیمت/موجودی |
| Order create | Order ID و snapshot | Order service | Duplicate submit |
| Payment | attempt/authorization/capture | Finance/Payment | callback تأخیری/مبهم |
| Inventory | reservation/allocation | Inventory | oversell/expiry |
| Fulfillment | pick/pack/ship | Warehouse | partial/backorder |
| Delivery | tracking/proof | Carrier/Ops | lost/returned |
| After-sales | cancel/return/refund | Support/Finance | partial/dispute |
| Reconciliation | order/payment/inventory/ledger | Finance/Ops | state mismatch |
اتوماسیون مناسب را اولویتبندی کنید
«تکراری بودن» تنها معیار نیست. Frequency، manual time، error cost، data readiness، reversibility و exception rate را کنار هم بگذارید.
| معیار | امتیاز بالا یعنی | ریسک |
|---|---|---|
| Volume | دفعات زیاد | Blast radius نیز زیاد |
| Rule clarity | Eligibility و Outcome روشن | Edge case پنهان |
| Data quality | State/ID قابلاعتماد | garbage-in |
| Error cost | صرفهجویی بالقوه زیاد | Automation error گران |
| Reversibility | Rollback/compensation ممکن | پیام/ارسال/Refund برگشتناپذیر |
| Exception rate | مسیر استاندارد غالب | Human queue اشباع |
ابتدا Workflowی را انتخاب کنید که State روشن، Outcome قابلسنجش و Compensation کمهزینه دارد؛ نه الزاماً پرزرقوبرقترین Use case.
Source of truth را برای هر موجودیت تعیین کنید
| موجودیت | Source of truth نمونه | Replica/Consumer |
|---|---|---|
| Order | Commerce/order database | CRM، WMS، Analytics |
| Payment | Payment provider + internal ledger | Order/support |
| Inventory | Inventory/WMS | Storefront/marketplace |
| Shipment | Fulfillment/carrier integration | Order/support/customer |
| Customer/Consent | Identity/CRM/consent registry | Messaging/analytics |
| Product/Price | Catalog/pricing service | storefront/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 |
|---|---|---|---|
| created | Order ID و snapshot ساخته شد | awaiting_payment/cancelled | هیچ Fulfillmentی |
| awaiting_payment | price/inventory precheck | paid/payment_uncertain/expired | payment attempt |
| paid | payment reconciled | allocated/refund_pending | reserve/allocate |
| allocated | stock assignment | packing/backorder/cancel | warehouse task |
| shipped | carrier acceptance | delivered/exception/returned | tracking notice |
| delivered | delivery evidence/policy | return_window/closed | after-sales eligibility |
مستند رسمی WooCommerce Orders API وضعیتهای Platform را نشان میدهد؛ Mapping داخلی→Platform باید Versioned و قابلآزمون باشد. مستقیمبردن همه منطق به Statusهای افزونهای، مهاجرت و Reconciliation را سخت میکند.
Event، Command و State را جدا کنید
| نوع | معنی | نام خوب | نام بد |
|---|---|---|---|
| Event | واقعیتی که رخ داده | payment.succeeded | processOrder |
| Command | درخواست انجام عمل | reserveInventory | inventoryChanged |
| 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 دقیق چیست؟ |
| Idempotency | Logical operation key چیست؟ |
| Success | چه Evidenceی Outcome را اثبات میکند؟ |
| Timeout/Retry | کدام خطا قابل Retry و تا چه زمانی؟ |
| Compensation | اگر Step بعدی شکست خورد چه خنثی میشود؟ |
| Escalation | چه زمانی Human، با چه Contextی؟ |
| Data/Policy | PII/Consent/retention/secret چیست؟ |
| Owner/SLO | چه کسی پاسخگو و چه شاخصی؟ |
Idempotency؛ Retry امن
عمل Idempotent با تکرار همان درخواست، Outcome جدید ناخواسته نمیسازد. کلید باید Logical operation را مشخص کند؛ نه Timestamp تصادفی در هر Retry.
| عمل | Idempotency key نمونه | اثر Duplicate |
|---|---|---|
| ثبت پرداخت سفارش | payment_attempt_id | Ledger entry دوم ساخته نشود |
| رزرو SKU | order_id+line_id+reservation_v | Quantity دوبار کم نشود |
| ارسال تأیید | order_id+template_v+channel | پیام تکراری نرود |
| ساخت Shipment | fulfillment_id+parcel_no | بارنامه دوم نسازد |
| Refund | refund_request_id | مبلغ دوبار برنگردد |
Stripe در مستند Webhook رسمی صریحاً میگوید Event تکراری ممکن است برسد، ترتیب تولید تضمین نیست و Handler بهتر است Asynchronous باشد. Shopify نیز در راهنمای تحویل Webhook عملیات Idempotent و Dedup بر اساس Webhook ID را توصیه میکند. این رفتارها را Exception ندانید؛ مبنای طراحی قرار دهید.
Inbox، Dedup و Ack سریع
- Raw body و Signature را طبق Provider و قبل از Parse نامناسب Validate کنید.
- Event ID، source، type، received_at و payload hash را در Inbox پایدار ثبت کنید.
- Unique constraint/Dedup را پیش از Side effect اعمال کنید.
- پس از پذیرش پایدار، پاسخ موفق سریع بدهید؛ Business logic سنگین را Queue کنید.
- Worker با State/Version تازه Eligibility را دوباره بررسی کند.
- نتیجه، 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؟
| مدل | مزیت | ریسک | مناسب |
|---|---|---|---|
| Orchestration | State/Timeout/Compensation مرکزی و قابلدیدن | Coordinator coupling/bottleneck | Order workflow چندمرحلهای حساس |
| Choreography | Consumer مستقل و توسعه توزیعشده | Flow پنهان، loop و debugging دشوار | Notification/analytics side effects |
| Hybrid | Core flow هماهنگ، side effect event-driven | Boundary نیازمند Governance | بیشتر فروشگاههای متوسط |
برای Payment→Inventory→Fulfillment معمولاً Visibility و Compensation مهم است؛ برای Analytics یا اطلاعرسانی، Consumer مستقل مناسبتر است. Tool نباید معماری را بهجای نیاز انتخاب کند.
Saga و Compensation
Transaction توزیعشده میان درگاه، انبار و شرکت حمل معمولاً در اختیار شما نیست. اگر پرداخت موفق و رزرو موجودی ناموفق شد، «Rollback database» کافی نیست؛ Business compensation لازم است.
| Step | Action | Compensation احتمالی | نکته |
|---|---|---|---|
| Payment authorize | Hold/authorize | void/release | Policy Provider |
| Inventory reserve | Quantity hold | release reservation | TTL و owner |
| Capture | دریافت وجه | refund request | برگشت فوری/قطعی فرض نشود |
| Shipment create | بارنامه/ماموریت | cancel shipment | بعد از pickup شاید ناممکن |
| Customer message | اعلام وضعیت | پیام اصلاحی | ارسالشده پاک نمیشود |
Compensation همیشه معکوس ریاضی نیست؛ ممکن است هزینه، تأخیر یا دخالت انسان داشته باشد. State آن نیز باید Observable باشد.
Inventory؛ Available با On-hand یکی نیست
| مفهوم | تعریف | ریسک |
|---|---|---|
| On-hand | فیزیکی ثبتشده | خرابی/کسری ثبتنشده |
| Reserved | برای Order/Cart نگهداشته | Reservation منقضینشده |
| Available | On-hand منهای Reservation/Buffer | Replication 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 | منتظر نتیجه معتبر | شناسه و امکان ادامه |
| succeeded | Reconcile amount/order؛ transition idempotent | تأیید واحد |
| failed | دلیل امن و Retry policy | راه تلاش دوباره |
| uncertain | Query provider/reconciliation؛ Fulfillment hold | پیام «در حال بررسی»، نه پرداخت مجدد کور |
| refunded | Refund ID/amount/state | زمان و Scope روشن |
پرداخت ناموفق و Retry انسانی
Auto-retry پرداخت بدون Contract ممکن است Duplicate charge یا تجربه نگرانکننده بسازد. برای هر روش پرداخت مشخص کنید آیا Retry خودکار مجاز است، User action لازم است، Token/Consent وجود دارد و چه فاصله/حدی رعایت میشود. در پرداخت یکباره ایرانی، اغلب مسیر امن «ساخت تلاش تازه با Order ثابت و Attempt ID تازه» است.
Fulfillment و ارسال
| Automation | Precondition | Exception |
|---|---|---|
| ساخت Pick task | paid+allocated | hazmat/oversize/manual review |
| انتخاب انبار | stock/capacity/cutoff | split shipment |
| ساخت Label | address/weight/service valid | provider timeout/invalid address |
| اعلام Tracking | carrier acceptance نه فقط label | label cancelled |
| Delivery update | carrier event version | out-of-order/false delivered |
Label creation با Shipment pickup برابر نیست. Customer message باید Stage واقعی را منتقل کند و Provider mapping versioned باشد.
Cancellation، Return و Refund
این مسیرها را بعداً وصله نکنید؛ همان State machine اصلیاند.
| درخواست | Eligibility | Automation boundary |
|---|---|---|
| Cancel before fulfillment | State/warehouse cutoff | release reserve + void/refund |
| Cancel after label | carrier/warehouse capability | human/compensation ممکن |
| Partial return | line/quantity/window/condition | line-level state |
| Refund | approved amount/method | request≠settled |
| Restock | inspection/disposition | فوری پس از درخواست نه |
Notification؛ نتیجه State، نه Source of truth
Email/SMS/Push باید از Transition معتبر مشتق شود. Message status نباید Order status را تعیین کند.
| فیلد | نمونه |
|---|---|
| Purpose | Transactional یا Marketing |
| Eligibility | State، consent/channel، quiet rule |
| Template version | order-confirmed.fa.v4 |
| Idempotency | order+transition+channel+template |
| Provider state | accepted/delivered/failed/unknown |
| Fallback | in-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 | تصمیم مالی |
| آسیب/ایمنی | فوری flag | Priority 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/Quota | throttle/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 unknown | deploy compatible consumer یا transform |
| Business invalid | اصلاح Source/Manual resolution؛ replay کور نه |
| Security suspect | Quarantine، عدم پردازش، incident |
| Duplicate | Mark 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↔Order | paid provider / unpaid order | hold fulfillment، reconcile |
| Order↔Inventory | paid / no reservation | allocate یا compensate |
| Shipment↔Order | carrier delivered / order shipped | version check/update |
| Refund↔Ledger | requested / not settled | follow-up/escalate |
| Channel↔Catalog | price/stock stale | republish/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 tamper | signature/raw body/timestamp/dedup |
| Credential | نشت/دسترسی زیاد | secret manager/rotation/least privilege |
| Workflow UI | تغییر Rule بدون review | RBAC/MFA/approval/audit |
| Payload | PII در Log/DLQ | minimize/redact/encrypt/retention |
| Connector | supply-chain/permission drift | inventory/review/revoke |
| Replay | Side effect گسترده | dry run/scope/approval/kill switch |
| Agent/AI | tool misuse/prompt data | allowlist/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/Durability | Workflow و Timer پس از Crash ادامه مییابد؟ |
| Idempotency | Dedup و logical key چگونه است؟ |
| Retry/DLQ | Policy، replay و audit دارد؟ |
| Versioning | Workflow در حال اجرا با Deploy جدید چه میشود؟ |
| Secrets/RBAC | scope/rotation/MFA/approval؟ |
| Observability | trace/state/attempt/payload redaction؟ |
| Testing | fixture/sandbox/clock/failure injection؟ |
| Export/Exit | definition/history/data portable؟ |
| Iran fit | eligibility/payment/latency/support/mirror؟ |
نام ابزارها و پلن رایگان سریع عوض میشوند. خرید را با Pilot روی یک Workflow سخت، Export test و TCO سهساله انجام دهید.
Build یا Buy یا Low-code؟
| مدل | مناسب | ریسک |
|---|---|---|
| Built-in platform | Flow ساده نزدیک Platform | محدودیت/lock-in |
| Low-code/iPaaS | Integration سبک و سرعت Pilot | state/debug/cost/secret sprawl |
| Workflow engine | Flow طولانی/Timer/compensation | operational complexity |
| Custom service | Core differentiation/high scale | مالکیت کامل maintenance |
| Hybrid | Core durable، peripheral low-code | boundary/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 latency | Trigger→durable inbox | source/type |
| Completion latency | eligible trigger→business outcome | workflow/stage |
| Success rate | terminal success ÷ eligible runs | provider/version |
| Duplicate suppression | deduped ÷ received | source/type |
| Queue age | oldest actionable message | priority/provider |
| DLQ rate | terminal failures ÷ runs | reason/schema |
| Reconciliation mismatch | inconsistent entities ÷ checked | pair/state |
| Human exception | escalated ÷ runs + resolution time | reason/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ی دارد؟ |
| Provider | Latency/error/rate-limit کدام Integration؟ |
| Queue | Age/depth/drain/priority چگونه است؟ |
| Business | کدام Outcome/guardrail متاثر است؟ |
| Change | کدام version/deploy/rule تغییر کرد؟ |
اصول Log/Metric/Trace/SLO و Incident در راهنمای Observability تفصیل داده شدهاند.
تست اتوماسیون
| تست | سناریو |
|---|---|
| Contract | schema/version/enum/unknown field |
| State transition | valid/invalid/concurrent/stale version |
| Idempotency | same event/request ۲/۱۰/۱۰۰ بار |
| Ordering | out-of-order/missing/late |
| Failure | timeout/5xx/429/401/400/partial |
| Clock | TTL/cutoff/timezone/holiday/late callback |
| Compensation | هر Step پس از Side effect شکست بخورد |
| Replay | dry-run/scope/dedup/kill |
| Load | sale spike/backlog/provider quota |
| Security | bad signature/replay/permission/secret rotate |
| Human | override/escalate/resume/audit |
Shadow، Canary و Feature flag
- Shadow: Event را بخوانید اما Side effect نکنید؛ تصمیم پیشنهادی را با واقعیت مقایسه کنید.
- Dry-run: اثر هر Command را Preview کنید.
- Canary: درصد کوچک یا Store/Provider محدود.
- Guardrail: error/duplicate/queue age/customer harm.
- Kill switch: توقف Side effect با حفظ Inbox.
- Rollback: workflow version و compensation plan.
Pipeline، Artifact، Provenance، Canary و Rollback در راهنمای CI/CD امن آمده است.
TCO و ROSI اتوماسیون
| Bucket | هزینه |
|---|---|
| Build/license | engine/iPaaS/plugin/development |
| Integration | API mapping/sandbox/certification |
| Run | executions/compute/queue/SMS/email/API |
| Quality | test data/failure injection/security |
| Operations | monitoring/on-call/DLQ/reconciliation |
| Change | provider/schema/business-rule migration |
| Exception | human handling/compensation/support |
| Exit | export/rebuild/history/credential rotation |
Benefit را با manual minutes، cycle time، error-loss range، capacity و customer outcome بسنجید. فرض «نیروی انسانی حذف میشود» را مستقیم به Savings تبدیل نکنید؛ کار به Exception handling، QA و improvement منتقل میشود.
RACI
| کار | Responsible | Accountable | Consulted |
|---|---|---|---|
| Process/Policy | Ops/Product | Business owner | Support/Finance |
| State/Event contract | Engineering | Architecture owner | Ops/Data |
| Payment/Refund | Finance/Engineering | Finance owner | Support/Risk |
| Inventory/Fulfillment | Warehouse/Ops | Operations owner | Commerce |
| Security/Privacy | Security/Legal | Publisher | Engineering/Marketing |
| SLO/Incident | SRE/Engineering | Engineering lead | Ops/Providers |
| Measurement | Analytics/Finance | Product owner | Ops/Support |
Runbook: Webhook تکراری Side effect ساخته
- Consumer/Workflow Side effect را Pause؛ Inbox را نگه دارید.
- Scope را با event/object/type و logical idempotency key پیدا کنید.
- Payment/inventory/shipment/message را جدا Reconcile کنید.
- Compensation را بر اساس Harm و Reversibility اجرا کنید.
- Dedup boundary/unique constraint/transaction ordering را Fix و Backfill تست کنید.
- Replay را Dry-run و سپس محدود اجرا کنید.
Runbook: Payment موفق است اما Order پرداختنشده
- Fulfillment را تا تعیین تکلیف Hold کنید؛ از پرداخت مجدد کور جلوگیری کنید.
- Provider reference، amount/currency/order ID و attempt را Validate کنید.
- Webhook Inbox/signature/dedup/worker/DLQ و ordering را بررسی کنید.
- با Conditional transition و Audit، Order را Reconcile کنید.
- پیام دقیق برای Customer/Support و Query جلوگیری از تکرار بسازید.
Runbook: Queue عقب افتاده است
- Age/depth/arrival/drain و Provider quota را اندازه بگیرید.
- Payment/Order/Fulfillment را از Marketing/Review اولویت دهید.
- Poison message، retry storm، downstream outage و deploy را تفکیک کنید.
- Concurrency را تا حد Safe بالا یا Side effect کماهمیت را Shed کنید.
- بعد از Drain، State و missed SLA را Reconcile و مشتری متاثر را مدیریت کنید.
Runbook: موجودی منفی یا Oversell
- Channel write و فروش SKU متاثر را موقت محدود کنید.
- On-hand/reserved/allocated/available و versionها را بازسازی کنید.
- Duplicate reservation، stale event، TTL race و sync lag را بررسی کنید.
- Orderها را بر اساس Policy allocate/backorder/cancel و Customer را آگاه کنید.
- Atomic condition، safety stock، version guard و reconciliation را اصلاح کنید.
Runbook: Provider خارجی/داخلی قطع شده
- Circuit breaker؛ درخواست تازه بیپایان نفرستید.
- Inbox/Queue پایدار، TTL و ظرفیت را بررسی کنید.
- Fallback/manual route و Customer message را بر اساس Stage فعال کنید.
- Recovery را با Canary و Rate محدود آغاز کنید.
- 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 پرداخت = success | Order غلط | webhook/query/reconciliation |
| Webhook دقیقاً یکبار و مرتب | Duplicate/stale state | idempotency/version |
| Retry همه خطاها | storm/duplicate | error taxonomy/backoff |
| DLQ بدون Owner | lost orders | SLO/runbook/replay |
| Email source of truth | state drift | domain state |
| Marketing و Transactional یکی | consent/frequency harm | purpose boundary |
| Low-code بدون Governance | secret/rule sprawl | RBAC/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 نیست.






