1import{j as e}from"./vendor-motion-CfBPC-kS.js";import{L as t}from"./vendor-react-BR_v4Ont.js";import{C as n}from"./ContentPage-BxMYAaUt.js";import"./index-VVKdn61F.js";import"./vendor-supabase-BSd6ADfF.js";import"./HireCTA-DktS03tb.js";import"./EmailGateModal-BCI8ZqlV.js";import"./dialog-my3VBzDi.js";const r=e.jsxs(e.Fragment,{children:["const body = (",e.jsxs(e.Fragment,{children:[e.jsxs("p",{children:[e.jsx("strong",{children:"Last updated:"})," 2026-06-08 · ",e.jsx("strong",{children:"Tested on:"})," n8n 1.x · ",e.jsx("strong",{children:"Read time:"})," ~5 min"]}),e.jsx("h2",{children:"Symptoms â what you're seeing"}),e.jsxs("ul",{children:[e.jsx("li",{children:"The n8n execution finishes green, but a downstream node receives an empty, null, or malformed value"}),e.jsx("li",{children:"An AI extraction or HTTP Request node returns a result that looks valid enough to continue, even though a required field is missing"}),e.jsx("li",{children:"A Google Sheets, CRM, database, or email node writes incorrect data without showing a workflow error"}),e.jsx("li",{children:"You only discover the problem by checking the final output manually or after a client reports missing data"}),e.jsx("li",{children:"Hard failures appear in the Executions list, but validation failures leave no alert or review record"})]}),e.jsx("h2",{children:"Why this happens"}),e.jsx("p",{children:"n8n reports a node error when a node throws or returns an execution failure. It does not know that a successful response is semantically wrong for your workflow. An HTTP Request node can return status 200 with an empty object. An AI node can return text that does not contain the field your next node expects. A mapping expression can resolve to an empty value while the execution still finishes successfully."}),e.jsx("p",{children:"That creates two separate error classes:"}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Hard failures:"})," a node throws an error, an API returns an error response, or a required operation cannot complete. These belong in an n8n Error Trigger workflow."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Silent failures:"})," the node completes, but its output fails your business rule. These require validation gates inside the workflow."]})]}),e.jsxs("p",{children:["For example, an OpenAI or other AI API call can return a syntactically valid response that contains no usable lead email. That is not fixed by an Error Trigger. It needs a validation branch. If the API instead returns HTTP 429, use a retry and wait pattern as described in the ",e.jsx(t,{to:"/fix/n8n-openai-rate-limit-429",style:{color:"var(--tm-accent)"},children:"n8n OpenAI 429 rate-limit fix"}),"."]}),e.jsx("h2",{children:"The fix, step by step"}),e.jsxs("ol",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"Define what a valid item must contain."})," Write down the fields that the next node cannot operate without. For a contact workflow, that might be an email address and contact name. For an API response, it might be an object ID and a status value. Do not treat the presence of a JSON object as proof that the data is usable."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Add a validation step immediately after extraction or transformation."})," A Code node can add an explicit boolean to every item, then an IF node can route the items. The example below validates every incoming item rather than inspecting only the first item:",e.jsx("div",{style:{color:"var(--tm-code-text)",marginTop:12,marginBottom:4,fontSize:13},children:"Code node â validate required fields"}),e.jsx("pre",{style:{background:"var(--tm-code-bg)",color:"var(--tm-code-text)",padding:16,borderRadius:4,marginTop:0,fontSize:13,overflowX:"auto"},children:`return items.map((item) => { 2 const email = item.json.email; 3 const name = item.json.name; 4 5 const valid = 6 typeof email === 'string' && email.trim().length > 0 && 7 typeof name === 'string' && name.trim().length > 0; 8 9 return { 10 json: { 11 ...item.json, 12 validation: { 13 valid, 14 reason: valid ? null : 'Required email or name is missing', 15 }, 16 }, 17 }; 18});`})]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Route the validation result with an IF node."})," Set the condition to the boolean validation field, such as ",e.jsx("code",{style:{color:"var(--tm-code-text)"},children:"$json.validation.valid"}),". The true output continues to the main workflow. The false output goes to logging and notification. Do not use a loose string comparison such as checking whether a response âlooks non-emptyâ; validate the fields the next operation actually needs."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Record the rejected item and reason."})," Add a Google Sheets, database, or other durable logging node to the false branch. Include the workflow name, execution identifier if available, input identifier, timestamp, and validation reason. Store enough context to reproduce the failure, but redact credentials, access tokens, and unnecessary personal data."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Alert on the false branch."})," Send a Slack message or another notification when invalid data is detected. Include the workflow name, the failed field, and a link or execution identifier that lets you inspect the run. Logging without an alert still leaves the failure undiscovered until somebody reviews the log."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Configure an Error Trigger workflow for hard crashes."})," Create a separate workflow beginning with n8n's Error Trigger node. Add a notification and a durable failure log, then assign that workflow in the source workflow's error workflow setting â the exact settings-menu label can shift between n8n versions, so confirm it against your installed version. The Error Trigger path handles node failures; it does not replace the validation branch above."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"Test both paths deliberately."})," Run one item with valid data, one item with each required field missing, and one request that produces a known API failure. Confirm that valid items continue, invalid items are logged and alerted, and hard failures reach the Error Trigger workflow. Check the Executions list and the failure log after each test."]})]}),e.jsxs("p",{style:{marginTop:32},children:[e.jsx("strong",{children:"Stuck on this for more than 30 minutes?"})," ",e.jsx(t,{to:"/contact#booking",style:{color:"var(--tm-accent)"},children:"Book a 30-min scope call"}),". I'll get on Zoom, inspect the workflow, and either fix it on the call or scope what it will take. No upsell, no decks."]}),e.jsx("h2",{children:"Common variations"}),e.jsxs("ul",{children:[e.jsxs("li",{children:[e.jsx("strong",{children:"âThe workflow is green but the CRM record is wrong.â"})," Add field-level validation before the CRM node. Confirm that the mapped fields exist and have the expected type, not just that the previous node returned JSON."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"âThe AI node sometimes returns no usable answer.â"})," Validate the required output fields or structured-output contract before continuing. Route missing fields to review instead of sending the response to a customer or writing it to the CRM."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"âThe workflow stops after an API error.â"})," Separate transient errors such as HTTP 429 or 5xx responses from permanent errors. Retry transient failures with a bounded wait and log the final failure; do not retry invalid requests indefinitely."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"âThe workflow continues after a node error.â"})," If you use a node's continue-on-error setting, connect the resulting error data to an explicit branch. Otherwise the workflow can pass an error-shaped item to the next node and create a second silent failure."]}),e.jsxs("li",{children:[e.jsx("strong",{children:"âThe schedule ran, but the result is wrong.â"})," A workflow can have correct error handling and still run at the wrong time. Check the workflow and instance timezone using the ",e.jsx(t,{to:"/fix/n8n-schedule-trigger-timezone",style:{color:"var(--tm-accent)"},children:"n8n schedule trigger timezone diagnostic"}),"."]})]}),e.jsx("h2",{children:"When this isn't the issue"}),e.jsx("p",{children:"If your validation branch is firing correctly but the workflow still produces the wrong result, continue with these checks:"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Inspect the input and output of the first node where the value changes. A later mapping expression cannot repair a value that was already wrong upstream."}),e.jsx("li",{children:"Check whether the workflow processes multiple items. Expressions or Code node logic that reads only the first item can silently drop the rest. Use item-aware mappings and return one output item for each input item unless aggregation is intentional."}),e.jsx("li",{children:"Check credential scopes, API pagination, rate limits, and response status handling. A partial API response can pass a basic presence check while omitting records that the workflow assumes exist."}),e.jsxs("li",{children:["If the failure involves a memory node returning null or losing context, inspect the memory connection and session key separately using the ",e.jsx(t,{to:"/fix/n8n-simple-memory-node-error",style:{color:"var(--tm-accent)"},children:"n8n Simple Memory node error guide"}),"."]})]}),e.jsxs("p",{style:{marginTop:32},children:[e.jsx("strong",{children:"Need eyes on the workflow?"})," ",e.jsx(t,{to:"/contact#booking",style:{color:"var(--tm-accent)"},children:"Book a 30-min scope call"})," or ",e.jsx("a",{href:"mailto:[email protected]",style:{color:"var(--tm-accent)"},children:"email Basit"})," with the failing execution ID and the node where the data first becomes invalid."]}),e.jsx("h2",{children:"Related pages"}),e.jsxs("ul",{children:[e.jsx("li",{children:e.jsx(t,{to:"/fix/n8n-openai-rate-limit-429",style:{color:"var(--tm-accent)"},children:"Fix: n8n OpenAI 429 rate-limit errors"})}),e.jsx("li",{children:e.jsx(t,{to:"/fix/n8n-simple-memory-node-error",style:{color:"var(--tm-accent)"},children:"Fix: n8n Simple Memory node errors"})}),e.jsx("li",{children:e.jsx(t,{to:"/fix/n8n-schedule-trigger-timezone",style:{color:"var(--tm-accent)"},children:"Fix: n8n schedule trigger wrong timezone"})})]})]}),");"]}),u=()=>e.jsx(n,{tier:1,slug:"n8n-error-failed",title:"Fix: n8n silent failures with error handling â basitq.cloud",subtitle:"n8n can finish an execution successfully while passing empty or incorrect data downstream. Add validation gates for expected values, route failures to review, and use an Error Trigger workflow for hard crashes.",metaDescription:"Fix n8n silent failures with validation gates, Error Trigger workflows, Slack alerts, and failure logs that catch wrong or empty data before downstream nodes.",lastUpdated:"2026-09-21",readTime:"5",techStack:["n8n","Slack","Google Sheets","Error Trigger"],relatedPages:[{title:"N8N Schedule Trigger Timezone",slug:"n8n-schedule-trigger-timezone",tier:1},{title:"N8N Openai Rate Limit 429",slug:"n8n-openai-rate-limit-429",tier:1},{title:"N8N Simple Memory Node Error",slug:"n8n-simple-memory-node-error",tier:1}],relatedServices:[],faq:[{q:"What is an n8n silent failure?",a:"A silent failure is an execution that finishes without a node error while passing empty, malformed, or incorrect data to downstream nodes."},{q:"Does n8n's Error Trigger catch every workflow problem?",a:"No. Error Trigger catches workflow executions that fail at the node level when the workflow is configured to use an error workflow. It does not replace validation gates for wrong or missing data."},{q:"How do I stop empty data from reaching the next n8n node?",a:"Add a validation step immediately after the node that extracts or transforms the data. Route invalid items through an IF node to logging, notification, or manual review instead of continuing on the main path."},{q:"Should I use Continue On Fail for n8n error handling?",a:"Use it only when the workflow has an explicit error branch that records the failure and prevents the invalid result from continuing. Continuing without inspecting the error creates another silent failure."}],body:r});export{u as default};
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.