What is n8n? Workflow automation explained
n8n is a workflow automation tool you run on your own server. What it is, how it is pronounced, what a workflow looks like, and when to use it.
What is n8n?
n8n is a workflow automation tool that you can run on your own server. A workflow is a chain of boxes called nodes. The first node waits for something to happen, and the nodes after it do the work. You join the nodes in a browser editor, and when the ready-made ones cannot do what you need, you drop into a Code node and write JavaScript or Python at that one step.
Two facts about n8n matter more than any feature list. It is source-available software you host yourself, so the workflows and the credentials they use stay on a machine you control. It also speaks plain HTTP and JSON rather than one vendor's catalogue, so an internal service that no hosted automation product has ever heard of is still just an HTTP Request node away.
How do you pronounce n8n, and what does the name mean?
It is pronounced "n-eight-n".
The name is a squeezed version of "nodemation". The founder's own explanation sits in the project README: "node-" because the editor is a node view and the runtime is Node.js, and "-mation" for automation. Count the letters between the first n and the last n of "nodemation" and you get eight, which is where the 8 comes from. He shortened it because he did not want to type the long name into a terminal every time.
Triggers, nodes and the data between them
Every workflow starts with a trigger node. The trigger decides when the workflow runs. A Webhook trigger fires when an HTTP request arrives at a URL n8n gives you. A Schedule trigger fires on a clock. An app trigger fires when the service it watches reports something new. A workflow with no trigger node cannot start on its own, so it only ever runs when you press the button in the editor.
Everything after the trigger is an action node: send a message, call an API, read a database, reshape a field, branch on a condition. Nodes run left to right along the lines you draw. A branch node such as IF or Switch splits that line in two, and each output continues on its own path.
Data travels between nodes as a list of items. Each item is a JSON object wrapped under a json key, with an optional binary key when the item carries a file. Most nodes run once per item, so a trigger that hands over fifty items makes the next node do its job fifty times. This is the first thing that surprises people: one execution of a workflow is not one operation. It is one operation per item.
Nodes read that data with expressions. An expression is a small piece of JavaScript inside double braces, and {{ $json.email }} means "the email field of the item this node is working on right now". Anywhere a node lets you type a value, you can type an expression instead.
A small workflow, start to finish
The example below is three nodes long. A request arrives, one node reshapes it, one node sends a message. You can follow the shape of it without installing anything.
Step 1. Add a Webhook node and set the HTTP method to POST. n8n prints two URLs at the top of the node panel. The test URL works while the editor is listening. The production URL works only while the workflow is switched on. They are different URLs on purpose, so your half-finished workflow never answers real traffic.
Step 2. Click "Listen for test event", then send the node something. Paste the test URL from the node panel into the variable below.
# paste the test URL that the Webhook node shows in the editor
TEST_URL='https://n8n.example.com/webhook-test/xxxxxxxx'
curl -X POST -H 'Content-Type: application/json' \
-d '{"name":"Ana","plan":"pro","email":"ana@example.com"}' \
"$TEST_URL"The node panel fills with one item, and it looks like this:
{
"headers": { "content-type": "application/json" },
"params": {},
"query": {},
"body": { "name": "Ana", "plan": "pro", "email": "ana@example.com" }
}That shape is worth memorising. What you posted lives under body. The headers and the query string sit beside it, never merged into it. A first workflow that reads {{ $json.name }} gets an empty value back, because the field is actually at {{ $json.body.name }}.
Step 3. Add an Edit Fields (Set) node. Add one string field called message and set its value to an expression:
New signup: {{ $json.body.name }} on the {{ $json.body.plan }} planThe panel previews the finished string against the real item while you type. Use that preview. A wrong path shows up as a blank preview immediately, instead of as a blank message in your chat channel at four in the morning.
Step 4. Add the node that sends the message. A Slack node with a channel selected works, and so does an HTTP Request node posting to whatever incoming webhook URL your chat tool hands out. Set the text field to {{ $json.message }}, the field the previous node just built.
Step 5. Save the workflow, then flip the Active toggle at the top right. Only now does the production URL answer. Call it before you activate and you get HTTP 404 with a body that says exactly what is wrong:
The requested webhook "POST new-signup" is not registered.
The workflow must be active for a production URL to run successfully.One more difference to expect. A test run draws itself on the canvas as it goes, so you watch the data move. A production run does not. It appears in the Executions list in the sidebar, with the input and output of every node stored for you to open later.
Running n8n yourself
The fastest look at the real thing is the official Docker image. These are the commands from the project README:
docker volume create n8n_data
docker run -it --rm --name n8n -p 5678:5678 -v n8n_data:/home/node/.n8n docker.n8n.io/n8nio/n8nOpen http://localhost:5678 and the editor is there. The volume is the part to pay attention to. n8n keeps its SQLite database and its credential encryption key under /home/node/.n8n, so a container started without that volume comes up empty every time, and credentials saved into a volume you later delete cannot be decrypted again.
That command is for looking, not for running. --rm deletes the container the moment you stop it, and nothing here sets up TLS (transport layer security) or a restart policy. The editor is also reachable by anyone who can reach port 5678. A deployment you can actually depend on needs a domain name, a certificate and a reverse proxy in front of the container, which is what installing n8n on a VPS with Docker and HTTPS walks through. If Compose files are new to you, read Docker Compose on a VPS first.
One setting bites almost everyone who uses a Schedule trigger. Scheduled workflows run in the instance timezone, not in your laptop's timezone, and the default is not UTC. Set it deliberately on day one: n8n timezones and schedules covers the variable and the traps around daylight saving.
When n8n beats a cron job and a shell script
A shell script under cron is smaller, faster and easier to reason about than any automation platform. It has no database to back up, no editor, no port to protect. If the job is "run this at 04:00 and write a file", write the script. Nothing here improves on that.
n8n earns its keep when one of these is true:
- The trigger is not a clock. Cron cannot react to an inbound HTTP request or to a new row appearing in a table.
- The work crosses several APIs, each with its own authentication, pagination and rate limits. The credential store and the per-node retry settings remove the boring half of that code.
- You need to see what happened. Every execution is stored with the data at each step, so you open the failed run and look at the exact item that broke it. A cron job gives you an exit code and a line in a mail spool.
- Somebody who does not write code has to change it in six months. Editing a value in a node panel is a much smaller risk than editing a shell script on a production server.
The cost is honest and it is not zero. You gain a service to keep running, a database to back up and an upgrade to perform every few weeks. Treat it like any other service you host, because that is what it is.
When a hosted service is the better answer
Self-hosting spends your attention, and attention is the scarce resource. n8n Cloud, the vendor's hosted version, takes the upgrades and the backups off your plate, and it gives you a stable public URL for webhooks without you owning a domain. Choose it when the automation matters more to you than the infrastructure under it.
Keep n8n on your own server when the data must not leave your control, or when the workflows need to reach services on a private network that a hosted runner cannot see. Cost follows volume too: hosted plans charge by usage, while a self-hosted instance costs whatever the VPS costs, no matter how many times a workflow fires.
If your real question is n8n against a different product, the n8n, Zapier and Make comparison lines up the three pricing models and the ceiling each one hits. If you want this idea from a different project entirely, the self-hosted alternatives to n8n is the shorter road.
Where the licensing line falls
n8n calls its model fair-code. The source is public and you can read all of it, and the license still limits what you may do with it. The code ships under the Sustainable Use License, and the limitation is one sentence long: "You may use or modify the software only for your own internal business purposes or for non-commercial or personal use." You may pass it on to other people only free of charge and for non-commercial purposes, and you may not remove the copyright or license notices from it.
In practice that means running n8n for your own company's work is allowed, and reselling it as a hosted service to other people is the thing the license exists to stop. It does not meet the Open Source Initiative definition of open source, because that definition forbids exactly this kind of limit on the field of use. Some capabilities, such as SAML single sign-on and log streaming, sit behind the separate n8n Enterprise License instead. The full split is in what the free Community edition includes and what it does not.
Where the AI features fit
Most of n8n's recent attention comes from its AI nodes, and they follow the same model as everything else. An AI Agent node takes a large language model (LLM) as one sub-node and a set of tools as others, where a tool is simply another n8n node the model is allowed to call. The workflow around it stays ordinary: a trigger brings data in, the agent decides what to do, and normal nodes carry out the rest. Building an AI agent in n8n shows that wiring in full.
FAQ
How do you pronounce n8n?
It is pronounced "n-eight-n". The name is short for "nodemation", which the founder built from "node-" (the editor is a node view running on Node.js) and "-mation" (automation). The 8 stands for the eight letters between the first n and the last n of "nodemation", and the short form exists because typing the long one into a terminal got tiring.
Is n8n free to use?
The Community edition is free to download and self-host under the Sustainable Use License, and there is no per-execution charge on your own server. The license allows use for your own internal business purposes or for personal use, and it does not allow you to sell n8n to other people as a hosted service. n8n Cloud is a paid product, and a few features such as SAML single sign-on need the separate Enterprise license.
Do I need to know how to code to use n8n?
No, for the common path. You pick nodes, connect them and fill in fields. Some JavaScript helps as soon as you reshape data, because expressions such as {{ $json.body.email }} are JavaScript inside double braces. When a workflow needs logic that no node covers, a Code node lets you write JavaScript or Python for that single step and hand the result to the next node.
What is the difference between the test URL and the production URL on a webhook?
The test URL only listens after you click "Listen for test event" in the editor, and its result is drawn on the canvas so you can inspect every node. The production URL answers only while the workflow's Active toggle is on, and its runs appear in the Executions list rather than on the canvas. Calling a production URL on an inactive workflow returns HTTP 404 saying the requested webhook is not registered, with a hint that the workflow must be active.
Is n8n open source?
The source code is public and you can self-host it, so it is source-available. It is not open source under the Open Source Initiative definition, because the Sustainable Use License restricts use to internal business, personal or non-commercial purposes, and OSI-approved licenses cannot limit the field of use. n8n describes this position as fair-code.