الانتقال إلى المحتوى الرئيسي
هذا هو المسار الواحد من لا شيء إلى ربط يعمل، وهو مكتوب للمطوّر الذي ينفّذه. في نهايته يصل تسجيل حقيقي في منتجك إلى حملة، ويظهر حدث حقيقي في سجل ذلك الشخص، ويمكن أن تبدأ حملة في لحظة وقوعه. تحتاج ثلاثة أشياء: الدخول إلى لوحة تحكم حملة، وكود HTML لموقعك، وكود الخادم الذي يتم فيه التسجيل والدفع.
تريد الاختبار أولاً؟ لا يوجد مفتاح اختبار منفصل بعد. كل المفاتيح حيّة، فقد يطلق حدث ترسله حملة حقيقية. ابنِ على نشاط ثانٍ تنشئه للاختبار، وبدّل المفتاح حين تطلق.
تبني بأداة مثل Lovable أو v0 أو Bolt لشخص ليس لديه حساب في حملة؟ ابدأ بالتثبيت القابل للاستلام في hamla.io/developers، ثم عُد إلى هنا بعد أن يستلم صاحب النشاط التثبيت، فالمفتاح السري لا يصدر قبل ذلك.

كيف تتكامل القطع

وسم السكربت يرى المتصفح، وخادمك يعرف الوقائع. أرسل الاثنين فترى حملة الشخص كاملاً.
1

أضف وسم السكربت

انسخ المقتطف من الإعدادات ← الموقع وضعه في كل صفحة، قبل </head>:
يسجّل الزيارات ومن أين جاءت، ويعرض النوافذ، ويعطي كل متصفح معرّف زائر. والتطبيق الجوّال الذي لا صفحات ويب له يستطيع تخطّي هذه الخطوة.
2

أنشئ مفتاحاً سرياً

الإعدادات ← مفاتيح API ← أنشئ مفتاحاً سرياً. يبدأ بـ sk_live_.خزّنه باسم HAMLA_API_KEY في بيئة خادمك. فهو يستطيع كتابة بيانات العملاء، فعامله ككلمة مرور قاعدة البيانات: لا تضعه أبداً في صفحة ويب، ولا في تطبيق جوّال، ولا في متغيّر بيئة يرسله إطار عملك إلى المتصفح (NEXT_PUBLIC_… وVITE_…).على Node.js، ثبّت الحزمة:
وأي لغة أخرى تعمل عبر HTTP عادي. الحزمة تضيف الطابور وإعادة المحاولة فقط.
3

عرّف الناس عند تسجيلهم

هذه الخطوة هي أكثر ما تتخطّاه عمليات الربط، وهي التي تقرّر إن كانت حملة تستطيع مراسلة الشخص يوماً.استدعِ identify من خادمك عند التسجيل، ومرة أخرى عند تسجيل الدخول:
ماذا يفعل:
  • ينشئ جهة الاتصال، أو يُثري الموجودة. الأسماء والموقع تملأ الناقص ولا تستبدل شيئاً أبداً.
  • يسجّل أنك أنت من أدخل هذا الشخص إلى حملة، وهذا ما يتيح للحملات مراسلته بالبريد. وبتعريفك الشخص تؤكد أن لديك إذناً بالتسويق له، كما تشترط شروط حملة.
  • يربط زياراته المجهولة السابقة، ومنها الإعلان الذي جاء به، حين تمرّر ملف تعريف visitorId أو تستدعيه من الصفحة بـ hamla.identify({ email }).
track وحده لا يجعل الشخص قابلاً للوصول. جهة الاتصال التي لم تعرفها حملة إلا من حدث ليس لها إذن مسجَّل، فلن ترسل إليها أي حملة، ولا حتى بريد. استدعِ identify أولاً، في لحظة تسجيل الشخص. وتسجيل حملة نفسها يعمل بهذا الترتيب.
أما الرسائل النصية وواتساب فتحتاج أكثر من ذلك: كل منهما يتطلب موافقة الشخص نفسه على تلك القناة، عبر نافذة أو نموذج من حملة، أو بتأكيد من النشاط داخل حملة. فالبريد أو رقم الهاتف وحده ليس إذناً أبداً.
4

أرسل الأحداث من مكان حدوثها

في الكود الذي لديك أصلاً، مثل إشعار الدفع أو تأكيد الحجز أو بدء التجربة، أضف استدعاءً واحداً:
  • event اسمك أنت للحظة، بأي لغة. والمحفّزات والشرائح تطابقه حرفياً.
  • type يقول ماذا يعني الحدث (purchase وrefund وbooking وsignup وtrial…)، فيُحتسب الدفع إيراداً. انظر القائمة كاملة.
  • idempotencyKey رقم فاتورتك أو طلبك. فإشعار الدفع المُعاد يُحتسب مرة واحدة.
  • traits تصف الشخص الآن (خطته وحالته). والحدث هو ما فعله.
لا يرمي track وidentify أخطاءً ولا يعطّلان شيئاً أبداً، فلا يستطيع استدعاء تسويقي أن يكسر عملية دفع. وعلى المنصات الخالية من الخوادم، استدعِ await hamla.flush() قبل أن تعيد الدالة، كي يُرسَل الطابور.
5

تأكد من وصوله

استخدم trackNow مرة واحدة، لتقرأ الجواب:
تخبرك النتيجة إن كان الحدث قد وصل، وبماذا قرّرت حملة:
وحين يكون ok هو false، يقول reason لماذا (config أو invalid_input أو http أو network أو timeout)، ويحمل status رمز HTTP. وعبر HTTP العادي تحصل على data نفسها داخل { "success": true, "data": … }.ثم افتح ذلك الشخص في جهات الاتصال: الحدث في سجله مع وقت حدوثه. ويسرد warnings ما لم تستطع حملة تطبيقه، مثل سمة من نوع خاطئ، ولا يظهر إلا حين يكون هناك ما يقال. اقرأه في أول طلب. وإن قال campaigns will not reach this contact فالشخص لم يُعرَّف قط: عُد إلى الخطوة الثالثة.
6

حوّل الحدث إلى رسالة

سلّمه لصاحب النشاط، أو افعلها بنفسك:
  • اطلب من حملة: «حين يُطلق أحد subscription_started، أرسل له بريد ترحيب بأفضل ثلاث نصائح لدينا.»
  • أو ابنِها: افتح حملة ← متى تبدأ الحملة؟ ← حدث في تطبيق ← أحداث تطبيقك ← اكتب اسم الحدث.
من الآن فصاعداً، كل من يُطلق ذلك الحدث ويمكن الوصول إليه تصله الرسالة، في لحظة حدوثه.

أحضر تاريخك

أرسل التسجيلات والمدفوعات السابقة عبر POST /api/sdk/track/batch، حتى 500 في الطلب الواحد، كلٌّ بوقته الحقيقي occurredAt ومفتاح idempotencyKey. التاريخ يملأ الملفات والإيرادات والشرائح، ولا يرسل رسالة أبداً. التفاصيل في مرجع الأحداث.

قبل الإطلاق

  • المفتاح السري على خادمك فقط.
  • identify يعمل عند التسجيل وتسجيل الدخول، قبل أول track أو معه.
  • كل حدث فيه مال له type وidempotencyKey.
  • الدوال الخالية من الخوادم تستدعي await hamla.flush() قبل أن تعيد.
  • بدّلت مفتاح نشاط الاختبار بالمفتاح الحقيقي.

حين لا يسير شيء كما يجب

كل حقل وحد وخطأ في مرجع الأحداث. والشرح الأطول للأحداث، مع مثالين لعيادة ولمنتج SaaS، في أحداث حملة.