Skip to content
Skip to main content
A stack of cream documents and manila folders on a linen table, half hidden behind an upright pane of frosted glass in a brass frame, with the right edge of the stack sticking out past the glass in plain sight — a metaphor for n8n execution data redaction hiding payloads in the UI while the data itself stays stored
8 min readBy Carlos Aragon

n8n Execution Data Redaction: What It Actually Hides

n8n execution data redaction hides each node's payload when someone reads an execution. It does not stop n8n from storing it. The rows in your database stay unencrypted, so the emails, phone numbers and card fragments are still in Postgres, still in last night's backup, and still in any console.log a Code node printed. Redaction is an access control for the UI. If what you actually want is “n8n doesn't keep customer data,” that's a different set of settings, and they're free on every edition.

Who Gets Redaction, and Since When?

Short version: Enterprise only, on Cloud and self-hosted alike. It arrived in two pieces:

  • n8n 2.16.0— per-workflow toggles. Workflow → … menu → Settings gives you two independent switches: Redact production execution data (webhooks, schedules, any active trigger) and Redact manual execution data (what you run from the editor).
  • n8n 2.26.0— instance-wide enforcement under Settings → Security → Data redaction. Pick Production executions (the recommended floor) or Manual and production executions. Once enforced, the workflow toggles lock to Redact and the API rejects any workflow that tries to set a weaker policy.

If you're on Community, Starter or Pro, you won't see either switch. Don't panic about that yet — the rest of this post is about why the switch was never the part that mattered most.

What Does Redaction Hide?

When a redacted execution is opened, n8n swaps the data out at read time:

  • Item JSON on every node's input and output becomes an empty object
  • Binary data — PDFs, images, attachments — is dropped
  • Fields a node author declared sensitive via sensitiveOutputFields are hidden
  • Error messages shrink to the error type and HTTP status code, which matters more than it sounds: a lot of API errors echo the request body back

What stays: node names, status, timing, the workflow graph. You can still see that “Create Contact” failed with a 422 at 2:14am. You just can't see whose contact. It also flows into log streaming — redacted executions are redacted in log output too.

One design choice I like: it fails closed. If n8n can't resolve a node's type definition (say, a community node that got uninstalled), that node's whole output is redacted rather than guessed at.

What Redaction Doesn't Hide

This is the list nobody puts in the announcement post, and it's straight from n8n's own docs:

Not redactedWhere it ends up
Stored execution rowsYour database, unencrypted, and every backup of it
Code node console.logEditor Logs panel (manual) or stdout (production) → Docker logs
Webhook response bodiesWhoever called the webhook
Auth headers on outbound requestsThe receiving service and any proxy in between
Data moving between nodes mid-runEvery node, including third-party ones
Enforcement settingsNot exported through source control

The first row is the one that bites. n8n describes redaction as UI-layer only, with no backend access control. Point a SQL client at a self-hosted Postgres and run something like this:

SELECT "executionId"
FROM execution_data
WHERE data LIKE '%@gmail.com%'
LIMIT 20;

On a lead-routing instance running the default save settings, that query comes back full whether redaction is on or not. Redaction changed who can see it through n8n. It didn't change what's sitting on disk.

The last row is a quieter trap. You set enforcement in staging, promote workflows to production through Git, and production has no enforcement until someone sets it again by hand.

So What Is Redaction For?

I don't want to undersell it. It solves a real problem, just not the one people assume.

The real problem is people, not disks. On a shared instance, the ops person debugging a Slack notification can open the payroll workflow's executions and read salaries. A contractor with editor access can scroll through six months of customer phone numbers. Redaction fixes that: everyone sees that things ran, and only people with the execution:reveal scope can see what ran through them.

And reveals are audited. Clicking Reveal data asks for confirmation and emits n8n.audit.execution.data.revealed to your log streaming destination, with user, execution ID, workflow ID, IP and timestamp. Denied attempts emit reveal_failure, and policy changes emit n8n.audit.redaction-enforcement.updatedwith before and after values. For a SOC 2 auditor asking “who looked at customer data and when,” that's a clean answer. Executions that used dynamic credentials can't be revealed at all, even by an owner.

So: redaction is least-privilege for the execution viewer. Treat it as that and it's good. Treat it as data minimization and you'll write something false in a GDPR record.

How Do You Actually Stop n8n Keeping PII?

Don't save it. These are the settings I change first on any self-hosted instance that touches leads, and none of them need Enterprise:

# docker-compose.yml → n8n.environment
- EXECUTIONS_DATA_SAVE_ON_ERROR=all          # keep failures, you need them
- EXECUTIONS_DATA_SAVE_ON_SUCCESS=none       # default: all
- EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false   # default: true
- EXECUTIONS_DATA_SAVE_ON_PROGRESS=false
- EXECUTIONS_DATA_PRUNE=true
- EXECUTIONS_DATA_MAX_AGE=72                 # hours; default 336 (14 days)
- EXECUTIONS_DATA_PRUNE_MAX_COUNT=5000       # default 10,000

