External call with no timeout configured — A single slow external call can block the entire workflow execution. At high trigger frequency, accumulated stuck executions can exhaust the n8n execution queue.
AI node has no output token cap — Without a cap, models occasionally produce very long outputs — particularly when given an ambiguous or open-ended prompt. This increases cost unpredictably and can cause downstream parsing to fail if the consumer expects a bounded response.
Side-effect node has no audit trail — If this action is disputed, replayed, or causes a data inconsistency, there is no structured record of what was sent, when, and with what data. Debugging requires cross-referencing n8n execution history with the external system's own logs.
| Check | Description | Status |
|---|---|---|
| Failure Alerting | Failures silent — only visible in execution log | Missing |
| Retry on Failure | Transient failures cause permanent stops | Present |
| Request Timeouts | Slow providers can block execution indefinitely | Missing |
| Duplicate Prevention | Retry on write events creates duplicate records | Missing |
| Empty Response Handling | Zero-result lookups break downstream logic | Present |
| AI Output Limits | Output cost and parsing risk unbounded 2 of 4 AI nodes missing token cap | Partial |
| AI Output Format | Free-form output will break downstream parsers 2 of 4 AI nodes lack structured output | Partial |
| Activity Logging | Side effects unlogged | Missing |
| Write Deduplication | Webhook replays may create duplicate records | Present |
Run this analysis on your own workflows
- HTTP Request[3c35b597]
- Posts Relevance AI Agent
- Send a text message
A single slow external call can block the entire workflow execution. At high trigger frequency, accumulated stuck executions can exhaust the n8n execution queue.
Set a timeout under the node's Additional Options. A value of 10,000–30,000 ms (10–30 seconds) is a reasonable starting point for most APIs; adjust based on the provider's documented SLA.
- HTTP Request[3c35b597]
- Posts Relevance AI Agent
- Edit Fields[9aadc0a2]
Operators cannot tell from external signals that a run failed. Silent failures go undetected until a downstream system shows missing data or a user reports a problem.
Connect a dedicated Error Workflow in workflow settings, or add a per-node onError: "continueErrorOutput" path that sends an alert via Slack, email, or a logging service.
- Filter
These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.
- In `conditions.conditions[0].leftValue`, change {{ !$items("Get row(s) in sheet").some(r => String(r.json.id) === String($json.id)) }} to {{ !$items("Get row(s) in sheet")?.some(r => String(r?.json?.id) === String($json?.id)) }}.
- Append row in sheet
These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.
- In `columns.value.id`, change {{ $('Filter').item.json.id }} to {{ $('Filter')?.item?.json?.id }}.
- In `columns.value.username`, change {{ $('Filter').item.json.username }} to {{ $('Filter')?.item?.json?.username }}.
- In `columns.value.title`, change {{ $('Filter').item.json.title }} to {{ $('Filter')?.item?.json?.title }}.
- In `columns.value.communityName`, change {{ $('Filter').item.json.parsedCommunityName }} to {{ $('Filter')?.item?.json?.parsedCommunityName }}.
- In `columns.value.flair`, change {{ $('Filter').item.json.flair }} to {{ $('Filter')?.item?.json?.flair }}.
- In `columns.value.relevancy`, change {{ $('Edit Fields').item.json.assessment }} to {{ $('Edit Fields')?.item?.json?.assessment }}.
- Add relevant posts with replies
These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.
- In `columns.value.id`, change {{ $('Filter').item.json.id }} to {{ $('Filter')?.item?.json?.id }}.
- In `columns.value.username`, change {{ $('Filter').item.json.username }} to {{ $('Filter')?.item?.json?.username }}.
- In `columns.value.title`, change {{ $('Filter').item.json.title }} to {{ $('Filter')?.item?.json?.title }}.
- In `columns.value.communityName`, change {{ $('Filter').item.json.parsedCommunityName }} to {{ $('Filter')?.item?.json?.parsedCommunityName }}.
- In `columns.value.flair`, change {{ $('Filter').item.json.flair }} to {{ $('Filter')?.item?.json?.flair }}.
- In `columns.value.relevancy`, change {{ $('Edit Fields').item.json.assessment }} to {{ $('Edit Fields')?.item?.json?.assessment }}.
- In `columns.value.response`, change {{ $json.response }} to {{ $json?.response }}.
- In `columns.value.date`, change {{ $('Filter').item.json.createdAt }} to {{ $('Filter')?.item?.json?.createdAt }}.
- Response Creating AI Agent
These expressions work reliably against test data where all fields are present. In production, fields may be absent, null, or differently typed — causing a runtime error or silent null propagation at the point of the expression.
- In `text`, change {{ $('Filter').item.json.title }} to {{ $('Filter')?.item?.json?.title }}.
- Posts Relevance AI Agent
- Response Creating AI Agent
Without a cap, models occasionally produce very long outputs — particularly when given an ambiguous or open-ended prompt. This increases cost unpredictably and can cause downstream parsing to fail if the consumer expects a bounded response.
Set maxTokens to a value appropriate for the task. Classification tasks rarely need more than 100 tokens; structured JSON output typically needs 200–500; long-form summaries may need 1,000–2,000. Start conservative and increase if needed.
Currently covers AI/LLM nodes. Non-AI API costs will be added in a future update.
- Posts Relevance AI Agent
- Response Creating AI Agent
- Full payload in prompt — unbounded input tokens
- No output cap — unbounded output tokens
- Agent iteration risk — no max iterations set
Set maxTokens to a value appropriate for the task. Classification tasks rarely need more than 100 tokens; structured JSON output typically needs 200–500; long-form summaries may need 1,000–2,000. Start conservative and increase if needed.
| # | Issue title | Issue description | Affected nodes | |||
|---|---|---|---|---|---|---|
| 1 | Cost Risk | AI node has no output token cap | Node "Posts Relevance AI Agent" has no | Posts Relevance AI Agent | High | 85% |
| 2 | Cost Risk | AI node has no output token cap | Node "Response Creating AI Agent" has no | Response Creating AI Agent | High | 85% |
| 3 | Reliability | AI output drives downstream logic without a structured format | Node "Response Creating AI Agent" produces free-form text output that flows into downstream logic with no Output Parser or JSON mode configured. | Response Creating AI Agent | High | 75% |
| 4 | Reliability | External call with no timeout configured | Node "HTTP Request" makes an external call with no timeout parameter set. The n8n execution will wait indefinitely if the provider is slow or unresponsive. | HTTP Request, Posts Relevance AI Agent, Send a text message, Response Creating AI Agent, Anthropic Chat Model, Anthropic Chat Model1 | High | 90% |
| 5 | Reliability | Finding: missing credentials | Posts Relevance AI Agent: credentialsPresent=false. ai_languageModel sub-node checked for credentials (not the host) | Posts Relevance AI Agent | High | 80% |
| 6 | Reliability | Finding: missing credentials | Send a text message: credentialsPresent=false | Send a text message | High | 80% |
| 7 | Reliability | Finding: missing credentials | Response Creating AI Agent: credentialsPresent=false. ai_languageModel sub-node checked for credentials (not the host) | Response Creating AI Agent | High | 80% |
| 8 | Reliability | Finding: missing credentials | Anthropic Chat Model: credentialsPresent=false. ai_languageModel sub-node checked for credentials (not the host) | Anthropic Chat Model | High | 80% |
| 9 | Reliability | Finding: missing credentials | Anthropic Chat Model1: credentialsPresent=false. ai_languageModel sub-node checked for credentials (not the host) | Anthropic Chat Model1 | High | 80% |
| 10 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Response Creating AI Agent" contains expression(s) with risky patterns that assume fields are always present. | Response Creating AI Agent | High | 85% |
| 11 | Reliability | No error handler or failure notification path | Workflow has 8 high-risk nodes (external calls or writes) with no configured error workflow and no inline notification path. If a production execution fails, the failure only appears in execution history. | HTTP Request, Posts Relevance AI Agent, Edit Fields, Send a text message, Response Creating AI Agent, Anthropic Chat Model, Anthropic Chat Model1, Edit Fields1 | High | 85% |
| 12 | Cost Risk | AI agent has no iteration limit | Agent node "Posts Relevance AI Agent" has no | Posts Relevance AI Agent | Medium | 85% |
| 13 | Cost Risk | AI agent has no iteration limit | Agent node "Response Creating AI Agent" has no | Response Creating AI Agent | Medium | 85% |
| 14 | Reliability | AI output drives downstream logic without a structured format | Node "Posts Relevance AI Agent" produces free-form text output that flows into downstream logic with no Output Parser or JSON mode configured. | Posts Relevance AI Agent | Medium | 75% |
| 15 | Reliability | Finding: dangling node reference | unreachable: $('Get row(s) in sheet') | Filter | Medium | 80% |
| 16 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Filter" contains expression(s) with risky patterns that assume fields are always present. | Filter | Medium | 85% |
| 17 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Append row in sheet" contains expression(s) with risky patterns that assume fields are always present. | Append row in sheet | Medium | 85% |
| 18 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Posts Relevance AI Agent" contains expression(s) with risky patterns that assume fields are always present. | Posts Relevance AI Agent | Medium | 75% |
| 19 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Add relevant posts with replies" contains expression(s) with risky patterns that assume fields are always present. | Add relevant posts with replies | Medium | 85% |
| 20 | Cost Risk | Full or large payload detected in AI prompt | Node "Posts Relevance AI Agent" receives text: large-payload keyword 'body' in its prompt parameter. This sends an unbounded amount of data to the model. | Posts Relevance AI Agent | Medium | 80% |
| 21 | Cost Risk | Full or large payload detected in AI prompt | Node "Response Creating AI Agent" receives text: large-payload keyword 'body' in its prompt parameter. This sends an unbounded amount of data to the model. | Response Creating AI Agent | Medium | 80% |
| 22 | Reliability | Irreversible write chain with no compensation path | Nodes HTTP Request, Send a text message perform irreversible side effects in sequence with no rollback, cancellation, or compensation path between them. A failure after the first write leaves external systems partially updated. | HTTP Request, Send a text message | Medium | 75% |
| 23 | Observability | Side-effect node has no audit trail | Node "HTTP Request" performs a write node: "http request" (sideeffect: unknown_write) operation with no logging or audit trail detected downstream. | HTTP Request | Medium | 70% |
| 24 | Observability | Side-effect node has no audit trail | Node "Send a text message" performs a write node: "send a text message" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Send a text message | Medium | 70% |
| 25 | Naming | Finding: poor naming generic | 3 node(s) use default/generic names.. Node "HTTP Request" (n8n-nodes-base.httpRequest) has a generic default name.. Node "Edit Fields" (n8n-nodes-base.set) has a generic default name.. Node "If" (n8n-nodes-base.if) has a generic default name. | HTTP Request, Edit Fields, If | Low | 90% |
| 26 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Edit Fields" contains expression(s) with risky patterns that assume fields are always present. | Edit Fields | Low | 75% |
| 27 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "If" contains expression(s) with risky patterns that assume fields are always present. | If | Low | 75% |
| 28 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Edit Fields1" contains expression(s) with risky patterns that assume fields are always present. | Edit Fields1 | Low | 75% |
| 29 | Reliability | Finding: external without retry | Node "Posts Relevance AI Agent" (@n8n/n8n-nodes-langchain.agent) is a read-only external call with no retry configured.. sideEffect: read_only, role: ai_agent. Read-only calls are typically safe to retry; enabling retryOnFail improves resilience to transient failures. | Posts Relevance AI Agent | Info | 70% |
| 30 | Reliability | Finding: external without retry | Node "Response Creating AI Agent" (@n8n/n8n-nodes-langchain.agent) is a read-only external call with no retry configured.. sideEffect: read_only, role: ai_agent. Read-only calls are typically safe to retry; enabling retryOnFail improves resilience to transient failures. | Response Creating AI Agent | Info | 70% |
| 31 | Reliability | Finding: external without retry | Node "Anthropic Chat Model" (@n8n/n8n-nodes-langchain.lmChatAnthropic) is a read-only external call with no retry configured.. sideEffect: read_only, role: ai_model_call. Read-only calls are typically safe to retry; enabling retryOnFail improves resilience to transient failures. | Anthropic Chat Model | Info | 70% |
| 32 | Reliability | Finding: external without retry | Node "Anthropic Chat Model1" (@n8n/n8n-nodes-langchain.lmChatAnthropic) is a read-only external call with no retry configured.. sideEffect: read_only, role: ai_model_call. Read-only calls are typically safe to retry; enabling retryOnFail improves resilience to transient failures. | Anthropic Chat Model1 | Info | 70% |