یک سفارش ثبت میشود؛ فروشگاه موجودی را کم میکند، ERP پیام را نمیگیرد، CRM همان سفارش را دوباره میسازد و اپراتور هم Refund را از پنل درگاه انجام میدهد. نتیجه میتواند فروش کالای ناموجود، فاکتور تکراری یا بازپرداخت دوباره باشد. مشکل از «وصلنبودن نرمافزارها» نیست؛ از تعریفنشدن مالک داده، وضعیت سفارش و رفتار سیستم هنگام شکست است.
یکپارچهسازی CRM و ERP با فروشگاه اینترنتی پروژه نصب Connector نیست. این کار طراحی یک زنجیره عملیاتی است که باید بداند هر واقعیت کجا ساخته میشود، با چه شناسهای حرکت میکند، Retry چه اثری دارد و اختلاف داده چگونه کشف و اصلاح میشود. در این راهنما، از تصمیم و Data contract تا معماری، امنیت، مهاجرت و عملیات روزانه پیش میرویم.
CRM، ERP و فروشگاه دقیقاً چه نقشی دارند؟
CRM تعاملات، سرنخ، فرصت فروش، رضایت ارتباطی و تاریخچه رابطه با مشتری را مدیریت میکند. ERP معمولاً مالک بخشی از عملیات مالی، حسابداری، خرید، کالا و منابع سازمان است. فروشگاه نیز تجربه Catalog، سبد، Checkout و ثبت سفارش آنلاین را ارائه میدهد. اما مرز واقعی به محصول و فرایند سازمان بستگی دارد؛ نام نرمافزار بهتنهایی مالکیت داده را تعیین نمیکند.
در فروشگاه بزرگتر، OMS برای چرخه سفارش، PIM برای اطلاعات محصول، WMS برای عملیات انبار، درگاه برای تراکنش و 3PL برای حمل نیز حضور دارند. اگر این نقشها را به زور داخل «CRM یا ERP» جا دهید، مدل مبهم میشود.
| قابلیت | سیستم محتمل | پرسش مالکیت |
|---|---|---|
| هویت و ترجیح ارتباطی مشتری | CRM / Identity / Consent service | کدام سیستم Merge و لغو رضایت را نهایی میکند؟ |
| نام، ویژگی و رسانه محصول | PIM / ERP / Commerce | نسخه قابل انتشار و تاریخ اثر کجا تأیید میشود؟ |
| موجودی فیزیکی و قابل فروش | WMS / ERP / OMS | On-hand، Reserved و Available-to-promise چه تفاوتی دارند؟ |
| سفارش و وضعیت آن | OMS / Commerce | State machine و شماره مرجع نهایی متعلق به کجاست؟ |
| تراکنش پرداخت | Gateway / Payment service | منبع حقیقت موفقیت پرداخت Callback تأییدشده است یا Redirect مرورگر؟ |
| فاکتور و سند مالی | ERP / Accounting | چه رویدادی سند را قطعی، باطل یا اصلاح میکند؟ |
| Pick، Pack و Shipment | WMS / 3PL | کد رهگیری و وضعیت تحویل از کدام منبع پذیرفته میشود؟ |
| تحلیل و گزارش | Warehouse / BI | آیا گزارش از رخداد عملیاتی ساخته میشود یا دیتابیس تولید را تغییر میدهد؟ |
«منبع واحد حقیقت» به معنی یک دیتابیس برای همهچیز نیست؛ یعنی برای هر واقعیت، یک مالک و قاعده حل تعارض روشن وجود دارد.
آیا اکنون به یکپارچهسازی CRM و ERP نیاز دارید؟
یکپارچگی همیشه ارزشمند نیست. اگر روزانه ده سفارش دارید و یک مسئول با Export کنترلشده، تطبیق و ثبت را درست انجام میدهد، اتوماسیون پیچیده ممکن است هزینه و ریسک بیشتری بسازد. ابتدا درد عملیاتی و حجم تغییر را اندازه بگیرید.
| نشانه | شاهد لازم | پاسخ محتمل |
|---|---|---|
| Oversell یا لغو بهعلت موجودی | نرخ سفارش ناموجود و تأخیر Sync | رزرو، ATP و همگامسازی سریع موجودی |
| ثبت دستی تکراری | ساعت کار، خطا و Rework | جریان سفارش به ERP با کنترل Idempotency |
| پشتیبانی بدون دید سفارش | زمان پاسخ و انتقال بین تیمها | نمای Read-only وضعیت معتبر در CRM |
| اختلاف مالی | تفاوت Order، Payment، Invoice و Refund | Ledger و Reconciliation روزانه |
| کمپین اشتباه | پیام پس از لغو رضایت یا خرید | مالکیت Consent و Event معتبر Lifecycle |
| فقط علاقه به «Real-time» | هیچ SLO یا زیان تأخیر تعریف نشده | ابتدا SLA و ارزش تأخیر را تعیین کنید |
Baseline را با تعداد سفارش، Peak، نرخ خطای دستی، زمان پردازش، اختلاف موجودی، Refund، تماس پشتیبانی و Contribution ثبت کنید. اگر مسئله اصلی در Pick/Pack و ارسال است، راهنمای مدیریت انبار، Fulfillment و ارسال ابتدا مدل عملیاتی را روشن میکند.
از Journey و Failure شروع کنید، نه از API
یک مسیر عمودی انتخاب کنید: مثلاً «ثبت سفارش تا تحویل» یا «مرجوعی تا بازپرداخت». سپس State، مالک، ورودی، خروجی، شکست و اقدام انسانی هر گام را ثبت کنید. فهرست Endpointها بدون این نقشه فقط نشان میدهد چه چیزی ممکن است، نه اینکه چه چیزی باید رخ دهد.
Journey: سفارش پرداختشده تا ارسال
Trigger: payment.confirmed
Owner of order state: OMS
Inputs: order_id, payment_id, amount, currency, version
Effects: reserve/confirm inventory → create ERP order → release to WMS
Failure policy: retry bounded → quarantine → human review
Reconciliation: payment ↔ order ↔ invoice ↔ shipment
SLO: 99% orders released to warehouse within 5 minutes
Guardrails: no duplicate invoice, no negative ATP, no shipment before confirmationبرای ارزیابی عمومی API، Webhook، Batch، امنیت و خروج از Vendor، راهنمای یکپارچهسازی سایت چارچوب مکملی ارائه میکند. این مقاله روی مرزهای خاص CRM، ERP و Commerce تمرکز دارد.
ماتریس Source of Truth بسازید
برای هر Entity و حتی هر Field، «مالک نوشتن» را تعیین کنید. دوطرفهکردن Sync بهطور پیشفرض تصمیم خطرناکی است. اگر شماره تلفن در فروشگاه و CRM همزمان ویرایش شود، کدام برنده است؟ آیا Last-write-wins با ساعتهای ناهماهنگ قابل اعتماد است؟ آیا اپراتور باید Conflict را ببیند؟
| داده | مالک پیشنهادی نمونه | جهت انتشار | قاعده تعارض |
|---|---|---|---|
| SKU و واحد کالا | ERP/PIM | به Commerce و WMS | ویرایش خارج از مالک رد یا Flag شود |
| قیمت پایه | ERP/Pricing | به Commerce | Effective_at و Currency اجباری |
| موجودی قابل فروش | OMS/WMS | به Commerce | Version بالاتر؛ Snapshot برای بازیابی |
| سفارش | OMS/Commerce | به ERP، CRM و WMS | Order ID پایدار؛ ایجاد فقط یکبار |
| وضعیت پرداخت | Payment service | به OMS و ERP | تأیید Server-to-server و Amount match |
| رضایت بازاریابی | Consent/CRM | به ابزارهای ارسال | لغو جدیدتر فوراً مقدم است |
| وضعیت حمل | WMS/3PL | به OMS، CRM و مشتری | Transition مجاز و Event time |
| Refund مالی | Payment/ERP با Orchestrator | به OMS و CRM | Reference و Idempotency مستقل |
CRM برای «دید ۳۶۰ درجه» لازم نیست مالک کپی همه دادهها باشد. اغلب یک نمای ترکیبی یا Read model با حداقل فیلدهای لازم امنتر و تازهتر است. داده خام رفتار مرور نیز فقط با هدف، رضایت و دوره نگهداشت روشن وارد CRM شود.
شناسه مشترک و Data Contract
اتصال بدون شناسه پایدار، اختلاف را فقط سریعتر میکند. ایمیل یا تلفن کلید مناسبی برای سفارش نیست: تغییر میکند، ممکن است مشترک باشد و قالبهای مختلف دارد. برای Customer، Product/SKU، Order، Order line، Payment، Invoice، Shipment، Return و Refund شناسه مستقل و جدول Cross-reference داشته باشید.
{
"event_id": "01J...",
"event_type": "commerce.order.paid.v2",
"occurred_at": "2026-08-11T10:14:22Z",
"producer": "payment-service",
"correlation_id": "checkout_8f2...",
"entity_id": "order_104872",
"entity_version": 7,
"currency": "IRR",
"amount_minor": 248000000,
"data": { "payment_id": "pay_..." }
}قرارداد باید نوع، اجباری/اختیاریبودن، Enum، واحد، Currency، منطقه زمانی، Nullable، محدودیت طول، PII classification، Version و مثال داشته باشد. استاندارد CloudEvents یک Envelope بیطرف از Vendor برای شناسه، منبع، نوع و زمان رخداد پیشنهاد میکند؛ استفاده از آن جای تعریف معنای کسبوکاری Payload را نمیگیرد.
ریال، تومان، تاریخ و متن فارسی
در ایران، مقدار نمایشی «تومان» و مقدار API «ریال» را با یک Flag مبهم جابهجا نکنید. واحد پول و مقیاس عدد باید صریح باشند و Total از جمع Line، تخفیف، مالیات و ارسال Reconcile شود. زمان را در UTC ذخیره و نمایش را با Asia/Tehran انجام دهید. تاریخ شمسی فقط Presentation باشد مگر Contract واقعاً آن را مشخص کرده باشد. ی/ک، نیمفاصله، ارقام فارسی/لاتین، تلفن با کد کشور و آدرس چندخطی را با Fixture واقعی تست کنید.
Sync، Webhook یا Batch؟
«Real-time» یک روش واحد نیست. هر جریان بر اساس Latency budget، حجم، تحمل ناسازگاری و رفتار شکست انتخاب میشود.
| الگو | مناسب برای | ریسک | کنترل لازم |
|---|---|---|---|
| API همزمان | استعلام کوتاه یا Validation لازم در Request | زنجیره وابستگی، Timeout و کندی Checkout | Timeout، Circuit breaker، Cache و Fallback |
| Webhook | اعلان تغییر از SaaS یا درگاه | تکرار، ترتیب نامطمئن و جعل | Signature، Timestamp، Inbox، Queue و Fetch canonical |
| Event/Queue | تغییرات حجیم و Decoupled | Eventual consistency و عملیات پیچیده | Idempotency، Ordering scope، DLQ و Replay |
| Batch/File | Backfill، Catalog بزرگ و تطبیق دورهای | تأخیر و Partial load | Checksum، Manifest، Watermark و Atomic publish |
| CDC/Outbox | انتشار قابل اتکای تغییر مالک داده | Schema coupling و Lag | Committed rows، Offset، Version و Idempotent consumer |
برای Checkout، وابستگی همزمان به CRM معمولاً لازم نیست؛ کندی CRM نباید خرید را متوقف کند. سفارش را در مالک خود ثبت و انتشار را صفبندی کنید. در مقابل، تأیید قیمت یا مجازبودن روش پرداخت ممکن است پیش از تعهد، پاسخ معتبر بخواهد. معماری رویدادمحور مزایا و هزینههای عملیاتی دارد؛ راهنمای Event-Driven، Outbox و Saga این Trade-off را عمیقتر بررسی میکند.
Point-to-point، Connector، iPaaS یا لایه سفارشی؟
| گزینه | مزیت | محدودیت | Fit |
|---|---|---|---|
| Connector بومی | راهاندازی سریع و پشتیبانی Vendor | Mapping و Failure policy محدود | جریان استاندارد و حجم کم/متوسط |
| Point-to-point | ساده برای یک اتصال | با رشد سیستمها N×N و شکننده | موقت، محدود و با مالک روشن |
| iPaaS | Orchestration، Mapping و مانیتورینگ آماده | هزینه، Lock-in، محدودیت Runtime و داده | چند SaaS با الگوهای نسبتاً استاندارد |
| Integration service سفارشی | کنترل Contract، Reliability و Security | هزینه ساخت و On-call | دامنه متمایز و ریسک/حجم بالا |
| Hybrid | تفکیک Commodity از جریان بحرانی | Governance چند ابزار | اغلب سازمانهای در حال رشد |
تصمیم را بر اساس Coverage سناریو، Limit API، Bulk/Delta، Webhook، Sandbox، Log، Replay، Data residency، Security، SLA، قیمت در Peak، Export و Exit بگیرید. فهرست برندهای مشهور، پاسخ معماری نیست. یک Pilot با داده نماینده اجرا کنید و Vendor را با خرابی واقعی بسنجید.
چرخه سفارش را State machine طراحی کنید
سفارش فقط «جدید، ارسالشده، تمامشده» نیست. Payment، Inventory، Fulfillment و مالی Lifecycleهای جدا دارند که باید با قانون به هم متصل شوند. پرداخت موفق لزوماً به معنی موجودی قطعی نیست و ارسالشدن لزوماً به معنی تحویل یا درآمد حفظشده نیست.
Order: draft → placed → awaiting_payment → paid
→ allocated → released → shipped → delivered
↘ cancelled / partially_cancelled
Return: requested → approved → received → inspected
→ refund_authorized → refunded / rejected
Invalid transitions:
shipped → awaiting_payment
refunded → refund_authorized again
cancelled → released without explicit reopen commandهر Transition باید Actor، Preconditions، Event، Side effects و Compensation داشته باشد. Partial shipment، Split payment، قیمت تغییرکرده، Backorder، لغو بخشی، Return بخشی، RTO و Refund ناموفق را در طراحی اولیه بگنجانید. برای اجرای جزئیات Order automation، راهنمای اتوماسیون فروشگاه الگوی State machine، Inbox/Outbox و Reconciliation را شرح میدهد.
موجودی: On-hand با Available-to-promise یکی نیست
کمکردن موجودی در لحظه ایجاد سفارش کافی نیست. باید بدانید چه زمانی Reserve میکنید، Reservation چه TTL دارد، پرداخت ناموفق چه زمانی آن را آزاد میکند و Fulfillment از کدام Location انجام میشود.
ATP = On-hand
- Reserved valid
- Safety stock
- Damaged / quarantine
+ Confirmed inbound allowed by promise policyUpdate موجودی باید Version یا Sequence داشته باشد تا Event دیررس مقدار جدید را عقب نبرد. Snapshot دورهای برای بازیابی و Event برای تغییر سریع میتوانند کنار هم باشند. Negative inventory، Reservation منقضی، Stock divergence و Oversell را مانیتور کنید.
هویت مشتری و Consent را جدا از سفارش نگه دارید
Guest checkout، چند ایمیل، شماره تلفن تغییرکرده، خرید شرکتی و حساب مشترک خانواده باعث میشوند Merge ساده بر اساس ایمیل خطرناک باشد. یک Customer ID داخلی، Evidence اتصال شناسهها و فرایند Merge/Unmerge قابل ممیزی لازم است.
خرید، رضایت برای پیام بازاریابی نیست. Purposeهای تراکنشی، پشتیبانی و بازاریابی را جدا کنید. لغو رضایت باید با Timestamp و Source به ابزارهای ارسال برسد و در شکست Sync، Fail-safe باشد. تحلیل سگمنت، RFM، CLV و Churn نیز پس از کیفیت Identity و سفارش معنا پیدا میکند؛ تحلیل داده مشتریان فروشگاه این لایه را پوشش میدهد.
Reliability: «دقیقاً یکبار» را وعده ندهید
Webhook و Queue ممکن است پیام را تکرار کنند؛ شبکه میتواند پاسخ را گم کند؛ Consumer ممکن است پس از انجام اثر و پیش از ثبت موفقیت Crash کند. بنابراین Side effectهای کسبوکاری باید Idempotent باشند. مستندات رسمی Stripe Webhooks نیز دریافت رویداد تکراری، پردازش Async و نگهداری Event IDهای پردازششده را جزو بهترین رویهها میداند؛ این اصل به Vendor خاص محدود نیست.
Idempotency و Inbox
برای Create order، Issue invoice و Refund کلید کسبوکاری مستقل داشته باشید. Consumer باید Event ID و Outcome را در همان مرز تراکنش ثبت کند. Retry با همان Key، نتیجه قبلی را برگرداند و اثر دوم نسازد.
Transactional Outbox
نوشتن سفارش در دیتابیس و انتشار Event دو عملیات جدا هستند. اگر یکی موفق و دیگری شکست بخورد، دادهها واگرا میشوند. الگوی Transactional Outbox در AWS Prescriptive Guidance تغییر دامنه و رکورد Outbox را در یک تراکنش ثبت و انتشار را جدا میکند؛ Consumer همچنان باید تکرار را تحمل کند.
Retry، DLQ و Replay
Retry باید محدود، با Exponential backoff و Jitter باشد. خطای Validation با Retry حل نمیشود و باید Quarantine شود. DLQ قبرستان پیام نیست: Owner، SLA، ابزار Inspect/Correct/Replay و ثبت اثر Replay لازم دارد. Replay باید همان Idempotency و Authorization مسیر عادی را طی کند.
Ordering و داده دیررس
Ordering جهانی معمولاً پرهزینه و غیرضروری است؛ ترتیب را در Scope سفارش یا SKU تعریف کنید. Entity version، Event time و Processing time را جدا نگه دارید. اگر `order.shipped.v8` پیش از `order.paid.v7` رسید، Transition نامعتبر نباید کورکورانه اعمال شود.
Reconciliation؛ شبکه ایمنی یکپارچهسازی
حتی معماری خوب هم اختلاف خواهد داشت. Reconciliation یک Job موقت بعد از Launch نیست؛ کنترل دائمی مالی و عملیاتی است. حداقل این مجموعهها را مقایسه کنید:
- Orderهای Paid در درگاه بدون Order متناظر؛
- Orderهای Paid بدون Invoice یا Allocation؛
- جمع Order lines با Invoice، Discount، Shipping و Tax؛
- Refund در Payment بدون Credit note یا وضعیت Return؛
- Shipment تحویلشده بدون تغییر سفارش؛
- SKU/Price/Inventory نسخه متفاوت بین مالک و Storefront؛
- Consent لغوشدهای که در ابزار ارسال فعال مانده است.
هر اختلاف باید Severity، Owner، Root cause، اصلاح داده، اصلاح سیستم و Audit trail داشته باشد. داشبورد «۱۰۰٪ Sync موفق» اگر داده گمشده را نمیبیند، آرامش کاذب میسازد.
امنیت API و Webhook
اتصال ERP مسیر پرقدرتی به قیمت، موجودی، مالی و اطلاعات مشتری است. یک Token مشترک با دسترسی کامل، Blast radius را بزرگ میکند. OWASP API Security Top 10 2023 ریسکهایی مانند Broken object/function authorization، مصرف نامحدود منابع، فهرست ناقص API و اعتماد ناامن به APIهای ثالث را برجسته میکند.
- برای هر Integration هویت Workload، Scope و Least privilege جدا بسازید.
- Webhook را با Signature روی Raw body، Timestamp و پنجره Replay بررسی کنید.
- Secret را در Vault نگه دارید، Rotate کنید و هرگز در Log یا Payload نفرستید.
- Object-level و Function-level authorization را Server-side کنترل کنید.
- Rate limit، اندازه Payload، Schema و Allowlist نوع Event را اعمال کنید.
- PII، Token پرداخت، قیمت خرید و یادداشت داخلی را از Event غیرضروری حذف کنید.
- Log ممیزی برای تغییر Mapping، Replay، Override و دسترسی اضطراری بسازید.
- Dependency و API مصرفی Vendor را Inventory و نسخههای منقضی را رصد کنید.
Redirect مرورگر مدرک قطعی پرداخت نیست؛ Callback امضاشده و استعلام Server-to-server باید Amount، Currency، Merchant و Reference را تطبیق دهند. راهنمای اتصال امن درگاه پرداخت چرخه Authorize/Capture/Verify/Refund و بازیابی خطا را جداگانه توضیح میدهد.
Observability را به Outcome وصل کنید
لاگ «Webhook ۲۰۰ شد» نمیگوید سفارش به انبار رسیده است. Correlation ID را از Checkout تا Payment، ERP، WMS و CRM حمل کنید و Telemetry فنی را به وضعیت کسبوکار متصل سازید.
| لایه | SLI نمونه | هشدار معنادار |
|---|---|---|
| Transport | Success، Latency، Timeout، Rate-limit | افزایش خطا یا P95 فراتر از SLO |
| Queue | Lag، Age، Backlog، DLQ | قدیمیترین پیام از حد Journey بیشتر |
| Contract | Schema rejection، Unknown enum/version | Producer تغییر ناسازگار داده است |
| Entity | Duplicate، stale version، conflict | Order/SKU از قاعده مالکیت خارج شده |
| Journey | Paid→ERP، ERP→WMS، Ship→Notify | درصد یا زمان گذار از SLO عبور کرده |
| Business | Oversell، Cancel، Refund، تماس، Margin | اثر مشتری/مالی با Release همبسته است |
Metric dictionary و اتصال رویدادهای عملیاتی به Warehouse در راهنمای تحلیل دادههای بازاریابی تکمیل میشود. CRM dashboard نباید با Revenue حسابداری یا سفارش مرجوعشده اشتباه گرفته شود.
تستهایی که قبل از Go-live لازماند
- Contract test: نمونه نسخه جاری و قبلی، Field اختیاری، Enum ناشناخته و Payload بزرگ.
- Identity test: مهمان، مشتری تکراری، تلفن/ایمیل تغییرکرده، Merge و Unmerge.
- Order test: تخفیف، مالیات، ارسال، Variant، Bundle و سفارش جزئی.
- Payment test: Timeout، Callback تکراری، Redirect بدون Callback، Amount mismatch و Refund جزئی.
- Inventory test: رقابت دو خرید آخرین کالا، Reservation expiry و Event دیررس.
- Failure test: ERP قطع، Rate limit، Queue backlog، Poison message و Secret منقضی.
- Recovery test: Retry، Replay، DLQ، Reconciliation، Manual override و Rollback.
- Load test: Peak واقعی کمپین، Batch Catalog همزمان و Backpressure.
- Security test: Signature جعلی، Replay، IDOR/BOLA، Scope اضافی و SSRF.
Fixtureها را با داده فارسی، تومان/ریال، شهرهای مختلف، کالاهای چندانباره و درگاه واقعی Sandbox بسازید. Success path بهتنهایی معیار پذیرش نیست.
مهاجرت بدون Big Bang
ابتدا Inventory اتصالهای موجود، فایلهای دستی، Cron، Plugin، Spreadsheet و Overrideهای اپراتور را ثبت کنید. سپس یک Vertical slice کمریسک را با Shadow read اجرا کنید: سیستم جدید خروجی تولید میکند اما هنوز فرمان نهایی نمیدهد. اختلاف را با مسیر قدیمی بسنجید.
- Backfill با Watermark و Checksum انجام شود.
- Dual-run فقط با مالک تصمیم و پایان مشخص باشد؛ دو نویسنده فعال نسازید.
- Cutover window، Freeze، Drain queue و Delta sync تعریف شود.
- معیار Go/No-go بر اساس Divergence، Error budget و Journey باشد.
- Rollback باید دادههای ایجادشده پس از Cutover را Reconcile کند؛ برگشت Deploy کافی نیست.
- پس از Hypercare، مسیر قدیمی، Secret، Cron و دسترسی Legacy واقعاً بازنشسته شوند.
مثال اول: فروشگاه لوازم خانگی با دو انبار
ERP مالک SKU و قیمت پایه است، WMS موجودی فیزیکی هر انبار را نگه میدارد، OMS رزرو و ATP را محاسبه میکند و CRM فقط نمای سفارش و رضایت ارتباطی را دریافت میکند. در Checkout، فروشگاه قیمت منتشرشده و روش ارسال را میسنجد؛ پس از `payment.confirmed`، OMS رزرو را قطعی و سفارش ERP را با Idempotency key ایجاد میکند.
اگر ERP قطع باشد، پرداخت دوباره انجام نمیشود؛ سفارش در `paid_waiting_erp` میماند، Queue Retry میکند و پس از SLO به اپراتور هشدار میدهد. Reconciliation درگاه با OMS، پرداخت بدون سفارش را پیدا میکند. اگر WMS فقط یک کالا داشته باشد، Reservation اتمیک مانع فروش دوم میشود.
مثال دوم: فروش B2B با اعتبار و قیمت قراردادی
CRM مالک Account، Opportunity و نقشهای خرید است؛ ERP مالک Credit limit، Contract price و Invoice. فروشگاه B2B باید Account ID را به کاربر مجاز وصل کند و قیمت را با Effective date بگیرد. Quote تأییدشده به Order تبدیل میشود، اما تغییر قیمت یا اعتبار پس از تأیید باید Version و Approval جدید بسازد.
نمای CRM میتواند وضعیت سفارش و بدهی را نشان دهد، اما نباید Ledger مالی را بازنویسی کند. سفارش بزرگ، پرداخت اعتباری و ارسال جزئی Stateهای متفاوت دارند. Audit trail باید مشخص کند چه کسی Override کرده و مشتری کدام نسخه Quote را پذیرفته است.
ملاحظات ویژه اجرای یکپارچهسازی در ایران
- دسترسی و مجوز: قبل از انتخاب SaaS خارجی، ثبتنام، KYC، پرداخت، تمدید، IP restriction، Export و سناریوی تعلیق را با مدرک بسنجید.
- شبکه: Queue محلی، Buffer، Retry و Replay باید قطعی یا ناپایداری ارتباط بین سایت، ERP ابری و 3PL را تحمل کنند.
- درگاه و تسویه: Callback، استعلام، شماره مرجع، تسویه و Refund هر PSP را Contract جدا ببینید.
- ریال و تومان: واحد API، نمایش، حسابداری و گزارش را در Fixture و Reconciliation صریح کنید.
- تقویم و زمان: UTC برای Event، Asia/Tehran برای عملیات و تبدیل شمسی فقط در لایه نمایش.
- ERP محلی: وجود API به معنی Delta، Idempotency، Bulk، Webhook یا SLA نیست؛ با سناریوی واقعی Pilot کنید.
- کانال دستی: سفارش تلفنی یا پیامرسان باید Order ID رسمی بگیرد؛ Spreadsheet موازی نباید منبع پنهان حقیقت شود.
- خروج: Export داده، مستند Mapping، Secret rotation، مالکیت کد و Runbook انتقال را در قرارداد بیاورید.
اگر فروش همزمان در سایت، شعبه، شبکه اجتماعی و Marketplace انجام میشود، استراتژی Omnichannel مالکیت Inventory، Customer و Order میان کانالها را در سطح کسبوکار تکمیل میکند.
نقشه ۹۰روزه پیادهسازی
| بازه | کار | خروجی و Gate |
|---|---|---|
| روز ۱ تا ۱۵ | Baseline، Journey، Entity و Integration inventory | Scope عمودی، درد کمیشده و Owner |
| روز ۱۶ تا ۳۰ | Source-of-truth، ID، State و Data contract | Contract نسخهدار و Conflict policy |
| روز ۳۱ تا ۴۵ | Proof of concept و ارزیابی Connector/iPaaS/Build | Failure evidence، TCO و Exit |
| روز ۴۶ تا ۶۰ | Vertical slice، Queue، Idempotency، Security و Telemetry | Contract/Failure/Load tests سبز |
| روز ۶۱ تا ۷۵ | Shadow run، Backfill و Reconciliation | Divergence زیر Threshold |
| روز ۷۶ تا ۹۰ | Canary، Cutover محدود و Hypercare | Scale، Hold یا Rollback بر اساس SLO |
چکلیست پذیرش و عملیات
- برای هر Entity و Field بحرانی، مالک نوشتن و حل تعارض مشخص است.
- شناسههای Customer/Order/Payment/Invoice/Shipment/Return پایدار و قابل تطبیقاند.
- State machine، Transition نامعتبر، Partial و Compensation مستند شدهاند.
- API/Webhook/Event/Batch بر اساس SLO انتخاب شده، نه شعار Real-time.
- Idempotency، Inbox/Outbox، Retry، DLQ، Replay و Ordering تست شدهاند.
- Reconciliation مالی، سفارش، موجودی، حمل و Consent Owner و SLA دارد.
- Least privilege، Signature، Replay defense، Secret rotation و Audit فعالاند.
- Correlation، Lag، Divergence و Outcome مشتری/مالی مانیتور میشوند.
- سناریوی قطعی شبکه، Rate limit، Vendor outage و Rollback تمرین شده است.
- Runbook، RACI، On-call، TCO، Export و Exit در تحویل نهایی وجود دارد.
پرسشهای متداول یکپارچهسازی CRM و ERP با فروشگاه
تفاوت CRM و ERP در فروشگاه اینترنتی چیست؟
CRM رابطه، تعامل، سرنخ و رضایت ارتباطی را مدیریت میکند؛ ERP معمولاً عملیات مالی، کالا، خرید و منابع را پوشش میدهد. مرز دقیق به معماری کسبوکار بستگی دارد و ممکن است OMS، PIM یا WMS مالک بعضی دادهها باشند.
از CRM شروع کنیم یا ERP؟
از مسئله شروع کنید. اگر Oversell و پردازش سفارش زیان میسازد، جریان Commerce→OMS/ERP/WMS اولویت دارد. اگر پیگیری Lead و پشتیبانی شکسته است، CRM زودتر ارزش میدهد. اتصال همه سیستمها در فاز اول الزامی نیست.
آیا همگامسازی دوطرفه بهتر است؟
نه لزوماً. Sync دوطرفه تعارض، Loop و ابهام مالکیت میسازد. برای هر Field یک مالک نوشتن تعیین کنید و فقط جایی دوطرفه شوید که Use case، Merge rule و Audit روشن دارد.
Webhook یعنی همگامسازی دقیقاً یکبار؟
خیر. Webhook ممکن است تکراری، دیر یا خارج از ترتیب برسد. Signature، Queue، Inbox، Idempotency، Entity version، Retry محدود و Reconciliation برای پردازش قابل اتکا لازماند.
یکپارچهسازی CRM و ERP چقدر زمان میبرد؟
عدد ثابت معتبری وجود ندارد. تعداد Entity و Journey، کیفیت API، داده Legacy، حجم، الزامات مالی، تست شکست و آمادگی تیم زمان را تعیین میکنند. یک Vertical slice را میتوان زودتر Pilot کرد، اما Rollout کامل باید به شواهد SLO و اختلاف داده وابسته باشد.
جمعبندی
یکپارچهسازی CRM و ERP با فروشگاه زمانی موفق است که Customer، Product، Inventory، Order، Payment و Finance هرکدام مالک و قرارداد روشن داشته باشند. API سریع بدون Idempotency، Reconciliation و عملیات شکست، فقط خطا را با سرعت بیشتری پخش میکند.
یک Journey ارزشمند را انتخاب کنید، State و Source of truth را تثبیت کنید، مسیر را در برابر تکرار و قطعی مقاوم سازید و Outcome واقعی را بسنجید. سپس با Canary و Gate شواهد گسترش دهید. این رویکرد شاید از نصب یک Plugin کندتر به نظر برسد، اما چیزی میسازد که در روز شلوغ، Refund و قطعی شبکه نیز قابل اعتماد بماند.






