Fragile expression — likely to fail when production data shape differs from test data — 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.
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 1 / 9 external nodes have timeout | Partial |
| 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 1 of 6 AI nodes missing token cap | Partial |
| AI Output Format | Free-form output will break downstream parsers 1 of 6 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
- Save Niche
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.niche`, change {{ $json.output.niche }} to {{ $json?.output.niche }}.
- In `columns.value.keywords`, change {{ ($json.output.searchTerms || []).join(', ') }} to {{ ($json?.output?.searchTerms || [])?.join(', ') }}.
- In `columns.value.business`, change {{ $json.output.business }} to {{ $json?.output.business }}.
- In `columns.value.audience`, change {{ $json.output.audience }} to {{ $json?.output.audience }}.
- Extract Niche
- Niche Model
- Save Niche
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.
- Extract Niche
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 {{ $json.output.data.title }} to {{ $json?.output?.data?.title }}.
- Write Script
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 {{ $('Resolve Niche').item.json.niche }} to {{ $('Resolve Niche')?.item?.json?.niche }}.
- Extract Niche
- Niche Model
- Niche Parser
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.
- Extract Niche
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.
- Email the Brief
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 `subject`, change {{ $json.niche }} to {{ $json?.niche }}.
- In `message`, change {{ $json.html }} to {{ $json?.html }}.
- Deep Scrape
If the external service processes the first request but n8n receives a timeout or transient error, the retry sends a duplicate request. Depending on the service, this can create duplicate records, send duplicate emails, or charge a customer twice.
Add an Idempotency-Key header (or equivalent for the target API) using a deterministic value derived from trigger data — for example, the order ID, event ID, or a hash of the request payload. This allows the API to recognize and deduplicate the retry.
- Split Terms
- Combine Sources
- Virality Analyst
If any one branch fails or is slow, the downstream Merge node either hangs waiting for the branch or receives incomplete data. The error from the failed branch may not be clearly attributed in execution logs.
Add error handling on each branch before the merge point. Consider whether it is acceptable for one branch failure to abort the others, or whether partial results should be passed forward with a failure flag.
Currently covers AI/LLM nodes. Non-AI API costs will be added in a future update.
- Extract Niche
- 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.
- Every Morning 8AM
full dataset fetched on every run
Add a time-based filter parameter using $now minus the trigger interval (e.g., updatedAfter: {{ DateTime.now().minus({ hours: 1 }).toISO() }}). Alternatively, track the last-processed timestamp in a database or workflow static data and filter to records newer than that point.
- Virality Analyst
- Write Script
no max iterations set
Set maxIterations to 10–20 for most agentic tasks. Monitor actual iteration counts in execution history and adjust up if legitimate tasks are being cut short.
| # | Issue title | Issue description | Affected nodes | |||
|---|---|---|---|---|---|---|
| 1 | Cost Risk | AI node has no output token cap | Node "Extract Niche" has no | Extract Niche | High | 85% |
| 2 | Reliability | External call with no timeout configured | Node "Extract Niche" makes an external call with no timeout parameter set. The n8n execution will wait indefinitely if the provider is slow or unresponsive. | Extract Niche, Niche Model, Save Niche, Read Niche, Virality Analyst, Analyst Model, Write Script, Script Model | High | 90% |
| 3 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Extract Niche" contains expression(s) with risky patterns that assume fields are always present. | Extract Niche | High | 85% |
| 4 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Save Niche" contains expression(s) with risky patterns that assume fields are always present. | Save Niche | High | 85% |
| 5 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Write Script" contains expression(s) with risky patterns that assume fields are always present. | Write Script | High | 85% |
| 6 | Reliability | No error handler or failure notification path | Workflow has 15 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. | Extract Niche, Niche Model, Niche Parser, Save Niche, Read Niche, Resolve Niche, Rank Top Viral, Virality Analyst, Analyst Model, Analyst Parser, Build Digest, Write Script, Script Model, Render HTML, Email the Brief | High | 85% |
| 7 | Cost Risk | AI agent has no iteration limit | Agent node "Extract Niche" has no | Extract Niche | Medium | 85% |
| 8 | Cost Risk | AI agent has no iteration limit | Agent node "Virality Analyst" has no | Virality Analyst | Medium | 85% |
| 9 | Cost Risk | AI agent has no iteration limit | Agent node "Write Script" has no | Write Script | Medium | 85% |
| 10 | Reliability | AI output drives downstream logic without a structured format | Node "Write Script" produces free-form text output that flows into downstream logic with no Output Parser or JSON mode configured. | Write Script | Medium | 75% |
| 11 | Complexity | Finding: complexity nodes | Workflow contains 34 active nodes (threshold: >30 medium, >60 high, >100 critical). | — | Medium | 100% |
| 12 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Virality Analyst" contains expression(s) with risky patterns that assume fields are always present. | Virality Analyst | Medium | 75% |
| 13 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Email the Brief" contains expression(s) with risky patterns that assume fields are always present. | Email the Brief | Medium | 75% |
| 14 | Cost Risk | Full or large payload detected in AI prompt | Node "Extract Niche" receives text: large-payload keyword 'body' in its prompt parameter. This sends an unbounded amount of data to the model. | Extract Niche | Medium | 80% |
| 15 | Reliability | High fan-out with external calls — partial failure risk at merge point | Workflow fans out into 3 parallel branches, each calling an external service. No per-branch error handling was detected before the merge point. | Split Terms, Combine Sources, Virality Analyst, Virality Analyst, Virality Analyst | Medium | 70% |
| 16 | Reliability | Retry enabled on write operation without idempotency key | Node "Deep Scrape" has retry enabled on an operation detected as a likely write (HTTP method: POST). No idempotency header was found in the node configuration. | Deep Scrape | Medium | 75% |
| 17 | Cost Risk | Scheduled workflow fetches all records with no incremental filter | Node "Read Niche" fetches all records with no time-based or incremental filter. Every execution retrieves the full dataset. | Every Morning 8AM, Read Niche | Medium | 70% |
| 18 | Observability | Side-effect node has no audit trail | Node "Save Niche" performs a write node: "save niche" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Save Niche | Medium | 70% |
| 19 | Observability | Side-effect node has no audit trail | Node "Email the Brief" performs a write node: "email the brief" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Email the Brief | Medium | 70% |
| 20 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "AnyAPI: Scrape Website" contains expression(s) with risky patterns that assume fields are always present. | AnyAPI: Scrape Website | Low | 75% |
| 21 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "TikTok Top" contains expression(s) with risky patterns that assume fields are always present. | TikTok Top | Low | 75% |
| 22 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "YouTube" contains expression(s) with risky patterns that assume fields are always present. | YouTube | Low | 75% |
| 23 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Instagram Reels" contains expression(s) with risky patterns that assume fields are always present. | Instagram Reels | Low | 75% |
| 24 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "X Search" contains expression(s) with risky patterns that assume fields are always present. | X Search | Low | 75% |
| 25 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Log Viral Finds" contains expression(s) with risky patterns that assume fields are always present. | Log Viral Finds | Low | 75% |
| 26 | Reliability | Finding: external without retry | Node "Extract Niche" (@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. | Extract Niche | Info | 70% |
| 27 | Reliability | Finding: external without retry | Node "Niche Model" (@n8n/n8n-nodes-langchain.lmChatOpenRouter) 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. | Niche Model | Info | 70% |
| 28 | Reliability | Finding: external without retry | Node "Read Niche" (n8n-nodes-base.dataTable) is a read-only external call with no retry configured.. sideEffect: read_only, role: external_read. Read-only calls are typically safe to retry; enabling retryOnFail improves resilience to transient failures. | Read Niche | Info | 70% |
| 29 | Reliability | Finding: external without retry | Node "Virality Analyst" (@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. | Virality Analyst | Info | 70% |
| 30 | Reliability | Finding: external without retry | Node "Analyst Model" (@n8n/n8n-nodes-langchain.lmChatOpenRouter) 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. | Analyst Model | Info | 70% |
| 31 | Reliability | Finding: external without retry | Node "Write Script" (@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. | Write Script | Info | 70% |
| 32 | Reliability | Finding: external without retry | Node "Script Model" (@n8n/n8n-nodes-langchain.lmChatOpenRouter) 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. | Script Model | Info | 70% |