{"name": "Ep10 - Which n8n? (cloud vs self-hosted verdict)", "nodes": [
{"parameters": {"formTitle": "Which n8n?", "formDescription": "Five answers. You get a verdict, the monthly bill for both, and the point where switching pays.", "formFields": {"values": [{"fieldLabel": "Business name", "requiredField": true}, {"fieldLabel": "Email", "fieldType": "email", "requiredField": true}, {"fieldLabel": "Workflows you plan to run", "fieldType": "number", "placeholder": "e.g. 2", "requiredField": true}, {"fieldLabel": "Runs a month, all workflows together", "fieldType": "number", "placeholder": "e.g. 300", "requiredField": true}, {"fieldLabel": "Comfortable with a terminal? (yes or no)", "placeholder": "yes or no", "requiredField": true}]}, "options": {"buttonLabel": "Get my verdict"}}, "id": "c1", "name": "Which n8n", "type": "n8n-nodes-base.formTrigger", "typeVersion": 2.2, "position": [0, 0], "webhookId": "ep10-which-n8n"},
{"parameters": {"jsCode": "// Which n8n? Cloud or self-hosted, scored from five answers.\nconst f = $input.first().json;\nconst business = String(f['Business name'] || 'your business').trim();\nconst email = String(f['Email'] || '').trim();\nconst workflows = Math.max(1, Number(f['Workflows you plan to run']) || 1);\nconst runs = Math.max(0, Number(f['Runs a month, all workflows together']) || 0);\nconst terminal = /^y/i.test(String(f['Comfortable with a terminal? (yes or no)'] || '').trim());\n\n// n8n cloud list prices, billed yearly, September 2026. Check n8n.io/pricing, they change.\nlet plan, cloudCost, limits;\nif (runs <= 2500 && workflows <= 5) { plan = 'Starter'; cloudCost = 20; limits = '2,500 runs and 5 active workflows'; }\nelse if (runs <= 10000 && workflows <= 15) { plan = 'Pro'; cloudCost = 50; limits = '10,000 runs and 15 active workflows'; }\nelse { plan = 'Enterprise'; cloudCost = null; limits = 'custom pricing above 10,000 runs or 15 workflows'; }\n\n// A $5-6 server runs a small business. Step up to a ~$12 server past 20,000 runs a month.\nconst serverCost = runs > 20000 ? 12 : 6;\n\nlet pick, why, switchWhen;\nif (!terminal) {\n  pick = 'n8n cloud';\n  why = 'Nobody on the team wants a terminal, so you are paying n8n to be the IT department. That is the right trade.';\n  switchWhen = (cloudCost === null || cloudCost >= 50)\n    ? 'Your bill is already at Pro or above. Pay a freelancer once to set up a self-hosted server (episode 8) and keep the difference every month.'\n    : 'Switch when the bill reaches $50, or when someone on the team is happy in a terminal.';\n} else if (workflows <= 2 && runs <= 2500) {\n  pick = 'n8n cloud';\n  why = 'Under three workflows the gap is about $14 a month. That does not buy back an evening of setup and a monthly update.';\n  switchWhen = 'Switch at workflow three, or when you pass 2,500 runs a month.';\n} else {\n  pick = 'Self-hosted';\n  why = 'You can run a terminal and you will own three or more workflows. Unlimited runs on a $6 server beats a metered plan.';\n  switchWhen = 'Move to cloud only if you stop wanting to run updates and backups yourself.';\n}\n\nconst cloudLine = cloudCost === null ? `n8n cloud: ${plan}, ${limits}.` : `n8n cloud: ${plan} at $${cloudCost} a month, ${limits}.`;\nconst selfLine = `Self-hosted: about $${serverCost} a month for a server, unlimited runs, plus your time.`;\nconst summary = `${cloudLine} ${selfLine} ${why} ${switchWhen}`;\n\nreturn [{ json: { business, email, workflows, runs, terminal: terminal ? 'yes' : 'no', plan, cloudCost, serverCost, pick, why, switchWhen, summary } }];"}, "id": "c2", "name": "Score It", "type": "n8n-nodes-base.code", "typeVersion": 2, "position": [260, 0]},
{"parameters": {"sendTo": "={{ $json.email }}", "subject": "=Which n8n for {{ $json.business }}: {{ $json.pick }}", "emailType": "text", "message": "=Hi,\n\nHere is the verdict for {{ $json.business }}: {{ $json.pick }}.\n\nYour answers: {{ $json.workflows }} workflows, {{ $json.runs }} runs a month, terminal: {{ $json.terminal }}.\n\n{{ $json.summary }}\n\nSetup videos:\nn8n cloud in 20 minutes: https://youtu.be/_j2N4dc-_3w\nSelf-host on a $5 server: https://youtu.be/RTK1iqJJvus\n\nOwnerAutomate", "options": {"appendAttribution": false, "senderName": "OwnerAutomate Demo"}}, "id": "c3", "name": "Email the Verdict", "type": "n8n-nodes-base.gmail", "typeVersion": 2.1, "position": [520, 0], "credentials": {"gmailOAuth2": {"id": "avT0HSTU0k73ksRU", "name": "Gmail (OwnerAutomate)"}}},
{"parameters": {"operation": "completion", "completionTitle": "={{ $('Score It').item.json.pick }} for {{ $('Score It').item.json.business }}", "completionMessage": "={{ $('Score It').item.json.summary }}", "options": {}}, "id": "c4", "name": "Verdict", "type": "n8n-nodes-base.form", "typeVersion": 1, "position": [780, 0]}
], "connections": {"Which n8n": {"main": [[{"node": "Score It", "type": "main", "index": 0}]]}, "Score It": {"main": [[{"node": "Email the Verdict", "type": "main", "index": 0}]]}, "Email the Verdict": {"main": [[{"node": "Verdict", "type": "main", "index": 0}]]}}, "settings": {"executionOrder": "v1"}}
