Workflow review
webhook_to_sheets
Needs a human decision (1)
FlowGuard could not apply these fixes safely, so the fixed workflow leaves them unchanged.
Code· Rename to 'Normalise Submission Fields' or similar.
| Severity | Category | Node | Issue and fix | Status |
|---|---|---|---|---|
| critical | security | Log Submission | Postgres executeQuery uses inline n8n expressions ({{ $json.name }}, {{ $json.email }}, etc.) with no queryReplacement; user-supplied input can break out of the string literal and execute arbitrary SQL. Fix: Replace inline expressions with $1, $2, $3, $4 positional parameters and set options.queryReplacement to the array of values. | Fixed |
| high | reliability | Append to Sheet | Google Sheets node has no retryOnFail; transient Google API errors (rate limits, 503) will permanently lose the submission from the sheet. Fix: Set retryOnFail: true, maxTries: 3, waitBetweenTries: 2000. | Fixed |
| medium | reliability | Form Webhook | Webhook responds immediately (onReceived) before downstream Postgres and Sheets writes complete; a failure in Log Submission or Append to Sheet cannot be surfaced to the caller. Fix: Change responseMode to 'lastNode' and add a Respond to Webhook terminal node, so errors can return a 500 to the form. | Fixed |
| low | docs | Code | Node still has the default name 'Code', making the workflow graph ambiguous. Fix: Rename to 'Normalise Submission Fields' or similar. | Manual |
| low | docs | (workflow) | Workflow name 'My workflow 3' is a default placeholder, making it impossible to identify in the n8n workflow list. Fix: Rename to 'Event Signup → Postgres + Sheets' or similar. | Fixed |
Fixed workflow
flowchart LR
n0["Form Webhook"]
n1["Normalise Submission Fields"]
n2["Log Submission"]
n3["Append to Sheet"]
n4["Respond 200"]
n0 --> n1
n1 --> n2
n2 --> n3
n3 --> n4
classDef red fill:#fdecea,color:#8a1c12,stroke:#d0402b,stroke-width:1.5px
classDef orange fill:#fdf0e3,color:#7a3a06,stroke:#d9731a,stroke-width:1.5px
classDef yellow fill:#fbf5dc,color:#5e4b05,stroke:#b8960f,stroke-width:1.5px
classDef blue fill:#e8f0fb,color:#153e75,stroke:#3d74c4,stroke-width:1.5px
classDef clean fill:#f6f7f9,color:#2b3139,stroke:#c3c8cf
class n0 yellow
class n1 clean
class n2 red
class n3 orange
class n4 clean