القمع والمحفّزات
القمع جراف. التشغيل صف. الانتظار وقت.
ده النموذج كله، وكل خاصية صعبة في المنتج ده طالعة من الجمل التلاتة دي. تعديل قمع شغال آمن بسببهم. إعادة المحاولة مش بتبعت مرتين بسببهم. شخص ألغى اشتراكه يوم التلات مش بيسمع حاجة يوم الخميس بسببهم.
اللي بيحصل فعلًا لما يشتغل
نشر الفانل بيكتب نسخة ثابتة ما بتتغيرش. حد بيدخل، وسطر بيظهر: تشغيلة واحدة، للكونتاكت ده، مربوطة بالنسخة دي، وفيها النود الحالي، ووقت الاستيقاظ، والكونتيكست بتاعها.
ووركر بيحجز التشغيلات اللي وقت استيقاظها عدّى، وبياخدها بـSKIP LOCKED عشان وركرين مياخدوش نفس الواحدة. بينفّذ النودات لحد ما يوصل لانتظار أو نهاية، وبعدين بيكتب وقت الاستيقاظ الجاي وبيسيبها.
النود دالة نقيّة من التشغيلة والكونتاكت والنود نفسها — وكل تأثيراتها بتتحفظ في نفس الترانزاكشن بتاعة تقدم التشغيلة. الخاصية دي بالذات هي اللي بتخلي إعادة المحاولة آمنة. ووركر بيتقتل في نص الثانية بين "الإرسال" و"التقدم" بيسيب الاثنين مع بعض أو ولا واحد، عمره ما بيسيب واحد بس.
ولأن التطبيق هو اللي بيدي الوقت مش الداتابيز، السطر اللي بيتكتب دلوقتي مستحق دلوقتي. عمود جدولة بقيمة افتراضية من ساعة الداتابيز مش مستحق في لحظة كتابته، وبيفوّت التيك نفسه اللي خلاقه — بقطة شكلها مش حاجة خالص لحد ما رسالة تتأخر ساعة.
- 1حجز
wake_at <= now()،FOR UPDATE SKIP LOCKED. طابور من غير حجز بيبعت مرتين افتراضيًا. - 2تنفيذالنودات بالترتيب لحد انتظار أو نهاية. كل واحدة بتكتب خطوة: إيه اللي قررته، وإيه اللي أخرجته.
- 3كوميتالتأثيرات والتقدم في ترانزاكشن واحدة. دي الحتة كلها.
- 4نومبيتكتب
wake_atالجديد. مفيش صفوف لاحقة موجودة لسه، ولا محتاجين أي واحدة منها.
تشغيلة واحدة لكل كونتاكت لكل نسخة
أربع عشر مُشغِّل
اللي يقدر يبدأ تشغيلة
من دول أشياء بتعملها إنت. وأغلبهم أشياء عميلك بيعملها أو مش بيعملها — وعدم عمل الحاجة هو مُشغِّل زي عملها بالظبط.
بيوصلوا
form_submit، list_join، contact_created، tag_added وsegment_enter. السيجمنت شرط عايش، فـ"دخل السيجمنت" بتغطي كل "بقى" تقدر تعبّر عنها — تلات أوردرات، تسعين يوم صمت، صرف فوق حد معين.
بيعملوا حاجة
page_visit من سنيبت الموقع، message_opened، link_clicked، booking_made وpayment_made. فتح الرسالة نفسه إيفنت على الكونتاكت، فالفانل يقدر يستنى رد فعل على آخر حاجة بعتها.
الوقت، أو إنت
date_field مع إزاحة — عيد ميلاد، تجديد، "سنة من", سبعة أيام قبل أو تلات أيام بعد. schedule للمتكرر. وmanual للإعلان اللي بتبعته لأنك قررت كده.
التطبيق بتاعك
api_event هو إيفنت مخصص بتبعته من كودك بتوكن بتاعك. أي حاجة منتجك عارفها بتبقى مُشغِّل: فعل حساب، دعّى زميل، وصل للحد، لغى، صدّر. دي اللي بتحوّل أداة إيميلات لجزء من منتجك.
إعادة الدخول، قرار واحد
الفانل يا بيقبل إعادة الدخول يا لأ، والداتابيز بتفرضه: تشغيلة واحدة لكل كونتاكت لكل فانل إلا لو قلت غير كده. نفس المُشغِّل يشتغل مرتين في نفس الثانية مش هيطلّع تشغيلتين بالغلط.
شروط الدخول
المُشغِّل بيشتغل، ومواصفات الدخول بتقرر هل الكونتاكت ده بالذات مؤهل — شرط سيجمنت قدام الباب. أرخص من نود شرط في أول خطوة، وبيخلي الجراف عن اللي بيحصل مش عن مين مسموحله يدخل.

