Live demo · no signup

Before and after the same fix

Identical invoice webhook. Left: no duplicate guard. Right: removeDuplicates + Stripe idempotency key. Scroll both reports, then stress your own workflow.

Before · no idempotency

Gate FAIL · retry survivors 3 · risk 100/100

Deploy gate

fail

Not production-ready yet

At least one stress path looks dangerous (retries, spam, or money).

"Invoice on payment webhook" should not go live yet: 7 critical issue(s) (score 100/100). Biggest risk: "Create Invoice" can fail with no backup path (Create Invoice).

Risk score

100/100

Higher = more danger under retries and missing guards.

Nodes
4

Active nodes in the workflow graph

Critical
7

Issues that can hurt customers or money

High
6

Serious but usually not instant money loss

Outbound
3

Actions that leave the company (email, pay, API…)

Coverage
100%

How much of the graph we can simulate

How to read this report

  1. Start with the gate (FAIL). That is the ship / don't ship call.
  2. Open for each problem and the fix.
  3. Use only when you want the numbers behind a finding.

Trigger data: Built-in sample trigger data

Coverage 100%. Outbound paths 100% simulated.

Do these first

  1. 1.

    "Create Invoice" can fail with no backup path

    Turn on retry for transient SMTP/API errors, and route hard failures to an error branch that alerts someone.

  2. 2.

    "Create Invoice" retries can create duplicates

    Before create/send: check "already processed?" using a unique event/message id. Prefer upserts over creates.

  3. 3.

    Webhook "Payment Webhook" can fire side effects twice

    Store the provider event id; if you've seen it, skip every create/send node.

  • If production retried this 50×, Northwind Ops (simulated) would send 47 copycat emails and create 47 Stripe objects for the same customers.
  • Coverage 100%. Outbound paths 100% simulated.
  • Mock simulation ran 4 steps · 3 external action(s) on happy path.
  • Storyboard sample: Run #1: 1 invoice + 1 email + 1 message · Run #2: 1 invoice + 1 email + 1 message · Run #3: 1 invoice + 1 email + 1 message
  • Silent quota drain: Email / ESP 100 calls (soft 5); Payments 100 calls (soft 3); Team chat 100 calls (soft 8) — 2800 budget unit(s) burned with no hard stop.
  • Same event twice: 3 outbound actions ran again on the retry.
  • Simulation scenarios: 0/8 passed (N/A counts as pass).
  • Top issue: "Create Invoice" can fail with no backup path @ Create Invoice

Simulation only. Crash Labs does not call your live Stripe, Gmail, or other APIs.

After · removeDuplicates + Stripe key

Gate FAIL · retry survivors 0 · risk 89/100

Second delivery is a no-op. Remaining findings are static guards (error workflow, alerts), not retry spam.

Deploy gate

fail

Not production-ready yet

At least one stress path looks dangerous (retries, spam, or money).

"Invoice on payment webhook (idempotent)" should not go live yet: 1 critical issue(s) (score 89/100). Biggest risk: "Create Invoice" can fail with no backup path (Create Invoice).

Risk score

89/100

Higher = more danger under retries and missing guards.

Nodes
5

Active nodes in the workflow graph

Critical
1

Issues that can hurt customers or money

High
5

Serious but usually not instant money loss

Outbound
3

Actions that leave the company (email, pay, API…)

Coverage
100%

How much of the graph we can simulate

How to read this report

  1. Start with the gate (FAIL). That is the ship / don't ship call.
  2. Open for each problem and the fix.
  3. Use only when you want the numbers behind a finding.

Trigger data: Built-in sample trigger data

Coverage 100%. Outbound paths 100% simulated.

Do these first

  1. 1.

    "Create Invoice" can fail with no backup path

    Turn on retry for transient SMTP/API errors, and route hard failures to an error branch that alerts someone.

  2. 2.

    Nobody gets alerted when this workflow fails

    In n8n Settings, set an Error Workflow (or add an Error Trigger flow) that Slack/emails your team with the failed run link.

  3. 3.

    Tried to send email with a missing recipient

    Add an IF check: only send when the recipient field is present and looks like an email.

  • In a fake company replay (50 runs): 1 emails left the building and 1 Stripe objects were created across 1 customer key(s).
  • Coverage 100%. Outbound paths 100% simulated.
  • Mock simulation ran 5 steps · 3 external action(s) on happy path.
  • Storyboard sample: Run #1: 1 invoice + 1 email + 1 message · Run #2: no external side effects · Run #3: no external side effects
  • Same event twice: second delivery stayed quiet. Good.
  • Simulation scenarios: 5/8 passed (N/A counts as pass).
  • Top issue: "Create Invoice" can fail with no backup path @ Create Invoice

Simulation only. Crash Labs does not call your live Stripe, Gmail, or other APIs.

Gate it in CI

Pro API keys call POST /api/v1/gate and spend 1 credit per check. Drop this into GitHub Actions:

- uses: crashlabs/gate@v1
  with:
    api_key: ${{ secrets.CRASHLABS_API_KEY }}
    workflow_path: ./workflows/invoice.json
    fail_on_warn: "false"