So we’re a small dev team, self-hosted community edition, building automation workflows for clients. We’ve hit a wall with something pretty basic and I’m curious if others have figured it out or if everyone’s just winging it.
Our current process is embarrassing honestly. To move something from staging to prod we export the JSON, import it on the other server, then manually go through and fix credentials, URLs, env vars, whatever broke in the transfer. With 10-12 workflows in our main project this is already annoying. The bigger problem is that there’s no clean way to give each developer their own isolated setup to test changes without copy-pasting everything across manually, and our staging server ends up being this shared mess where everyone’s stepping on each other.
I’ve looked at the source control feature but that’s only in business and enterprise and we’re not paying €667/month for that.
Is there a workflow people have actually made work here? Or is everyone just living with the copy-paste chaos?
Hi @PurveshGandhi
For a quick move between environments, exporting and importing the workflow JSON is the simplest option.
For something more maintainable across staging-prod, I think n8n source control environments is the better long-term path, because workflows are versioned in Git branches.
Just keep in mind that credentials and variable values are not synced automatically, so those still need to be set per instance.
So,export-import for a fast copy, source control for the proper environment workflow.
I would split this into two layers: workflow shape and environment binding.
For Community Edition, I would not treat the exported JSON as the whole deployment system. Keep the JSON as the workflow shape, then maintain a small promotion map next to it:
- workflow name, owner, trigger, upstream systems, downstream systems
-
- variables that change by local, staging, and prod
-
- credential stubs by name and service, with no secrets in the shared JSON
-
- one fake or redacted smoke-test input per workflow, plus expected outputs
-
- promotion checklist: export, import, bind variables and credentials, run fixture, activate, record rollback notes
-
- developer sandbox rule: local or temporary clone with fake credentials only; shared staging should be the pre-prod gate, not the experiment box
- For 10-12 workflows, a single table of workflow / credentials / variables / smoke test / rollback will usually show which workflows are truly hard to promote and which only need consistent naming.
- I would avoid posting real credential exports. A safe next snippet would be a sanitized list of the workflows, anonymized credential names, env-specific variables, and one transfer that broke.
Welcome @PurveshGandhi to our community! I’m Jay and I am a n8n verified creator.
One approach that can save you from the manual export/import cycle on Community Edition is to automate it with n8n’s own REST API. You can run a workflow that calls GET /api/v1/workflows on your staging server, pulls the JSON of each workflow, then POST /api/v1/workflows or PUT /api/v1/workflows/{id} on your prod server to push it across.
For credentials, you still need to rebind manually since secret values aren’t exported - but you can automate the workflow sync itself. Combine this with a env var map stored in a Google Sheet or a simple JSON file (staging credential name → prod credential name) and the rebinding step becomes a Code node substitution before the push, rather than manual hunting.
This won’t give you the branching/rollback of source control, but it replaces the copy-paste loop with a push-button workflow that runs in under 30 seconds for 10-12 workflows.
Thanks @nguyenthieutoan! This is super helpful.
The API-based sync makes a lot of sense for the staging → prod promotion piece. Two follow-ups if you don’t mind:
First, we’re also building for a couple of client projects alongside our own, each on separate n8n instances. Does managing multiple sync workflows and credential maps per client get unwieldy, or does it stay clean?
Second, and this one’s been bugging us more than the promotion issue honestly. We mentioned in the original post that our staging server is a shared mess where developers step on each other. Your sync approach solves the push to prod, but what do you do about giving each developer an isolated environment to test changes in without contaminating staging? That’s the part we haven’t figured out.