Workflow automation you can run yourself: connect apps and APIs on a canvas, or drop into JavaScript for the steps that need it, with the whole thing on your own server.
Build me the automation I actually need instead of a hosted n8n: the four workflows I really run, as code, with retries and a history I can read. Read this first: n8n is source-available and self-hosting it is a real answer — the fee buys hosting and hundreds of maintained integrations. The reason to build instead is narrow and honest: most people who pay for a workflow tool are running three or four flows, and three or four flows written directly are less code than the configuration that describes them, faster, and impossible to break by dragging a node. STACK - Node 20+ with Fastify - SQLite through better-sqlite3, WAL mode - A worker process for the queue - Server-rendered interface; the flow drawn as a list, not a canvas - Caddy in front THE DATA MODEL - flows: id, name, version, definition_json, is_active, created_at - flow_versions: id, flow_id, version, definition_json, published_at — a run is pinned to a version, so editing never changes a run in flight - runs: id, flow_id, flow_version, trigger_payload_json, status, started_at, finished_at, error, dedupe_key - step_runs: id, run_id, step_id, attempt, status, input_json, output_json, error, ms - connections: id, service, credentials_encrypted, expires_at, refreshed_at - cursors: id, source, value, updated_at - queue: id, run_id, step_id, run_at, attempts, locked_by, locked_at, lease_expires_at - Every step's input and output stored. When a flow does the wrong thing at three in the morning, those payloads are the only thing that answers why TRIGGERS - Webhook with a secret and a signature check, answering 200 immediately and queueing - Schedule with a cron expression and a time zone, with both daylight-saving transitions tested - Poll a source on an interval with a stored cursor and deduplication by item identifier. A poller that re-emits everything after a restart is the classic disaster in this category - Manual, with a payload typed by hand, which is how a flow is tested STEPS - HTTP request with full control of method, headers, body, timeout, and a declared retry policy - Branch on a condition, loop over a list with a concurrency limit, delay, and stop with a reason - Transform: a small expression language over the accumulated run state, or a sandboxed script with a time limit, no filesystem and no ambient network - Integrations written as small modules with a declared input and output schema. Write the three you need. Three you understand beat thirty you inherited DATA BETWEEN STEPS - Reference earlier output by a simple path expression against the run state - The editor shows real sample data from the last run beside every field, so a path is picked rather than typed. This is the single biggest difference between a usable flow tool and a frustrating one - Types checked where a step declares them, with the error before the run rather than inside it RELIABILITY, WHICH IS THE PART THAT DECIDES EVERYTHING - Retries with exponential backoff and jitter, per step, with a maximum - Retry only what is safe. A non-idempotent action needs an idempotency key, and the step declares whether it has one — sending an email twice is annoying, charging a card twice is a refund and an apology - Deduplication on the trigger, so a webhook delivered twice runs once - The queue is a table with a lease, so a crashed worker's work is resumed rather than lost - A permanent failure goes to a dead-letter list with everything needed to replay it, and replay is one button - Rate limits per integration, respected with backoff and the API's own headers honoured THE INTERFACE - A flow as a vertical list of steps with branches indented beside them. A node-and-wire canvas is more work to build and less readable for the flows people actually run - A run view: every step with its input, output, duration and error, expandable - Runs filterable by status, failures first - Dark and light SECRETS - Connections encrypted at rest with a key from the environment, decrypted only in the worker - OAuth refresh under a lock, so two workers cannot refresh at once and invalidate each other - Redacted from every stored payload and every log, by key name and by value match, including encoded forms OPERATIONS - .env: DATABASE_PATH, BASE_URL, ENCRYPTION_KEY, SESSION_SECRET, WEBHOOK_SECRET - Migrations on boot, each once - Step payloads pruned on a schedule with the retention stated — they are the bulk of the data - Nightly backup off the machine, restore script - Health endpoint reporting queue depth, the oldest unlocked item and any expired lease WHAT MATTERS MOST Idempotency and the stored payloads. Build the lease queue and the dedupe key first, then kill the worker mid-run and confirm nothing is lost and nothing repeats. An automation tool that occasionally does something twice is a tool you stop trusting with anything that matters — which is every reason you had for building it. Give me the repository, migrations, .env.example, two seed flows, and a README with deploy steps behind Caddy.
What you lose
- Hundreds of integrations with their authentication, pagination and rate limits already solved
- A canvas that makes a workflow readable to somebody who did not write it
- Execution history with the data at each step, which is how you debug an automation at all
If you would rather not build
- A cron job and a script, which is often the honest answer
What it costs
read from their page 18 Aug 2026
| Plan | Billed monthly | Billed yearly | Last read |
|---|---|---|---|
| — | $20/mo | — | 18 Aug 2026 |
Their pricing page is where these came from. Seeing a different price? Tell us.
The escape hatch
open source · no votes, no paid placement
Windmill
$0Turns scripts into scheduled workflows with a run history.
windmill-labs/windmillfree · open source
Why this verdict
our own opinion · changed only by a person
77/100
Verdict yes at 77: three automations as code beat a platform. Recording each step's input and output is what makes the home-made version debuggable.
History
tracked since 10 Aug 2026 · nothing is ever overwritten
Questions about n8n
answered from the record above
Is n8n free?
No — the plan we track is $20 a month. Starter at $20/month on n8n Cloud; the source-available edition is free to self-host and is what most people run.
Can you replace n8n by building your own?
YES. Replaceable in one session with an AI coding agent. Replacement score 77 out of 100, build time one session. Read what you lose before you decide.
How much does n8n cost?
$20 a month on Starter — $240 a year. Recorded 18 Aug 2026.
What do you lose by replacing n8n?
Hundreds of integrations with their authentication, pagination and rate limits already solved; A canvas that makes a workflow readable to somebody who did not write it; Execution history with the data at each step, which is how you debug an automation at all. If any of those carry weight for you, keep paying.
Is there an open-source alternative to n8n?
Yes: n8n, Windmill. The prompt on this page is for when you want it your way instead.
Related entries
same category first, most replaced first
Every week, something stops being worth paying for.
New verdicts, prices that moved, entries added. One email a week. Unsubscribe in one click. Nothing is being sent yet — your address is kept here, and the first issue is the first thing it is used for.
free forever · no tracking pixel · stored here, never passed to anyone

