القمع والمشغِّلات
القمع رسم بياني. والتشغيل صف. والانتظار وقت.
هذا هو النموذج بأكمله، وكل خاصية صعبة في هذا المنتج تنبع من تلك الجمل الثلاث. بفضلها تعديل قمع حيّ آمن. بفضلها لا تُرسل إعادة المحاولة مرتين. وبفضلها من ألغى اشتراكه الثلاثاء لا يسمع شيئًا الخميس.
ما يحدث فعلًا عند التشغيل
نشر قمع يكتب نسخة غير قابلة للتغيير. يدخل أحدهم، فيظهر صف: تشغيل واحد، لهذه الجهة، مثبَّت على تلك النسخة، يحمل العقدة الحالية وزمن استيقاظ وسياقه الخاص.
يستأجر العامل المسارات التي مضى وقت استيقاظها، مطالبًا بها عبر 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
الخنق يضبط إيقاع الدفعات حتى لا تُغرق صندوق بريد ذو حد إرسال منخفض حتى يُعلَّق. وساعات الهدوء تحتجز الرسالة حتى وقت مهذب — تُطبَّق على مستوى الرسالة، ولا تُنسخ في كل فرع من فروع المخطط.
يُفحص قبل أن يُسمح له بالعمل
المُتحقِّق يرفض الأشياء نفسها منك ومن الذكاء الاصطناعي
يُفحص المخطط قبل نشره، والفحص ليس استشاريًا. إنه مسار الشيفرة نفسه سواء رسم شخص القمع أو ولّده نموذج، وهذا هو السبب الوحيد الذي يجعل القمعات المولَّدة جديرة بالثقة أصلًا.
مدخل واحد بالضبط
عقدتا مدخل هما غموض لا ينتبه إليه أحد حتى يتلقى نصف القائمة الخطأ التسلسل الخطأ.
كل عقدة قابلة للوصول
الفرع اليتيم إما خطأ أو رسالة تظن أنها ستُرسل وهي لا تُرسل. وكلاهما يستحق أن تُخبَر عنه.
يجب أن تتضمن كل دورة انتظارًا
الحلقة التي لا تتضمن انتظارًا هي حلقة لا نهائية وفي وسطها إرسال. هذه القاعدة هي الفرق بين قمع وحادثة.
كل إرسال له محتواه الإبداعي
لا يمكن نشر عقدة send_email بلا محتوى إبداعي وبلا موضوع. الرسالة ذات الموضوع الصحيح وجسم فارغ هي حالة فشل حقيقية؛ وهي تُرفض هنا.
كل متغير معروف
تُتحقَّق متغيرات الدمج عند النشر. {{frist_name}} خطأ مطبعي تراه أثناء التحرير، لا "مرحبًا ،" تصل إلى أربعين ألف صندوق بريد.
ثم حاكِه
شغِّل تجربة جافة لجهة اتصال حقيقية عبر المخطط كاملًا، واقرأ المسار المتَّخذ وكل رسالة كانت ستُرسل، مع يومها. لا شيء يخرج من المبنى.
الحالات المُحرجة
سبعة أشياء تُفسد محركًا ساذجًا
كل واحدة من هذه اختبار خلفه ساعة حتمية، لأن كلًّا منها يُفسد تنفيذًا يبدو صحيحًا تمامًا حتى يلتقي بالواقع.
- 1قمع يدور في حلقة على نفسهمشروع وشائع وسليم — بشرط أن تتضمن الدورة انتظارًا، وهو ما يصرّ عليه المُتحقِّق.
- 2شخص يلغي اشتراكه في منتصف الطريقيُفحص الاستبعاد عند الإرسال، لا عند الاصطفاف. الفحص عند الاصطفاف يُرسل البريد إلى من غادروا أثناء الانتظار.
- 3يُحرَّر القمع وعشرة آلاف شخص بداخلهيواصلون السير على النسخة التي دخلوا عليها حتى النهاية. والداخلون الجدد يسلكون الجديدة.
- 4يُطلَق المُحفِّز نفسه مرتين في ثانية واحدةتشغيل واحد، لأن التفرّد فهرس لا فحص يليه إدراج.
- 5تُحذف جهة اتصال في منتصف التشغيلينتهي التشغيل. المحو الذي يترك تسلسلًا ما زال موجَّهًا إلى أحد ليس محوًا.
- 6يمتد الانتظار عبر تغيير التوقيت الصيفي"ثلاثة أيام في التاسعة صباحًا" تعني التاسعة صباحًا على الجانبين من تغيير الساعة.
- 7تُقتل وحدة عاملة بين الإرسال والتقدُّمالتأثيرات والتقدُّم معاملة واحدة. إما أن كليهما حدث أو لم يحدث أي منهما.
ساعة حتميةكل اختبار يُفشِل تنفيذًا معقولًا
الحملات هي النصف الآخر
قمع التحويل يتفاعل. أما الحملة فهي بثّ لمرة واحدة: جمهور، وجدول زمني، ومُقيِّد للإرسال، وإرسال. إنها شيء ذو شكل مختلف، ويُبقيها النظام منفصلة عمدًا بدلًا من ادّعاء أنها قمع بعقدة واحدة.
قاعدتان تجعلان ذلك آمنًا. الجمهور يُبنى مرة واحدة ويرفض العمل مرتين — لأن إعادة حله سيضيف بصمت كل من انضم منذ بدء الإرسال، وسيخفي فهرس إزالة التكرار ذلك بمنعه التكرارات التي أنشأها هو نفسه. والعدّادات تُحسب من جديد من أحداث التسليم ولا تُزداد في مكانها أبدًا، حتى لا يُضخّم خطاف ويب (webhook) مُعاد تقريرًا ما.
أيّهما تستخدم: إذا حدث الأمر بسبب فعلٍ قام به الشخص، فهو قمع. وإذا حدث بسبب قرارٍ اتخذته يومًا ما، فهو حملة. قدرٌ مدهش من أتمتة التسويق يفشل بفرض الشكل الثاني على الأول.