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.
Finding: loop invariant read — Review the finding details and address accordingly.
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 2 of 8 write nodes guarded | Partial |
| Empty Response Handling | Zero-result lookups break downstream logic | Missing |
| AI Output Limits | Output cost and parsing risk unbounded | N/A |
| AI Output Format | Free-form output will break downstream parsers | N/A |
| Activity Logging | Side effects unlogged 6 of 8 write nodes missing audit log | Partial |
| Write Deduplication | Webhook replays may create duplicate records | Present |
Run this analysis on your own workflows
- KIE Error
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 {{ $('Config').first().json.brand }} to {{ $('Config')?.first()?.json?.brand }}.
- FB Post
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 `queryParameters.parameters[0].value`, change {{ $('KIE Check').first().json.generatedImageUrl }} to {{ $('KIE Check')?.first()?.json?.generatedImageUrl }}.
- In `queryParameters.parameters[1].value`, change {{ $('KIE Check').first().json.caption }} to {{ $('KIE Check')?.first()?.json?.caption }}.
- IG Container
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 `queryParameters.parameters[0].value`, change {{ $('KIE Check').first().json.generatedImageUrl }} to {{ $('KIE Check')?.first()?.json?.generatedImageUrl }}.
- In `queryParameters.parameters[1].value`, change {{ $('KIE Check').first().json.caption }} to {{ $('KIE Check')?.first()?.json?.caption }}.
- IG Publish
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 `queryParameters.parameters[0].value`, change {{ $('IG Container').first().json.id }} to {{ $('IG Container')?.first()?.json?.id }}.
- Success Notification
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 {{ $('Config').first().json.brand }} to {{ $('Config')?.first()?.json?.brand }}.
- KIE Poll
- KIE Check
The workflow works reliably with test data where lookups always return results. In production, when the lookup returns zero results, the expression throws a runtime error or propagates null/undefined through the rest of the workflow — silently, with no clear error message pointing to the cause.
Add an IF node immediately after "KIE Poll" to branch on whether results exist (e.g., {{ $json.length > 0 }}). Route the empty case to an explicit exit, log, or notification.
- FB Post
- IG Container
- IG Publish
If any provider in the chain is slow or unresponsive, the entire chain hangs. The maximum possible hang time is 5 × the provider's default response timeout, which may exceed n8n's execution time limit and block downstream runs from starting.
Set a timeout on each node in the chain. Consider whether intermediate results can be persisted (e.g., to a database) so that a partial retry can resume from a checkpoint rather than re-running the entire chain.
- KIE Poll
- KIE Poll
Every iteration sends the exact same request — the loop body does not vary with item content. This is almost certainly unintentional and produces N identical API calls where one would suffice.
If only one call is needed, remove the loop. If the loop is needed for a different reason, verify which expressions in the loop body should reference the current item ($json, $item) and ensure they do.
- Route KIE
Items that legitimately do not match any configured condition are dropped with no log, notification, or fallback processing. This is intentional for filtering patterns (keep only matching items) but is a bug for routing patterns (every item must go somewhere).
Verify whether silent discard is intentional. If every item should be processed by at least one branch, add an "Otherwise" or catch-all output that logs the unmatched item or routes it to a fallback handler.
Currently covers AI/LLM nodes. Non-AI API costs will be added in a future update.
- KIE Poll
batch API available
Consult the workflow configuration to address this finding.
- Schedule 10am+3pm ET
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.
| # | Issue title | Issue description | Affected nodes | |||
|---|---|---|---|---|---|---|
| 1 | Reliability | External call with no timeout configured | Node "Fetch Last Record" makes an external call with no timeout parameter set. The n8n execution will wait indefinitely if the provider is slow or unresponsive. | Fetch Last Record, Fetch Past Topics, Generate Content, KIE Create, KIE Poll, KIE Error, FB Post, IG Container, IG Publish, Log to Airtable, Success Notification | High | 90% |
| 2 | Cost Risk | Finding: loop invariant read | loop: "KIE Poll". read node: "KIE Poll" (role: external_read) — no per-item expression in identifying parameters. identifying params checked: url: "__KIPNAI_SAN__URL__qKOGZIwW__", query: "(absent)", resource: "(absent)", key: "(absent)", body: "(absent)", endpoint: "(absent)". read fetches identical data every iteration — hoist above loop or cache the result | KIE Poll, KIE Poll | High | 75% |
| 3 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "KIE Error" contains expression(s) with risky patterns that assume fields are always present. | KIE Error | High | 90% |
| 4 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "FB Post" contains expression(s) with risky patterns that assume fields are always present. | FB Post | High | 90% |
| 5 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "IG Container" contains expression(s) with risky patterns that assume fields are always present. | IG Container | High | 90% |
| 6 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "IG Publish" contains expression(s) with risky patterns that assume fields are always present. | IG Publish | High | 90% |
| 7 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Success Notification" contains expression(s) with risky patterns that assume fields are always present. | Success Notification | High | 90% |
| 8 | Reliability | Lookup result accessed without empty-state check | Node "Fetch Last Record" fetches a list or search result. A downstream expression uses | Fetch Last Record, Config | High | 80% |
| 9 | Reliability | Lookup result accessed without empty-state check | Node "Fetch Past Topics" fetches a list or search result. A downstream expression uses | Fetch Past Topics, Prep Prompt | High | 80% |
| 10 | Reliability | Lookup result accessed without empty-state check | Node "KIE Poll" fetches a list or search result. A downstream expression uses | KIE Poll, KIE Check | High | 80% |
| 11 | Cost Risk | Loop body makes external calls without referencing the current item | Loop node "KIE Poll" iterates over items, but the loop body's external call to "KIE Poll" does not reference the current item's data in any expression. | KIE Poll, KIE Poll | High | 65% |
| 12 | Reliability | No error handler or failure notification path | Workflow has 16 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. | Fetch Last Record, Config, Fetch Past Topics, Prep Prompt, Generate Content, Parse Content, KIE Create, KIE Poll, KIE Check, KIE Error, FB Post, IG Container, IG Publish, Build Airtable, Log to Airtable, Success Notification | High | 85% |
| 13 | Reliability | Sequential external chain with no timeouts — cascade hang risk | Nodes FB Post, IG Container, IG Publish, Log to Airtable, Success Notification form a sequential chain of 5 external calls with no timeout configured on any node. | FB Post, IG Container, IG Publish, Log to Airtable, Success Notification | High | 80% |
| 14 | Reliability | API response may be paginated — only first page processed | Node "Fetch Last Record" fetches data without | Fetch Last Record | Medium | 60% |
| 15 | Reliability | API response may be paginated — only first page processed | Node "Fetch Past Topics" fetches data without | Fetch Past Topics | Medium | 60% |
| 16 | Reliability | API response may be paginated — only first page processed | Node "KIE Poll" fetches data without | KIE Poll | Medium | 60% |
| 17 | Reliability | Branch with no fallback path | Switch/IF node "Route KIE" has no Switch/Router node "Route KIE" has no "Otherwise" or fallback output — items that match no condition will be silently discarded. | Route KIE | Medium | 60% |
| 18 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "KIE Poll" contains expression(s) with risky patterns that assume fields are always present. | KIE Poll | Medium | 90% |
| 19 | Reliability | Irreversible write chain with no compensation path | Nodes Generate Content, KIE Create 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. | Generate Content, KIE Create | Medium | 75% |
| 20 | Reliability | Irreversible write chain with no compensation path | Nodes KIE Create, FB Post 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. | KIE Create, FB Post | Medium | 75% |
| 21 | Reliability | Irreversible write chain with no compensation path | Nodes FB Post, IG Container 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. | FB Post, IG Container | Medium | 75% |
| 22 | Reliability | Irreversible write chain with no compensation path | Nodes IG Container, IG Publish 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. | IG Container, IG Publish | Medium | 75% |
| 23 | Reliability | Irreversible write chain with no compensation path | Nodes IG Publish, Log to Airtable 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. | IG Publish, Log to Airtable | Medium | 75% |
| 24 | Reliability | Irreversible write chain with no compensation path | Nodes Log to Airtable, Success Notification 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. | Log to Airtable, Success Notification | Medium | 75% |
| 25 | Reliability | Irreversible write chain with no compensation path | Nodes KIE Create, KIE Error 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. | KIE Create, KIE Error | Medium | 75% |
| 26 | Cost Risk | Loop calls external service per item without batching or rate limiting | Loop node "KIE Poll" calls "KIE Poll" (external node: "KIE Poll" (role: external_read, externality: third_party_api)) once per item with no rate-limiting delay between calls. | KIE Poll, KIE Poll | Medium | 85% |
| 27 | Reliability | Retry enabled on write operation without idempotency key | Node "IG Container" has retry enabled on an operation detected as a likely write (HTTP method: POST). No idempotency header was found in the node configuration. | IG Container | Medium | 75% |
| 28 | Cost Risk | Scheduled workflow fetches all records with no incremental filter | Node "Fetch Last Record" fetches all records with no time-based or incremental filter. Every execution retrieves the full dataset. | Schedule 10am+3pm ET, Fetch Last Record | Medium | 70% |
| 29 | Reliability | Sequential external chain with no timeouts — cascade hang risk | Nodes Fetch Last Record, Fetch Past Topics, Generate Content, KIE Create form a sequential chain of 4 external calls with no timeout configured on any node. | Fetch Last Record, Fetch Past Topics, Generate Content, KIE Create | Medium | 80% |
| 30 | Observability | Side-effect node has no audit trail | Node "Generate Content" performs a write node: "generate content" (sideeffect: unknown_write) operation with no logging or audit trail detected downstream. | Generate Content | Medium | 70% |
| 31 | Observability | Side-effect node has no audit trail | Node "KIE Create" performs a write node: "kie create" (sideeffect: unknown_write) operation with no logging or audit trail detected downstream. | KIE Create | Medium | 70% |
| 32 | Observability | Side-effect node has no audit trail | Node "KIE Error" performs a write node: "kie error" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | KIE Error | Medium | 70% |
| 33 | Observability | Side-effect node has no audit trail | Node "FB Post" performs a write node: "fb post" (sideeffect: unknown_write) operation with no logging or audit trail detected downstream. | FB Post | Medium | 70% |
| 34 | Observability | Side-effect node has no audit trail | Node "IG Container" performs a write node: "ig container" (sideeffect: unknown_write) operation with no logging or audit trail detected downstream. | IG Container | Medium | 70% |
| 35 | Observability | Side-effect node has no audit trail | Node "Success Notification" performs a write node: "success notification" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Success Notification | Medium | 70% |
| 36 | Naming | Finding: poor naming generic | 1 node(s) use default/generic names.. Node "Manual Trigger" (n8n-nodes-base.manualTrigger) has a generic default name. | Manual Trigger | Low | 90% |
| 37 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Fetch Past Topics" contains expression(s) with risky patterns that assume fields are always present. | Fetch Past Topics | Low | 75% |
| 38 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Route KIE" contains expression(s) with risky patterns that assume fields are always present. | Route KIE | Low | 75% |
| 39 | Reliability | Finding: external without retry | Node "Fetch Last Record" (n8n-nodes-base.httpRequest) 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. | Fetch Last Record | Info | 70% |
| 40 | Reliability | Finding: external without retry | Node "Fetch Past Topics" (n8n-nodes-base.httpRequest) 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. | Fetch Past Topics | Info | 70% |
| 41 | Reliability | Finding: external without retry | Node "KIE Poll" (n8n-nodes-base.httpRequest) 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. | KIE Poll | Info | 70% |