Something I see constantly in production n8n workflows that trips people up.
When you enable Continue On Fail on a node, n8n will mark the execution as success even if that node failed with a 500, a 401, or an empty response. The error gets passed downstream as error output data, the workflow keeps running, and the top-level execution status shows green.
This means: your HubSpot node failed, your CRM row was never created, your client never got the email — and n8n’s execution log shows success.
Three places this causes real pain:
-
HTTP Request nodes with Continue On Fail — a 500 from an API looks identical to a 200 in the execution view
-
Code nodes that throw errors — silently passed downstream
-
Any node in a multi-step flow where you “just want it to keep going”
The fix is to add an explicit IF node after any critical node that uses Continue On Fail — check for the presence of $json.error in the output and route it to an alert branch.
Has anyone else hit this in production? Curious how people are handling it across larger workflows.
good additions. the inconsistent error shape trips people up constantly. handling both $json.error.message and $json.error as a plain string in the same IF check is the right call.
the zero items case is nastier than CoF in some ways. no error shape, flow just stops, everything upstream shows green. i add explicit item count checks on nodes where empty output is a real failure, not just a quiet edge case.
on setup: central Error Trigger for obvious failures, but that leaves the CoF and zero-items cases uncovered. been building something specifically for the green-but-broken pattern. what’s the most common place you see zero items bite people in production?
واجهت هذه المشكلة بالضبط في الإنتاج مع سير عمل التقارير الموجهة للعملاء. نمط IF المضمّن بعد CoF يعمل، لكن لديه ضعف هيكلي واحد: كل فحص يعيش داخل سير العمل الذي يفحصه. إذا توقف التدفق مبكراً (حالتك ذات العناصر الصفرية)، أو قام شخص ما بتحرير عقدة وحذف فرع الفحص، فإن التحقق يموت معها — وكل شيء في الاتجاه المعاكس لا يزال يظهر باللون الأخضر.
ما توصلت إليه: احتفظ بالفحوصات المضمّنة للتوجيه، لكن انقل التحقق من الصحة خارج سير العمل. كل سير عمل إنتاجي يكتب سطر واحد من بيانات تشغيل (الحالة، وعدد العناصر، والطابع الزمني) إلى ورقة السجل كخطوته الأخيرة؛ ومراقب مجدول منفصل يقرأ السجل وينبه على التشغيلات المفقودة أو صفوف الخطأ أو مخرجات العد الصفري. يستمر المراقب في العمل بغض النظر عما يحدث داخل سير العمل الذي يراقبه — بما في ذلك عدم تشغيله على الإطلاق، وهو شيء لا يمكن لأي فحص مضمّن أن يكتشفه.
فضول لمعرفة المقياس الذي يبدأ عنده هذا في إيذاء الناس — كم عدد سير العمل الإنتاجي الذي تقوم بتشغيله عندما بنيت انضباط CoF الخاص بك؟
@dima_automation بخصوص عدم وجود عناصر في الإنتاج - أكثر الأماكن شيوعاً التي أراها هي جداول Google “Get Rows” مع مرشح لا يُرجع أي شيء (انتهاء صلاحية الرمز المميز، إعادة تسمية الجدول، نطاق خاطئ). يتم تنفيذ سير العمل بشكل نظيف مع عدم وجود عناصر، وكل عقدة لاحقة تُنتج صفر عناصر، وعقدة الإرسال/الكتابة النهائية لا تعمل أبداً. بدون خطأ، سجل أخضر، والعميل لا يحصل على تقرير. الثاني الأكثر شيوعاً: عقدة HTTP Request pagination التي تُنهي مبكراً لأن واجهة برمجة التطبيقات تغير مخطط الاستجابة وفحص “هل هناك صفحات أخرى” يُرجع false. الحل الذي أستخدمه: بعد أي عقدة قد يكون الناتج الصفري فشلاً حقيقياً فيها، أضف عقدة IF تفحص {{ $items().length === 0 }} وحول ذلك إلى تنبيه صريح بدلاً من المتابعة بصمت.
كلاهما من الكتب المدرسية، خاصة “Sheets Get Rows” مع مرشح يطابق بهدوء لا شيء، وينتج عنه صفر في كل مكان، وعملية الإرسال النهائية لا تعمل أبداً، وسجل أخضر. هذا هو أنظف شرح رأيته للمشكلة بأكملها.
عقدة IF التي تتحقق من {{ $items().length === 0 }} هي الحارس الداخلي الصحيح حيث الصفر فشل واضح بلا لبس. شيء واحد يستحق الإشارة إليه: إنه يلتقط حالتك الأولى لكن ليس الثانية. خروج الترقيم المبكر يعيد مجموعة مختصرة لكن ليست صفراً، لذا length === 0 يمر بجانبها بسهولة، المسار حصل على 40 من 200 صف وكل عقدة ممتلئة بسعادة. هذا يحتاج إلى عدد متوقع أو فحص أساسي، تقريباً هل هذا أقل بكثير مما تنتجه هذه المسافة عادة، وليس فقط صفر مقابل ليس صفراً.
وكلا النمطين لا يزالان يفترضان أن المسافة تم تشغيلها. النسخة الأكثر سوءاً هي سير العمل المجدول الذي لم ينطلق على الإطلاق، لا توجد عقدة IF تعمل لأن شيئاً لم يعمل، لا شيء يُقرأ كصفر لأن شيئاً لم ينفذ. هذه هي الحالة التي دفعتني نحو فحص النتيجة من خارج المسافة، لا يمكن لحارس لكل عقدة أن يحمي مسافة لم تحدث. فحص الصفر لديك بالإضافة إلى مرجع العدد بالإضافة إلى فحص الحيوية الخارجي يغطي معظم السطح بينهما.