How does everyone handle "what changed?" in n8n workflows?

Since saving overwrites the previous version, I’ve never found a clean way to see what changed in a workflow week-to-week. Curious what the community does manual JSON exports? git? something else? Especially for those running n8n for clients. Trying to figure out the best practice here.

إعجاب واحد (1)

The approach I use is a scheduled workflow that calls the n8n API to export all workflows as JSON and commits them to a GitHub repo - runs every night, so you always have a diff-able history without touching the editor.

For the git backup pattern: use the n8n API GET /workflows/{id} to pull each workflow’s JSON, then push to GitHub via the GitHub node or an HTTP Request to the GitHub Contents API. Once it’s in git, git diff gives you a clean node-by-node comparison between any two dates.

For client work specifically, I pair this with a simple naming convention in the workflow notes field to tag the client and version. Not built-in versioning, but it works reliably without any extra tooling.

Since you mentioned client workflows, split this into two needs: internal rollback history, and a client-facing change trail. The client-facing one is paid work: read-only exports, a diff the client can understand, and a short approve/dispute note before anything changes live.

Is this for one self-hosted instance, or several client workspaces?