Skip to Content

Someone else's workflow is on your canvas. Here is how it becomes yours

make it yours
n8n Guide · Part 4

Someone else's workflow is on your canvas. Here is how it becomes yours

You found a template and pasted the JSON in. What is on the canvas now points at another person's Google account, another person's Slack channel, another person's field names and the trigger time that suited them. Press Execute and it fails, and that is the correct result. This part walks the whole conversion once — swap the parameters, point the expressions at your own field names, add a branch, change the trigger type — and finishes with the three checks that decide whether it is safe to switch on.

3 levels
Parameters, nodes, logic — cheapest first, and most edits never leave the first one
3 checks
Save, Execute Workflow, Executions — run in that order after every edit
Active off
Nothing outside your browser is notified while that toggle stays off
Why it will not just run

A template is a skeleton, not a finished machine

Templates were built by somebody else for their own situation. That is what makes them useful, and it is also why pressing Execute on a fresh import fails. Every node on the canvas is still addressed to things you have no access to.

So the useful way to think about a template is not “run it as-is.” It is “use it as a skeleton.” The skeleton has already made the decisions that are hardest for a beginner — which nodes to use, how they are wired, how the data moves from one to the next. Your job is to swap the parameters hanging off that skeleton for your own. There are four of them:

  • The Google Sheet ID becomes your own sheet.
  • The Slack channel moves from #example-channel to #my-team.
  • The credentials become ones authorized under your own account.
  • The trigger moves from “every day at 8:00 am” to “run when someone submits the form.”
In plain terms

A template is an IKEA instruction sheet. It shows you how a few boards become a cabinet, and it saves you the whole job of working that out. The screws and the boards are still yours to supply. Nobody carries home the cabinet somebody else already assembled — and if they did, it would be standing in the wrong room.

