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.
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 6 of 7 write nodes guarded | Partial |
| Empty Response Handling | Zero-result lookups break downstream logic | Present |
| 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 7 write nodes missing audit log | Partial |
| Write Deduplication | Webhook replays may create duplicate records | Present |
Run this analysis on your own workflows
- If2
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 {{ $json.messages[0].text.body }} to {{ $json?.messages[0]?.text?.body }}.
- In `conditions.conditions[1].leftValue`, change {{ $json.messages[0].type }} to {{ $json.messages?.[0].type }}.
- In `conditions.conditions[2].leftValue`, change {{ $json.messages[0].text.body }} to {{ $json?.messages[0]?.text?.body }}.
- Update a row
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 `filters.conditions[0].keyValue`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.
- Send message1
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 `recipientPhoneNumber`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.
- If[60aaa43d]
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 {{ $json.messages[0].text.body }} to {{ $json?.messages[0]?.text?.body }}.
- Update a row1
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 `filters.conditions[0].keyValue`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.
- Send message2
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 `recipientPhoneNumber`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.
- Get Pet Vacination Records
- Check pet parent is on DND mode
- Send 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.
- Send message
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 `recipientPhoneNumber`, change {{ $json.phone }} to {{ $json?.phone }}.
- In `textBody`, change {{ $json.parent_name }} to {{ $json?.parent_name }}.
- In `textBody`, change {{ $('Get Pet Vacination Records').item.json.pet_name }} to {{ $('Get Pet Vacination Records')?.item?.json?.pet_name }}.
- Edit Fields[ed3f1259]
- Get Pet Vacination Records
- Filter Vaccine Eligible Pets
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.
- If1
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 {{ $json.dnd }} to {{ $json?.dnd }}.
| # | Issue title | Issue description | Affected nodes | |||
|---|---|---|---|---|---|---|
| 1 | Reliability | External call with no timeout configured | Node "Get Pet Vacination Records" makes an external call with no timeout parameter set. The n8n execution will wait indefinitely if the provider is slow or unresponsive. | Get Pet Vacination Records, Check pet parent is on DND mode, Send message, Update a row, Send message1, Update a row1, Send message2 | High | 90% |
| 2 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Send message" contains expression(s) with risky patterns that assume fields are always present. | Send message | High | 85% |
| 3 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "If2" contains expression(s) with risky patterns that assume fields are always present. | If2 | High | 90% |
| 4 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Update a row" contains expression(s) with risky patterns that assume fields are always present. | Update a row | High | 90% |
| 5 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Send message1" contains expression(s) with risky patterns that assume fields are always present. | Send message1 | High | 90% |
| 6 | 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 | High | 90% |
| 7 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Update a row1" contains expression(s) with risky patterns that assume fields are always present. | Update a row1 | High | 90% |
| 8 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Send message2" contains expression(s) with risky patterns that assume fields are always present. | Send message2 | High | 90% |
| 9 | Reliability | No error handler or failure notification path | Workflow has 9 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. | Edit Fields, Get Pet Vacination Records, Filter Vaccine Eligible Pets, Check pet parent is on DND mode, Send message, Update a row, Send message1, Update a row1, Send message2 | High | 85% |
| 10 | 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 | Medium | 85% |
| 11 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "If1" contains expression(s) with risky patterns that assume fields are always present. | If1 | Medium | 75% |
| 12 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "validate the eligibility" contains expression(s) with risky patterns that assume fields are always present. | validate the eligibility | Medium | 75% |
| 13 | Reliability | Fragile expression — likely to fail when production data shape differs from test data | Node "Check pet parent is on DND mode" contains expression(s) with risky patterns that assume fields are always present. | Check pet parent is on DND mode | Medium | 75% |
| 14 | Reliability | Irreversible write chain with no compensation path | Nodes Get Pet Vacination Records, Check pet parent is on DND mode 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. | Get Pet Vacination Records, Check pet parent is on DND mode | Medium | 75% |
| 15 | Reliability | Irreversible write chain with no compensation path | Nodes Check pet parent is on DND mode, Send 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. | Check pet parent is on DND mode, Send message | Medium | 75% |
| 16 | Reliability | Irreversible write chain with no compensation path | Nodes Update a row, Send message1 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. | Update a row, Send message1 | Medium | 75% |
| 17 | Reliability | Irreversible write chain with no compensation path | Nodes Update a row1, Send message2 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. | Update a row1, Send message2 | Medium | 75% |
| 18 | Observability | Side-effect node has no audit trail | Node "Check pet parent is on DND mode" performs a write node: "check pet parent is on dnd mode" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Check pet parent is on DND mode | Medium | 70% |
| 19 | Observability | Side-effect node has no audit trail | Node "Send message" performs a write node: "send message" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Send message | Medium | 70% |
| 20 | Observability | Side-effect node has no audit trail | Node "Update a row" performs a write node: "update a row" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Update a row | Medium | 70% |
| 21 | Observability | Side-effect node has no audit trail | Node "Send message1" performs a write node: "send message1" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Send message1 | Medium | 70% |
| 22 | Observability | Side-effect node has no audit trail | Node "Update a row1" performs a write node: "update a row1" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Update a row1 | Medium | 70% |
| 23 | Observability | Side-effect node has no audit trail | Node "Send message2" performs a write node: "send message2" (sideeffect: external_write) operation with no logging or audit trail detected downstream. | Send message2 | Medium | 70% |
| 24 | Reliability | Branch with no fallback path | Switch/IF node "If1" has no a default/fallback output — items that match no condition will be silently discarded. | If1 | Low | 60% |
| 25 | Reliability | Branch with no fallback path | Switch/IF node "validate the eligibility" has no a default/fallback output — items that match no condition will be silently discarded. | validate the eligibility | Low | 60% |
| 26 | Reliability | Branch with no fallback path | Switch/IF node "If" has no a default/fallback output — items that match no condition will be silently discarded. | If | Low | 60% |
| 27 | Naming | Finding: poor naming generic | 3 node(s) use default/generic names.. Node "Edit Fields" (n8n-nodes-base.set) has a generic default name.. Node "Schedule Trigger" (n8n-nodes-base.scheduleTrigger) has a generic default name.. Node "If" (n8n-nodes-base.if) has a generic default name. | Edit Fields, Schedule Trigger, If | Low | 90% |