كيف تعمل الأتمتة
الأتمتة تراسل الأشخاص واحدًا واحدًا مع وقوع الأحداث: ينضم شخص إلى قائمة، أو يملأ نموذجًا، أو يفعل شيئًا في منتجك، أو يحلّ عيد ميلاده. تصف المسار مرة واحدة ويسلكه كل شخص بوتيرته الخاصة.
مشغِّل وشجرة من الخطوات
يتكوّن definition من trigger، وخطوة entry، وقائمة steps. ولكل خطوة key فريد داخل الأتمتة: حرف صغير يتبعه من 2 إلى 23 حرفًا صغيرًا أو رقمًا. تسمّي الخطوة ما يليها في next، ويسمّي branch خطوتين، yes وno. وnull ينهي ذلك المسار. تشكّل الخطوات شجرة، فلا توصَل خطوة من موضعين ولا يعود شيء إلى الوراء. وتتسع الأتمتة لـ 50 خطوة على الأكثر، بتفرّعات لا يزيد عمقها على 5 مستويات.
audience_joined: تُضاف جهة اتصال إلىaudienceId. وتُستبعد جهات الاتصال المضافة عبر استيراد ما لم تكن قيمةincludeImportedهي true.form_submitted: يشترك شخص عبر النموذجformId. ومع التأكيد المزدوج يدخل حين يؤكد.event: ترسل شيفرتك حدثًا اسمهeventName. ويحصر ما يصل إلى 5 منfiltersعلى خصائصه من يدخل.date: يحلّ يوم معيّن لكل عضو فيaudienceId. وقيمةfieldهيbirthdayأوjoined، أي ذكرى يوم انضمامه إلى ذلك الجمهور. ويزيحهoffsetDaysبما يصل إلى سنة: قيمة سالبة لأيام قبله، وموجبة لأيام بعده.manual: لا أحد يدخل من تلقاء نفسه. تضيف الأشخاص من التطبيق أو عبر نقطة نهاية التسجيل.
| الخطوة | ما تفعله |
|---|---|
| send_email | يرسل الإصدار المنشور من templateId من from، وهو عنوان في مساحة العمل هذه. ويملأ props قيم القالب، ويحل subject محل موضوع القالب ويقبل حقول دمج مثل {{firstName|there}} |
| wait | يُبقي الشخص منتظرًا: لمدة duration، أو until أي حتى اليوم والوقت التاليين المحددين من الأسبوع، أو بانتظار event عليه أن يقوم به، مع timeout يواصل بعده على أي حال |
| branch | يطرح سؤالًا واحدًا ويوجّه الشخص إلى yes أو no: email_opened أو email_clicked لخطوة بريد سابقة، أو in_audience، أو field من جهة الاتصال، أو event قام به خلال withinDays |
| add_to_audience، remove_from_audience | يغيّر الجماهير التي تنتمي إليها جهة الاتصال |
| update_field | يكتب قيمة لدى جهة الاتصال |
| webhook | يستدعي إحدى نقاط نهاية webhook لديك بحدث automation.webhook |
| exit | ينهي المسار مبكرًا. ويُحتسب خروجًا لا إكمالًا |
القيمة في props أو update_field تأتي من أحد ثلاثة مواضع: { "source": "static", "value": "…" }، و{ "source": "contact", "field": "firstName" } لـ email أو name أو firstName أو lastName أو attributes.<key>، و{ "source": "event", "path": "orderId" } لخاصية من الحدث الذي بدأ المسار.
مسودة ونسخة منشورة
الحفظ يغيّر definition المسودة. ولا يعمل شيء حتى يثبّت POST /automations/{id}/publish المسودة بوصفها نسخة مرقّمة، يعرضها published بعد ذلك. ومن هم بداخلها بالفعل يكملون بالنسخة التي دخلوا بها، ومن يدخلون بعد ذلك يحصلون على الجديدة. ويفيد hasUnpublishedChanges بأن المسودة تقدّمت عن المنشور.
draft: لم تُنشر قط. لا أحد يدخلها.live: منشورة وتعمل.paused: لا أحد يدخل ويبقى كل من بداخلها في مكانه. ويذكرpausedReasonالسبب:manual، أو مشكلة واجهها المحرّك، مثلsender_refusedأوtemplate_unavailable.archived: أُوقفت نهائيًا. يخرج منها كل من بداخلها، ويبقى السجلّ.
settings منفصلة وتُطبَّق فور حفظها: timezone، وsendWindow تنتظر الرسائل خارجها، وreentryDays قبل أن يتمكن الشخص نفسه من الدخول مجددًا (null تعني مرة واحدة)، وexitOnLeave لإخراج من يغادرون جمهور المشغِّل، وlistAudienceId، وهو الجمهور الذي يُسجَّل فيه إلغاء الاشتراك.
يسرد problems ما في المسودة من مشكلات، ولكل منها code، وpath الحقل، وstepKey، وهل هي blocking. والمسودة التي فيها مشكلة مانعة لا يمكن نشرها.
الأشخاص داخل الأتمتة
كل شخص يدخل يحصل على تسجيل. ويكون active ما دام يتنقل بين الخطوات، وcompleted حين يبلغ نهاية مسار، وexited حين يخرج مبكرًا، مع exitReason: exit_step أو unsubscribed أو suppressed أو left_audience أو removed أو archived أو failed.
- تُنفَّذ الخطوات خلال نحو 15 ثانية من حلول موعدها. ولا يتلقى الشخص أبدًا رسالتين من أتمتة واحدة في الدورة نفسها.
- رسائل الأتمتة بريد تسويقي، ولذلك تحمل كل رسالة منها رابط إلغاء الاشتراك. ومن يلغي اشتراكه يخرج من الأتمتات التي تراسل تلك القائمة، ومن ارتدّ بريد عنوانه أو اشتكى يخرج عند خطوته التالية.
- الرسالة التي لا يستطيع عنوانها استقبال البريد تُتخطّى، ويواصل الشخص إلى الخطوة التالية.
- حين يُرفض الإرسال للجميع، كمُرسِل فقد نطاقه أو قالب أُلغي نشره، تتوقف الأتمتة مؤقتًا ويذكر
pausedReasonالسبب.
أحداث من تطبيقك
يسجّل POST /events أن جهة اتصال فعلت شيئًا: order.placed، trial.started، plan.upgraded. ويبدأ الحدث كل أتمتة منشورة يسمّيه مشغِّلها، ويدفع إلى الأمام كل من ينتظره، ويجيب عن سؤال event في التفرّع. وتُحفظ الأحداث 90 يومًا.
من يستطيع فعل ماذا
- القراءة تتطلب
automations:readوالتغيير يتطلبautomations:write. والنشر والاستئناف وإرسال اختبار تتطلب أيضًاemails:send، لأنها تجعل الأتمتة ترسل بريدًا. - إرسال حدث يتطلب
contacts:write، وقراءة أحداث جهة اتصال تتطلبcontacts:read. - يرى مفتاح API والمالك كل أتمتة في مساحة العمل. أما التطبيق الذي ربطه عضو فيرى ما أنشأه ذلك العضو منها.
- حذف أتمتة يطلب من تطبيق OAuth رمز تحقق. أما مفتاح API فلا يحتاج إليه أبدًا.
- تسمح الخطة بـ 1 أتمتة منشورة في Free، و10 في Starter، و50 في Business، وبأي عدد في Enterprise. وتتسع مساحة العمل افتراضيًا لـ 100 أتمتة.
أحداث webhook automation.entered وautomation.exited وautomation.paused تخبر أنظمتك بمن دخل ومن خرج ومتى توقفت أتمتة. وأرشفة أتمتة تنهي مسار كل من فيها من دون حدث automation.exited لكل شخص.
من الشيفرة والطرفية والوكلاء
كل ما هنا متاح أيضًا في SDK بوصفه openemail.automations وopenemail.events، وفي CLI بوصفه openemail automations وopenemail events. ولدى خادم MCP أدوات للأتمتة، فيستطيع الوكيل أن ينشئ أتمتة وينشرها ويتابع من بداخلها.