Get your broadcasts liveشغّل حملاتك على واتساب
A hands-on walkthrough of the Broadcast Hub — from connecting WhatsApp to recurring campaigns. Tick items off as you go; your progress is saved in this browser. دليل عملي لمركز البث — من ربط واتساب حتى الحملات المتكرّرة. علِّم الخطوات أثناء تقدّمك؛ يُحفظ تقدّمك في هذا المتصفّح.
1What you're buildingما الذي تبنيه
A self-hosted console that sends approved WhatsApp template messages to lists of contacts over Meta's Cloud API, tracks delivery in real time, and honors opt-outs automatically. لوحة تحكّم ذاتية الاستضافة ترسل رسائل قوالب واتساب المعتمدة لقوائم جهات الاتصال عبر Cloud API من Meta، وتتابع التسليم لحظيًا، وتحترم طلبات إلغاء الاشتراك تلقائيًا.
2Connect WhatsApp (no code)ربط واتساب (بدون كود)
Go to Settings → Connect WhatsApp and paste your Meta values straight into the form — no .env editing needed (saved values override env and are stored in the database):
اذهب إلى الإعدادات → ربط واتساب والصِق قيم Meta مباشرة في النموذج — دون تعديل .env (القيم المحفوظة تتجاوز متغيرات البيئة وتُخزَّن في قاعدة البيانات):
| Fieldالحقل | Where in Metaمكانه في Meta |
|---|---|
| Phone number IDمعرّف رقم الهاتف | WhatsApp → API setup |
| Business account IDمعرّف حساب الأعمال | WhatsApp → API setup |
| App ID (for template media uploads)معرّف التطبيق (لرفع وسائط القوالب) | App → Settings → Basic |
| Access tokenرمز الوصول | System-user permanent tokenرمز دائم لمستخدم النظام |
| App secretالسر السرّي للتطبيق | App → Settings → Basic |
Hit Test connection to confirm the credentials reach Meta. Secrets are write-only — they show as · saved once stored. اضغط اختبار الاتصال للتأكّد من وصول البيانات إلى Meta. الأسرار للكتابة فقط — تظهر كـ · محفوظ بعد التخزين.
Webhookالـ Webhook
The page shows your callback URL ready to copy. In WhatsApp → Configuration, paste it with your verify token and subscribe to messages:
تعرض الصفحة رابط الاستدعاء جاهزًا للنسخ. في WhatsApp → Configuration، الصِقه مع رمز التحقق واشترك في حدث messages:
Callback URL: https://YOUR_DOMAIN/api/webhooks/whatsapp
Verify token: (the webhook verify token from the form)ngrok http 3000 and use the HTTPS URL. Every webhook is HMAC-verified against your app secret.
تختبر محليًا؟ استخدم ngrok http 3000 ثم الرابط الآمن HTTPS. كل Webhook يُتحقَّق منه بـ HMAC مقابل السر السرّي للتطبيق.
3Create & sync templatesإنشاء القوالب ومزامنتها
You can only broadcast templates Meta has approved. Build one right in the app on Templates → Create, then submit it to Meta for review: لا يمكنك الإرسال إلا بقوالب اعتمدتها Meta. أنشئ قالبًا داخل التطبيق من القوالب → إنشاء، ثم أرسله إلى Meta للمراجعة:
- Header attachment (optional): Image, Document/PDF, or Video. Pick a sample file — it's uploaded to Meta's resumable-upload API and the returned handle is attached for review.
- Body with
{{1}},{{2}}variables (one example value required per variable), plus an optional footer. - Buttons (up to 3): Quick reply, URL, Call (phone), or Copy code (coupon).
- Carousel (optional): 2–10 swipeable media cards, each with a media URL, text, and an optional link button.
- مرفق الترويسة (اختياري): صورة، أو مستند/PDF، أو فيديو. اختر ملفًا عيّنة — يُرفع إلى واجهة الرفع القابل للاستئناف لدى Meta ويُرفق المُعرِّف (handle) الناتج للمراجعة.
- النص مع متغيّرات
{{1}}و{{2}}(قيمة مثال مطلوبة لكل متغيّر)، مع تذييل اختياري. - الأزرار (حتى 3): ردّ سريع، أو رابط URL، أو اتصال (هاتف)، أو نسخ كود (كوبون).
- كاروسيل (اختياري): من 2 إلى 10 بطاقات وسائط قابلة للتمرير، لكل منها رابط وسائط ونص وزر رابط اختياري.
Already have templates in Meta? Pull them in instead:لديك قوالب جاهزة في Meta؟ اسحبها بدلًا من ذلك:
GET /api/templates?sync=1
Approved templates appear in the broadcast and campaign pickers; each placeholder becomes a variable you map per-contact.تظهر القوالب المعتمدة في قوائم اختيار الحملات؛ ويصبح كل متغيّر حقلًا تربطه بكل جهة اتصال.
4Upload contactsرفع جهات الاتصال
On Contacts (or the dashboard upload card), import a CSV. A phone column is required; name is reserved; any other column becomes a template variable.
من جهات الاتصال (أو بطاقة الرفع في لوحة التحكّم)، استورد ملف CSV. عمود phone مطلوب؛ وname محجوز؛ وأي عمود آخر يصبح متغيّر قالب.
phone,name,city +966 50 000 0001,Ahmed,Riyadh 965 5000 0003,Fahad,Kuwait City
- Phones are normalized to E.164 digits; bad rows are rejected and counted. Grab the CSV template button if you're not sure of the format.
- Prefer to add one at a time? Use Add contact (first/last name + country code + number).
- Manage everyone on the Contacts page: search, inline edit, opt out / re-subscribe, and multi-select bulk delete.
- Optionally attach the upload to a list — broadcasts target lists. Every time a list changes, a snapshot backup is saved so you can restore a previous version with one click.
- تُطبَّع الأرقام إلى صيغة E.164؛ وتُرفض الصفوف غير الصالحة وتُحصى. استخدم زر قالب CSV إن لم تكن متأكدًا من الصيغة.
- تفضّل الإضافة واحدًا تلو الآخر؟ استخدم إضافة جهة اتصال (الاسم الأول/الأخير + رمز الدولة + الرقم).
- أدِر الجميع من صفحة جهات الاتصال: بحث، وتعديل مباشر، وإلغاء/إعادة الاشتراك، وحذف جماعي بالتحديد المتعدّد.
- اربط الرفع بـقائمة اختياريًا — الحملات تستهدف القوائم. ومع كل تغيير للقائمة يُحفظ نسخة احتياطية (snapshot) لتتمكّن من الاستعادة بنقرة واحدة.
5Send a broadcastإرسال حملة
Dashboard → New broadcast: pick a template + list, fill the variables, send now or schedule. لوحة التحكّم → حملة جديدة: اختر قالبًا وقائمة، واملأ المتغيّرات، ثم أرسل الآن أو جدوِل.
How variable mapping worksكيف يعمل ربط المتغيّرات
field:name / field:city to pull each contact's value. Order matches {{1}}, {{2}}, ….كل مدخل متغيّر إما نص ثابت (للجميع) أو field:name / field:city لجلب قيمة كل جهة اتصال. الترتيب يطابق {{1}}, {{2}}, ….Schedulingالجدولة
WA_MPS (default 80/s) so you never exceed Meta's tier.
تُستبعَد طلبات إلغاء الاشتراك قبل وضع أي شيء في الطابور، ويُحدِّد العامل السرعة بـ WA_MPS (الافتراضي 80/ث) كي لا تتجاوز حدّ Meta.
6Monitor, analytics & retryالمتابعة والتحليلات وإعادة المحاولة
Click a broadcast to open its detail page. While it's in flight you'll see a ● live progress bar that polls every few seconds. اضغط على حملة لفتح صفحة تفاصيلها. أثناء التنفيذ سترى شريط تقدّم ● مباشر يُحدَّث كل بضع ثوانٍ.
- Analytics funnel: Sent → Delivered → Read → Clicked, with delivery and read rates at a glance.
- Button events: taps on your template buttons are tracked (total + unique, broken down per button) so you can measure response.
- Filter recipients by status (PENDING / SENT / DELIVERED / READ / FAILED) and load more.
- If any failed, hit Retry N failed — it re-queues just those with the saved variables.
- Inbound
STOPauto-opts-out a contact from all future sends. - Replies land in the Inbox — a live two-way thread where you can answer with text or attachments within the 24-hour window (read receipts included).
- قُمع التحليلات: أُرسِلت ← وصلت ← قُرئت ← نُقِر، مع معدّلات التسليم والقراءة بلمحة.
- أحداث الأزرار: تُتتبَّع نقرات أزرار القالب (الإجمالي + الفريد، مفصّلة لكل زر) لقياس التفاعل.
- صفِّ المستلمين حسب الحالة (PENDING / SENT / DELIVERED / READ / FAILED) وحمِّل المزيد.
- إن فشل بعضها، اضغط إعادة محاولة N فاشلة — يعيد فقط تلك مع المتغيّرات المحفوظة.
- رسالة
STOPالواردة تُلغي اشتراك جهة الاتصال من كل الإرسالات المستقبلية تلقائيًا. - الردود تصل إلى صندوق الوارد — محادثة ثنائية مباشرة يمكنك الرد فيها بنص أو مرفقات خلال نافذة الـ 24 ساعة (مع إشعارات القراءة).
7Recurring / drip campaignsالحملات المتكرّرة
On Campaigns, create a schedule that fires a fresh broadcast on a cron (UTC). Pick a preset or write your own. من الحملات، أنشئ جدولًا يطلق حملة جديدة وفق توقيت cron (بتوقيت UTC). اختر إعدادًا جاهزًا أو اكتب تعبيرك.
| Cron | Meaningالمعنى |
|---|---|
0 9 * * * | Every day 09:00 UTCكل يوم 09:00 UTC |
0 9 * * 1-5 | Weekdays 09:00 UTCأيام العمل 09:00 UTC |
0 9 1 * * | 1st of each month 09:00 UTCأول كل شهر 09:00 UTC |
Pause/resume or delete any campaign at any time. Each run honors opt-outs and the rate limit just like a manual send.أوقف/استأنف أو احذف أي حملة في أي وقت. كل تشغيل يحترم الموافقات وحدّ السرعة تمامًا كالإرسال اليدوي.
8Team & securityالفريق والأمان
- Settings → invite teammates (ADMIN or MEMBER). Only ADMINs can manage users.
- Sessions use short access tokens + rotating refresh tokens — Sign out everywhere kills every session.
- Login is rate-limited; all data and APIs sit behind auth except the webhook and health check.
- الإعدادات → ادعُ أعضاء الفريق (ADMIN أو MEMBER). المسؤولون فقط يديرون المستخدمين.
- تستخدم الجلسات رموز وصول قصيرة + رموز تجديد متبدّلة — تسجيل الخروج من كل الأجهزة يُنهي كل الجلسات.
- تسجيل الدخول محدود المعدّل؛ وكل البيانات والواجهات خلف المصادقة عدا الـ Webhook وفحص الصحة.