kipn.ai
Shared workflow report

pasted-template.json

Analyzed

Executive Summary
n8n
Production RiskHigh

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.

Observability Gap

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.

58/ 100
Overall
Risk: HighCost: Low
Reliability
0
Security
100
Cost Risk
100
Observability
52
AI Governance
100
Naming
97
Complexity
100
Nodes
16
Edges
13
External calls
7
LLM nodes
0
AI via HTTP
0
Loops
0
Error handlers
0
Unreachable
0
Max depth
7
Workflow Graph
Graph
16 nodes · 13 edges
100%
click a node to highlight its upstream & downstream paths
Controls Matrix
Present Partial Missing
CheckDescriptionStatus
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

Break Points
1Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • If2
What happens:

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.

Recommended Fix:
  • 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 }}.

2Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • Update a row
What happens:

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.

Recommended Fix:
  • In `filters.conditions[0].keyValue`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.

3Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • Send message1
What happens:

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.

Recommended Fix:
  • In `recipientPhoneNumber`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.

4Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • If[60aaa43d]
What happens:

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.

Recommended Fix:
  • In `conditions.conditions[0].leftValue`, change {{ $json.messages[0].text.body }} to {{ $json?.messages[0]?.text?.body }}.

5Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • Update a row1
What happens:

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.

Recommended Fix:
  • In `filters.conditions[0].keyValue`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.

6Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • Send message2
What happens:

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.

Recommended Fix:
  • In `recipientPhoneNumber`, change {{ $('WhatsApp Trigger').item.json.contacts[0].wa_id }} to {{ $('WhatsApp Trigger')?.item?.json?.contacts[0]?.wa_id }}.

7Missing timeoutRisk HighConfidence 90%7 nodes affected
Affected Nodes:
  • Get Pet Vacination Records
  • Check pet parent is on DND mode
  • Send message
What happens:

A single slow external call can block the entire workflow execution. At high trigger frequency, accumulated stuck executions can exhaust the n8n execution queue.

Recommended Fix:

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.


8Fragile expressionRisk HighConfidence 85%1 node affected
Affected Nodes:
  • Send message
What happens:

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.

Recommended Fix:
  • 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 }}.

9Missing error handlerRisk MediumConfidence 85%9 nodes affected
Affected Nodes:
  • Edit Fields[ed3f1259]
  • Get Pet Vacination Records
  • Filter Vaccine Eligible Pets
What happens:

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.

Recommended Fix:

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.


10Fragile expressionRisk MediumConfidence 75%1 node affected
Affected Nodes:
  • If1
What happens:

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.

Recommended Fix:
  • In `conditions.conditions[0].leftValue`, change {{ $json.dnd }} to {{ $json?.dnd }}.
Raw Findings (27)
#Issue titleIssue descriptionAffected nodes
1ReliabilityExternal 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 message2High90%
2ReliabilityFragile 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 messageHigh85%
3ReliabilityFragile 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.

If2High90%
4ReliabilityFragile 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 rowHigh90%
5ReliabilityFragile 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 message1High90%
6ReliabilityFragile 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.

IfHigh90%
7ReliabilityFragile 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 row1High90%
8ReliabilityFragile 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 message2High90%
9ReliabilityNo 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 message2High85%
10ReliabilityFragile 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 FieldsMedium85%
11ReliabilityFragile 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.

If1Medium75%
12ReliabilityFragile 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 eligibilityMedium75%
13ReliabilityFragile 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 modeMedium75%
14ReliabilityIrreversible 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 modeMedium75%
15ReliabilityIrreversible 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 messageMedium75%
16ReliabilityIrreversible 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 message1Medium75%
17ReliabilityIrreversible 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 message2Medium75%
18ObservabilitySide-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 modeMedium70%
19ObservabilitySide-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 messageMedium70%
20ObservabilitySide-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 rowMedium70%
21ObservabilitySide-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 message1Medium70%
22ObservabilitySide-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 row1Medium70%
23ObservabilitySide-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 message2Medium70%
24ReliabilityBranch with no fallback path

Switch/IF node "If1" has no a default/fallback output — items that match no condition will be silently discarded.

If1Low60%
25ReliabilityBranch 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 eligibilityLow60%
26ReliabilityBranch with no fallback path

Switch/IF node "If" has no a default/fallback output — items that match no condition will be silently discarded.

IfLow60%
27NamingFinding: 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, IfLow90%

Catch workflow risks before they catch you