Successful runs are where most personal data piles up, and they're the runs you almost never open. Failures you keep, because that's where you debug. If a blanket noneis too aggressive, the same options exist per workflow under Workflow settings → Save successful production executions. I set it on the workflows that carry contact data and leave internal plumbing alone.

Do the retention math for your volume, too. The defaults prune at 14 days or 10,000 executions, whichever hits first. A form webhook doing 1,500 runs a day hits the count cap in under seven days, so the age setting never kicks in. A workflow doing 40 a day keeps two full weeks of payloads. Same settings, very different exposure.

Three gotchas that show up in audits:

  • Annotated executions are never pruned. Tag or rate an execution once while debugging and it lives forever, payload included.
  • Pruning soft-deletes first. Hard deletes run every 15 minutes by default, with a 1-hour buffer. Fine for storage, worth knowing if you promise a deletion time to anyone.
  • Backups outlive pruning. If you dump Postgres nightly and keep 30 days of dumps, your real retention is 30 days plus MAX_AGE, not MAX_AGE.

The console.log Leak Nobody Checks

The most common leftover in a Code node is console.log(JSON.stringify($input.all())) from some old debugging session. In production that goes to stdout. Stdout goes to docker logs, and from there to whatever ships your logs — Loki, Datadog, a Synology log center nobody rotates.

Redaction does nothing here, and neither do the save settings. An execution that n8n never saved can still have printed its entire payload to a log that's retained for 90 days. Grep your workflow exports for console.logand delete anything that prints items instead of counts. It's a five-minute job.

If you've set up tracing for your AI agent workflows, check that too. Prompt and completion capture puts the same customer message into a second system with its own retention.

Is It Worth Enterprise Just for Redaction?

Not on its own. If you're a solo operator or a small team where everyone with n8n access already has database access, redaction hides data from people who can read it anyway. Spend the effort on the save settings and the log cleanup instead.

It starts to earn its keep when:

  • several teams share one instance and shouldn't see each other's data
  • contractors or clients get editor access to their own projects
  • an auditor wants a record of who viewed customer data, not just a policy that says nobody does

That's also roughly the point where the Cloud vs self-hosted question gets serious, and where version control stops being optional — with the caveat above that enforcement won't ride along in Git.

What I'd Actually Do

In order:

  1. SAVE_ON_SUCCESS=none on workflows with personal data, errors still saved
  2. SAVE_MANUAL_EXECUTIONS=false and MAX_AGE down to 72 hours
  3. Kill payload-printing console.log calls
  4. Match your database backup retention to what you'd say out loud to a client
  5. On Enterprise, enforce production redaction and stream reveal events somewhere you'll actually read

Steps one through four are the ones that change what's on disk. Step five changes who can look. Both matter, but if you only have 30 minutes, do the first four. The same thinking applies to where you store leads and to what your AI nodes are allowed to touch: decide what the system keeps before you decide who's allowed to see it.

Not Sure What Your n8n Is Keeping?

I audit self-hosted n8n instances for exactly this: what gets saved, where it leaks, and how long it really lives once backups are counted. Send me your setup and I'll tell you where the customer data is hiding.

Editions, versions, scopes, audit events and the not-redacted list verified 25 September 2026 against n8n's Redact execution data docs; environment variable defaults and pruning rules from Manage execution data. The SQL query is illustrative — table layout can change between versions, so check your own schema first.

Related Posts

n8n

n8n Cloud vs Self-Hosted in 2026: The Real Math

n8n removed active-workflow limits from every plan in 2026, so the old reason to self-host is gone. What you buy now is a monthly execution allowance and a concurrency ceiling — and the jump from Pro to Business is 4x the executions for 13x the price. Measured numbers from my own instance: 179 workflows, ~5,600 executions a month, a median run under one second, and why AI agent workflows break the concurrency assumption entirely.

n8n

Cloudflare Access Blocks Your n8n Webhooks. Here Is the Fix That Keeps Both.

Cloudflare Access is an identity proxy, and a webhook sender has no identity to offer, so Access 403s the delivery before n8n ever sees it. The three fixes that actually work: a service token with a Service Auth policy for callers you control, a Bypass policy scoped to the webhook path for third parties like Stripe, and the split-hostname setup I run in production. Plus the four gotchas, including the 403 that turned out to be bot protection rather than Access.

n8n

Scaling Self-Hosted n8n: When to Switch to Queue Mode (2026)

Default n8n runs the editor, webhooks, and every execution in one Node process — it works until the UI crawls during runs and webhooks drop under load. The signal to move is the main process pinned near 80% CPU; the fix is queue mode: a main instance, a Redis broker, and dedicated workers on Postgres. The exact signals I watch, the env vars I set, and the mistakes that cost me a night of dropped executions.