اتصال موفق این نیست که یک Lead در Demo از فرم سایت به CRM برسد. اتصال موفق وقتی است که همان Lead پس از Retry دوبار ساخته نشود، رضایت ایمیلش گم نشود، شماره ایرانی درست نرمال شود، تغییر Schema جریان را نشکند و اگر CRM چند ساعت قطع شد، تیم بداند چه دادهای در صف است و چگونه آن را بدون ارسال تکراری بازیابی کند.
یکپارچهسازی سایت یعنی طراحی جریان قابل اعتماد داده و عملیات میان سایتساز و سامانههایی مثل CRM، پرداخت، انبار، حسابداری، ایمیل، پشتیبانی و Analytics. تعداد Appهای Marketplace معیار کافی نیست. باید Source of truth، Data contract، Identity، امنیت، تحویل پیام، خطا، Reconciliation، Observability، هزینه و Exit را برای مهمترین Journeyها اثبات کنید.
یکپارچهسازی سایت چیست؟
Integration فقط «اتصال دو ابزار» نیست؛ قرارداد هماهنگی دو یا چند سیستم مستقل است. هر سیستم Data model، Identifier، Permission، Rate limit، Availability، Release cycle و Failure mode خود را دارد. طراحی باید تعیین کند چه رویدادی، با چه معنا و چه ضمانتی از مرز عبور میکند.
مثلاً در اتصال فرم Lead به CRM، سایت ممکن است صاحب Submission خام باشد، CRM صاحب Lifecycle فروش و سامانه Email صاحب وضعیت Delivery/Unsubscribe. اگر هر سه «وضعیت مشتری» را مستقل و دوطرفه تغییر دهند، Circular update و داده متناقض محتمل است.
چرا عبارت «دید ۳۶۰ درجه مشتری» خطرناک است؟
هیچ اتصال خودکار تضمین نمیکند داده دقیق، کامل یا مجاز است. یک Profile متمرکز میتواند رکورد دو فرد را Merge کند، Consent قدیمی را معتبر فرض کند یا Order برگشتی را Revenue موفق بشمارد. بهجای شعار، سؤالهای قابل آزمون بپرسید:
- چه Sourceهایی وارد Profile میشوند و Purpose هرکدام چیست؟
- Identity چگونه Resolve و Merge/Unmerge میشود؟
- Freshness و Quality هر Attribute چگونه نمایش داده میشود؟
- چه کسی Access دارد و Retention/Deletion چگونه منتشر میشود؟
- Metricهای کسبوکار از کدام State نهایی محاسبه میشوند؟
برای معماری Event، Identity، Warehouse و Attribution، راهنمای تحلیل دادههای بازاریابی از GA4 تا Warehouse مکمل این مقاله است.
از Journey و Capability شروع کنید، نه App catalog
فهرست «اتصال به ۵۰۰۰ ابزار» تا زمانی که مسیر واقعی کسبوکار را پوشش ندهد ارزش کمی دارد. Journeyهای حیاتی را بنویسید:
| Journey | سیستمها | Outcome | شکست غیرقابل قبول |
|---|---|---|---|
| Lead تا تماس فروش | Form، CRM، SMS/Email، Support | Lead واجد شرایط با Consent و Owner | رکورد گم/تکراری یا تماس بدون رضایت |
| Checkout تا Order | Site، PSP، OMS، Inventory | یک Order معتبر برای یک Payment | برداشت وجه بدون Order یا سفارش دوباره |
| Order تا ارسال | OMS، WMS، Carrier، Notification | رزرو، Dispatch و Tracking درست | Oversell، Variant غلط یا Shipped کاذب |
| Refund تا حسابداری | RMA، PSP، Ledger، CRM | Refund و Credit آشتییافته | برگشت دوگانه یا Revenue اشتباه |
| عضویت تا ایمیل | Form، Consent store، ESP | Subscriber مجاز و قابل لغو | ارسال پس از Unsubscribe |
Integration inventory؛ نقشه جریانها
برای هر اتصال یک ردیف Versioned ثبت کنید:
| فیلد | پرسش |
|---|---|
| Producer/consumer | چه سیستم/Ownerی داده را تولید و چه کسی مصرف میکند؟ |
| Business event | رخداد واقعی چیست، نه نام Button یا Endpoint؟ |
| Direction | یکطرفه، دوطرفه یا Request/response است؟ |
| Trigger/frequency | Sync، Async، Webhook، Schedule یا دستی؟ |
| Volume/burst | روز عادی، Campaign و Peak چه حجمی دارند؟ |
| Latency/freshness | چند ثانیه/دقیقه/ساعت قابل قبول است؟ |
| Data class | PII، مالی، Credential یا عمومی؟ |
| Criticality | شکست آن Revenue، ایمنی، قانون یا فقط Convenience را متاثر میکند؟ |
| SLO/dependency | هدف و وابستگی Upstream/Downstream چیست؟ |
| Recovery/owner | Alert، Runbook، Replay، Reconcile و تصمیم با چه کسی است؟ |
Source of truth را به تفکیک Domain تعیین کنید
یک سیستم معمولاً صاحب همه واقعیتها نیست. جدول مالکیت بنویسید:
| Domain | Source of truth نمونه | Consumer |
|---|---|---|
| Product/SKU/variant | PIM/ERP | Site، Feed، Ads، Support |
| Available inventory | OMS/WMS | Site و Channelها |
| Payment state | Ledger + PSP evidence | Order/Finance/Support |
| Order lifecycle | OMS | CRM، WMS، Customer UI |
| Lead/sales stage | CRM | Site personalization/BI |
| Email consent | Consent registry/ESP با تاریخچه | Campaign tools |
| Accounting entry | Accounting ledger | BI/Reporting |
Source of truth یعنی سیستم مرجع تصمیم، نه تنها محل نگهداری Copy. قواعد Write، Conflict و Correction باید روشن باشند. «همهچیز دوطرفه Sync شود» معمولاً چرخه و Last-write-wins ناخواسته میسازد.
انواع یکپارچهسازی و Trade-off
| روش | Fit | محدودیت پنهان |
|---|---|---|
| Native | Use case استاندارد و پشتیبانی یکپارچه | Field/Workflow محدود، Roadmap و Lock-in |
| Marketplace app/plugin | نیاز رایج با نصب سریع | Third-party quality، permission، update و abandonment |
| iPaaS/no-code automation | جریان کمریسک/کمحجم و Prototype | Task cost، opaque retry، rate limit، data residency و lock-in |
| Direct API | منطق سفارشی، حجم/کنترل بیشتر | Engineering، versioning، security و operations |
| Webhook/event | واکنش Async با Latency پایین | Duplicate، out-of-order، retry، signature و replay |
| Batch/file/SFTP | حجم زیاد، سیستم Legacy یا Freshness ساعتی | Stale data، partial file، encoding و reconcile |
| Embedded script/tag | Analytics/widget روی Browser | Performance، privacy، CSP و supply-chain risk |
| Custom code/extension | Behavior نزدیک Platform | Upgrade compatibility و lifecycle ownership |
Native الزاماً امنتر یا قابلاعتمادتر نیست؛ Marketplace بزرگ نیز کیفیت را تضمین نمیکند. برای انتخاب کلی Managed builder، CMS، Headless یا Custom بر اساس TCO و Exit، مقاله انتخاب سایتساز برای کسبوکار بزرگ را ببینید.
Sync، Event یا Batch؟
| پرسش | Request/response | Event/Webhook | Batch |
|---|---|---|---|
| آیا کاربر منتظر پاسخ است؟ | بله، برای تصمیم فوری | نه؛ Status بعداً | نه |
| Latency | کم | کم تا متوسط | متوسط تا زیاد |
| Coupling | زمانی/Availability بالا | کمتر، اگر Queue باشد | زمانبندیشده |
| Failure | Timeout و پاسخ کاربر | Retry/DLQ/replay | File reject/partial/re-run |
| نمونه | قیمت حمل یا Verify payment | order.paid یا contact.updated | Catalog شبانه/ledger export |
Checkout را نباید به CRM غیرحیاتی Sync وابسته کنید. رویداد Order را Durably ثبت و CRM را Async بهروز کنید. برعکس، موجودی قابل فروش ممکن است پیش از قبول Order نیاز به تصمیم Sync یا Reservation داشته باشد.
Data contract؛ معنا پیش از JSON
API schema فقط نام Field و Type نیست. Contract باید Semantics را هم مشخص کند:
- Business event و شرط رخداد؛
- شناسه یکتا، Source و Version؛
- Required/optional/null/absent؛
- Enum و Unknown value handling؛
- Timestamp، timezone و ordering؛
- Amount، currency و unit؛
- PII classification، purpose و retention؛
- Error code و retryability؛
- Backward compatibility و deprecation؛
- Sample، test fixture و owner.
OpenAPI Specification میتواند Contract HTTP API و Webhookهای ورودی را مستند کند، اما فایل OAS بهتنهایی رفتار، Permission، Idempotency یا SLO را ثابت نمیکند. Documentation را با تست و Evidence زنده نگه دارید.
شناسه و Identity mapping
Email و شماره تلفن Identifier پایدار و یکتای مطمئن نیستند؛ تغییر، اشتراک یا Recycle میشوند. برای هر Domain:
- Internal ID پایدار بسازید؛
- External ID هر Provider و Tenant را جدا نگه دارید؛
- Mapping version و source را ثبت کنید؛
- Merge rule، confidence و Human review داشته باشید؛
- Unmerge و Correction را ممکن کنید؛
- Cross-tenant lookup را صریحاً منع و تست کنید.
Upsert بر اساس Email میتواند دو مشتری یا دو شعبه را اشتباه یکی کند. Composite key را با Domain و Tenant طراحی کنید.
فارسی، شماره، تاریخ و پول
| مسئله | قرارداد Data layer | نمایش |
|---|---|---|
| ی/ی و ک/ک | Normalization rule بدون تغییر مقدار اصلی | املای استاندارد فارسی |
| ۰۹… و +۹۸… | فرمت Canonical و Country جدا | محلی و قابل ویرایش |
| اعداد فارسی/لاتین | Parse هر دو، ذخیره Canonical | متناسب Locale |
| تومان/ریال | Amount integer + currency/unit صریح | واحد و separator روشن |
| شمسی/میلادی | Timestamp استاندارد + timezone | Calendar محلی در UI |
| نام راستبهچپ/لاتین | Unicode و validation غیرتخریبی | BiDi صحیح |
| SKU/کدملی/کدپستی | String، نه Number | حفظ صفر ابتدایی |
تبدیل تومان/ریال نباید در چند Connector با Round متفاوت تکرار شود. Owner و Conversion point واحد تعیین کنید.
API versioning و تغییر سازگار
شکستن Integration معمولاً با «بهروزرسانی موفق» رخ میدهد. تغییرها را طبقهبندی کنید:
| تغییر | ریسک | کنترل |
|---|---|---|
| افزودن Field optional | Consumer سختگیر ممکن است بشکند | Unknown field tolerance و contract test |
| افزودن Enum value | Switch بدون default شکست میخورد | Unknown handling |
| تغییر معنا بدون Type | خطرناک و پنهان | Semantic version/event جدید |
| حذف/rename | Breaking | deprecation، dual-read/write و deadline |
| تغییر pagination/rate limit | داده ناقص/۴۲۹ | client test و capacity plan |
| تغییر webhook signature | رد همه eventها | key/version overlap و canary |
Authentication و Authorization
API key داخل JavaScript مرورگر یا Password اصلی Admin برای Connector، مرز امنی نیست. الگو را بر اساس Actor انتخاب کنید:
- OAuth Authorization Code با محافظتهای جاری برای دسترسی به نمایندگی کاربر؛
- Client credentials یا Workload identity برای Machine-to-machine، اگر Provider پشتیبانی کند؛
- Token کوتاهعمر، Scope/Audience محدود و Rotation؛
- Secret manager، نه تنظیمات قابل مشاهده یا Spreadsheet؛
- Service account جدا برای هر Environment/Integration؛
- Revocation، audit و Break-glass procedure.
RFC 9700 بهترین رویه جاری OAuth ۲.۰ را با تهدیدها و اصلاح الگوهای قدیمی پوشش میدهد. وجود OAuth در صفحه Feature کافی نیست؛ Flow، Scope، Redirect URI، Token storage و Revocation را بررسی کنید.
WordPress و Application Password
در WordPress، REST API برای دسترسی External میتواند از Application Password استفاده کند تا Password اصلی کاربر داده نشود. مستند Application Passwords در WordPress دامنه و مدیریت آن را توضیح میدهد. یک کاربر Service با کمترین Capability، HTTPS، Rotation و Audit بسازید؛ Application Password را در Frontend منتشر نکنید.
Webhook امن و قابل بازیابی
- Request body خام و Headerهای لازم را بدون تغییر برای Verify آماده کنید.
- Signature و Timestamp را با Secret درست و Replay window بررسی کنید.
- Source/Tenant/Event type را Allowlist کنید.
- Event ID را در Dedup store ثبت کنید.
- پس از نوشتن Durable در Queue، سریع پاسخ مناسب بدهید.
- پردازش Business را Async و Idempotent انجام دهید.
- Retryable و terminal error را جدا کنید.
- پس از حد Retry، DLQ و Alert بسازید.
- Replay و Reconciliation را با کنترل Operator فراهم کنید.
هیچ فرض عمومی درباره Exactly-once delivery نکنید. بسیاری از Providerها At-least-once هستند؛ Duplicate و out-of-order را رفتار عادی طراحی کنید. اگر Event فقط اشاره به Resource است، در صورت نیاز State جاری را با API و Version/updated_at بخوانید.
CloudEvents چه کمکی میکند؟
CloudEvents قالب مشترکی برای توصیف Event با Attributeهایی مانند ID، Source، Type و Spec version ارائه میدهد. این استاندارد Interoperability envelope را بهتر میکند؛ Semantics دامنه، ترتیب، Transaction و Delivery guarantee را خودکار حل نمیکند.
Idempotency؛ تکرار امن
اگر Client پس از Timeout نداند Order ساخته شده یا نه و Request را دوباره بفرستد، بدون Idempotency دو Order میسازد. یک Idempotency key باید به Operation و Caller/Scope وصل و نتیجه قبلی تا Window مناسب نگه داشته شود.
dedupe identity = tenant_id + event_source + event_id
business idempotency = operation + stable_business_key + versionDedup فقط حذف Event تکراری نیست. Side effectهای Email، Inventory، Invoice و Refund نیز باید دوبارهپذیر یا Guarded باشند. Key تصادفی تازه در هر Retry، Idempotency نمیسازد.
Retry، Backoff و DLQ
| خطا | Retry؟ | اقدام |
|---|---|---|
| Timeout/5xx موقت | بله | Exponential backoff + jitter + cap |
| 429 | بله | Retry-After/rate budget و throttle |
| 401/invalid token | مشروط | refresh/rotate یکبار؛ سپس alert |
| 403/scope | خیر تا اصلاح | terminal/config issue |
| 400/schema invalid | خیر | quarantine، contract issue |
| ۴۰۴ برای eventual resource | مشروط | window محدود و ordering check |
| 409 conflict | وابسته | read current/version-aware resolution |
Retry نامحدود هزینه و Duplicate میسازد. DLQ باید Owner، Reason، payload reference امن، retry count، first/last seen و Action داشته باشد؛ قبرستان پیام نباشد.
Error contract
«خطایی رخ داد» برای Integration قابل اجرا نیست. Error باید Machine-readable code، human summary، occurrence/correlation ID، retryability و Field pointer مناسب داشته باشد، بدون افشای Stack/Secret. RFC 9457 Problem Details for HTTP APIs یک مدل استاندارد برای جزئیات خطای HTTP ارائه میدهد؛ Error taxonomy دامنه خود را نیز مستند کنید.
Reconciliation؛ شبکه حقیقت کامل نیست
حتی Webhook خوب ممکن است بهدلیل Outage، Bug، Retention یا Misconfiguration از دست برود. Job آشتیسازی بسازید:
- Watermark آخرین Sync موفق و Overlap window را نگه دارید.
- منبع را با Pagination کامل بخوانید.
- Record count، checksum یا Domain totals را مقایسه کنید.
- Missing، duplicate، stale و conflicting را دستهبندی کنید.
- Repair را Idempotent و Audit شده اجرا کنید.
- Drift rate و Age را به SLO وصل کنید.
برای پرداخت، Reconciliation با PSP و Ledger ضروری است؛ Callback تنها منبع حقیقت نیست. طراحی Portfolio و مسیر Settlement/Refund در راهنمای روشهای پرداخت فروشگاه اینترنتی آمده است.
امنیت API و مصرف داده ثالث
Integration سطح حمله و Trust boundary تازه میسازد. Inventory Endpointها، Tokenها، Webhookها و Data flow را نگه دارید. کنترلهای کلیدی:
- Object/Function-level authorization و Tenant isolation؛
- Rate/resource limit و Protection از expensive operation؛
- Input validation، output encoding و Schema allowlist؛
- SSRF guard برای URL/Callback/Import؛
- Webhook signature، replay control و secret rotation؛
- عدم اعتماد کور به API ثالث؛ validate، sanitize و limit؛
- Dependency/app/vendor inventory و patch/deprecation؛
- Audit trail بدون Token/PII خام.
OWASP API Security Top ۱۰ نسخه ۲۰۲۳ خطر «Unsafe Consumption of APIs» را نیز برجسته میکند. Threat model و کنترلهای عمیق در راهنمای امنیت API، OAuth و Webhook آمده است.
حریم خصوصی و Consent propagation
Server-side Integration نیاز Consent و Purpose را حذف نمیکند. برای هر Field مشخص کنید چرا منتقل میشود، گیرنده/زیرپردازشگر کیست، کجا نگهداری میشود، چه مدت و چگونه اصلاح/حذف میشود.
| رویداد | قرارداد |
|---|---|
| subscribe | source، purpose، policy version، timestamp، evidence |
| unsubscribe | global/list scope، effective time، suppression propagation |
| delete request | systems، legal hold/exception، completion evidence |
| profile correction | source ownership، downstream update و conflict |
| vendor exit | export، deletion certificate و token revoke |
Unsubscribe نباید از CRM دوباره با Sync دوطرفه فعال شود. Consent و Deliverability را با راهنمای ایمیل مارکتینگ Permission-based طراحی کنید.
Performance و Frontend integration
Plugin و App لزوماً همه کد خود را در Frontend تزریق نمیکند و Direct API هم لزوماً سریع نیست. اثر را اندازه بگیرید:
- JavaScript bytes/parse/eval و Main-thread work؛
- Third-party request، DNS/TLS و failure blocking؛
- Layout shift و Interaction delay؛
- Tag duplication و چند Analytics collector؛
- Cookie/storage و Consent timing؛
- Server call latency، timeout budget و connection pool؛
- Webhook backlog و batch processing.
Widget غیرحیاتی نباید Checkout را Block کند. Circuit breaker و timeout/fallback را بر اساس Criticality طراحی کنید؛ «افزونه بیشتر = سایت کندتر» قانون خطی نیست.
Observability و SLO اتصال
| SLI | تعریف نمونه | علامت خطر |
|---|---|---|
| Delivery success | پیامهای پردازش نهایی / پیام واجد شرایط | HTTP ۲۰۰ بدون Business success |
| End-to-end latency | Business event تا State مقصد P50/P95/P99 | فقط API latency |
| Freshness | Age جدیدترین داده معتبر | Job سبز با داده قدیمی |
| Duplicate rate | dedupe/conflict بر کل Event | نادیدهگرفتن side effect تکراری |
| DLQ age/depth | قدیمیترین و تعداد پیام حلنشده | فقط Queue depth |
| Reconciliation drift | Missing/conflict میان Source و مقصد | اعتماد به Webhook تنها |
| Rate-limit headroom | مصرف/سقف در Window | ۴۲۹ فقط هنگام Campaign |
Correlation ID و Trace context را میان Gateway، Queue، Worker و Vendor log منتقل کنید، با Redaction. W3C Trace Context قالب استاندارد انتشار Context trace را تعریف میکند. طراحی Metric/Log/Trace/SLO و Alert در مقاله Observability سایت تکمیل شده است.
Testing؛ Sandbox کافی نیست
| تست | سؤال |
|---|---|
| Contract | Producer/consumer با Schema و Example نسخه جاری سازگارند؟ |
| Mapping | Null، Unicode، تومان/ریال، timezone و enum unknown چه میشوند؟ |
| Duplicate/out-of-order | Side effect تکراری یا State rollback رخ میدهد؟ |
| Timeout/retry | نتیجه نامعلوم چگونه Resolve میشود؟ |
| Rate limit/burst | Campaign/Import سقف را میشکند؟ |
| Auth/rotation | Token expire، revoke و secret overlap کار میکند؟ |
| Failure injection | Provider 5xx، Queue delay، DLQ و Recovery؟ |
| Reconciliation | Event عمداً حذفشده پیدا و repair میشود؟ |
| Privacy/security | Scope، log، tenant isolation و deletion propagate میشوند؟ |
| Production canary | Sandbox با Policy/limit/data واقعی تفاوت دارد؟ |
Test data باید غیرحساس و قابل پاکسازی باشد. Production replay را روی Sandbox بدون Anonymization نریزید.
Release، Migration و Rollback
- Contract version و Consumerها را Inventory کنید.
- Backward-compatible change را اول منتشر کنید.
- Dual-read یا Shadow mode برای مقایسه بگذارید.
- Canary با Tenant/Traffic محدود اجرا کنید.
- Reconciliation و Business guardrail را ببینید.
- Cutover و deprecation را تاریخدار کنید.
- Rollback را برای Code، Schema، Queue و Side effect تعریف کنید.
- پس از تثبیت، Secret/Endpoint قدیمی را حذف کنید.
Build once، Progressive delivery، Verification و Rollback در راهنمای CI/CD امن توضیح داده شده است.
ارزیابی قابلیت Integration سایتساز
| حوزه | Evidence قابل قبول |
|---|---|
| API coverage | Endpoint واقعی برای Domainهای لازم، نه فقط Marketing claim |
| Auth | Flow، Scope، service account، rotate/revoke و audit |
| Webhook | event catalog، signature، retry، ordering، replay و history |
| Limits | rate/burst/pagination/payload/concurrency و افزایش سقف |
| Versioning | changelog، deprecation window، test version و backward policy |
| Data portability | Export کامل content/catalog/order/customer/config و format |
| Marketplace governance | permission review، update، support، disclosure و removal path |
| Observability | delivery log، request/event ID، audit و error detail |
| Sandbox | parity، fixture، payment/inventory simulation و reset |
| Operations | Status، SLA/support، incident notice و runbook access |
| Iran fit | Eligibility، KYC/payment، support، network و export واقعی |
| Exit | termination، token revoke، data delete و replacement timeline |
به جای «دارد/ندارد»، سه Use case حیاتی را در PoC اجرا و Failure را عمداً تزریق کنید. Demo موفق بدون Duplicate/Retry/Exit evidence امتیاز کامل نمیگیرد.
Native، iPaaS یا Custom؟
| شرایط | گزینه محتمل | Guardrail |
|---|---|---|
| Workflow ساده و کمریسک | Native/iPaaS | Task cost، consent، retry و export |
| Lead/Marketing متوسط | Native + queue/validation یا iPaaS کنترلشده | dedupe، suppression و observability |
| Payment/Inventory/Order حیاتی | Direct/custom integration یا connector اثباتشده | state/idempotency/reconcile/SLO |
| Legacy batch | File/SFTP adapter | atomic file، checksum، partial/error report |
| چند Provider متغیر | Adapter/anti-corruption layer | canonical model و provider-specific loss |
Custom کنترل بیشتر میدهد، نه نتیجه رایگان. اگر تیم On-call، تست و نگهداری ندارد، اتصال سفارشی پرریسک میشود. iPaaS نیز Operations را حذف نمیکند؛ فقط بخشی از Runtime را منتقل میکند.
TCO Integration
3-year integration TCO = platform/app/iPaaS licenses and task overage
+ build/config/mapping/migration
+ test/sandbox/environment
+ monitoring/log/storage/egress
+ security/privacy/compliance assurance
+ maintenance/version/deprecation work
+ incident/support/on-call cost
+ exit/rebuild/data exportهزینه هر Task در Flow چندمرحلهای، Burst، Retry و Replay را سناریو کنید. Connector ارزان با Error opaque و بدون Export میتواند Incident و Exit گرانتری داشته باشد.
نمونه ۱: فرم فارسی تا CRM و ایمیل
- Form یک
submission_idپایدار و policy/consent version میسازد. - Phone را به فرم Canonical تبدیل و مقدار خام را فقط در صورت نیاز/Policy نگه میدارد.
- Submission در Store/Queue پایدار ثبت میشود؛ موفقیت UI به CRM زنده وابسته نیست.
- Worker با External mapping و Idempotency، Contact/Lead را میسازد یا بهروز میکند.
- Duplicate احتمالی quarantine یا طبق Rule دارای confidence Merge میشود.
- Subscription فقط با Consent مناسب به ESP میرود.
- CRM owner و status اولیه را برمیگرداند؛ Site از CRM حقیقت Sales stage نمیسازد.
- Job آشتیسازی Submissionهای بدون Lead و Leadهای بدون Source را گزارش میکند.
نمونه ۲: سفارش، پرداخت، موجودی و حسابداری
برای فروشگاه ایرانی، Order ID، Payment attempt ID، PSP reference، SKU/variant و Accounting document ID را جدا نگه دارید. Flow:
- Site یک Order draft و Payment attempt یکتا میسازد.
- Callback/return مرورگر را تنها حقیقت پرداخت نمیداند؛ Server verification میکند.
- Transition پرداخت Idempotent است و Order را دوبار Paid نمیکند.
- OMS Inventory را Reserve و نتیجه را با Version ثبت میکند.
- Event paid به Queue میرود؛ WMS/Email/Accounting مستقل مصرف میکنند.
- شکست Accounting Checkout را Rollback نمیکند؛ DLQ و Reconcile دارد.
- Refund با reference جدید و Link به Original payment ثبت و به Ledger آشتی میشود.
Available-to-promise، Fulfillment و Return state در راهنمای مدیریت موجودی و ارسال فروشگاه آمده است.
ملاحظات ایران
- Eligibility: Country/entity/KYC و Terms هر SaaS، Marketplace و Payment provider را با شخصیت واقعی بررسی کنید؛ هویت/کشور جعلی راهکار نیست.
- Availability: دسترسی ISP، محدودیت شبکه، DNS/CDN و مسیر Admin/Support را از چند اپراتور تست کنید.
- Payment: Callback، Settlement، Refund، تعطیلی بانکی و Reconciliation داخلی را PoC کنید.
- SMS: Delivery report، خط خدماتی/تبلیغاتی، Unicode، Template و Failover Provider را بسنجید.
- Locale: RTL، ی/ک، اعداد، +۹۸، ریال/تومان، تقویم و timezone را در Data contract بیاورید.
- Cost: ارز، اعتبار Quote، Tax، task/egress و تمدید را با Scenario محاسبه کنید.
- Exit: Export محلی دورهای و مسیر جایگزین برای قطع حساب/پرداخت/Support داشته باشید.
Runbookهای ضروری
Webhook backlog یا DLQ رشد میکند
Ingress و Queue را از Consumer جدا بررسی کنید؛ Event age، type، tenant، error class و deploy را Segment کنید. پردازش را با Rate امن مهار، terminalها را quarantine، fix را Canary و Replay را Idempotent اجرا کنید.
Token یا Secret منقضی/افشا شده
Connector را محدود، Token را revoke/rotate، Scope و log access را بررسی، Window رخداد و درخواستهای مشکوک را استخراج و Secret overlap را کنترل کنید. Password اصلی Admin را جایگزین سریع نکنید.
داده CRM و سایت Drift کرده است
Source ownership، last successful watermark، mapping version و change log را ببینید. Diff را به missing/stale/conflict/duplicate تقسیم، repair را dry-run و Correction را Audit کنید؛ Blind two-way sync نزنید.
Provider rate limit را کاهش میدهد
Traffic budget، burst، retry storm و endpoint mix را محاسبه؛ batching/cache/coalescing و backpressure را فعال؛ کار غیرحیاتی را عقب بیندازید و سقف/قرارداد را مذاکره کنید.
Schema یا App update جریان را شکست
Breaking field/enum/auth/signature را با contract diff پیدا، version قدیم را در صورت امکان نگه، Adapter را Fix و تست fixture/Replay را اجرا کنید. سپس Deprecation monitor و CI gate اضافه کنید.
برنامه ۳۰، ۶۰ و ۹۰ روزه
| بازه | اقدام | خروجی |
|---|---|---|
| روز ۱ تا ۳۰ | Journey/Integration inventory، Source of truth، data/privacy classification، SLO و TCO baseline | نقشه جریان، risk register و سه Use case PoC |
| روز ۳۱ تا ۶۰ | Contract/identity/auth، queue/idempotency/retry/DLQ/reconcile، observability | Design record، test fixture، dashboard و runbook |
| روز ۶۱ تا ۷۵ | Sandbox/contract/load/failure/security/privacy test و canary | Evidence pack و acceptance result |
| روز ۷۶ تا ۹۰ | Staged rollout، SLO/guardrail monitor، fail/replay drill و exit export | Scale/iterate/stop decision و backlog |
چکلیست انتخاب و انتشار
- آیا Journey و Outcome پیش از انتخاب Connector مشخصاند؟
- آیا Source of truth و جهت Write برای هر Domain روشن است؟
- آیا ID، Schema، Time، Currency، Error و Version Contract دارند؟
- آیا Auth/Scope/Secret/Revocation و Tenant isolation تست شدهاند؟
- آیا Duplicate، out-of-order، timeout، ۴۲۹ و partial failure پوشش دارند؟
- آیا Queue، DLQ، Replay و Reconciliation Owner دارند؟
- آیا Consent، Retention، deletion و Vendor exit منتشر میشوند؟
- آیا SLI/SLO، Trace/Correlation، Alert و Runbook وجود دارد؟
- آیا ایران با Payment/SMS/Locale/Network/Eligibility/FX تست شده است؟
- آیا TCO سهساله و Export/Replacement path اثبات شدهاند؟
جمعبندی
یکپارچهسازی خوب سایت را «مرکز فرماندهی» نمیکند؛ هر سیستم را در نقش درست و با مرز قابل مشاهده نگه میدارد. Data باید صاحب، معنا و نسخه داشته باشد؛ پیام باید تکرار و بینظمی را تحمل کند؛ خطا باید قابل تشخیص و بازیابی باشد؛ و تیم باید بتواند بدون حدس Drift را آشتی دهد یا Vendor را جایگزین کند.
برای ارزیابی یک سایتساز، از فروشنده نپرسید «چند Integration دارید؟» سه Journey حیاتی خود را با Failure case بدهید و Evidence بخواهید: Source of truth، Auth، Rate limit، Webhook delivery، Replay، Log، Export، TCO و Exit. پاسخ این آزمون از اندازه App store مهمتر است.
پرسشهای متداول
یکپارچهسازی Native بهتر است یا API سفارشی؟
به Criticality و Contract بستگی دارد. Native برای Use case استاندارد و تیم کوچک میتواند سریعتر باشد؛ API سفارشی کنترل بیشتری بر Mapping، State و Operations میدهد اما هزینه ساخت/نگهداری دارد. هر دو را با Auth، coverage، retry، reconciliation، SLO، TCO و Exit بسنجید.
آیا Zapier یا ابزار iPaaS برای Integration کافی است؟
برای Flow کمریسک، حجم محدود و Prototype ممکن است کافی باشد. برای Payment، Inventory یا Order حیاتی باید رفتار Duplicate، Retry/DLQ، Rate limit، data residency، Observability، Reconciliation، task cost و Export را اثبات کنید. No-code به معنی No-operations نیست.
Webhook چه تفاوتی با API دارد؟
API معمولاً توسط Consumer برای Request/Query فراخوانی میشود؛ Webhook یک HTTP callback است که Producer هنگام رخداد به Consumer میفرستد. Webhook نیز API است و به Signature، Replay control، Idempotency، Queue، Retry/DLQ و Reconciliation نیاز دارد.
چرا داده در دو سیستم یکسان نمیماند؟
Source ownership مبهم، Mapping متفاوت، Event گم/تکراری، ترتیب نادرست، تغییر Schema، Identity merge، Rate limit یا اصلاح دستی میتواند Drift بسازد. Watermark، Version، idempotency و Job آشتیسازی لازماند؛ Sync دوطرفه کور مشکل را تشدید میکند.
چطور Integration سایتساز را پیش از خرید تست کنیم؟
سه Journey واقعی را در PoC اجرا کنید و فقط Happy path را نبینید: Duplicate، timeout، ۴۲۹، token rotation، schema change، vendor outage، deletion و export را آزمایش کنید. API coverage، Webhook history/replay، logs، SLO، TCO و مسیر Exit را با Evidence ثبت کنید.






