منظومة جونادا للواتساب
بثّ واتساب وأتمتة قوالب لمشغّل تجارة إلكترونيّة إقليميّ. تكامل مباشر مع Meta Cloud API، 1.2 مليون رسالة شهريًّا بنسبة تسليم 99.9٪.
عن المشروع.
جونادا منظومة بثّ وأتمتة قوالب على WhatsApp بنيتها لمشغّل تجارة إلكترونيّة إقليميّ كان يستنزف ميزانيّته على رسوم المنصّات لكلّ رسالة. يتحدّث النظام مباشرة مع Meta Cloud API، ويدير اعتماد القوالب، ويوجّه عمليّات البثّ الكبيرة عبر طابور يحترم حدود المعدّل لكلّ عميل. صمّمت وبنيت الخادم وطبقة الطابور وأدوات الإدارة. يمرّر الآن أكثر من مليون رسالة شهريًّا دون وسيط خارجيّ.
ما الذي تغيّر.
رسالة شهريًّا
نسبة التسليم
زمن الـ API، الـ p95
ما الذي وجدناه.
مشغّل تجارة إلكترونيّة أراد بثّ تحديثات الطلبات والرسائل الترويجيّة إلى قاعدة عملائه عبر WhatsApp دون دفع رسوم لكلّ رسالة إلى الأبد.
ما الذي فعلناه.
تكامل مباشر مع Meta Cloud API، وطابور Node.js يحترم حدود المعدّل لكلّ عميل، وواجهة لإدارة القوالب تعكس مسار اعتماد قوالب WhatsApp ذاته كي يعرف المسؤول مسبقًا إن كان القالب سيُقبل.
ما الذي أصبح.
توجيه 1.2 مليون رسالة شهريًّا بنسبة تسليم 99.9٪ وبزمن إرسال وسطيّ تحت 300 مللي ثانية.
دوري الفعليّ في هذا المشروع.
منفرد · 100٪ باك-إند + طابور + واجهة إدارة + تكامل Meta API. لا طبقة SaaS (Twilio، MessageBird، 360dialog) تجلس بين المشغّل وMeta. علاقة مباشرة مع Meta Cloud API تعني الحفاظ على الهامش، تحكّمًا كاملاً بالقوالب، ولا رسوم وسيط لكلّ رسالة.
مهندس باك-إند
Node.js 20 + Fastify. عميل Meta Cloud API مباشر، مستقبل webhook لإيصالات التسليم، مزامنة حالة القوالب.
مهندس طوابير + حدود معدّل
BullMQ على Redis. سلّات حدود معدّل لكلّ عميل تحترم نظام مستويات WhatsApp (250/1k/10k/100k رسالة/يوم حسب درجة الجودة).
مهندس واجهة إدارة
باني قوالب يعكس استمارة الموافقة في Meta، مجدول بثّ، مدير قوائم مستلمين، لوحة معدّل تسليم بتحديثات لحظيّة.
DevOps + مراقبة
PM2، MongoDB Atlas، Sentry لتتبّع الأخطاء، لوحات Grafana لمعدّل التسليم + عمق الطابور.
الأرقام التي تهمّ.
- +1.2Mرسالة شهريًّاحجم إنتاج ثابت؛ ذُرى خلال فعاليّات التخفيضات.
- 99.9٪نسبة التسليمسُلّمت بتأكيد Meta (ليس مجرّد أُرسلت). الإرسالات الفاشلة تُعزَل + يُعاد المحاولة بعد التحليل.
- <300msوسيط زمن الإرسالمن إضافة إلى الطابور إلى استلام Meta API، مقاس عند العامل.
- 0$رسوم وسيط لكلّ رسالةتكامل Meta مباشر — تطبّق فقط أسعار محادثات Meta. لا زيادة SaaS.
- ~85٪نسبة اعتماد القوالبتقدير — واجهة الإدارة تلتقط أشهر أسباب الرفض قبل الإرسال إلى Meta.
- <2sمعالجة إيصال webhookwebhook Meta → تحديث قاعدة → تحديث لوحة.
ما الذي كان معطّلاً فعلاً.
مراسلة WhatsApp بحجم تفرض اختيارًا: تدفع لـTwilio/MessageBird/360dialog ~0.005-0.015 دولار للرسالة كرسوم وسيط فوق أسعار محادثات Meta — عند 1M رسالة/شهر تصبح 5000-15000 دولار شهريًّا تذهب لوسيط يضيف إدارة طوابير + لوحات لكنّه يحجز عملك رهينة لأسعاره. أو تتكامل مع Meta Cloud API مباشرة، ما يعني بناء الطابور، دورة حياة اعتماد القوالب، معالجة إيصال webhook التسليم، الالتزام بمستويات حدود المعدّل، واللوحات بنفسك. اختار المشغّل التكامل المباشر بعد حساب الأرقام بعد السنة الأولى.
المساحة الصعبة من المشروع.
- 01نظام مستويات WhatsApp (250 → 1k → 10k → 100k → بلا حدّ رسالة/يوم حسب درجة الجودة) يتطلّب سلّة token لكلّ عميل تحترم المستوى الحاليّ + تخفض الإيقاع تلقائيًّا عند انخفاض درجة الجودة.
- 02دورة حياة اعتماد القوالب: مسوّدة → مُرسَلة → قيد المراجعة → معتمَدة/مرفوضة. واجهة الإدارة تعكس أسباب رفض Meta بدقّة ليكرّر المشغّلون بسرعة دون إرسال مسوّدات سيّئة.
- 03إيصالات التسليم تصل لاتزامنيًّا عبر webhooks لكلّ رسالة — عند 40 ألف رسالة/يوم هذا 40 ألف ضربة webhook. يجب معالجتها كلّها خلال ثانيتين لإبقاء اللوحة حيّة.
- 04إدارة قوائم المستلمين: WhatsApp يتطلّب تأكيد opt-in لكلّ رقم؛ المنصّة يجب أن تتعقّب حالة الموافقة + تاريخ التسليم لكلّ رقم لتفادي الضرر الصامت لدرجة الجودة من الإرسال إلى أرقام غير مستجيبة.
- 05شفافيّة التكلفة: المشغّلون يريدون تكلفة كلّ بثّ بعملتهم قبل الإرسال. أسعار Meta تتفاوت حسب بلد المستلم + فئة المحادثة (خدمة، تسويق، مصادقة، خدمة). الحاسبة يجب أن تطابق فواتير Meta ضمن ±2٪.
انتصارات هندسيّة تستحقّ التسمية.
سلّة حدود معدّل لكلّ عميل
سلّة token لكلّ حساب WhatsApp Business (WABA)، تعاد التعبئة بمعدّل المستوى الحاليّ. عند خفض المستوى (انخفاض درجة جودة)، تُعاد السلّة فورًا إلى الحدّ الجديد. لا فيضان طابور.
واجهة إدارة واعية باعتماد القوالب
واجهة الإدارة تشغّل مجموعة regex أسباب رفض Meta في الجانب العميل قبل الإرسال. يرى المشغّلون تحذيرات (مثل: «القوالب التسويقيّة لا يمكن أن تحتوي على أرقام هاتف في النصّ») ويعدّلون قبل حرق فتحة إرسال.
idempotency لـwebhook
Meta تعيد محاولة تسليم webhooks الفاشلة حتّى 24 ساعة. قد يصل نفس إيصال التسليم 5 مرّات أو أكثر. مفتاح idempotency على (waba_id + message_id + status) يمنع الحساب المضاعف.
محرّك توقّع التكلفة
مصفوفة أسعار Meta مسبقة التحميل، تُحدَّث يوميًّا. بحث حسب بلد المستلم، تصنيف فئة المحادثة، تحويل عملة وفق العملة الأساس للمشغّل. دقّة ±2٪ تحقّقت ضدّ فواتير Meta الشهريّة.
كيف يتشابك النظام.
طبقة الحافّة
طبقة التطبيق (Node.js)
طبقة اللاتزامن + الطوابير
طبقة البيانات
القرارات وراء كلّ اختيار.
Node.js + Fastify (باك-إند)
- بيئة تشغيل event-driven هي التناسب الطبيعيّ لإدخال/إخراج webhook + طابور عالي الإنتاجيّة — 40 ألف إيصال/يوم بـCPU من خانة واحدة.
- Fastify يتفوّق على Express بـ2-3 أضعاف في إنتاجيّة JSON عند الأحجام الصغيرة لـwebhooks WhatsApp.
- async/await أصليّ + أنماط Promise.all تجعل التوزيع لكلّ بثّ تافهًا.
BullMQ + Redis (طابور)
- أسماء طوابير لكلّ WABA تعطي عزلًا طبيعيًّا لكلّ عميل دون نسخ Redis منفصلة.
- إعادة محاولة مع backoff مدمجة تتعامل مع 429s من Meta دون كود مخصّص.
- أولويّات الوظائف تتيح للرسائل المعاملاتيّة العاجلة قطع الطابور أمام بثّ تسويقيّ كبير.
MongoDB (قوالب + بثّ)
- القوالب ذات بنية شديدة التغيّر (أنواع وسائط الرأس، أعداد الأزرار، تجاوزات اللغة) — تخزين JSON أصليّ يتفادى 5+ هجرات لكلّ ميزة قالب.
- خطوط aggregation تشغّل لوحة معدّل التسليم دون OLAP جانبيّ.
Meta Cloud API مباشر (لا SaaS وسيط)
- عند 1M+ رسالة/شهر، رسوم الوسيط (5k-15k$ شهريًّا) تتجاوز تكلفة بناء الوسيط مرّة.
- تحكّم كامل بدورة حياة القوالب، ترقيات المستوى، واسترداد درجة الجودة — لا طبقة SaaS تخفي الأذرع.
- ملكيّة WABA مباشرة تبقى مع المشغّل؛ التحوّل إلى مزوّد آخر لاحقًا يعني تبديل الطابور + اللوحة، لا ترحيل حالة الحساب.
ما علّمنا إيّاه هذا البناء.
- رسوم الوسيط لكلّ رسالة تتراكم. عند أيّ حجم ذي معنى، امتلاك الوسيط يردّ تكلفته خلال سنة.
- نظام مستويات WhatsApp يكافئ السلوك الجيّد — لكنّه يعاقب الأخطاء بقسوة. استرداد درجة الجودة يستغرق أسابيع. ابنِ واجهة الإدارة لتفادي المسوّدات السيّئة قبل الشحن، لا للتفاعل مع الرفوض فقط.
- idempotency لـwebhook ليس اختياريًّا. Meta ستعيد المحاولة. خطّط له من اليوم الأوّل.
