سلة اليوم ليست منصة تجارة إلكترونية فقط — هي البنية التحتية التي تشغّل أكثر من 68,000 تاجر نشط في المملكة، ومرّ عبرها 13.3 مليار دولار من إجمالي قيمة المبيعات (GMV)، وتستحوذ على 44.11% من عدد المتاجر السعودية بنمو سنوي يقارب 45% في 2025. كل متجر سعودي من اثنين زاره مشتري سلة مرة واحدة على الأقل.
هذا النجاح يصنع مشكلة هندسية محددة جداً: ما إن يتجاوز متجرك ألف طلب يومياً أو يربط أكثر من ثلاثة أنظمة خارجية (ERP، مستودع، أداة تسويق، ZATCA)، حتى يبدأ Salla API بالتصرّف كأي SaaS API عند الحدّ: rate limits تُرفض، webhooks تتأخر أو تتكرر، ومزامنة المخزون تتعارض بين القنوات.
الحل ليس مغادرة سلة — الحل أن تبني بينك وبينها طبقة Middleware رفيعة تتولى التوجيه، الـ retry، الـ idempotency، ومحوّلات الأنظمة الخارجية. هذا المقال يشرح المشكلة بالأرقام، يصف الجدران الثلاثة، ثم يقدّم المعمارية المرجعية التي نشغّلها على أكثر من متجر سعودي حقيقي.
لماذا تصطدم سلة بسقف API عند الحجم؟
سلة كمنصة SaaS مغلقة تخدم 68 ألف تاجر بقواعد مشتركة. وهذا قرار صحيح من جانبها: rate limits و webhook quotas موحّدة تحمي الـ tenants من بعضهم. لكن من جهة التاجر الذي ينمو، تظهر ثلاثة قيود يجب التعامل معها هندسياً، لا متمنّياً أن تختفي:
- حدود معدّل الطلبات (Rate Limits). عند المزامنة الكاملة للمخزون أو سحب الطلبات التاريخية، تصل بسرعة إلى 429 Too Many Requests. الـ retry الساذج يضاعف المشكلة.
- موثوقية الـ Webhooks. سلة تُرسل webhooks لكل حدث (طلب جديد، تحديث مخزون، استرجاع). لكن أي SaaS — سلة وغيرها — لا يضمن exactly-once delivery. ستستلم نفس الحدث مرتين، أو لن يصلك أبداً إذا كان endpoint الخاص بك معطّلاً لخمس دقائق.
- غياب تكاملات أصلية عميقة. سلة تملك متجر تطبيقات واسعاً، لكن لا يوجد تكامل رسمي عميق ثنائي الاتجاه مع Odoo أو Zoho Books أو Salesforce. تطبيقات الطرف الثالث تُغطي 70% من الحالات وتترك الباقي لك.
أضف إلى ذلك أن سلة كمنصة مغلقة المصدر لا تنشر CVE database عاماً. هذا ليس عيباً — معظم SaaS كذلك (Shopify، BigCommerce) — لكنه يعني أن مسؤولية الـ defensive layer بين سلة وأنظمتك الداخلية تقع عليك.
الجدار الأول: حدود معدّل الطلبات
سيناريو واقعي: متجر مكوّنات سيارات في الرياض، 12,000 SKU، يستخدم WMS داخلياً يدفع تحديثات المخزون كل 15 دقيقة. عند المزامنة، يحاول النظام تحديث 12 ألف منتج عبر PUT /products/{id} خلال نافذة قصيرة. النتيجة: 429، ثم retry فوري، ثم 429 مرة أخرى، حتى يدخل الـ rate limit في حالة "cool-down" طويلة.
ما لا يحلّ المشكلة: retry بدون backoff، أو تشغيل أكثر من Worker متوازي على نفس API key.
ما يحلّ المشكلة هندسياً:
- Token bucket على مستوى الـ Middleware يحدّد عدد الطلبات/الدقيقة قبل أن تصل إلى Salla.
- Exponential backoff with jitter عند استلام 429 — مع احترام رأس
Retry-Afterإذا أرسلته سلة. - Batching عبر استخدام endpoints المجمّعة حين تتاح، أو delta sync بدل full sync (لا تحدّث منتجاً إلا إذا تغيّر).
- Priority queue: طلبات بيع جديدة لها أولوية أعلى من تحديث وصف منتج.
الجدار الثاني: موثوقية الـ Webhooks
سلة ترسل webhook عند كل حدث: order.created, order.updated, product.updated. هذه السلوكيات معروفة:
- لا توجد ضمانات exactly-once — قد تستلم نفس الـ event مرتين.
- إذا كان endpoint الخاص بك بطيئاً (timeout > بضع ثوانٍ) أو أعاد 5xx، فقد تُعيد المنصة الإرسال أو تتجاوز الحدث.
- ترتيب الأحداث غير مضمون — قد يصلك
order.updatedقبلorder.created.
أي endpoint يكتب مباشرة في ERP أو يُرسل بريداً للعميل من داخل handler الـ webhook هو bug ينتظر مرحلة الإنتاج. أمازون ويب سيرفيسز تشرح هذا بالتفصيل في Best Practices for Idempotent APIs.
الحل المعماري:
- Webhook receiver يكتب الحدث الخام في قائمة (queue) ويعيد
200 OKخلال أقل من 200 مللي ثانية. - كل حدث يحمل idempotency key (مثلاً
order_id + event_type + timestamp) ويُحفظ في Redis بـ TTL أسبوع. - Worker منفصل يسحب من القائمة، يتحقق من الـ idempotency key، ثم ينفّذ المنطق.
هكذا يصبح تكرار الحدث آمناً، والـ endpoint الخاص بك لا يسقط إذا تعطّل ERP لساعة.
الجدار الثالث: التكامل العميق مع الأنظمة الخارجية
تطبيقات سلة الجاهزة جيدة للحالات البسيطة. لكن إذا كنت تحتاج:
- مزامنة الطلبات والمرتجعات مع Odoo (مع تطابق رموز المنتجات، حسابات الضرائب، ومراكز التكلفة).
- دفع الفواتير لـ Zoho Books مع توليد فاتورة ZATCA Phase 2 مطابقة.
- تحديث المخزون من WMS مخصص أو مستودع SAP.
- إرسال أحداث الشراء إلى Meta Conversions API و Google Ads بـ enhanced conversions.
… فستجد أن كل تطبيق طرف ثالث يحلّ جزءاً، ويترك جزءاً، ويعطّل جزءاً عند التعارض مع غيره. الـ Middleware الخاص بك يصبح single source of truth لما يخرج من سلة وما يدخلها.
المعمارية المرجعية: نمط Event Router
هذه هي المعمارية التي ننفّذها في مشاريع التجار السعوديين:
┌─────────────────────────────┐
│ سلة Salla │
│ (Webhooks + REST API) │
└──────────┬──────────────────┘
│ HTTPS Webhooks
▼
┌──────────────────────────────────────────────┐
│ 1. Webhook Receiver (HTTP, < 200ms) │
│ - يتحقق من توقيع HMAC │
│ - يكتب الحدث الخام في Queue │
│ - يعيد 200 OK فوراً │
└──────────┬───────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 2. Event Queue (SQS / Redis Streams) │
│ - durable, ordered per partition │
│ - DLQ للأحداث الفاشلة بعد N محاولات │
└──────────┬───────────────────────────────────┘
│
▼
┌──────────────────────────────────────────────┐
│ 3. Event Router + Idempotency Cache (Redis) │
│ - يتحقق من المفتاح، يمنع التكرار │
│ - يوجّه الحدث للـ adapters المعنية │
└──┬──────────────┬──────────────┬─────────────┘
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌──────────────┐
│ ERP │ │ WMS / │ │ Marketing │
│ Adapter │ │ Stock │ │ Adapter │
│ (Odoo / │ │ Adapter │ │ (Meta, Google,│
│ Zoho) │ │ │ │ Klaviyo) │
└─────────┘ └─────────┘ └──────────────┘
│ │ │
└──────────────┴──────────────┘
│
▼
┌──────────────┐
│ ZATCA Phase │
│ 2 Submitter │
│ (Fatoora) │
└──────────────┘
الخصائص الجوهرية:
- Stateless receiver: يُقاس أفقياً بسهولة.
- Durable queue: الأحداث لا تُفقد إذا سقط Worker.
- Idempotency على مستوى الـ business operation: لا تُسجَّل الفاتورة في Odoo مرتين حتى لو وصل الـ event ثلاث مرات.
- Adapters معزولة: تعطّل Odoo لا يوقف إرسال Conversions API لميتا.
- Observability: كل حدث له trace ID يُتتبَّع من سلة حتى آخر adapter.
التقنيات المستخدمة تختلف. شائع: Node.js / Hono أو Python FastAPI للـ receiver، Redis Streams أو AWS SQS للقائمة، PostgreSQL لتخزين state، و Docker على VPS سعودي للامتثال لـ PDPL.
خمسة أشياء قبل أن تكتب سطر Middleware واحداً
التسرّع في بناء Middleware يولّد ديناً تقنياً أسوأ من المشكلة الأصلية. قبل البدء:
- راجع استخدام API الحالي. اطلب من فريقك أو من شريك سلة سجلات الاستخدام لآخر 90 يوماً. أي endpoints تستهلك أكثر؟ متى تصل إلى 429؟
- ارسم نموذج البيانات (Data Model Map). صنّف الكيانات: منتج، طلب، عميل، مخزون. لكل كيان: من هو system of record (سلة، Odoo، WMS)؟ التعارضات في هذا التعريف هي مصدر 80% من bugs المزامنة.
- عرّف مفاتيح الـ idempotency. لكل حدث: ما المفتاح الذي يضمن أن تكراره لا يكرّر الأثر؟ مثلاً
order_idلـ order events، لكنorder_id + line_idلأحداث مستوى السطر. - حدّد SLA داخلياً. كم ثانية مسموح بين webhook سلة وظهور الطلب في Odoo؟ خمس ثوانٍ؟ دقيقة؟ ساعة؟ يحدد هذا حجم الـ workers و RAM الـ Redis.
- خطّط لتكامل ZATCA Phase 2 الآن. الموجة 24 من الفوترة الإلكترونية تشمل المنشآت بإيرادات 375 ألف–750 ألف ريال وموعدها النهائي 30 يونيو 2026. إذا كان متجرك في هذه الفئة، يجب أن يكون submitter ZATCA جزءاً من Middleware منذ اليوم الأول. راجع دليل ZATCA الكامل والوثائق الرسمية على بوابة ZATCA.
ربط سلة بأنظمة المؤسسة بشكل سليم هو امتداد طبيعي لـاستراتيجية تكامل الأنظمة، ويُمكّن لاحقاً من إضافة طبقات أتمتة مثل التجارة الذكية المدعومة بالـ AI في MENA.
أسئلة شائعة (FAQ)
س: هل أحتاج فعلاً Middleware؟ ألا تكفي تطبيقات سلة الجاهزة؟ ج: تحت 500 طلب/يوم وتكاملين خارجيين فقط، الإجابة عادة لا. فوق 1000 طلب/يوم، أو عند ربط ERP + WMS + ZATCA + أداة تسويق، الإجابة عادة نعم. السبب ليس "سلة لا تكفي" — السبب أن أي SaaS API يحتاج طبقة retry/idempotency/observability عند هذا الحجم.
س: هل Middleware يتعارض مع شروط استخدام سلة؟ ج: لا. أنت تستخدم API الرسمي عبر وثائق Salla Developers. الـ Middleware ببساطة client أكثر ذكاءً لـ API.
س: كم يستغرق بناء Middleware من هذا النوع؟ ج: نسخة MVP (webhook receiver + queue + adapter واحد لـ Odoo): 3–4 أسابيع. الإصدار الكامل بأربع adapters و ZATCA submitter و observability: 8–12 أسبوعاً.
س: ماذا عن ZATCA Phase 2؟ هل تطبيق سلة الجاهز يكفي؟ ج: للموجات الصغيرة بمتطلبات بسيطة، عادة نعم. لكن إذا كنت تحتاج تخصيص شجرة الحسابات، التعامل مع journals متعددة، أو ربط مع ERP يصدر الفواتير، فالـ Middleware هو المكان الطبيعي لـ ZATCA submitter.
س: هل أحتاج استضافة سعودية للـ Middleware؟ ج: للامتثال الكامل مع PDPL وتقليل latency مع كل من سلة و ZATCA، نعم نوصي بـ VPS داخل المملكة (Riyadh region من مزوّد معتمد).
الخطوة التالية
بنينا هذه الطبقة على متاجر سعودية حقيقية تتعامل مع آلاف الطلبات يومياً وعشرات آلاف الـ SKUs، وربطناها بـ Odoo و Zoho Books و ZATCA Phase 2.
عرض مجاني: جلسة مراجعة معمارية لمدة 30 دقيقة. نراجع معك استخدام API الحالي، نقاط الألم، ونرسم لك Middleware البلوبرنت — بدون التزامات.
تواصل معنا الآن لحجز جلسة المراجعة.