أربع عشر حاجة تقدر تبدأه. ستاشر حاجة ممكن تحصل بعده.
ستاشر أكشن وسبع نودات تدفق
الفانل يقدر يعمل إيه، وبيقرر إزاي
يبعت حاجة
send_email، send_sms، send_push، send_letter — أربع قنوات، جراف واحد — وكمان notify_team لما الشخص اللي لازم يعرف يكون شغال معاك.
يغيّر الكونتاكت
add_tag، remove_tag، add_to_list، remove_from_list، set_field. إنك تعلّم على الناس وأنت ماشي هو اللي بيخلي سيجمنت الفانل الجاي بسيط.
يوصل برّه
http_request لأي حاجة تحبها، وcreate_payment على حسابك المتصل إنت، وbook_slot على مصدر حجز. اللي بيدفع فاضل بتاعك؛ ومحدش بيبقى عميل لينا.
يتنقل بين الفانلات
enter_funnel وexit_funnel. اتبنى سيكوينس ترحيب واحدة ونده عليها من أربع حتت، بدل ما تدير أربع نسخ بتتفرق مع بعض بحلول مارس.
توليد وقت الإرسال
ai_generate بيملأ متغيرات الدمج لكل كونتاكت، بحساب من رصيدك، وبكاش حسب الكرياتيف وهاش صفات الكونتاكت — وإلا كنت هتدفع على كل مستلم في كل إرسالة.
انتظار، فرع، تقسيم، دمج
wait بياخد مدة، أو تاريخ ووقت، أو يوم من الأسبوع بساعة، أو حقل تاريخ مع إزاحة. condition شرط على شريحة له نعم ولا. split تقسيم A/B/n بأوزان. join بيرجّع الفروع تاني لبعض.
goal — الهدف اللي يهم
الهدف بيوقف التسلسل لأي حد يوصله. حجز، اشترى، رد: باقي التسلسل بيتلغى له هو بالذات. محدش هيستنى رسالة "وحشتناك" تاني يوم بعد ما رجع، والنود دي هي اللي بتمنع ده.
throttle و quiet_hours
الـ throttle بيوزّع الدفعة بحيث إن صندوق بريد له سقف معدل منخفض ميتضربش لحد الإيقاف. ساعات الهدوء بتحبس الرسالة لحد وقت معقول — بتتطبق على مستوى الرسالة نفسها، مش بتتنسخ في كل فرع من فروع الرسم.
بيتتفحص قبل ما يقدر يشتغل
المُتحقّق بيرفض نفس الحاجات ليك ولكل الـ AI
الرسم بيتفحص قبل ما ينشر، والفحص مش مجرد نصيحة. نفس الكود بيتنفذ سواء حد رسم القمع بإيده أو موديل ولّده، وده السبب الوحيد اللي يخلي القمع المولّد يبقى موثوق أصلًا.
نقطة دخول واحدة بالظبط
نودين دخول دي لُبس محدش بيلاحظه غير لما نص القائمة يوصل له التسلسل الغلط.
كل نود لازم تكون قابلة للوصول
الفرع اليتيم يا غلطة يا رسالة انت فاكرها بتتبعت وهي مش بتتبعت. الاتنين يستاهل يتقال لك عليهم.
أي دايرة لازم فيها انتظار
اللوب اللي مفيهوش انتظار هو لوب لا نهائي فيه إرسال في نصه. القاعدة دي هي الفرق بين قمع وحادثة.
كل إرسال له تصميمه
نود send_email من غير تصميم وموضوع مش ممكن تنشر. الرسالة اللي موضوعها صح وجسمها فاضي دي حالة فشل حقيقية؛ وبتترفض هنا.
كل متغير معروف
متغيرات الدمج بتتتحقق عند النشر. {{frist_name}} غلطة إملائية بتشوفها وانت بتعدّل، مش "أهلاً ," بتوصل في أربعين ألف إنبوكس.
وبعدين جرّبه بمحاكاة
شغّل تجربة لجهة اتصال حقيقية على الرسم كله واقرأ المسار اللي اتخذ وكل رسالة كانت هتتبعت، ويومها. مفيش حاجة بتخرج بره.
الحالات الصعبة
سبع حاجات بتكسر أي محرك ساذج
كل واحدة منهم اختبار وراه ساعة ثابتة ومحددة، لأن كل واحدة بتكسر تنفيذ شكله سليم تمامًا لحد ما يقابل الواقع.
- 1قمع بيلف على نفسهمشروع، شائع، وسليم — بشرط إن الدايرة فيها انتظار، والمُتحقّق بيرضخ على ده.
- 2حد يلغي اشتراكه في نص الطريقالاستبعاد بيتفحص عند الإرسال، مش عند الطابور. الفحص عند الطابور بيبعث للناس اللي مشيوا خلال فترة الانتظار.
- 3القمع يتعدّل وعشرة آلاف شخص جواههم كمّلوا على النسخة اللي دخلوا عليها لآخرها. الجداد يمشوا على الجديدة.
- 4نفس التريجر يشتغل مرتين في ثانية واحدةتشغيل واحد، لأن التفرد ده فهرس مش فحص وبعده إدخال.
- 5جهة اتصال تتمسح في نص التشغيلالتشغيل بيخلص. مسح بيسيب تسلسل لسه موجه لحد معين مش مسح.
- 6انتظار بيمتد على تغيير التوقيت الصيفي"تلات يوم الساعة تسعة الصبح" معناها تسعة الصبح على الجانبين من تغيير الساعة.
- 7ووركر يتقتل بين الإرسال والتقدّمالتأثيرات والتقدّم معاملة واحدة. يا الاتنين حصلوا يا ولا حاجة حصلت.
ساعة حتميةكل اختبار يكسر تطبيقًا يبدو منطقيًا
الحملات هي النص التاني
الفانل بيتفاعل. أما الـحملة فهي إرسال لمرة واحدة لجمهور معيّن: جمهور، جدول زمني، تحديد للسرعة، وإرسال. ده شكل مختلف تمامًا من الأشياء، وبيتم فصله عمدًا بدل ما نتظاهر إنه فانل بعقدة واحدة.
فيه قاعدتين بيخلوها آمنة. الجمهور بيتجمّع مرة واحدة بس وبيرفض يشتغل تاني — لأن إعادة تجميعه هتضيف بصمت كل اللي انضمّوا من وقت ما الإرسال بدأ، ودليل منع التكرار هيخبي ده بمنعه النسخ المكررة اللي هو نفسه خلقها. والأعدادات بتتحسب من جديد من أحداث التسليم، مش بتزيد في مكانها، فحتى ويب هوك متكرر مش هيضخّم التقرير.
تستخدم أنهي فيهم: لو الحاجة حصلت بسبب تصرف من الشخص نفسه، يبقى فانل. لو حصلت بسبب قرار خدته يوم تلاتة، يبقى حملة. نسبة كبيرة من التسويق الآلي بتبوظ بسبب إنهم بيفرضوا النوع التاني في شكل الأول.