ฟันเนลและทริกเกอร์
ฟันเนลคือกราฟ การรันคือแถวข้อมูล การรอคือช่วงเวลา
นั่นคือโมเดลทั้งหมด และคุณสมบัติที่ยากทุกอย่างของผลิตภัณฑ์นี้ล้วนออกมาจากสามประโยคนี้ การแก้ไขฟันเนลที่กำลังทำงานอยู่ปลอดภัยเพราะสิ่งเหล่านี้ การลองใหม่ไม่สามารถส่งซ้ำได้เพราะสิ่งเหล่านี้ และคนที่ยกเลิกการติดตามในวันอังคารจะไม่ได้รับอะไรเลยในวันพฤหัสบดีเพราะสิ่งเหล่านี้
เมื่อรันจริง ๆ แล้วเกิดอะไรขึ้น
การเผยแพร่ฟันเนลจะสร้าง เวอร์ชันที่เปลี่ยนแปลงไม่ได้ เมื่อมีผู้ติดต่อเข้ามา จะมีแถวหนึ่งปรากฏขึ้น: การรันหนึ่งครั้ง สำหรับผู้ติดต่อรายนี้ ผูกกับเวอร์ชันนั้น ระบุโหนดปัจจุบัน เวลาปลุก และบริบทของตัวเอง
เวิร์กเกอร์จะยืมการรันที่เวลาปลุกผ่านไปแล้ว โดยอ้างสิทธิ์ด้วย 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 จะเติมตัวแปร merge ให้รายชื่อติดต่อแต่ละราย โดยนับใช้โควตาของคุณและแคชตาม hash ของครีเอทีฟและคุณลักษณะของรายชื่อติดต่อ — มิฉะนั้นคุณจะต้องจ่ายเงินต่อผู้รับในทุกครั้งที่ส่ง
รอ, แยกเส้นทาง, แตกสาขา, รวมกลับ
wait รับค่าเป็นระยะเวลา, วันที่เวลา, วันในสัปดาห์พร้อมเวลา หรือฟิลด์วันที่พร้อมออฟเซ็ต condition คือเงื่อนไขการแบ่งกลุ่มที่มีทางใช่และทางไม่ split คือการแบ่ง A/B/n พร้อมน้ำหนัก join นำเส้นทางที่แตกออกกลับมารวมกัน
goal — โหนดที่สำคัญที่สุด
เป้าหมายจะยุติการทำงานของลำดับสำหรับทุกคนที่ไปถึงมัน พวกเขาจองแล้ว ซื้อแล้ว หรือตอบกลับแล้ว: ส่วนที่เหลือของลำดับจะถูกยกเลิกเฉพาะตัวพวกเขา ไม่มีใครได้รับข้อความ "เราคิดถึงคุณ" ในวันรุ่งขึ้นหลังจากที่พวกเขากลับมาแล้ว และนี่คือโหนดที่ป้องกันเรื่องนั้น
throttle และ quiet_hours
Throttle ควบคุมจังหวะการส่งจำนวนมากเพื่อไม่ให้กล่องจดหมายที่มีเพดานอัตราต่ำถูกยิงจนถูกระงับ Quiet hours จะกุมข้อความไว้จนถึงเวลาที่เหมาะสม — ใช้ที่ระดับข้อความ ไม่ใช่คัดลอกไปใส่ทุกสาขาของกราฟ
ตรวจสอบก่อนจะรันได้
ตัวตรวจสอบปฏิเสธสิ่งเดียวกันทั้งกับคุณและกับ AI
กราฟจะถูกตรวจสอบก่อนเผยแพร่ได้ และการตรวจสอบนี้ไม่ใช่แค่คำแนะนำ มันคือเส้นทางโค้ดเดียวกันไม่ว่าจะเป็นคนวาด funnel หรือโมเดลสร้างขึ้น ซึ่งเป็นเหตุผลเดียวที่ทำให้ funnel ที่สร้างโดย AI น่าเชื่อถือได้เลย
มีจุดเริ่มต้นเพียงจุดเดียว
การมีโหนดเริ่มต้นสองจุดคือความกำกวมที่ไม่มีใครสังเกตเห็น จนกระทั่งครึ่งหนึ่งของรายการได้รับลำดับที่ผิด
ทุกโหนดต้องเข้าถึงได้
สาขาที่ถูกทิ้งขาดนั้นเป็นได้ทั้งความผิดพลาด หรือข้อความที่คุณคิดว่ากำลังจะส่งออกแต่จริง ๆ ไม่ได้ส่ง ทั้งสองกรณีควรได้รับการแจ้งเตือน
วงรอบต้องมีการรอ
ลูปที่ไม่มีการรออยู่ข้างในคือลูปอนันต์ที่มีการส่งข้อความอยู่ตรงกลาง กฎนี้คือเส้นแบ่งระหว่าง funnel กับเหตุฉุกเฉิน
ทุกการส่งต้องมีครีเอทีฟ
โหนด send_email ที่ไม่มีครีเอทีฟและหัวเรื่องจะเผยแพร่ไม่ได้ ข้อความที่มีหัวเรื่องถูกต้องแต่เนื้อหาว่างเปล่าเป็นความล้มเหลวที่เกิดขึ้นจริง และมันถูกปฏิเสธที่นี่
ทุกตัวแปรต้องเป็นที่รู้จัก
ตัวแปร merge จะถูกตรวจสอบตอนเผยแพร่ {{frist_name}} เป็นคำสะกดผิดที่คุณเห็นตอนกำลังแก้ไข ไม่ใช่ "สวัสดีครับ ," ที่ไปปรากฏในกล่องจดหมายสี่หมื่นใบ
จากนั้นจำลองดู
ทดลองรันรายชื่อติดต่อจริงผ่านกราฟทั้งหมด แล้วอ่านย้อนกลับเส้นทางที่เดินและข้อความทุกฉบับที่จะถูกส่ง พร้อมวันที่จะส่ง ไม่มีอะไรหลุดออกไปข้างนอก
กรณีที่ยุ่งยาก
เจ็ดสิ่งที่ทำให้เอนจินแบบง่ายพัง
ทุกข้อในนี้คือการทดสอบที่มีนาฬิกาแบบกำหนดผลลัพธ์ล่วงหน้าอยู่เบื้องหลัง เพราะแต่ละข้อทำให้การใช้งานที่ดูถูกต้องสมบูรณ์แบบพังทันทีที่เจอความจริง
- 1Funnel ที่วนกลับเข้าหาตัวเองถูกต้อง พบได้ทั่วไป และไม่มีปัญหา — ตราบใดที่วงรอบมีการรออยู่ข้างใน ซึ่งเป็นสิ่งที่ตัวตรวจสอบบังคับ
- 2มีคนยกเลิกการติดตามระหว่างทางการกดคัดกรองจะตรวจสอบตอนส่ง ไม่ใช่ตอนเข้าคิว การตรวจสอบตอนเข้าคิวจะส่งเมลไปหาคนที่ยกเลิกไปแล้วระหว่างช่วงรอ
- 3Funnel ถูกแก้ไขขณะที่มีคนอยู่ข้างในหนึ่งหมื่นคนพวกเขาจะเดินต่อบนเวอร์ชันที่ตัวเองเข้ามา จนถึงจบ ส่วนผู้เข้าใหม่จะเดินบนเวอร์ชันใหม่
- 4ทริกเกอร์เดียวกันยิงซ้ำภายในหนึ่งวินาทีได้เพียงหนึ่งการรัน เพราะความไม่ซ้ำเป็นดัชนี ไม่ใช่การตรวจสอบแล้วตามด้วยการแทรก
- 5รายชื่อติดต่อถูกลบระหว่างการรันการรันจะสิ้นสุดลง การลบข้อมูลที่ยังทิ้งลำดับข้อความที่ระบุถึงใครบางคนไว้ ไม่ใช่การลบข้อมูลที่แท้จริง
- 6การรอคร่อมการเปลี่ยนเวลาออมแสง"สามวันที่เวลาเก้าโมงเช้า" หมายถึงเก้าโมงเช้าทั้งก่อนและหลังการเปลี่ยนเวลา
- 7เวิร์กเกอร์ถูกฆ่าระหว่างการส่งกับการเดินหน้าเอฟเฟกต์และการเบิกเงินล่วงหน้าเป็นธุรกรรมเดียวกัน ไม่ใช่เกิดทั้งคู่ ก็ไม่เกิดเลย
นาฬิกาแบบกำหนดผลลัพธ์ได้แต่ละการทดสอบทำลายการใช้งานที่ดูเป็นไปได้
แคมเปญคืออีกครึ่งหนึ่ง
ฟันเนลคือสิ่งที่ตอบสนอง ส่วน แคมเปญ คือการส่งสารครั้งเดียวแบบเรียกเข้าเอง: กลุ่มผู้รับ ตารางเวลา การจำกัดอัตราส่ง และการส่ง เป็นสิ่งที่มีรูปแบบต่างออกไป และถูกแยกไว้โดยเจตนา มิใช่แกล้งทำเป็นฟันเนลที่มีโหนดเดียว
มีสองกฎที่ทำให้ปลอดภัย กลุ่มผู้รับจะถูก สร้างขึ้นเป็นรูปธรรมเพียงครั้งเดียว และปฏิเสธการรันซ้ำ — การคำนวณใหม่จะเพิ่มทุกคนที่เข้าร่วมหลังจากการส่งเริ่มต้นอย่างเงียบ ๆ และดัชนีกันซ้ำจะปิดบังสิ่งนั้นโดยบล็อกรายการซ้ำที่มันสร้างขึ้นเอง และตัวนับจะถูก คำนวณใหม่จากเหตุการณ์การส่งมอบ ไม่ใช่เพิ่มค่าในที่เดิม ดังนั้น webhook ที่ส่งซ้ำจึงไม่สามารถเบิกความในรายงานได้
จะใช้อะไรดี: ถ้าเกิดขึ้นเพราะสิ่งที่บุคคลนั้นทำ มันคือฟันเนล ถ้าเกิดขึ้นเพราะสิ่งที่ท่านตัดสินใจในวันอังคารวันหนึ่ง มันคือแคมเปญ ระบบการตลาดอัตโนมัติจำนวนไม่น้อยพังทลายเพราะบังคับให้แบบที่สองอยู่ในรูปของแบบแรก