Tips > Reliability & Performance

Compare Successful and Failed Executions Side by Side

n8n stores the complete input and output data for every node in every execution.

n8n stores the full input and output of every node for every execution, so when a previously healthy workflow suddenly fails, open the failed execution beside a recent successful one and compare the failing node's input. The difference in that input data is almost always the cause, and it points you straight to the fix.

Why compare executions in n8n?

n8n stores the complete input and output data for every node in every execution. When a workflow that has been running successfully suddenly fails, the fastest path to the root cause is comparing the failing execution's data against a recent successful one. The difference in the input data is almost always the cause.

Real-world example: Your Stripe-to-Slack workflow has run successfully 200 times but failed this morning. You compare executions to find the difference.

How do you compare a failed and a successful execution?

1. Go to the Executions tab (left sidebar).
2. Find the failed execution (red indicator) and click to open it.
3. Note the input data for the failing node.
4. Open a new browser tab (or use the back button).
5. Open a recent successful execution (green indicator).
6. Navigate to the same node and compare the input data.

Successful Execution - Stripe webhook payload

{
  "type": "charge.succeeded",
  "data": {
    "object": {
      "amount": 4999,
      "currency": "usd",
      "customer": "cus_ABC123",
      "billing_details": {
        "name": "Alice Johnson",
        "email": "alice@example.com"
      }
    }
  }
}

Failed Execution - Stripe webhook payload

{
  "type": "charge.succeeded",
  "data": {
    "object": {
      "amount": 4999,
      "currency": "usd",
      "customer": "cus_DEF456",
      "billing_details": {
        "name": null,
        "email": null
      }
    }
  }
}

What does the difference tell you?

The comparison reveals that billing_details.name and billing_details.email are null in the failing execution. The downstream Slack message node uses {{ $json.data.object.billing_details.name }} in the message body, which produced an empty string that violated a required-field check.

The fix: add a fallback expression {{ $json.data.object.billing_details.name ?? "Unknown Customer" }} or add an IF node to handle the null case.

Related: Always Set an Error Workflow on Every Production Workflow · Break Large Workflows into Sub-Workflows

Showcase builds

19 complete workflows from my own projects, each with its n8n workflow JSON to import. Showcase entries link the file at the end of the article.

See the showcase builds

Keep reading

190 entries grouped by topic, from first workflow to queue mode. Free, no signup.

Browse the encyclopedia

Need it built?

I design, build and run n8n systems for clients. Every engagement starts with a $1,500 diagnostic audit, credited toward the build.

Book an introductory call