kipn.ai
Shared workflow report

Autonomous Social Media Pipeline v3

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.

Cost ExposureHigh

Finding: loop invariant read — Review the finding details and address accordingly.

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.

49/ 100
Overall
Risk: HighCost: High
Reliability
0
Security
100
Cost Risk
54
Observability
52
AI Governance
100
Naming
97
Complexity
100
Nodes
29
Edges
22
External calls
11
LLM nodes
0
AI via HTTP
0
Loops
0
Error handlers
0
Unreachable
0
Max depth
18
Workflow Graph
Graph
29 nodes · 22 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

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

Break Points
1Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • KIE Error
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 `text`, change {{ $('Config').first().json.brand }} to {{ $('Config')?.first()?.json?.brand }}.

2Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • FB Post
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 `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 }}.

3Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • IG Container
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 `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 }}.

4Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • IG Publish
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 `queryParameters.parameters[0].value`, change {{ $('IG Container').first().json.id }} to {{ $('IG Container')?.first()?.json?.id }}.

5Fragile expressionRisk HighConfidence 90%1 node affected
Affected Nodes:
  • Success Notification
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 `text`, change {{ $('Config').first().json.brand }} to {{ $('Config')?.first()?.json?.brand }}.

6Empty-state not handledRisk HighConfidence 80%2 nodes affected
Affected Nodes:
  • KIE Poll
  • KIE Check
What happens:

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.

Recommended Fix:

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.


7Timeout cascadeRisk HighConfidence 80%5 nodes affected
Affected Nodes:
  • FB Post
  • IG Container
  • IG Publish
What happens:

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.

Recommended Fix:

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.


9Unnecessary loopRisk HighConfidence 65%2 nodes affected
Affected Nodes:
  • KIE Poll
  • KIE Poll
What happens:

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.

Recommended Fix:

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.


10Branch without fallbackRisk HighConfidence 60%1 node affected
Affected Nodes:
  • Route KIE
What happens:

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).

Recommended Fix:

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.

Cost Hotspots

Currently covers AI/LLM nodes. Non-AI API costs will be added in a future update.

1Unnecessary per-item loopHigh exposure50 pts1 node affected
Affected Nodes:
  • KIE Poll
What happens:

batch API available

Recommended Fix:

Consult the workflow configuration to address this finding.


2Unfiltered pollLow exposure10 pts1 node affected
Affected Nodes:
  • Schedule 10am+3pm ET
What happens:

full dataset fetched on every run

Recommended Fix:

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.

Raw Findings (41)
#Issue titleIssue descriptionAffected nodes
1ReliabilityExternal 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 NotificationHigh90%
2Cost RiskFinding: 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 PollHigh75%
3ReliabilityFragile 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 ErrorHigh90%
4ReliabilityFragile 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 PostHigh90%
5ReliabilityFragile 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 ContainerHigh90%
6ReliabilityFragile 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 PublishHigh90%
7ReliabilityFragile 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 NotificationHigh90%
8ReliabilityLookup result accessed without empty-state check

Node "Fetch Last Record" fetches a list or search result. A downstream expression uses $input.first() without an IF node between the lookup and the access point to handle the zero-results case.

Fetch Last Record, ConfigHigh80%
9ReliabilityLookup result accessed without empty-state check

Node "Fetch Past Topics" fetches a list or search result. A downstream expression uses $input.first() without an IF node between the lookup and the access point to handle the zero-results case.

Fetch Past Topics, Prep PromptHigh80%
10ReliabilityLookup result accessed without empty-state check

Node "KIE Poll" fetches a list or search result. A downstream expression uses $input.first() without an IF node between the lookup and the access point to handle the zero-results case.

KIE Poll, KIE CheckHigh80%
11Cost RiskLoop 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 PollHigh65%
12ReliabilityNo 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 NotificationHigh85%
13ReliabilitySequential 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 NotificationHigh80%
14ReliabilityAPI response may be paginated — only first page processed

Node "Fetch Last Record" fetches data without returnAll: true or visible pagination handling (no cursor/offset parameter updating per page).

Fetch Last RecordMedium60%
15ReliabilityAPI response may be paginated — only first page processed

Node "Fetch Past Topics" fetches data without returnAll: true or visible pagination handling (no cursor/offset parameter updating per page).

Fetch Past TopicsMedium60%
16ReliabilityAPI response may be paginated — only first page processed

Node "KIE Poll" fetches data without returnAll: true or visible pagination handling (no cursor/offset parameter updating per page).

KIE PollMedium60%
17ReliabilityBranch 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 KIEMedium60%
18ReliabilityFragile 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 PollMedium90%
19ReliabilityIrreversible 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 CreateMedium75%
20ReliabilityIrreversible 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 PostMedium75%
21ReliabilityIrreversible 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 ContainerMedium75%
22ReliabilityIrreversible 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 PublishMedium75%
23ReliabilityIrreversible 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 AirtableMedium75%
24ReliabilityIrreversible 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 NotificationMedium75%
25ReliabilityIrreversible 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 ErrorMedium75%
26Cost RiskLoop 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 PollMedium85%
27ReliabilityRetry 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 ContainerMedium75%
28Cost RiskScheduled 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 RecordMedium70%
29ReliabilitySequential 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 CreateMedium80%
30ObservabilitySide-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 ContentMedium70%
31ObservabilitySide-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 CreateMedium70%
32ObservabilitySide-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 ErrorMedium70%
33ObservabilitySide-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 PostMedium70%
34ObservabilitySide-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 ContainerMedium70%
35ObservabilitySide-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 NotificationMedium70%
36NamingFinding: poor naming generic

1 node(s) use default/generic names.. Node "Manual Trigger" (n8n-nodes-base.manualTrigger) has a generic default name.

Manual TriggerLow90%
37ReliabilityFragile 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 TopicsLow75%
38ReliabilityFragile 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 KIELow75%
39ReliabilityFinding: 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 RecordInfo70%
40ReliabilityFinding: 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 TopicsInfo70%
41ReliabilityFinding: 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 PollInfo70%

Catch workflow risks before they catch you