Skip to content

Disabling n8n Telemetry and Phone-Home Traffic

The Problem

A self-hosted n8n instance chats to the outside world constantly. If you run a DNS sinkhole (Pi-hole, AdGuard Home) you will see a steady stream of lookups to n8n's own domains — often thousands per day from a single idle instance:

  • telemetry.n8n.io — usage/diagnostics (PostHog + RudderStack)
  • ph.n8n.io — PostHog analytics endpoint
  • api.n8n.io — version checks and the template gallery
  • cdn-rs.n8n.io, api-rs.n8n.io — analytics CDN/collector

None of this is required for n8n to run. It is analytics, version-notification polling, and the workflow-template browser phoning home. You can turn all of it off with environment variables — cleaner than blocking at the DNS layer, which can leave the UI spinning on a dead endpoint.

The Fix

Set these in the container's environment (Docker Compose environment: block, or an .env file):

- N8N_DIAGNOSTICS_ENABLED=false          # master switch — kills PostHog/RudderStack telemetry
- N8N_VERSION_NOTIFICATIONS_ENABLED=false # stops version-check polling to api.n8n.io
- N8N_TEMPLATES_ENABLED=false             # disables the template gallery (also api.n8n.io)
- EXTERNAL_FRONTEND_HOOKS_URLS=           # blank any external frontend hook URLs
- N8N_DIAGNOSTICS_CONFIG_FRONTEND=        # blank the frontend PostHog key
- N8N_DIAGNOSTICS_CONFIG_BACKEND=         # blank the backend diagnostics config

N8N_DIAGNOSTICS_ENABLED=false is the master switch and implicitly disables the frontend/backend diagnostics config too. The other lines shut the remaining chatter (version polling, templates).

Environment variables are read at process start, so a plain restart of an already-running container will not pick up new values — you must recreate it:

docker compose up -d          # recreates the container with the new environment
# or, if you edited an .env file:
docker compose up -d --force-recreate

Your named data volume is untouched by a recreate — workflows, credentials, and execution history all survive.

Verifying

Confirm the variables are live in the running container:

docker inspect <n8n-container> --format '{{range .Config.Env}}{{println .}}{{end}}' | grep -i diagnost

Then watch your DNS sinkhole. Queries to *.n8n.io should collapse to near-zero within a minute or two. A couple of stragglers to api.n8n.io right after the recreate are normal (startup), and an open editor tab may emit a few more until you reload it — but the recurring telemetry.n8n.io beacon stops entirely.

Notes

  • These variables are stable across n8n versions and safe to leave in place permanently.
  • If you also sinkhole *.n8n.io at the DNS layer, do it in addition to these variables, not instead — disabling at the source means the app never waits on a blocked endpoint.
  • Disabling telemetry does not affect updates; you still pull new images yourself (docker compose pull).