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.
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-channelto#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.”
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
This is a hands-on part. Follow it on a workflow you actually imported, rather than reading it through, and it will click.
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.
| Level | What you are doing | Time 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 |
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.
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.
-
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.
-
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.”
-
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.
-
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.
-
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.
-
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
#generalor#example-channelwith the channel you want notified, for example#my-team. -
Step 7
Press Save
There is a Save button in the top right of the canvas, and
Ctrl + S/Cmd + Sdoes 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.
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.
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.
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.
-
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. -
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'] }}. -
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_namestraight into the Message field and n8n writes{{ $json.applicant_name }}for you. There is no expression syntax to memorize this way. -
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
{{ }}. -
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.
{{ $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.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
-
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.
-
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
vipfield over from the Input panel, or type{{ $json.vip }}yourself. In the middle, choose is equal to. On the right, entertrueif the vip field is a boolean, orYes/Yif it is text.Once that is saved the IF node has two output dots: true on top, false below.
-
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. -
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.
-
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
vipset 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. -
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.”
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.
-
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.
-
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. -
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.
-
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
curlto 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
After swapping a trigger type, run the whole workflow by hand once to confirm nothing downstream broke.
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.
-
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.
-
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.
-
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"]
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.
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.
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 see | What it means | What 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"]
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.
⋮ → 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?
⋮ → 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?
⋮ → 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
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
Do I have to re-authorize the credential after changing a parameter?
I am halfway through an edit and want to keep it offline for now
If several of us edit the same workflow, do we clash?
Once I have edited a template, can I share it as my own contribution?
The Webhook URL stopped working after my edit
Where to go from here
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 guidePart 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