Webhook صادر
PropDrop بيبعت POST موقّع لبوابتك مع ردود الوكيل الذكي وفريقك وأحداث العملاء المهمة، بتوقيع X-PropDrop-Signature ومفتاح Idempotency-Key وإعادة محاولة.
الـ Webhook الصادر لـبوابة رسايل خاصة بيك: مثلًا n8n، أو مزود واتساب غير Meta، أو سيستم داخلي. PropDrop بيبعت للرابط بتاعك طلب POST فيه JSON موقّع، وبوابتك هي اللي توصّل الرسالة للعميل أو تعمل اللي عايزه بالحدث.
محتاجه ولا لأ؟
لو ربطت واتساب أو ماسنجر أو إنستجرام أو تيليجرام من PropDrop مباشرة، مش محتاجه عشان الردود: PropDrop بيبعتها بنفسه. استخدمه لو عندك بوابة خاصة، أو لو عايز سيستم تاني يعرف لما عميل يتأهل أو يطلب معاينة أو يتحوّل للفريق. ومعاه غالبًا هتحتاج الـ Webhook الوارد.
الصفحة دي للشخص التقني اللي بيجهّز البوابة. متاح في كل الباقات.
مين يقدر يظبطه: المالك والمدير.
التفعيل
افتح «إرسال الردود لبوابتك (Webhook صادر)»
من «الإعدادات ← القنوات والربط»، تحت «متقدم»، شغّل المفتاح.
حط «رابط الإرسال»
لازم يبدأ بـ https:// ويكون عنوان عام. دوس حفظ، هتظهر «تم حفظ رابط الإرسال».
اعمل «مفتاح التوقيع السري»
دوس «اعمل مفتاح جديد». المفتاح (بيبدأ بـ pd_out_) بيتعرض مرة واحدة بس: انسخه وحطه في بوابتك ودوس «نسخته». لو ضاع اعمل واحد جديد، والقديم بيبطل فورًا.
لو قفلت المفتاح، الرابط بيتمسح («تم إيقاف الـ Webhook الخارجي») وأي طلب كان مستني إعادة محاولة بيتعلّم «فشل».
بنبعت إمتى؟
كل طلب ليه حدث في الهيدر X-PropDrop-Event:
| الحدث | بيتبعت إمتى |
|---|---|
message.created | رد من الوكيل الذكي أو من فريقك في محادثة مش متوصّلة بقناة مربوطة في PropDrop (زي المحادثات اللي جاية من الـ Webhook الوارد). ردود شات الموقع مش بتتبعت لأن العميل شايفها بالفعل |
lead.qualified | الوكيل أهّل العميل وقيّمه (hot / warm / cold) |
viewing.requested | العميل طلب معاينة (طلب، مش ميعاد مؤكد: الفريق هو اللي بيأكد) |
handoff | الوكيل حوّل المحادثة للفريق |
lead.qualified و viewing.requested و handoff بيتبعتوا لكل المحادثات، من أي قناة، طول ما الرابط متحط.
شكل الطلب
POST https://gateway.example.com/propdrop
Content-Type: application/json
User-Agent: PropDrop-Webhooks/1.0
X-PropDrop-Event: message.created
Idempotency-Key: 9b2e…
X-PropDrop-Signature: sha256=<hex HMAC-SHA256(secret, body)>الجسم دايمًا نفس الغلاف:
{
"event": "message.created",
"id": "9b2e…",
"agency_id": "…",
"created_at": "2026-10-09T12:00:00.000Z",
"data": { }
}id هو نفس قيمة Idempotency-Key.
محتوى data لكل حدث
رد الوكيل الذكي (sender = ai):
{
"message_id": "…",
"conversation_id": "…",
"channel": "whatsapp",
"sender": "ai",
"text": "أهلاً يا أحمد! عندنا شقق 3 غرف في التجمع تبدأ من …",
"contact": { "name": "Ahmed Ali", "phone": "+201001234567", "instagram": null }
}رد من فريقك (sender = agent):
{
"message_id": "…",
"conversation_id": "…",
"channel": "whatsapp",
"sender": "agent",
"text": "…",
"contact": { "name": "Ahmed Ali", "phone": "+201001234567", "instagram": null }
}ردود الوكيل وردود الفريق ليهم نفس الشكل، والفرق بس في sender (ai أو agent). بيانات العميل دايمًا في contact (name وphone وinstagram).
التحقق من التوقيع
X-PropDrop-Signature = sha256= + HMAC-SHA256 بالمفتاح السري على جسم الطلب زي ما هو (raw body)، بصيغة hex. احسب نفس التوقيع وقارنه، وارفض أي طلب مختلف:
import { createHmac, timingSafeEqual } from "node:crypto";
function isFromPropDrop(rawBody, header, secret) {
if (!header?.startsWith("sha256=")) return false;
const expected = createHmac("sha256", secret).update(rawBody, "utf8").digest("hex");
const got = header.slice(7);
return got.length === expected.length && timingSafeEqual(Buffer.from(got, "hex"), Buffer.from(expected, "hex"));
}الجسم الخام
احسب التوقيع على النص اللي وصلك بالظبط، قبل أي JSON.parse أو إعادة ترتيب.
الرد وإعادة المحاولة
- رد بأي كود 2xx خلال 8 ثواني عشان الطلب يتحسب «اتسلم».
- لو مردتش، أو رديت بكود غير 2xx، أو رديت بتحويل (3xx، مش بنتبع التحويلات)، بنعيد المحاولة بعد حوالي دقيقة، وبعدها بحوالي 5 دقايق. يعني 3 محاولات إجمالي، وبعدها الطلب بيتعلّم «فشل».
- كل إعادة محاولة بتبعت نفس البايتات بالظبط بنفس التوقيع ونفس
Idempotency-Key.
Idempotency-Key
ممكن نفس الحدث يوصلك أكتر من مرة (مثلًا ردّيت متأخر وإحنا عيدنا المحاولة). خزّن Idempotency-Key وتجاهل أي طلب بمفتاح شفته قبل كده، عشان ماتبعتش نفس الرسالة للعميل مرتين. ومن ناحيتنا، نفس المفتاح مش بيتحط في الطابور غير مرة واحدة.
«آخر الطلبات المبعوتة»
تحت الإعدادات هتلاقي آخر 10 طلبات بالحدث والحالة («اتسلم»، «بيعيد المحاولة»، «فشل») وعدد المحاولات. لو فيه «فشل»، اتأكد إن الرابط شغال وبيرد 2xx بسرعة.