flowchart LR
  A["The template JSON
you pasted in"] --> B["Which nodes to use"] A --> C["How they are wired together"] A --> D["How the data flows through"] A --> E["Their Google account,
their Slack workspace"] A --> F["Their form, their sheet,
their channel name"] A --> G["Their trigger time"] B --> H["Keep. This is the part
you came for"] C --> H D --> H E --> I["Replace. Every one of these
points at somebody else"] F --> I G --> I
What you inherit, what you swapThe top three boxes in the middle column all feed Keep: they are the reason to start from a template at all. The bottom three feed Replace, and they are the reason a fresh import always fails on its first run.

This is a hands-on part. Follow it on a workflow you actually imported, rather than reading it through, and it will click.

Three levels of edit

Not every change costs the same

Before you touch anything, sort what you want to change into one of three levels. The levels differ in how much they disturb — and in whether you are likely to finish inside a coffee break or lose an afternoon.

LevelWhat you are doingTime it takes
Level 1 · change parameter values Swap the Sheet ID, the channel name, the trigger time and the credential inside a node. Node types and connections stay exactly as they are. 5 minutes — most of this part
Level 2 · add or remove nodes Add an IF branch, wire in one more Gmail notification, delete the Airtable node you do not need. Connections have to be redrawn, and you may need a new credential. 30 minutes — one worked example below
Level 3 · change the logic Move the trigger from a schedule to a Webhook, pull a stretch of the workflow out into a sub-workflow, split it into two workflows that call each other. A few hours — only the trigger swap here
If you are new, stay at Level 1. Get the template to the point where it runs, use it live for a week, and only then start adding branches or swapping triggers. Rushing into logic changes is the fastest way to break something you cannot yet diagnose.

The sections below follow that order. Sub-workflows are Part 14's subject and Webhooks are Part 17's; here you get the outline of a trigger swap and nothing more.

Level 1: parameters and fields

Point every node at your own things

Say you imported a workflow that looks like this: Google Form Trigger → Slack. Somebody submits the form, a message lands in Slack. The original author used their Google account, their form and their #general channel. All of it is about to become yours.

  1. Step 1

    Open the workflow you imported

    Go back to the Workflows list and click the one you just imported. The canvas opens with two nodes and a connection between them. The first node may carry a small red dot in its top-left corner, which means “this node is not configured yet.” That dot is the work list for this section.

  2. Step 2

    Click the Google Form Trigger node

    Double-click the node — a single click also works — and a large panel opens: input data on the left, Parameters in the middle, output data on the right. The middle column is what you edit. No credential is selected yet, so a line of red text reads “No credential selected.”

  3. Step 3

    Swap in your own Google account credential

    Find the Credential to connect with dropdown. Opening it gives you one of two cases. If you have connected a Google account before, on another workflow say, your credential is listed by name — something in the shape of Google API - Elmo. Pick it. If this is your first time, choose + Create new credential, which takes you to the Google consent screen where you sign in and let n8n read and write. Part 10 of this series has that flow end to end.

    Once a credential is chosen the red text disappears and the fields beneath it — Form and Trigger On — become usable.

  4. Step 4

    Pick your own Google Form

    The Form field lists every Google Form under your account. Find the one you want watched and click it. Leave Trigger On beside it at its default, Form Submitted, which fires whenever somebody submits.

  5. Step 5

    Do the same on the Slack node

    Click the Slack node and set its own Credential to connect with to your Slack workspace account. The first time, it sends you to slack.com to authorize. Come back afterwards and the fields below — Channel and Message — become selectable.

  6. Step 6

    Change the channel

    The Channel field takes two approaches. From list picks from a dropdown, and n8n lists every channel you are in — that is the one to use. By ID takes a channel ID you paste in. Either way, replace the template's #general or #example-channel with the channel you want notified, for example #my-team.

  7. Step 7

    Press Save

    There is a Save button in the top right of the canvas, and Ctrl + S / Cmd + S does the same thing. Press it and the bright blue button turns grey; some versions also flash a green saved note beside the title. Losing the accent color is the signal that matters. If you navigate away with the edit uncommitted, n8n raises an “unsaved changes” confirmation — read the buttons before you click one.

In plain terms

A value you are still typing into a field is like an order you are still shouting through the kitchen doorway. Clicking an empty part of the canvas is what puts it down on the pass. Save only picks up what is on the pass — which is why an edit can look perfectly present on screen and be completely absent when you come back tomorrow.

Changing a credential does not propagate. If a workflow has three Slack nodes, you have to change the credential on each of the three. This is the most common half-finished edit there is: two nodes point at you, the third still points at whoever built the template.

Remapping the fields, which is your first expression

The Slack node usually has a Message field, and the template author wrote something along these lines:

New form entry: {{ $json['field1'] }}

Whatever sits inside the two curly braces {{ }} is an Expression: it gets replaced at run time with data handed over by the previous node. $json means “the JSON of the current item,” and ['field1'] reads the field called field1.

Here is the problem. The author's Google Form field is called field1. Yours may well be called applicant_name. At run time n8n cannot find field1, and Slack cheerfully posts “New form entry: undefined” to your whole team.

In plain terms

The message is a form letter and the expression is the blank left for the name. The template author printed a blank labeled field1. Your address book has no column called that, so nothing gets pasted in, and the letter goes out with the gap still in it. Relabel the blank to match the column you actually have.

  1. Step 1

    Look at what the previous node outputs

    Go back to the Google Form Trigger node and press Execute step underneath it, which runs that node on its own. It waits for you to submit the form once. When you do, one item of JSON appears in the Output panel on the right. Read what the fields are actually called — applicant_name, email, vip, for example.

  2. Step 2

    Point the expression at the right field

    Click the Slack node, find the Message field, and change {{ $json['field1'] }} to {{ $json['applicant_name'] }}.

  3. Step 3

    Or let the drag-and-drop hint write it

    Faster: move the cursor to the left of the Message field and a small data tree appears in the Input panel, listing every field the previous node produced. Drag applicant_name straight into the Message field and n8n writes {{ $json.applicant_name }} for you. There is no expression syntax to memorize this way.

  4. Step 4

    Write a message with several fields

    One message can mix ordinary text with several expressions. These four lines go into the single Message field, one under the other:

    New form submission :bell:
    Name: {{ $json.applicant_name }}
    Email: {{ $json.email }}
    VIP: {{ $json.vip }}

    Write plain text directly, and wrap anything that pulls data in {{ }}.

  5. Step 5

    Press Execute step to preview it

    The Slack node runs on its own too. It takes that Google Form test item as its input and really does post a message to your channel — this is not a dry run. It has worked when you open Slack and see the message.

Two things to carry forward: {{ $json.fieldName }} reads a field on the current item, and the drag-and-drop hint will write that for you rather than making you type it. Part 10 also covers the whole expression syntax; this is the part you need today.
Level 2: add a branch

One more node, and the flow stops being a straight line

The form notification runs now. Then your boss adds a requirement: when a VIP customer submits the form, email the sales manager as well as posting to Slack. That needs one more node and a fork in the path.

flowchart TD
  A["Google Form Trigger"] --> B{"IF
vip is equal to true"} B -->|"true"| C["Gmail
email the sales manager"] C --> D["Slack
notify the team"] B -->|"false"| D
The shape you are buildingBoth branches end at the same Slack node. The VIP path just does one extra thing on the way there.
  1. Step 1

    Insert an IF node into the existing connection

    Move the cursor onto the connection between Google Form and Slack, and a + button appears on the line. Click it, search the nodes panel for “IF” and pick IF, which sits under the Flow category. n8n drops the node into the middle of the connection: the Google Form output now feeds IF, and one of IF's outputs feeds Slack.

  2. Step 2

    Set up the condition

    Click the IF node and the Parameters panel shows Conditions. Add one condition with three parts. On the left, drag the vip field over from the Input panel, or type {{ $json.vip }} yourself. In the middle, choose is equal to. On the right, enter true if the vip field is a boolean, or Yes / Y if it is text.

    Once that is saved the IF node has two output dots: true on top, false below.

  3. Step 3

    Wire a Gmail node onto the true branch

    Draw a connection out of IF's true output and the nodes panel opens at the far end. Search for “Gmail” and choose Send a message. Set the credential, put the sales manager's address in the recipient field, use a Subject such as VIP customer: {{ $json.applicant_name }}, and write what you like in the Body.

  4. Step 4

    Bring both branches back to Slack

    Draw a connection from the Gmail output to the existing Slack node, so a VIP submission sends the email first and then posts. Then draw a connection from IF's false output to that same Slack node, so a non-VIP submission only posts. Two connections can land on one node, and n8n runs them in order.

  5. Step 5

    Test both branches, not just the interesting one

    Press Execute step on the Google Form Trigger node and submit one piece of fake data with vip set to true. The IF node's true branch should turn green, Gmail should send and Slack should post. Then run it again with vip false: only Slack should turn green. You are finished when both sides behave.

  6. Step 6

    Press Save

    Adding a node needs a Save exactly as changing a parameter does. It is saved when the Save button has gone grey and navigating away no longer raises “Unsaved changes.”

The IF node is a workhorse. You will keep coming back to it. Part 11 covers it properly — several conditions at once, AND and OR, and the Switch node for when you need three branches or more.
Level 3: change the trigger

A warm-up at the third level, and the one URL trap

The trigger a template ships with will not always suit you. The common case: the template runs on a Schedule Trigger every day at 8:00 am, and what you actually want is for it to run when somebody presses a button in your front end. That means a Webhook trigger.

  1. Step 1

    Delete the Schedule Trigger node

    Click it once and press Delete, or right-click and choose Delete. The node disappears and the connection out of it breaks with it. You restore that in step 3.

  2. Step 2

    Add a Webhook trigger

    Press the + in the top left of the canvas, or hit Tab, to open the nodes panel. Find Webhook under Trigger, the top category, and drag it onto the spot where Schedule used to sit.

  3. Step 3

    Reconnect it to the downstream node

    Draw a connection from the connector dot on the right of the Webhook node to the connector dot on the left of the next node — the one Schedule used to trigger. Once it lands, the downstream node lights up to say it has an input again.

  4. Step 4

    Take the Test URL, and know which URL you are holding

    Click the Webhook node and the Parameters panel shows two URLs. The Test URL is temporary, for when you press Execute step inside n8n. The Production URL is the permanent one, live once the workflow is set to Active. Copy the Test URL and hand it to your front-end engineer, or call it with curl to try it.

sequenceDiagram
  participant C as Caller
  participant N as n8n
  participant W as Your workflow
  Note over N: Editor open, listening for a test event
  C->>N: request to the Test URL
  N->>W: one run, results shown in the editor
  W-->>C: the workflow responds
  Note over N: You leave the editor. The Test URL stops listening
  C->>N: request to the Test URL again
  N--xC: nothing runs
  Note over N: Active toggle turned on
  C->>N: request to the Production URL
  N->>W: the workflow runs for real
Two URLs, two different lifetimesThe Test URL is alive only while you are sitting in the editor with a test event running, and it expires. The Production URL answers only once Active is on.
Mixing up those two URLs is the classic Webhook debugging trap. Authentication, response modes and the rest of the deployment story are a large topic and this is only the outline — Part 17 covers deploying one for real.

After swapping a trigger type, run the whole workflow by hand once to confirm nothing downstream broke.

The three checks

What to do between saving and switching on

After the change is saved and before you flip the workflow to Active, run these three checks. Skipping them is how you plant a problem that surfaces at 8:00 am on a day you are not watching.

  1. Check 1

    Press Save and confirm the button turns grey

    The blue Save button in the top right loses its accent color when there are no unsaved changes. If it is still bright blue, or n8n raises an “Unsaved changes” dialog when you try to leave, it did not save. The usual reason is an edit still sitting in a node field that you never committed. Click an empty part of the canvas, then press Save.

  2. Check 2

    Press Execute Workflow and run the whole thing by hand

    There is a large Execute Workflow button at the bottom center of the canvas. Press it and n8n runs the workflow from the top — depending on the trigger, it either uses fake trigger data or asks you to fire it live. Watch for a green border on every node, and for any node that turns red.

  3. Check 3

    Open Executions and confirm a green check on every node

    The sidebar has Executions, the execution history. The run you just did is at the top. Click into it for the detail: every node should carry a green check. Opening a node with a red cross shows you the error message, which is where the actual diagnosis starts.

flowchart TD
  A["You finished the edit"] --> B{"Has the Save button
gone grey?"} B -->|"still blue"| B1["Click empty canvas to commit
the field you were typing in,
then Save again"] B1 --> B B -->|"grey"| C{"Execute Workflow:
does every node go green?"} C -->|"a node turns red"| C1["Fix that node before
you change anything else"] C1 --> C C -->|"all green"| D{"Executions: a green check
on every node?"} D -->|"a red cross"| D1["Open that node and
read the error message"] D1 --> C D -->|"all green"| E["Only now turn on Active"]
The gate before ActiveNo failure route goes forward. Two of them loop straight back to the check that just failed; the third, reading the error off a red cross in Executions, sends you back to Execute Workflow to retry the run. That is the whole discipline: one change, one run, one look at the result.

Only when all three pass should you flip the Active toggle in the top right. Once Active is on, a Schedule Trigger runs on its schedule and a Webhook trigger accepts outside calls.

In plain terms

Execute Workflow is you pressing your own doorbell to hear whether it rings. Turning on Active is wiring that bell to the front gate so strangers can press it at three in the morning. Both are worth doing. Only one of them should happen before you have heard the bell ring yourself.

Execute Workflow does not turn on the Active toggle. It is a single manual poke, nothing more. So you can edit and execute as often as you like — as long as Active is off, nobody outside gets notified by a schedule or an incoming call. It is the best safety net a beginner has, and it costs nothing to use it.
When you break it

Seven ways this goes wrong, and how to get back

If something feels wrong mid-edit, check this table before you start rebuilding anything. It is almost always one of these seven.

What you seeWhat it meansWhat to do
A small red dot in the node's top-left corner That node still has a required field empty, or no credential selected. Click the node, look at the Parameters panel, fill in whatever is marked in red.
The node has a red border after a run It errored at run time: the API call failed, the expression could not find the field, or the credential expired. Open Executions, click that node, read the error. Usually a wrong field name or a credential that needs re-authorizing.
No connection between two nodes You knocked it loose while dragging a node, or deleting the old node broke it and it was never redrawn. Draw a connection from the dot on the right of the upstream node to the dot on the left of the downstream node.
Execute Workflow does nothing The wrong trigger type for a manual poke. A Schedule Trigger only runs when its time comes. Swap in a Manual Trigger node for testing, or press Execute step on the trigger node instead of running the whole workflow.
The Slack message comes out as “undefined” The field name in the expression is wrong, so n8n cannot find that key. Read the real field name off the previous node's Output panel and correct the expression.
You pressed Save, but reopening shows the old version The Save button never actually turned grey — an uncommitted edit was still sitting in a field. Click empty space so the field loses focus, press Save, confirm grey, and only then navigate away.
The IF branch always goes to false The data types do not match. You compare vip == true while the real data is the string "true". Make the right-hand value the string true as well, or pick correctly between is equal to (string) and is equal to (boolean).

And when the edit itself has gone badly enough that you want out, the route back depends on one thing: whether you have saved or refreshed since the damage.

flowchart TD
  A["You have made a mess of it"] --> B{"Saved or refreshed
since the damage?"} B -->|"no"| C["Undo with Ctrl+Z or Cmd+Z.
A page refresh clears
the undo stack"] B -->|"yes"| D{"Is there an earlier
snapshot you want back?"} D -->|"yes"| E["Three-dot menu, Workflow history.
Preview a version, then restore it"] D -->|"no"| F["Import the original template again.
You lose your edits, but you are
back at a known starting point"]
Three ways backThe cheapest one has a short expiry. Undo works only while the page has not been reloaded, which is why the habit of duplicating before you edit is worth more than any of them.

Better than all three: before you start editing, open the three-dot menu beside the workflow in the Workflows list and choose Duplicate. You get an identical workflow with “copy” appended to the name. Edit the copy and keep the original untouched as your backup. If the copy goes wrong, delete it and duplicate again.

The most dependable personal backup lives outside n8n. After editing a workflow that matters, use ⋮ → Download to export it as JSON and keep that copy in your own Git. Undo, Workflow History and Duplicate all live inside the instance and all depend on it still being there. A JSON file in your own repository does not: it is the copy you can restore from after a bad migration, and the copy you can hand to a colleague. Get into the habit of downloading after every important edit, not only when something has already gone wrong. Before you push it anywhere shared, read the file — a workflow export carries whatever was typed into node parameters, so anything you pasted straight into a field instead of putting behind a credential travels with it.
Does Save keep a version history? Can I look at yesterday's version?
Yes. n8n has Workflow History built in, and the self-hosted Community edition has it too — it is not Enterprise-only. Find it under the three-dot menu at the top right of the workflow editor: ⋮ → Workflow history. It lists a snapshot for every Save, and you can preview one, restore it, or clone it into a new workflow. On self-hosted Community, snapshots are unlimited by default and the environment variable N8N_WORKFLOW_HISTORY_PRUNE_TIME, in hours, controls the pruning cycle. On n8n Cloud it varies by plan — Starter usually has none, Pro gives 5 days, Enterprise longer — so treat the pricing page as the authority rather than this paragraph.
I want to compare before and after. Is there a diff?
Not on the canvas. Workflow History lets you view two versions side by side and restore one, but it shows you which node changed rather than a word-by-word diff. For a line-by-line comparison the practical route is to export both as JSON with ⋮ → Download and compare the two files in an editor such as VS Code. Enterprise Source Control binds a whole instance to Git for pull-request-level review; it is not a diff button for one workflow.
I deleted a node by accident
Press Ctrl + Z, or Cmd + Z on a Mac. The canvas supports undo and redo as long as you have not refreshed the page — a refresh clears the undo stack. If you already saved and reloaded and undo cannot reach it, go to Workflow History and restore a snapshot.
The Executions page is all red and I do not know which one to fix first
Every row tells you which node failed. Start at the top, which is the most recent failure, click in, read the error message, fix that node's fields, then press Execute Workflow to retry. Fixing one failure often clears the next by itself. Do not change five things at once — change one, run once, look at the result.
Do I have to re-authorize the credential after changing a parameter?
It depends what you changed. A new Sheet ID, a new channel or an edited expression needs no re-authorization; the same credential is fine. A different Google account or a different Slack workspace needs a new credential, added on the Credentials page. A credential that has expired — an OAuth token that stopped working, say — is fixed by opening the Credentials page, clicking that credential and pressing Reconnect to authorize again.
I am halfway through an edit and want to keep it offline for now
Turn off the Active toggle in the top right. The workflow will not be fired by a schedule or a Webhook and runs only when you press Execute Workflow yourself. This is n8n's long-standing Inactive state and it behaves like a draft, though there is no button in the interface called Draft mode. Some newer plans have been adding a separate draft and publish flow, but the labels you will see are still Active and Inactive. Take as long over the edit as you like; it goes live when you say so.
If several of us edit the same workflow, do we clash?
Yes. n8n has no real-time multi-user collaboration today, unlike a shared document — two people open the same workflow, each edits their own copy, and whoever saves last overwrites whoever saved first. In practice: for a workflow the team shares, agree that only one person edits at a time and say so in chat. The sturdier arrangement is that everyone develops in their own Personal folder and duplicates into the Team workspace once it tests clean.
Once I have edited a template, can I share it as my own contribution?
You can, but it depends how much you changed. Swapping parameters alone — credential, channel, Sheet ID — counts as using a template rather than as original work. Adding a branch, changing the trigger or customizing with a Code node does count as your own contribution. When you share it, note in the description that it is adapted from someone else's template. That is the convention in the n8n community.
The Webhook URL stopped working after my edit
A Webhook has two URLs. The Test URL is live only while you are in the editor with Execute step or Listen for test event running, and it expires. The Production URL works only once the workflow is switched to Active. Mixing the two up is the most common trap when debugging a Webhook; Part 17 has the detail.
Next

Where to go from here

keep going

You can take what somebody else built and make it yours.

That is the most useful entry-level skill in n8n, and it is the last part that starts from other people's work. Part 5 teaches you to read the nodes panel — those hundreds of nodes fall into a few families, and once you know the families you find what you need in seconds instead of scrolling.

Open the full guide

Part 4 of the Woow n8n Onboarding Guide series on the Apporo blog.

Adapted from the Woow n8n Onboarding Guide, produced by WoowTech and released under CC BY 4.0. This adaptation is published by Apporo under the same licence.

Light · Air · Water · Control · apporo

in n8n
Copy a working workflow before you write one