n8n 2.21
Карта курсу
Вісім розділів. Лінійна траєкторія від першого Docker-контейнера до Fiverr-готового сервісу. На вхід - досвід backend (PHP/Laravel/Symfony) і базове знання Docker. На вихід - вмієш будувати workflow під будь-яку задачу і знаєш, як його продати клієнту.
Що таке n8n і де він тебе врятує
Без коду коли можна без коду, з кодом коли треба. Поняття workflow, node, connection. Ліцензія: що дозволено продавати, що ні. 5 use cases, які реально купують клієнти.
- 1.1 n8n - workflow automation з кодом коли треба
- 1.2 Fair-code і Sustainable Use License
- 1.3 Workflow, node, connection - словник
- 1.4 4 типи нод
- 1.5 5 use cases, які реально продаються
n8n - workflow automation з кодом коли треба
n8n - це платформа автоматизації workflow для технічних команд. Сильна сторона - гібрид: 80% будуєш drag-and-drop (як Zapier), 20% дописуєш JavaScript або Python (де no-code задихається).
Чим відрізняється від конкурентів
| Інструмент | Hosting | Код | Self-host | AI вбудовано |
|---|---|---|---|---|
| Zapier | SaaS only | JS у Code step | ✗ | OpenAI step |
| Make (Integromat) | SaaS only | обмежено | ✗ | OpenAI step |
| Apache Airflow | Self-host | Python DAG-и | ✓ | ✗ (DIY) |
| n8n | SaaS + self-host | JS, Python | ✓ безкоштовно | AI Agent + LangChain |
Fair-code і Sustainable Use License
n8n - fair-code, не open-source у строгому сенсі OSI. Source доступний, self-host безкоштовний, але є явні обмеження на комерційне використання. Це принципово важливо до того, як ти йдеш продавати n8n-послуги.
Що ДОЗВОЛЕНО
- Internal data syncing - "sync the data you control as a company, for example from a CRM to an internal database".
- Custom integrations - "Creating an n8n node for your product or any other integration between your product and n8n".
- Consulting services - "building workflows, custom features closely connect to n8n".
- Maintenance support - "setting it up or maintaining it on an internal company server".
- Backend з company credentials - якщо процес використовує ваші компанійні credentials, не end-users.
Що ЗАБОРОНЕНО
Workflow, node, connection - словник
Три базові поняття, без яких далі не пройдеш. Вивчи зараз - усе інше будується поверх них.
Як вони пов'язані
4 типи нод
Усі ноди n8n - чотири категорії. Розумієш категорії - орієнтуєшся у каталозі без читання назв по одній.
| Тип | Призначення | Приклади |
|---|---|---|
| Trigger | Запускає workflow. Тільки 1 на workflow (Webhook + Schedule = 2 окремих trigger-flow). | Manual Trigger, Webhook, Schedule Trigger, Gmail Trigger, RSS Read |
| Action | Інтеграція з конкретним сервісом. 400+ штук - Slack, Gmail, Notion, HubSpot, etc. | Slack, Google Sheets, HubSpot, Stripe, Telegram |
| Core | Логіка і робота з даними. Універсальні, не прив'язані до сервісу. | HTTP Request, Code, IF, Switch, Merge, Set, Wait |
| Cluster | AI/LangChain: root node + sub-nodes (Memory, Tools, Embeddings, ...). | AI Agent, Chat Trigger, Vector Store, OpenAI Chat Model |
5 use cases, які реально продаються
З 400+ можливих сценаріїв клієнти Fiverr купують переважно одне з п'яти. Запам'ятай їх - на них будуєш портфоліо.
1. Lead enrichment + multi-channel notify
Form submit → Webhook → enrich через Clearbit/Apollo → save до HubSpot → Slack alert sales team → email confirmation клієнту. Класика, продається за $80-200.
2. Daily/weekly report
Schedule Trigger (09:00) → SQL запит до Postgres → format → email або Slack post. Замінює "Vasya пише script + cron". Продається за $50-150.
3. AI customer support
Webhook (chat widget) → AI Agent з memory + RAG → response. У 2026 - найгарячіший напрямок, ціни $300-800.
4. SaaS sync (Stripe → CRM → Sheets)
Stripe webhook → IF event.type → HubSpot update + Google Sheets row + Slack notify. Купують агенції, що ведуть багато клієнтів. $150-400.
5. Internal monitoring
Schedule → HTTP Request до API клієнта → IF status != 200 → Telegram alert + create Asana task. Заміна StatusCake/UptimeRobot з custom логікою. $60-150.
Sandbox: Docker-стек і перший workflow
Один canonical docker-compose з Postgres - той самий, що піде у production. Запуск, секрети, UI tour, перший Hello-World workflow. Без зайвих кроків "спочатку поставимо неправильно, потім правильно".
- 2.1 Архітектура sandbox: n8n + Postgres + task runner
- 2.2 docker-compose.dev.yml - повний робочий стек
- 2.3 Запуск: .env, secrets, перший старт
- 2.4 UI tour: canvas, nodes panel, executions
- 2.5 Hello world: Manual trigger → Set
- 2.6 Data shape: items array, json, binary
- 2.7 Pin data: dev-цикл без зайвих API calls
- 2.8 Save, активувати, executions
Архітектура sandbox: n8n + Postgres + task runner
Принцип курсу: тренуйся на тому, що поїде на production. Тому з самого початку - три контейнери, а не один. Це той самий стек, що у розділі 7 піде на VPS клієнта.
Чому така архітектура
- Postgres з самого початку - n8n підтримує SQLite, але для production він не recommended. Якщо почнеш на SQLite - доведеться мігрувати у production. Уникаємо.
- External task runner - окремий контейнер для виконання Code nodes (JS і Python). Ізолює user code від main процесу. Це сучасна архітектура n8n (раніше Code виконувався inline).
- Persistent volumes -
db_storage(Postgres data) іn8n_storage(.n8n/configз encryption key, custom nodes).
docker run з SQLite в одну команду" існує у документації, але це quick demo, не sandbox. Ми її свідомо пропускаємо - тренуватися треба на тому, що поїде у production.docker-compose.dev.yml - повний робочий стек
Canonical compose файл. Знаходиться у sandbox/docker-compose.dev.yml. Розглянь кожну секцію - це твоя база для будь-якого подальшого setup.
volumes:
db_storage:
n8n_storage:
services:
postgres:
image: postgres:16
restart: always
environment:
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_NON_ROOT_USER: ${POSTGRES_NON_ROOT_USER}
POSTGRES_NON_ROOT_PASSWORD: ${POSTGRES_NON_ROOT_PASSWORD}
volumes:
- db_storage:/var/lib/postgresql/data
- ./init-data.sh:/docker-entrypoint-initdb.d/init-data.sh
healthcheck:
test: ["CMD-SHELL", "pg_isready -h localhost -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 10
n8n:
image: docker.n8n.io/n8nio/n8n:${N8N_VERSION}
restart: always
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
DB_POSTGRESDB_DATABASE: ${POSTGRES_DB}
DB_POSTGRESDB_USER: ${POSTGRES_NON_ROOT_USER}
DB_POSTGRESDB_PASSWORD: ${POSTGRES_NON_ROOT_PASSWORD}
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_RUNNERS_MODE: external
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
GENERIC_TIMEZONE: Europe/Kyiv
TZ: Europe/Kyiv
ports:
- "5678:5678"
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
postgres:
condition: service_healthy
n8n-runner:
image: n8nio/runners:${N8N_VERSION}
restart: always
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
depends_on:
- n8n
Що варто помітити
- Немає
version:- "the top-level version property is defined by the Compose Specification for backward compatibility. It is only informative and you'll receive a warning message that it is obsolete if used". - Немає
links:- "any service can reach any other service at that service's name". Контейнери на одній default-мережі знаходять одне одного по service name (postgres,n8n) автоматично. - healthcheck на postgres +
depends_on: condition: service_healthy- n8n чекає реальної готовності БД, а не просто запуску процесу. N8N_RUNNERS_MODE: external- n8n будує task broker на порту 5679 у себе. Окремий контейнерn8n-runnerпідключається черезN8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679з тим самимAUTH_TOKEN.
N8N_RUNNERS_ENABLED вже видалено: runtime каже "Remove this environment variable; it is no longer needed". У старих туторіалах ще зустрінеш - не копіюй сліпо.Запуск: .env, secrets, перший старт
Compose читає .env у тій самій директорії. Усі ${VAR} з compose - звідти. Ніколи не комітимо .env у Git.
Крок 1. Створи .env
cd sandbox/
cp .env.example .env
Крок 2. Згенеруй secrets
# N8N_ENCRYPTION_KEY (256-bit hex) - CRITICAL, з ним шифруються credentials
openssl rand -hex 32
# Postgres passwords (~140-bit base64)
openssl rand -base64 24
openssl rand -base64 24
# Runners auth token (128-bit hex) - shared secret n8n ↔ runner
openssl rand -hex 16
Підстав у .env. Файл має виглядати приблизно так:
N8N_VERSION=2.21.5
POSTGRES_USER=postgres
POSTGRES_PASSWORD=Kx7nT4mZ...
POSTGRES_DB=n8n
POSTGRES_NON_ROOT_USER=n8n
POSTGRES_NON_ROOT_PASSWORD=Hq2pY9...
N8N_ENCRYPTION_KEY=4f8a...64-hex-chars
RUNNERS_AUTH_TOKEN=9b2c...32-hex-chars
Крок 3. Захисти .env
chmod 600 .env
ls -la .env
# -rw------- 1 user user ... .env
Крок 4. Запуск
docker compose -f docker-compose.dev.yml up -d
# Очікувані статуси:
docker compose -f docker-compose.dev.yml ps
# postgres ... Up (healthy)
# n8n ... Up
# n8n-runner ... Up
Крок 5. Перевір логи + відкрий UI
docker compose -f docker-compose.dev.yml logs --tail=20 n8n
# n8n ready on ::, port 5678
# n8n Task Broker ready on 0.0.0.0, port 5679
# Registered runner "launcher-python" (...)
# Registered runner "launcher-javascript" (...)
# Відкрий браузер:
xdg-open http://localhost:5678
При першому вході - onboarding screen (email + пароль для owner account). Це не SaaS реєстрація, а локальний admin.
N8N_ENCRYPTION_KEY з .env = втратиш доступ до credentials у БД назавжди. Backup .env разом з БД-дампом - не окремо.UI tour: sidebar, canvas, top tabs
Owner account створено - тепер головні зони UI 2.21. Важливо: немає постійного nodes-каталогу зліва. Nodes panel - це popup, що відкривається лише коли додаєш ноду.
Що де лежить
- Лівий sidebar - global navigation: Overview, Chat, Templates, Insights, Help, Settings + Personal/Projects scope. Тут немає каталогу нод.
- Top bar workflow: scope path, ім'я workflow (інлайн edit), теги, кнопка Publish (з версіонуванням), undo/redo history, меню ⋯.
- Top tabs (під workflow header): Editor · Executions · Evaluations (нове у 2.x - порівняння виконань для AI workflows).
- Canvas - центр. Новий workflow вже містить trigger "When clicking 'Execute workflow'" - це Manual Trigger у 2.21.
- "Add node" connector (сірий
+справа від ноди) - drag arrow до нього і відкриється popup nodes panel. - "+" вгорі справа на canvas - додає ноду у вільне місце canvas.
- Кнопка Execute Workflow внизу canvas - для manual run.
Hello world: trigger → Edit Fields
Найшвидший живий workflow. Не треба шукати "Manual Trigger" - він вже на canvas як "When clicking 'Execute workflow'". Просто додаємо одну ноду після нього.
Кроки
- Sidebar → "+" біля логотипу n8n зверху → Workflow. (Або з Overview сторінки - Create workflow.)
- На canvas вже trigger "When clicking 'Execute workflow'" з сірим
+справа - це Add node connector. - Клік по
+connector → відкривається nodes panel popup. - У пошуку:
edit fields→ обери Edit Fields (Set). - У node panel справа: Add Field, Name =
message, Value =Hello, n8n!. - Внизу canvas - помаранчева кнопка ⚡ Execute workflow. Натиснути.
Що побачиш у output Edit Fields
[
{
"message": "Hello, n8n!"
}
]
JSON array з одним item - { json: { message: "Hello, n8n!" } }. Це базова форма даних n8n - детально на наступному слайді.
Data shape: items array, json, binary
Найважливіший слайд курсу. Без розуміння як n8n переміщує дані між нодами - не зможеш дебажити жоден workflow.
Модель даних
Між нодами рухається array of items. Кожен item - об'єкт з двома ключами:
[
{
"json": { "id": 1, "email": "a@b.com" },
"binary": { "file": { "data": "base64...", "mimeType": "image/png" } }
},
{
"json": { "id": 2, "email": "c@d.com" },
"binary": {}
}
]
Як ноди обробляють items
| Опція | Поведінка |
|---|---|
| default | Нода викликається один раз, отримує весь array. Сама вирішує що робити (більшість action-нод викликають API на кожен item). |
| Execute Once = ON | "node executes once, with data from the first item" - решта items ігнорується. |
| Always Output Data = ON | "node returns an empty item even if the node returns no data" - downstream не рветься. |
return [] зупиняє workflow downstream. Якщо хочеш повернути "нічого" але йти далі - return [{ json: {} }] або вмикай Always Output Data.Pin data: dev-цикл без зайвих API calls
Будуєш workflow з HTTP Request, який платний (OpenAI, Stripe, Apollo). Кожен Execute Workflow для тестування downstream нод = +$. Pin data це рятує.
Як pin
- Виконав ноду 1 раз → побачив output JSON.
- На output panel - іконка кнопки Pin Data (📌).
- Тепер ця нода не виконується. Натомість використовується запам'ятований JSON.
- Тестуєш downstream необмежено - external API не б'ється.
- Готовий до production - Unpin усі ноди.
Коли точно pin
- HTTP Request до платного API (LLM, paid SaaS).
- Database mutation (DELETE/UPDATE) - щоб не повторювати при кожному тесті.
- External webhook send (не хочемо спамити Slack клієнта).
- Long-running ноди (Wait, AI Agent з тривалими промптами).
Save, Publish, побачити executions
Workflow збудовано, тестування пройдено. У 2.x life cycle - auto-save → published. Старого "Active toggle" вже немає.
Auto-save
Publish (заміняє Active toggle)
Після publish активуються:
- Webhook + form triggers - production URLs.
- Schedule triggers - стартують за cron.
- App-event triggers (Gmail, Slack ...) - починають слухати.
Кнопка Publish у верхньому правому куті workflow header. Hotkey Shift + P. У модалі - назва версії і опис. Кожен publish = окрема версія (роли назад через history).
Executions: дебаг-інструмент
- Manual - "occur when testing" - не лічаться у quota plans.
- Production - "runs automatically" від тригерів. Тільки вони "count towards this quota".
- Дві view: per-workflow (tab Executions поряд з Editor) і all executions (з global Overview).
На кожному запуску бачиш input + output JSON для кожної ноди. Debug surface n8n - structured JSON у браузері, а не logs у файлі.
Ядро: ноди, дані, виконання
Топ-20 нод, які зустрінеш у кожному workflow. Expressions без коду. Code node з JS/Python. Error handling. Sticky notes. Credentials.
- 3.1 Triggers: Manual, Schedule, Webhook
- 3.2 Control flow: IF, Switch, Filter, Merge
- 3.3 Data manipulation: Set, Code, Aggregate, Split Out
- 3.4 Expressions: dynamic values без Code
- 3.5 Variables: $vars, $env, scopes
- 3.6 Code node: JS vs Python, modes
- 3.7 Error handling: continue, retry, error workflow
- 3.8 Executions: manual vs production
- 3.9 Sticky notes для самодокументації
- 3.10 Credentials: шифрування і encryption key
Triggers: Manual, Schedule, Webhook
Trigger нода - єдина точка входу у workflow. Три типи, які покривають 90% сценаріїв.
| Trigger | Коли | Активація |
|---|---|---|
| Manual | Тільки dev/тест. Кнопка Execute у редакторі. | Не активується (toggle сірий). |
| Schedule | Cron - daily report, hourly check, weekly cleanup. | Publish workflow. |
| Webhook | HTTP endpoint - form submit, third-party webhook (Stripe, GitHub), chat. | Test URL у dev, Production URL після Publish. |
Schedule Trigger: cron-style + presets
Інтервал (every N minutes/hours/days), Cron expression (стандартний 5-field), або готові presets (every Monday 09:00).
# Cron приклади
0 9 * * 1-5 # 09:00 робочі дні (Mon-Fri)
*/15 * * * * # кожні 15 хв
0 0 1 * * # 00:00 першого числа місяця
Webhook Trigger: HTTP endpoint
Деталі - у розділі 4.3-4.5.
Control flow: IF, Switch, Filter, Merge
Чотири ноди, що визначають форму будь-якого нетривіального workflow. Запам'ятай їхні різниці - не плутай.
| Нода | Що робить | Outputs |
|---|---|---|
| IF | "Splits workflow execution based on conditions" | 2 (true / false) |
| Switch | "Routes data to different paths based on multiple conditions" | N (one per rule) |
| Filter | "Removes items that don't match specified criteria" | 1 (тільки matched) |
| Merge | "Combines data from multiple branches" | 1 (об'єднано) |
Коли який
- IF - бінарне розгалуження. "VIP клієнт → персональний email, інакше - шаблонний".
- Switch - багатогілкове. "event.type = checkout.completed → Slack; refunded → email; failed → Telegram".
- Filter - відсіювання без розгалуження. "з 1000 leads залишити тільки з email".
- Merge - злити дані з двох гілок (паралельні API запити → одна нода для save).
Data manipulation: Set, Code, Aggregate, Split Out
Перетворення даних між нодами. У 80% випадків можна без Code - через декларативні ноди.
| Нода | Призначення | Як обрати |
|---|---|---|
| Set / Edit Fields | "Modifies or creates fields in your data" | Перевикористовуй майже завжди. Підтримує rename, додавання, видалення fields. |
| Aggregate | "Groups and combines data" | 10 items → 1 item з array всередині. items.map(x => x.email) без коду. |
| Split Out | "Separates array items into individual items" | Зворотне Aggregate. 1 item з array → N items. Для batch processing. |
| Code | JavaScript або Python для custom логіки | Тільки коли declarative ноди не покривають. Розділ 3.6. |
| Rename Keys | "Changes field names in objects" | user_name → userName. API-shape adaptation. |
| Remove Duplicates | "Eliminates repeated entries" | Дедуплікація по полю. SELECT DISTINCT без БД. |
| Sort | "Orders items by specified fields" | Order by field, ASC/DESC. |
| Limit | "Restricts the number of items processed" | Top-N. Дешевий захист від batch що пішов не туди. |
Expressions: dynamic values без Code
Будь-яке поле параметрів ноди можна заповнити динамічно - значенням з попередніх нод, з $vars, з $now тощо. Без Code ноди.
Синтаксис (сучасний)
// поточний item
{{ $json.email }} // поле з json поточного item
{{ $binary }} // binary даних поточного item
// доступ до даних іншої ноди - синтаксис $()
{{ $("HTTP Request").item.json.id }} // linked item (data item linking)
{{ $("HTTP Request").first().json.id }} // перший item на виході ноди
{{ $("HTTP Request").last().json.id }} // останній item
{{ $("HTTP Request").all() }} // усі items (array)
// helpers
{{ $now }} // DateTime now (Luxon)
{{ $today }} // дата сьогодні
{{ $now.toFormat("yyyy-MM-dd") }} // formatted
{{ $workflow.id }}, {{ $workflow.name }}
{{ $execution.id }}, {{ $execution.mode }} // "test" або "production"
{{ $itemIndex }} // індекс поточного item
{{ $vars.MY_VAR }} // custom variable
// conditional helpers
{{ $if($json.amount > 100, "VIP", "regular") }}
{{ $ifEmpty($json.email, "no-email@example.com") }}
// рядки
{{ "Hello, " + $json.firstName + "!" }}
{{ $json.email.toLowerCase() }}
Як перейти у expression mode
- Будь-яке текстове поле параметрів - є кнопка
{ }поряд. - Або просто почни друкувати
{{у поле. - Drag-and-drop з JSON output попередньої ноди - n8n сам згенерує expression.
$node["NodeName"] ще працює як legacy, але офіційні docs і всі приклади використовують сучасний $("NodeName"). Пиши новий код через $().Variables: $vars, $env, scopes
Замість захардкоджених значень (API URLs, ID-шок, threshold-ів) - variables. Зміниш одне місце - застосовується скрізь.
Синтаксис
Доступ: $vars.<variable-name>.
Дві области (scopes)
| Scope | Доступ | Коли |
|---|---|---|
| Global | "available to everyone on your n8n instance, across all projects" | Глобальні toggles, instance-wide endpoint URL. |
| Project-scoped | "available only within the specific project they're created in" | Per-customer config, dev/prod різні значення. |
Обмеження
- "All variables are strings" - якщо потрібно число чи bool, конвертуй у expression:
Number($vars.THRESHOLD). - Read-only з workflow - "changes require UI updates". Динамічно writting не можна.
- "If a variable has no value, n8n treats it as undefined".
Code node: JavaScript vs Python, modes
Коли declarative ноди не покривають - Code. Дві мови. Два режими виконання. Завжди return array of items.
Мови
- JavaScript (Node.js runtime у task runner). Default. Швидко, повний доступ до n8n helpers.
- Python (Pyodide WebAssembly у браузері або task runner). Зручно для data wrangling, але повільніше; обмежений набір std lib.
Режими виконання
| Mode | Виклик | Коли |
|---|---|---|
| Run Once for All Items | 1 виклик функції на весь array | Aggregation, group-by, реверс array |
| Run Once for Each Item | N викликів (по 1 на item) | Per-item transformation, API auth headers |
JS приклад: Run Once for All Items
// $input.all() - array of items {json, binary}
const items = $input.all();
const grouped = {};
for (const item of items) {
const key = item.json.country;
if (!grouped[key]) grouped[key] = 0;
grouped[key]++;
}
// Return: array of items
return Object.entries(grouped).map(([country, count]) => ({
json: { country, count }
}));
JS приклад: Run Once for Each Item
// $input.item.json - поточний item
return {
json: {
...$input.item.json,
email_lower: $input.item.json.email.toLowerCase(),
processed_at: new Date().toISOString()
}
};
{ json: {...} } (для All Items) або одне { json: {...} } (для Each Item). Інакше "expected an array of objects" і workflow падає.Error handling: continue on fail, retry, error workflow
Три рівні error handling. Йде від локального (per-node) до глобального (per-workflow).
Рівень 1: per-node
На вкладці Settings кожної ноди:
- On Error: Stop Workflow (default) - workflow падає, тригериться Error Workflow (якщо налаштовано).
- On Error: Continue - "Proceed to the next node despite the error, using the last valid data".
- On Error: Continue using error output - error дані йдуть у окремий output (для conditional handling).
Рівень 2: retry per-node
Параметри: Max Tries (3-5), Wait Between Tries (ms або з jitter).
Рівень 3: Error Workflow
Створи окремий workflow з Error Trigger нодою → Slack/Telegram alert з execution.id, error message, link до executions. Підв'яжи його у Settings основного workflow.
Stop And Error: штучний fail
"Add the Stop And Error node to your workflow to force executions to fail under your chosen circumstances, and trigger the error workflow". Корисно після IF на бізнес-валідацію.
Executions: manual vs production
Кожне виконання workflow зберігається у БД як execution. Розрізняй два типи.
| Тип | Як запускається | Quota | Збереження |
|---|---|---|---|
| Manual | Кнопка Execute Workflow у редакторі | "don't consume quota limits" (cloud) | Тільки якщо налаштовано EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true |
| Production | Trigger (Webhook, Schedule, ...) | "Only production executions count towards this quota" | Default - усі збережено |
Що бачиш у Executions tab
- Status: success / error / running / waiting
- Started at, duration, trigger name
- Per-node input + output JSON
- Error message + stack trace (для failed)
- "Retry" кнопка для failed
Опції збереження (env vars, розділ 6.6)
EXECUTIONS_DATA_SAVE_ON_ERROR=all # all | none
EXECUTIONS_DATA_SAVE_ON_SUCCESS=all
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=true
EXECUTIONS_DATA_PRUNE=true # auto-cleanup
EXECUTIONS_DATA_MAX_AGE=336 # hours (14 днів)
EXECUTIONS_DATA_PRUNE=true Postgres росте швидко - 10K executions × 50KB кожне = 500MB за тиждень при moderate traffic.Sticky notes для самодокументації
Workflow без коментарів - як код без коментарів через рік. Sticky notes - єдиний механізм документації в canvas.
Як створити
- У nodes panel - шукай "note" → Add.
- Double-click для редагування.
- Markdown:
**bold**,*italic*,## headings, links, lists. - Подвійні брекети не парсяться як expression - sticky це чистий markdown.
Палітра
- 7 preset кольорів + custom hex.
- Останні 8 custom auto-saved.
- Розмір resize за edges.
- Можна drag під ноди як background grouping.
Embed media
## Workflow purpose
This handles Stripe webhooks and creates HubSpot contacts.
**Trigger:** `POST https://n8n.client.com/webhook/stripe`
**Auth:** Header `Stripe-Signature`
**SLA:** retry x3 then alert in #ops

@[youtube](dQw4w9WgXcQ)
Що писати у sticky
- Призначення workflow (що робить, для кого)
- Inputs/outputs (формат, приклад)
- SLA (retry policy, alerts)
- Owner (хто підтримує) + дата останньої правки
Credentials: шифрування і encryption key
API keys, OAuth tokens, паролі - зберігаються у БД n8n зашифрованими. Розуміння цього критично для production.
Як працює шифрування
- n8n шифрує credentials AES-256 з ключем у env var
N8N_ENCRYPTION_KEY. - Якщо
N8N_ENCRYPTION_KEYне заданий - n8n генерує його при першому старті і зберігає у/home/node/.n8n/config. - Усі credentials у БД шифровані цим ключем. Без ключа - не розшифрувати.
Згенерувати ключ
openssl rand -hex 32
# приклад виводу:
# 9f2a8b7c4d3e1f5a6b9c8d7e4f3a2b1c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a
Encryption key rotation
Best practice для prod: ротація раз на 6-12 місяців. n8n підтримує процес з old + new key одночасно.
N8N_ENCRYPTION_KEY = усі credentials у БД безповоротно втрачені. Backup .env файлу разом з БД-дампом, не окремо.OAuth, API key, Basic auth, Header auth
Кожен тип ноди визначає, які типи credentials приймає. Один тип credentials можна reuse у багатьох нодах одного класу (наприклад, одна OpenAI credential на 10 OpenAI Chat Model нод).
Інтеграції: HTTP, webhooks, API
HTTP Request - вхід у будь-який API. Webhook - інші викликають твій workflow. n8n REST API - програмний контроль самого n8n.
- 4.1 HTTP Request: 7 видів auth, 5 типів body
- 4.2 HTTP Request: pagination і batching
- 4.3 Webhook як endpoint
- 4.4 Response modes
- 4.5 Response data + CORS, IP whitelist
- 4.6 n8n public REST API
- 4.7 Real case: Stripe webhook → Slack notify
HTTP Request: 7 видів auth, 5 типів body
Універсальна нода для будь-якого HTTP API. Коли немає dedicated action node - HTTP Request покриє все.
7 типів auth (generic credentials)
- Basic auth - username + password у Authorization header
- Custom auth - довільні headers/query params
- Digest auth - HTTP Digest scheme (рідко, legacy)
- Header auth - один header (напр.
X-API-Key: ...) - OAuth1 API - старі сервіси (Twitter v1, Trello)
- OAuth2 API - сучасний стандарт (Google, GitHub, ...)
- Query auth - API key у query string (
?api_key=...)
Тобто крім generic - можеш re-use credentials з action-нод (напр. зберіг OpenAI auth - HTTP Request бачить її як option).
5 типів body
| Body Type | Content-Type | Коли |
|---|---|---|
| Form URLencoded | application/x-www-form-urlencoded | Старі форми, OAuth2 token endpoint |
| Form-Data | multipart/form-data | File uploads |
| JSON | application/json | Default для сучасних REST API |
| n8n Binary File | залежить від binary | "sends the contents of a file stored in n8n as the body" |
| Raw | custom (user-specified) | XML, plain text, custom MIME |
HTTP Request: pagination і batching
API повертає 5000 items по 50 за сторінку, з rate limit 10 req/sec. HTTP Request має дві опції, що це покривають - без Code.
Pagination - збирання усіх сторінок
| Mode | Як працює | Приклад |
|---|---|---|
| Update a Parameter | "Use this when you need to dynamically set parameters for each request" | ?offset=0, ?offset=50, ?offset=100... |
| Response Contains Next URL | "Use this when the API response includes the URL of the next page" | GitHub Link: <...>; rel="next" header або data.next_page_url |
Опції для Update a Parameter
Pagination Mode: Update a Parameter
Type: Query
Name: offset
Value: ={{ $pageCount * 50 }}
Stop Condition: ={{ $response.body.items.length === 0 }}
Max Requests: 100
Batching - rate limit friendly
Якщо HTTP Request стоїть після ноди з 1000 items - він шле 1000 запитів. Без батчінгу - bombing API.
- Items per Batch - quantity per request (наприклад 5).
- Batch Interval - milliseconds between batches (0 = no delay).
Приклад: 1000 items, Items per Batch = 5, Interval = 1000ms → 200 batches × 1s = ~3.3 хв.
Webhook як endpoint
HTTP Request - n8n кличе зовнішній світ. Webhook - зовнішній світ кличе n8n. Триггер з власним URL.
Два URL: test і production
- Test URL - "activates when selecting 'Listen for Test Event'". Тільки після кліку у редакторі, очікує один запит.
- Production URL - "registers when you publish the workflow" (тобто після кліку Publish).
HTTP methods
Path і route params
"Manually specify a URL path, including adding route parameters" - формати /:variable або /:variable1/path/:variable2.
Приклади:
/webhook/stripe # фіксований path
/webhook/orders/:id # /webhook/orders/42 → $json.params.id = 42
/webhook/users/:userId/posts/:postId
Authentication
- None - публічний endpoint (для unauthenticated webhooks).
- Basic auth - username + password.
- Header auth - один header (типово для signature перевірки).
- JWT auth - підпис JWT з shared secret.
https://n8n.example.com/webhook/<random-id>. Цей URL - secret. Не публікуй його (тільки клієнту через secure channel). Будь-хто з URL може call workflow.Response modes
Що отримає викликаючий клієнт назад? Чотири опції.
| Mode | Що повертається | Коли |
|---|---|---|
| Immediately | "the response code and the message Workflow got started" | Fire-and-forget - довгий workflow не блокує клієнта |
| When Last Node Finishes | "the response code and the data output from the last node" | Sync-style - клієнт чекає результат, як звичайний API |
| Using 'Respond to Webhook' Node | "as defined in the Respond to Webhook node" | Повний контроль - status code, headers, body окремо |
| Streaming response | "real-time data streaming back to the user as the workflow processes" | LLM streaming - токени letery letery як приходять |
Respond to Webhook - "API endpoint" pattern
Найгнучкіша опція. Запам'ятай:
- Webhook trigger → Response Mode: Using 'Respond to Webhook' Node.
- У workflow робиш бізнес-логіку (validate, call API, save до DB).
- В кінці - нода Respond to Webhook з кастомним body + status + headers.
// Respond to Webhook node:
// Status: 200
// Headers: { "Content-Type": "application/json", "X-Request-ID": "{{ $execution.id }}" }
// Body: { "success": true, "user_id": "{{ $json.user_id }}" }
Response data options + CORS, IP whitelist
Дрібніші, але важливі настройки Webhook node.
Response data: що саме повертати
- All Entries - повний array items останньої ноди.
- First Entry JSON - тільки
jsonпершого item. - First Entry Binary - тільки
binaryпершого item (для file downloads). - No Response Body - 200 без тіла (acknowledgment-only).
CORS - для frontend integrations
Webhook node має inline опції для CORS - не потрібен окремий reverse proxy hack.
Options:
Allow Origins: ["https://app.example.com", "https://admin.example.com"]
Allowed Headers: ["Content-Type", "X-Custom"]
IP whitelisting
Опція IP(s) Whitelist. Якщо webhook кличе тільки відомий сервіс (Stripe, GitHub) - впиши їхні CIDR. Інші IP → 403.
IP Whitelist: 192.0.2.0/24, 198.51.100.0/24
Інші опції
- Ignore Bots - фільтрує запити з bot User-Agent (Googlebot, etc).
- Binary Property - назва binary key (для file uploads).
- Response Headers - custom headers (для proxies, auth).
- Response Code - default 200, перевизначай для 201 created чи 202 accepted.
n8n public REST API
n8n сам - API. Можеш керувати workflows, executions, credentials програмно. Корисно для CI/CD, DevOps automation, embed-management.
Доступ
- Self-host - безкоштовно, з box. Settings → API → Create API Key.
- Cloud - "The n8n API isn't available during the free trial. Please upgrade to access this feature".
Endpoints (вибірка)
# Auth header: X-N8N-API-KEY: <your-api-key>
# Workflows
GET /api/v1/workflows # list
GET /api/v1/workflows/:id # single
POST /api/v1/workflows # create
PUT /api/v1/workflows/:id # update
POST /api/v1/workflows/:id/activate
POST /api/v1/workflows/:id/deactivate
DELETE /api/v1/workflows/:id
# Executions
GET /api/v1/executions?workflowId=42
DELETE /api/v1/executions/:id
# Credentials (тільки create і delete)
POST /api/v1/credentials
DELETE /api/v1/credentials/:id
# Users (Enterprise)
GET /api/v1/users
POST /api/v1/users
OpenAPI playground
На self-hosted instance: http://localhost:5678/api/v1/docs/ - інтерактивний Swagger UI. Try it out без curl.
Real case: Stripe webhook → Slack notify
Зібрали всі шматки разом. Це портфолієфайл, який реально продається на Fiverr за $80-150.
Workflow
Ключові деталі
- Webhook: Method POST, Path
/stripe, Auth = None (Stripe не використовує Header auth - підпис у body), Response Mode = Using 'Respond to Webhook' Node. - Verify signature: Code node з HMAC SHA256 (Stripe webhook secret + raw body) → compare з
Stripe-Signatureheader. Якщо mismatch → Stop And Error. - Switch: 3 outputs за
$json.body.type-checkout.session.completed,charge.refunded,charge.failed. - Slack: action node з вибраним channel + template message з
{{ $json.body.data.object.amount }}. - Respond 200: Stripe чекає 200 за 3 секунди, інакше retry. Тримай workflow швидким (no AI у hot path).
AI workflows: agents, memory, RAG
LLM vs AI Agent. Cluster nodes. Chat Trigger + OpenAI. Memory persistence. Tools як workflows. Vector DB і RAG. Реальний кейс - AI email triage.
- 5.1 LLM vs AI Agent: різниця
- 5.2 Cluster nodes: root + sub-nodes
- 5.3 Chat Trigger + AI Agent + OpenAI
- 5.4 Memory: Simple Memory і Postgres
- 5.5 Tools: n8n workflows як AI tools
- 5.6 Vector DB + RAG: introduction
- 5.7 Real case: AI email triage
LLM vs AI Agent: різниця
"AI" у n8n - це не один тип ноди. Розрізняй LLM call (один shot - prompt → completion) і AI Agent (loop з tools).
Порівняння
| LLM (OpenAI Chat node) | AI Agent (cluster) | |
|---|---|---|
| Pattern | prompt → response | prompt → reasoning → tool call → result → reasoning → ... → response |
| Tools | немає | так - HTTP, workflows, custom |
| Memory | stateless | persistent через Memory sub-node |
| Use case | summarization, classification, generation | chatbot з actions, autonomous research, RAG QA |
| Ціна за виклик | 1 LLM API call | 3-15 LLM API calls (loop) |
Cluster nodes: root + sub-nodes
AI Agent на canvas - не одна нода. Це cluster: одна root node (AI Agent) + кілька sub-nodes, які підключаються знизу.
Sub-node типи
- Chat Model - LLM провайдер: OpenAI, Anthropic, Google Gemini, Ollama (local), Mistral.
- Memory - збереження контексту: Simple (in-process), Postgres, Redis, MongoDB.
- Tools - dії, які agent може викликати: HTTP Request Tool, Workflow Tool, Code Tool, custom action nodes.
- Output Parser - структурує LLM output у JSON schema (для downstream обробки).
- Embeddings + Vector Store + Retriever - RAG (розділ 5.6).
Chat Trigger + AI Agent + OpenAI
Найшвидший AI workflow за 5 хвилин. Готовий chatbot, доступний на вбудованому n8n UI.
Кроки
- Add Chat Trigger (вбудоване chat UI - відкривається у tab окремо).
- Add AI Agent після Chat Trigger.
- Connect AI Agent's Chat Model port → Add OpenAI Chat Model sub-node. Вибери credential (OpenAI API key), model =
gpt-4o-mini. - У AI Agent параметрах: System Message - твоя instruction.
- Save → відкрий Chat tab → пиши.
System message приклад
n8n показує цю цитату як приклад - бачиш, що system message це звичайний LLM prompt у "ти - роль" форматі.
Practical system message
Ти - помічник підтримки інтернет-магазину "Acme".
Завжди ввічливий, відповідаєш українською.
Якщо клієнт питає про статус замовлення - запитай номер.
Якщо проблема серйозна (повернення, скарга) - відповідай
"Передаю запит менеджеру" і не вигадуй деталей.
Не обіцяй того, що не підтверджено інформацією.
Models порівняння (2026)
- gpt-4o-mini - швидко, дешево ($0.15/1M tokens). Для більшості chatbot задач.
- gpt-4o - якісніше, дорожче ($2.50/1M). Для складних reasoning.
- claude-sonnet-4-6 - сильні reasoning + цитати, ціна ~$3/1M.
- gpt-oss / llama 3.3 через Ollama - локально, безкоштовно, але треба GPU.
Memory: Simple Memory і Postgres
Без memory agent забуває все між повідомленнями. Перший слайд має це і запам'ятай.
Не додав Memory sub-node → кожен запит у Chat Trigger - tabula rasa для agent. "Як мене звати?" "Не знаю."
Simple Memory (default)
- In-process key-value store у n8n.
- Window size - скільки останніх messages зберігати (5-20 типово).
- Session key -
{{ $json.sessionId }}(chat trigger автоматично надає це). - Втрачається при restart n8n.
Postgres Memory (для production)
- Persistent - перезавантаження n8n не втрачає історію.
- Підключай до того ж Postgres, де живе сам n8n (окрема таблиця).
- Опція Context Window Length - типово 5-20 повідомлень.
Redis Memory
- Швидше за Postgres, але потрібен окремий Redis сервіс.
- TTL native (auto-cleanup старих сесій).
- Для high-traffic chatbot.
Tools: n8n workflows як AI tools
Tool - це функція, яку AI Agent може сам вирішити викликати, коли йому це потрібно для відповіді. В n8n tool може бути сам workflow.
Типи tools
- HTTP Request Tool - довільний API endpoint як tool.
- Workflow Tool - інший n8n workflow викликається як tool.
- Code Tool - inline JS/Python tool.
- Action node як tool - Google Sheets, Notion, ...
$fromAI() - schema для parameters
Спеціальний експрешн у параметрі tool-ноди, який каже LLM "цей параметр ти заповнюєш сам, ось схема":
// Сигнатура: $fromAI(key, description?, type?, defaultValue?)
// key (string, обов'язково, 1-64 chars, [A-Za-z0-9_-])
// type ∈ {string, number, boolean, json}
// мінімум - тільки key
{{ $fromAI("order_id") }}
// з описом і типом
$fromAI("name", "The commenter's name", "string", "Jane Doe")
$fromAI("numItemsInStock", "Number of items in stock", "number", 5)
// embedded у рядку
Generated by AI: {{ $fromAI("subject") }}
LLM при вирішенні викликати tool сам зрозуміє, що передати у order_id з контексту розмови. Опис допомагає LLM правильно екстрагувати значення.
Practical приклад
AI chatbot для e-commerce клієнта:
- Memory: Postgres (per-user persistent)
- Tool 1: HTTP Request Tool → GET
/api/orders/{order_id} - Tool 2: Workflow Tool → "Create support ticket" (відкриває Jira issue)
- Tool 3: Google Sheets Tool → читає FAQ table
Користувач пише "де моя посилка #12345?" → agent сам вирішує викликати Tool 1 з order_id=12345 → бачить status → формує відповідь.
Vector DB + RAG: introduction
RAG (Retrieval-Augmented Generation) - patternw, де LLM відповідає на питання спираючись на твою документацію. Без RAG LLM знає тільки те, на чому тренувався.
Як працює RAG (упрощено)
- Indexing (раз): doc → split на chunks → embed (vector) → save у vector DB.
- Retrieval (per query): user question → embed → similarity search у vector DB → top-K chunks.
- Generation: LLM отримує question + top-K chunks як context → пише відповідь.
n8n cluster для RAG
- Vector Store: Pinecone, Qdrant, Weaviate, pgvector (Postgres extension)
- Embeddings: OpenAI
text-embedding-3-small($0.02/1M tokens) або Ollama local - Retriever: Vector Store Retriever sub-node
- Populate: окремий workflow з Schedule Trigger → Read docs (Notion, Google Drive, website crawl) → Embed → Insert у Vector Store
Real case: AI email triage
Premium-gig сценарій ($400-800 на Fiverr). Гібрид LLM + Agent з memory + tools.
Архітектура
Деталі реалізації
- Gmail Trigger: poll кожні 5 хв, фільтр
label:inbox is:unread. - AI Agent system message: "Класифікуй email у одну з категорій: support, billing, sales, spam. Для support - витягни order_id якщо є. Поверни JSON:
{category, priority, order_id?}". - Memory: Postgres з session key =
{{ $json.threadId }}(важливо! одна розмова з клієнтом = одна сесія). - Sheets Tool: AI Agent сам викликає для lookup customer (за email) у Google Sheets - VIP status, prior issues.
- Switch: за
$json.category- три гілки + spam → Gmail delete. - Asana: створює task в команді з context + AI summary.
Production: queue mode, моніторинг, безпека
Single instance vs queue mode (main + worker). Encryption key. Retention. Metrics. 2FA. Source control. Все, що відрізняє "поставив локально" від "клієнт платить $500/міс".
- 6.1 Single instance vs queue mode
- 6.2 Queue mode setup: env vars
- 6.3 Worker і webhook processor
- 6.4 docker-compose queue mode
- 6.5 Encryption key і backups
- 6.6 Execution data retention
- 6.7 Health checks + Prometheus metrics
- 6.8 Безпека: 2FA, redact, block nodes
- 6.9 Source control: dev/prod через Git
Single instance vs queue mode
Дві архітектури - вибір залежить від навантаження.
Single instance
- Один процес n8n робить все: UI, прийом webhooks, виконання workflows.
- Простий setup - docker-compose з 2 сервісами (n8n + postgres).
- Обмеження: довгий workflow блокує webhook-прийом (queueing у HTTP стеку).
Queue mode
- Main: UI + прийом webhooks + scheduler. Не виконує workflows.
- Worker(s): тільки виконання. Скейлиться горизонтально.
- Redis: queue, передає job-и main → worker.
- Webhook processor (опційно): окремий процес тільки для webhook прийому.
Коли переходити на queue
| Сигнал | Чому single не вистачає |
|---|---|
| ≥100 executions/min | Single instance throughput-обмежений |
| Workflow тривалістю > 30 сек | Блокує паралельні webhook-и |
| Webhook SLA < 2 сек (Stripe 3 sec) | Heavy execution розриває SLA |
| Multiple instances для HA | Single = SPOF |
Queue mode setup: env vars
Конфігурація queue mode - набір env vars, спільних для main і workers. N8N_ENCRYPTION_KEY мусить бути identical у всіх інстансах.
Core env vars
# Включити queue mode
export EXECUTIONS_MODE=queue
# Encryption key (CRITICAL: однаковий на main + workers + runners)
export N8N_ENCRYPTION_KEY=<hex-32>
# Redis для job queue
export QUEUE_BULL_REDIS_HOST=redis
export QUEUE_BULL_REDIS_PORT=6379
export QUEUE_BULL_REDIS_USERNAME=
export QUEUE_BULL_REDIS_PASSWORD=
export QUEUE_BULL_REDIS_DB=0
export QUEUE_BULL_REDIS_TIMEOUT_THRESHOLD=10000
# Webhook URL (публічний, що бачить світ)
export WEBHOOK_URL=https://n8n.example.com/
Worker settings
# Lease duration (worker тримає job)
export QUEUE_WORKER_LOCK_DURATION=60000
export QUEUE_WORKER_LOCK_RENEW_TIME=10000
# Stalled job detection
export QUEUE_WORKER_STALLED_INTERVAL=30000
export QUEUE_WORKER_MAX_STALLED_COUNT=1
# Offload manual executions to workers
export OFFLOAD_MANUAL_EXECUTIONS_TO_WORKERS=true
Health checks
export QUEUE_HEALTH_CHECK_ACTIVE=true
export QUEUE_HEALTH_CHECK_PORT=5678
export N8N_ENDPOINT_HEALTH=/healthz
Multi-main (HA)
# Тільки з Enterprise license
export N8N_MULTI_MAIN_SETUP_ENABLED=true
export N8N_MULTI_MAIN_SETUP_KEY_TTL=10
export N8N_MULTI_MAIN_SETUP_CHECK_INTERVAL=3
N8N_MULTI_MAIN_SETUP_ENABLED=true) - тільки на Enterprise license.N8N_ENCRYPTION_KEY різний на main і worker → credentials decrypted only on one of них → workflows падають з cryptic errors. Перевір first thing при дебагу queue mode.Worker і webhook processor
Окрема команда запускає n8n у worker mode. Один docker image - різні аргументи запуску.
Worker
# У docker:
docker run --name n8n-worker \
-e EXECUTIONS_MODE=queue \
-e N8N_ENCRYPTION_KEY=... \
-e QUEUE_BULL_REDIS_HOST=redis \
docker.n8n.io/n8nio/n8n worker
Або через npm:
./packages/cli/bin/n8n worker
n8n worker --concurrency=5
Concurrency tuning
--concurrency=N- кількість одночасних job-ів у одному worker- Default = 10. Швидкі workflow (HTTP-only) - вище (20-50). Heavy (LLM з memory) - нижче (3-5).
- Краще багато worker-ів з малим concurrency, ніж один з великим (краща ізоляція при crash).
Webhook processor (опційно)
Якщо webhook traffic дуже високий і ти не хочеш, щоб він боровся за CPU з main UI - окремий процес тільки для webhooks:
docker run --name n8n-webhooks \
-p 5679:5678 \
-e "EXECUTIONS_MODE=queue" \
-e N8N_DISABLE_PRODUCTION_MAIN_PROCESS=true \
docker.n8n.io/n8nio/n8n webhook
Цей процес тільки приймає webhooks → кладе у Redis. Workers потім беруть.
peak_executions_per_minute ÷ (60 ÷ avg_workflow_duration_seconds). Round up + 1 для headroom.docker-compose queue mode (full setup)
Готовий compose з main + worker + runners + redis + postgres. Скопіюй з sandbox/, працює з коробки.
volumes:
db_storage:
n8n_storage:
redis_storage:
x-shared: &shared
image: docker.n8n.io/n8nio/n8n:2.21.5
restart: always
environment:
DB_TYPE: postgresdb
DB_POSTGRESDB_HOST: postgres
EXECUTIONS_MODE: queue
QUEUE_BULL_REDIS_HOST: redis
QUEUE_HEALTH_CHECK_ACTIVE: "true"
N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY}
N8N_RUNNERS_MODE: external
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_BROKER_LISTEN_ADDRESS: 0.0.0.0
WEBHOOK_URL: ${WEBHOOK_URL}
EXECUTIONS_DATA_PRUNE: "true"
EXECUTIONS_DATA_MAX_AGE: 336
N8N_METRICS: "true"
volumes:
- n8n_storage:/home/node/.n8n
depends_on:
redis: { condition: service_healthy }
postgres: { condition: service_healthy }
services:
postgres:
image: postgres:16
# env + healthcheck див. sandbox/docker-compose.queue.yml
redis:
image: redis:7-alpine
volumes: [redis_storage:/data]
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
n8n:
<<: *shared
ports: ["5678:5678"]
n8n-worker:
<<: *shared
command: worker --concurrency=5
n8n-runner:
image: n8nio/runners:2.21.5
environment:
N8N_RUNNERS_AUTH_TOKEN: ${RUNNERS_AUTH_TOKEN}
N8N_RUNNERS_TASK_BROKER_URI: http://n8n:5679
Scale worker-ів
docker compose -f docker-compose.queue.yml up -d --scale n8n-worker=3
x-shared: &shared + <<: *shared - DRY-prince для env vars. Без нього доведеться повторювати 15+ env vars двічі. У sandbox/docker-compose.queue.yml повна робоча версія.Encryption key і backups
Втрата encryption key = втрата усіх credentials (API keys, OAuth tokens) у БД. Це найкритичніший backup item.
Що бекапити
- Postgres dump - workflows, executions, credentials (encrypted).
- n8n_storage volume -
.n8n/configфайл + custom nodes. - .env файл -
N8N_ENCRYPTION_KEY, паролі, OAuth secrets.
Backup script (daily cron)
#!/bin/bash
set -euo pipefail
BACKUP_DIR=/srv/backups/n8n
DATE=$(date +%F)
mkdir -p "$BACKUP_DIR"
# 1. Postgres dump
docker compose exec -T postgres pg_dump -U n8n -d n8n \
| gzip > "$BACKUP_DIR/db-$DATE.sql.gz"
# 2. n8n volume tarball (config + custom nodes)
docker run --rm \
-v sandbox_n8n_storage:/source:ro \
-v "$BACKUP_DIR":/backup \
alpine tar czf "/backup/n8n-vol-$DATE.tgz" -C /source .
# 3. .env (encryption key!)
cp /opt/n8n/.env "$BACKUP_DIR/env-$DATE.bak"
# 4. Off-site (rclone до S3/B2/...)
rclone copy "$BACKUP_DIR" remote:n8n-backups/
# 5. Видалити локально все старше 30 днів
find "$BACKUP_DIR" -type f -mtime +30 -delete
Encryption key rotation
На production - раз на 6-12 місяців. n8n підтримує процес із N8N_ENCRYPTION_KEY_PREVIOUS - старий ключ ще валідний поки credentials не re-encrypted з новим.
Execution data retention
n8n зберігає повний JSON input/output на кожній ноді для кожного execution. Без retention - Postgres росте на гігабайти за тижні.
Env vars для prune
# Включити auto-cleanup
EXECUTIONS_DATA_PRUNE=true
# Скільки тримати (години)
EXECUTIONS_DATA_MAX_AGE=336 # 14 днів
# Або скільки штук max
EXECUTIONS_DATA_PRUNE_MAX_COUNT=10000
# Що зберігати взагалі
EXECUTIONS_DATA_SAVE_ON_ERROR=all # all | none
EXECUTIONS_DATA_SAVE_ON_SUCCESS=all # all | none
EXECUTIONS_DATA_SAVE_MANUAL_EXECUTIONS=false # dev runs не зберігаємо
Compromise: ОЩАДЛИВЕ vs ДЕТАЛЬНЕ
| Профіль | SAVE_ON_SUCCESS | MAX_AGE | Дисковий слід |
|---|---|---|---|
| Default | all | 336h (14 д) | Великий |
| Ощадливо | none | 168h | 10× менше - тільки errors зберігаємо |
| Audit-heavy | all | 2160h (90 д) | 5× більше - для compliance |
Manual cleanup (одноразовий)
-- Видалити executions старше 30 днів
DELETE FROM execution_entity
WHERE finished < NOW() - INTERVAL '30 days';
-- Перевірити розмір таблиці
SELECT pg_size_pretty(pg_total_relation_size('execution_entity'));
DELETE на production без транзакції і LIMIT. Великий delete може блокувати n8n на хвилини.Health checks + Prometheus metrics
Без моніторингу - не знаєш, що workflow впав, або n8n уже годину не відповідає на webhooks.
Health endpoints
# Включити
QUEUE_HEALTH_CHECK_ACTIVE=true
QUEUE_HEALTH_CHECK_PORT=5678
N8N_ENDPOINT_HEALTH=/healthz
Викликаєш GET /healthz → 200 якщо все ок, 503 якщо БД/Redis недоступні.
Prometheus metrics
N8N_METRICS=true # default false
N8N_METRICS_PREFIX=n8n_ # опціонально
N8N_METRICS_INCLUDE_DEFAULT_METRICS=true
N8N_METRICS_INCLUDE_WORKFLOW_ID_LABEL=false # не вмикай - cardinality bомба
N8N_METRICS_INCLUDE_NODE_TYPE_LABEL=true
Endpoint: GET /metrics у Prometheus format.
Які метрики корисні
n8n_workflow_executions_total{status="success|failed"}- rate of executionsn8n_workflow_execution_duration_seconds- histogramn8n_queue_size- pending jobs у Redis (queue mode)n8n_db_pool_size,n8n_db_pool_idle- стан DB connection poolprocess_cpu_user_seconds_total,nodejs_heap_size_used_bytes- node defaults
Простий external monitor
UptimeRobot, BetterStack, або self-hosted Uptime Kuma - HTTP check кожні 60 сек:
- URL:
https://n8n.example.com/healthz - Expected status: 200
- Notification: email + Slack/Telegram
Безпека: 2FA, redact, block nodes
Шість шарів безпеки. Кожен закриває окремий клас атак.
1. 2FA для UI users
Settings → Users → enforce 2FA для admin. Без цього компроментація пароля = повний доступ до workflows + credentials.
2. Redact execution data
Для workflows з PII (паспортні дані, credit cards) - вмикай. Метадані (status, duration, node names) залишаються; payload приховано.
3. Block dangerous nodes
NODES_INCLUDE або NODES_EXCLUDE env vars. Найчастіше блокують:
# Не давати клієнту виконувати shell commands на хості:
NODES_EXCLUDE="[\"n8n-nodes-base.executeCommand\",\"n8n-nodes-base.readWriteFile\"]"
4. SSRF protection
N8N_BLOCKED_HOSTS або allowlist - заборонити HTTP Request на private IP (169.254.169.254 - AWS metadata, 127.0.0.1, 10.0.0.0/8).
5. Webhook URL secrecy
Production webhook URL містить random ID. Не вкладай у public docs. Постав Header auth якщо можливо.
6. TLS skip verification - NO
У HTTP Request є опція "Ignore SSL Issues". Включати тільки для localhost тестування - ніколи у production.
SSO + RBAC (Enterprise only)
"Single Sign-On for user account management" і role-based access control - тільки на Enterprise license. Для Community - один shared user.
Source control: dev/prod через Git
"Зробив workflow → клацнув активувати на проді" - небезпечна практика. Через Git ти отримуєш review + rollback + audit.
Setup (Enterprise)
- Settings → Environments → Connect Git repo (HTTPS або SSH key).
- Per-instance branch: dev instance →
main, prod instance →production. - Workflows commit-ються як JSON файли.
- Push / Pull через UI; merge через PR на GitHub.
Без Enterprise - ручний workflow
Для Community license такого UI немає, але механізм є:
- У workflow editor: ⋮ menu → Download → отримуєш JSON.
- Commit JSON у Git вручну.
- На prod: ⋮ menu → Upload → завантажуєш JSON.
- Credentials налаштовуєш окремо на кожному інстансі.
Через REST API (CI/CD)
# Дамп всіх workflows з dev:
curl -H "X-N8N-API-KEY: $KEY" \
https://dev.n8n.example.com/api/v1/workflows \
| jq '.data' > workflows.json
# Push до Git → CI pipeline на prod виконує POST у /api/v1/workflows
Деплой клієнту: VPS + Traefik + SSL
Від $5 VPS до робочого https://n8n.client.com за 20 хвилин. Backup стратегія, передача доступу, update protocol. Все, що треба для "ready for client".
- 7.1 VPS вибір: 2GB RAM, Ubuntu LTS
- 7.2 Docker і compose install
- 7.3 Traefik + Let's Encrypt
- 7.4 .env і secrets
- 7.5 Backups: volume + DB dump
- 7.6 Перший production workflow для клієнта
- 7.7 Передача клієнту
- 7.8 Update n8n
VPS вибір: 2GB RAM, Ubuntu LTS
Виберемо мінімальний прод-сервер для типового Fiverr клієнта.
Мінімальні вимоги
| Setup | RAM | vCPU | Disk |
|---|---|---|---|
| Single (1-10 workflows, low traffic) | 2 GB | 1 | 20 GB |
| Single (AI workflows, moderate) | 4 GB | 2 | 40 GB |
| Queue mode (1 main + 2 workers) | 4 GB | 2 | 40 GB |
| Queue mode (3+ workers, AI heavy) | 8 GB | 4 | 80 GB |
Провайдери (порівняння, 2026)
- Hetzner CX22 - 4 vCPU + 8GB RAM + 80GB SSD за €4.51/міс. Best value, дата-центр у Німеччині або Фінляндії.
- DigitalOcean Basic - 1 vCPU + 2GB + 50GB за $12/міс. Простіше UI, ширша географія.
- Vultr Cloud Compute - 1 vCPU + 2GB за $6/міс. Aggressive pricing, less polished UI.
- AWS Lightsail - $5-$40, зрозумілий тарифний план. Якщо клієнт уже на AWS.
Чому Ubuntu 24.04 LTS
- 5 років support, security updates безкоштовно.
- Docker maintainer-щі офіційно тестують на Ubuntu.
- Більшість docs/tutorials Ubuntu-orientовані - менше debug часу для тебе.
Docker і compose install
Перший крок на свіжому Ubuntu. 3 команди.
# 1. Update + install Docker (офіційний скрипт)
sudo apt update && sudo apt upgrade -y
curl -fsSL https://get.docker.com | sudo sh
# 2. Додай свого user у docker group (без sudo для docker)
sudo usermod -aG docker $USER
newgrp docker # або re-login
# 3. Перевір
docker version
docker compose version
Firewall (UFW)
sudo ufw allow OpenSSH
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status
SSH (22), HTTP (80 - для Let's Encrypt challenge), HTTPS (443). Більше нічого не відкриваємо.
swap (для 2GB RAM серверів)
# 2GB swap файл
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
free -h # перевір
Hardening (опційно але recommended)
- SSH disable root login:
PermitRootLogin noу/etc/ssh/sshd_config - SSH key-only auth:
PasswordAuthentication no - fail2ban:
sudo apt install fail2ban -y - unattended-upgrades для security patches:
sudo apt install unattended-upgrades -y
Traefik + Let's Encrypt
Traefik - reverse proxy, що автоматично отримує SSL-сертифікати від Let's Encrypt і renew їх. Налаштовується через docker labels - без окремого конфігу.
Передумови
- DNS A-запис:
n8n.example.com → IP сервера(через панель домену). - Порти 80, 443 відкриті у UFW (див. 7.2).
nslookup n8n.example.comповертає правильний IP.
Traefik service у compose
services:
traefik:
image: traefik:v3.1
restart: always
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.web.http.redirections.entrypoint.to=websecure
- --entrypoints.web.http.redirections.entrypoint.scheme=https
- --entrypoints.websecure.address=:443
- --certificatesresolvers.le.acme.tlschallenge=true
- --certificatesresolvers.le.acme.email=${SSL_EMAIL}
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
ports: ["80:80", "443:443"]
volumes:
- traefik_data:/letsencrypt
- /var/run/docker.sock:/var/run/docker.sock:ro
n8n labels (так Traefik знає про неї)
n8n:
image: docker.n8n.io/n8nio/n8n:2.21.5
# ... env, volumes ...
labels:
- traefik.enable=true
- traefik.http.routers.n8n.rule=Host(`${SUBDOMAIN}.${DOMAIN_NAME}`)
- traefik.http.routers.n8n.entrypoints=websecure
- traefik.http.routers.n8n.tls.certresolver=le
- traefik.http.services.n8n.loadbalancer.server.port=5678
- traefik.http.middlewares.n8n-sec.headers.stsseconds=315360000
- traefik.http.middlewares.n8n-sec.headers.browserxssfilter=true
- traefik.http.middlewares.n8n-sec.headers.contenttypenosniff=true
- traefik.http.routers.n8n.middlewares=n8n-sec
Перший запуск
docker compose -f docker-compose.prod.yml up -d
# Перевір логи Traefik (Let's Encrypt може зайняти 30-60 сек):
docker compose logs traefik | grep -i "certificate"
# Відкрий https://n8n.example.com у браузері - має бути валідний cert.
--certificatesresolvers.le.acme.caserver=https://acme-staging-v02.api.letsencrypt.org/directory. Production має rate limit 5 fail/hour - можна попасти у lockout..env і secrets
Секрети - у .env, не у docker-compose.yml. .env поза Git. На сервері - chmod 600.
Шаблон .env
# === n8n version ===
N8N_VERSION=2.21.5
# === Domain і SSL ===
DOMAIN_NAME=example.com
SUBDOMAIN=n8n
SSL_EMAIL=admin@example.com
GENERIC_TIMEZONE=Europe/Kyiv
# === PostgreSQL ===
POSTGRES_USER=postgres
POSTGRES_PASSWORD=<openssl rand -base64 24>
POSTGRES_DB=n8n
POSTGRES_NON_ROOT_USER=n8n
POSTGRES_NON_ROOT_PASSWORD=<openssl rand -base64 24>
# === n8n encryption (CRITICAL) ===
# openssl rand -hex 32
N8N_ENCRYPTION_KEY=...64-char-hex...
# === Runners auth ===
RUNNERS_AUTH_TOKEN=<openssl rand -hex 16>
Генерація secrets
# Encryption key (256-bit)
openssl rand -hex 32
# Паролі (24 base64 char ~= 144 bit entropy)
openssl rand -base64 24
# Auth token
openssl rand -hex 16
Хардеnинг файлу
# Власник + дозволи
sudo chown $USER:$USER .env
chmod 600 .env
# Перевір
ls -la .env
# -rw------- 1 user user ... .env
Що зробити у .gitignore
.env
.env.local
*.pem
*.key
acme.json
.env з encryption key у public Git? Не просто видали commit - згенеруй новий ключ, перешифруй credentials, rotate усі API keys, що зберігалися. Старі дані могли бути scrape-нуті..env з chmod 600 + регулярний backup. Не overkill для початку.Backups: volume + DB dump
Без backup стратегії - один OOM-kill на Postgres знищує клієнтський проєкт. Простий setup - cron + rclone.
Daily backup script
#!/bin/bash
# /opt/n8n/backup.sh
set -euo pipefail
BACKUP_DIR=/srv/backups
DATE=$(date +%F-%H%M)
PROJECT=n8n # ім'я docker-compose проєкту
mkdir -p "$BACKUP_DIR"
cd /opt/n8n
# 1. Postgres dump
docker compose exec -T postgres \
pg_dump -U n8n -d n8n \
| gzip > "$BACKUP_DIR/db-$DATE.sql.gz"
# 2. n8n volume tarball
docker run --rm \
-v ${PROJECT}_n8n_storage:/source:ro \
-v "$BACKUP_DIR":/backup \
alpine tar czf "/backup/vol-$DATE.tgz" -C /source .
# 3. .env (encryption key!)
cp .env "$BACKUP_DIR/env-$DATE.bak"
# 4. Off-site sync
rclone copy "$BACKUP_DIR" b2:client-n8n-backups/ \
--include "*-$DATE.*"
# 5. Локально - тримай 7 днів
find "$BACKUP_DIR" -type f -mtime +7 -delete
echo "Backup done: $DATE"
Cron
# crontab -e
0 3 * * * /opt/n8n/backup.sh >> /var/log/n8n-backup.log 2>&1
Off-site варіанти
- Backblaze B2 - $5/TB/міс, S3-compatible. Найдешевше для backups.
- AWS S3 Glacier - $0.36/TB/міс для cold storage.
- Second VPS - rsync до іншого сервера. Безкоштовно, якщо вже є.
- rclone - один tool для всіх вище.
rclone configінтерактивно.
Restore тест (раз на місяць)
# Створи fresh stack у /tmp
mkdir /tmp/n8n-restore && cd /tmp/n8n-restore
cp /opt/n8n/docker-compose.prod.yml .
# Restore .env (encryption key!)
cp /srv/backups/env-2026-05-15-0300.bak .env
# Restore Postgres
gunzip -c /srv/backups/db-2026-05-15-0300.sql.gz \
| docker compose exec -T postgres psql -U n8n -d n8n
# Restore volume
docker run --rm \
-v n8n-restore_n8n_storage:/target \
-v /srv/backups:/backup:ro \
alpine tar xzf "/backup/vol-2026-05-15-0300.tgz" -C /target
# Перевір - workflows працюють?
Перший production workflow для клієнта
Сервер є, домен працює, n8n відкривається. Тепер - перший workflow з якістю, за яку платять.
Checklist якісного workflow
- Trigger з auth (Webhook → Header або Basic; Schedule → нічого).
- Credentials зберігаються тільки у Credentials section, ніколи hardcoded у Code.
- Sticky notes: призначення, inputs, outputs, owner, дата.
- Error workflow налаштовано → Slack/email alert при fail.
- Retry policy на критичних HTTP Request нодах (3 спроби, exponential backoff).
- Continue on fail для non-critical нод (наприклад, secondary notification fails не має валити основний flow).
- Idempotency: workflow двічі викликаний з тим же input - не дублює дії (check by external_id).
- Logging: важливі точки → write до Google Sheets / Postgres для audit.
Dedicated user для клієнта
- Створи окремий user у Settings → Users.
- Передай login URL + temporary password через secure channel (1Password, ProtonMail, Signal).
- Перший вхід - клієнт міняє пароль і вмикає 2FA.
- Твій admin account - тримай як backup access.
Workflow naming convention
[Module] - Description (vN)
приклади:
[CRM] - HubSpot deal status sync (v2)
[Billing] - Stripe webhook to Slack (v1)
[Support] - Email triage AI agent (v3)
Префікс [Module] групує у списку workflows. Версія - щоб не плутати при оновленнях.
Передача клієнту
Workflow працює, тести зелені. Тепер - правильна handover, щоб клієнт міг сам ним користуватися (і платити тобі за support, а не за фіксінг твого "хвоста").
Що передаєш
- README.md у клієнтовому Git або Notion:
- URL n8n + login
- Список workflows з описом
- "Як активувати/деактивувати", "як подивитися execution log"
- "Куди звертатися при поломці" (ти + emergency contact)
- Workflow JSON exports у Git (як backup):
- ⋮ menu → Download → commit у repo
- Sticky notes вже у workflow (з розділу 3.9 і 7.6).
- Loom screencast 5-10 хв:
- Як зайти у n8n
- Як відкрити workflow і подивитися останні executions
- Як знайти конкретний run за датою/error message
- Як re-run failed execution
- External monitoring: UptimeRobot або Uptime Kuma на
/healthzз notification у клієнтський email/Slack.
SLA - на що домовляєшся
- Bug fix у твоєму workflow: 30 днів free revisions (Fiverr standard).
- Feature request: окремий quote.
- n8n upgrade: monthly maintenance гонорар або per-incident.
- n8n down 2 год: ти не маєш responsibility (це VPS / Docker / network), але можеш сповістити що сталося.
Контракт-лист (надішли перед роботою)
- "Я надаю n8n implementation. n8n - third-party software під Sustainable Use License."
- "Hosting на твоєму VPS - VPS managed by you, n8n maintained by you після handover."
- "30 днів revisions включено. Post-deploy maintenance - окремий contract."
Update n8n
n8n релізить нові версії щотижня. Patch (2.21.5 → 2.21.6) - безпечно. Minor (2.21 → 2.22) - читай release notes.
Команди update
cd /opt/n8n
# 1. Backup перед update (на всякий)
./backup.sh
# 2. Оновити image tag у .env або docker-compose
# Або просто pull latest якщо tag не pinned
docker compose pull
# 3. Recreate з новим image
docker compose up -d
# 4. Перевір логи
docker compose logs -f n8n | tail -50
# 5. Smoke test: відкрий https://n8n.example.com, перевір 1-2 workflows
Стратегія version pinning
| Стиль | Tag | Коли |
|---|---|---|
| Strict | 2.21.5 | Production. Ти контролюєш upgrades. |
| Minor | 2.21 або stable | Auto-patch updates безпечно. |
| Latest | latest | Тільки dev. Несподівані breaking changes. |
| Unstable | next | Beta testing наступних релізів. |
2.21.5). Раз на 2-4 тижні читай release notes на github.com/n8n-io/n8n/releases. Upgrade як maintenance window з backup.Rollback якщо щось зламалося
# У .env поверни попередню версію
sed -i 's/N8N_VERSION=2.22.0/N8N_VERSION=2.21.5/' .env
# Recreate
docker compose pull
docker compose up -d
# Якщо DB schema несумісна - restore з backup
gunzip -c /srv/backups/db-LAST_GOOD.sql.gz \
| docker compose exec -T postgres psql -U n8n -d n8n
Fiverr-готовність: послуги, ціна, доставка
Знаєш n8n. Тепер - як це продавати. Що дозволено, типи gig-ів, ціни, скоупінг, доставка, портфоліо-шаблони, червоні прапори.
- 8.1 Що можеш продавати по ліцензії
- 8.2 5 типів gig-ів, які купують
- 8.3 Скоупінг чек-лист
- 8.4 Ціни (Fiverr 2026)
- 8.5 Доставка: artifacts
- 8.6 5 portfolio templates
- 8.7 Червоні прапори клієнтів
- 8.8 Куди далі
Що можеш продавати по ліцензії
Повторимо ключове з 1.2 - тепер у площині Fiverr.
✓ ДОЗВОЛЕНО для Fiverr-послуг
- "Providing consulting services related to n8n, for example building workflows" - тобто будь-який workflow на замовлення.
- "Custom features closely connect to n8n" - кастомні розширення (custom nodes).
- "Supporting n8n, for example by setting it up or maintaining it on an internal company server" - setup + maintenance.
- "Creating an n8n node for your product or any other integration" - якщо клієнт має SaaS і хоче, щоб n8n легко інтегрувався.
- Backend з company credentials: ти будуєш n8n process, що використовує credentials клієнта (його OpenAI, його Stripe).
✗ ЗАБОРОНЕНО для Fiverr-послуг
Як уникнути проблем
- Завжди setup на сервері клієнта, не на твоєму.
- Клієнт - owner свого instance. Ти - consultant/contractor.
- Credentials - в його n8n, encryption key - в його .env.
- Якщо клієнт просить "host у тебе" - порадь Hetzner і налаштуй там, але білінг IDC - у нього.
5 типів gig-ів, які купують
Спрямованість важлива - "I will do automation" too generic. Профілюй на специфіку.
1. "I will build a workflow automation in n8n"
- Сценарій: one-off automation. Клієнт описує задачу - ти будуєш.
- Target: малий бізнес з конкретною проблемою ("автоматизуй пошту в Asana").
- Тривалість: 1-7 днів.
- Ціна: $30-300 залежно від complexity.
2. "I will set up n8n on your server with SSL"
- Сценарій: infra-only. Клієнт уже знає n8n, але не знає Docker/Linux.
- Target: solopreneur, агенція без DevOps.
- Тривалість: 4-12 годин включно з handover.
- Ціна: $100-200 фіксований.
3. "I will create AI chatbot with n8n + OpenAI"
- Сценарій: AI Agent з memory + tools + RAG.
- Target: e-commerce, customer support team.
- Тривалість: 2-7 днів.
- Ціна: $300-800 (premium - найгарячіший сегмент 2026).
4. "I will integrate your CRM with X using n8n"
- Сценарій: bi-directional sync HubSpot ↔ Stripe ↔ Slack тощо.
- Target: агенції, sales-led компанії.
- Тривалість: 2-5 днів.
- Ціна: $150-400.
5. "I will maintain your n8n instance monthly"
- Сценарій: retainer. Update n8n, monitor errors, fix bugs, add workflows.
- Target: уже існуючий клієнт після project delivery.
- Тривалість: ongoing.
- Ціна: $50-150/міс - стабільний пасивний дохід.
Скоупінг чек-лист
До того, як кажеш ціну, ти маєш мати відповіді на 9 питань. Без цього оцінка - guesswork, і ти або переплачуєш timeом, або клієнт виявить undocumented assumptions.
Pre-quote questionnaire
- Trigger: scheduled (раз на день/годину), webhook (від кого), form submit, email arrival, manual?
- Input data shape: попроси JSON sample / screenshot форми / API doc link. Ніколи "ну, ти зрозумієш".
- Бажаний output: куди іде, у якому форматі (Slack message template, Google Sheet row, API endpoint).
- Error path: що робити, якщо щось fail? Retry скільки разів? Alert куди?
- Volume: скільки виконань на день/годину/місяць?
- Latency requirement: real-time (< 5 сек) чи batch (раз на годину ok)?
- Credentials: чи в клієнта вже є API keys / OAuth для усіх сервісів? Чи треба налаштовувати?
- Hosting: у клієнта вже є n8n чи треба нове? Якщо нове - VPS уже куплено?
- Подальша підтримка: хочеш monthly maintenance, чи one-off?
Червоний прапор: відповіді на 6+ "не знаю"
Якщо клієнт не може відповісти - він не готовий замовляти. Запропонуй discovery call за $50 → з цього вийде нормальний скоуп → потім вже основний проект.
Time estimation формула
base_hours = 2 (setup, sticky notes, testing)
+ N_nodes × 0.5 (для звичайних)
+ N_ai_nodes × 1.5 (AI workflows тривають довше у дебагу)
+ 2 (handover, screencast, docs)
+ buffer (×1.3 завжди)
= скільки годин = ціна за твою hourly rate
Ціни (Fiverr 2026)
Орієнтир станом на 2026-05. Конкретні цифри залежать від тиру seller (New / Level 1 / Level 2 / Top Rated) і твого реgion.
Workflow building (per-project)
| Tier | Scope | Ціна | Delivery |
|---|---|---|---|
| Basic | 1 trigger + 3-5 nodes, no AI, no error workflow | $30-80 | 2-3 дні |
| Standard | 2 triggers, 10+ nodes, error handling, sticky notes | $100-250 | 4-7 днів |
| Premium | AI Agent + memory + RAG, error workflow, docs, video walkthrough | $300-800 | 7-14 днів |
Setup і infrastructure
- Basic setup: n8n у Docker single instance на клієнтовому VPS, HTTPS - $100-150.
- Queue mode setup: + Redis, worker scaling, monitoring - $200-400.
- Migration з cloud n8n до self-host: $150-300 (експорт workflows + import + credentials re-setup).
Maintenance (monthly retainer)
- Light: monitor errors, monthly update, 1 bug fix - $50/міс.
- Standard: + 2 small new workflows / зміни - $100-150/міс.
- Heavy: + on-call alerts, 5+ workflows changes, 24h response - $250-500/міс.
Add-ons
- Custom node development: $300-1500 залежно від complexity.
- Loom video walkthrough: +$30-50.
- Source control setup (Git, CI/CD): +$100-200.
- Monitoring stack (Uptime Kuma або Grafana): +$50-100.
Доставка: що отримує клієнт
Хороша доставка = клієнт хвалить у відгуку = більше замовлень. Включай ці artifacts завжди.
Mandatory delivery package
- Workflow JSON export - кнопка Download у workflow editor. Клієнт може re-import у новий n8n.
- README.md у клієнтовому Notion або Git:
- Що workflow робить (2-3 речення)
- Який trigger, які зовнішні сервіси, де credentials
- Як активувати / деактивувати
- Як знайти execution log
- Куди звертатися при поломці
- Sticky notes у самому workflow - inline документація (розділ 3.9).
- Loom screencast 5-10 хв:
- Walkthrough від trigger до output
- Як подивитися останні runs
- Як re-run failed
- 30 days revisions - стандарт Fiverr. Лагідно нагадуй, що "feature requests" - окремий quote.
Premium add-ons (за extra fee)
- Error workflow з alerts у Slack/Telegram - $30-50 extra.
- Uptime monitor налаштований і inteграється з нотифікаціями - $20-50.
- Monthly maintenance retainer pitch - запропонуй у delivery message.
- Backup script + cron + off-site rclone - $50-100.
Delivery message template
Привіт, [Client]!
Workflow готовий. Дивись:
1. JSON: attached - на випадок міграції
2. README у твоєму Notion: [link]
3. Video walkthrough: [Loom link, 7 хв]
4. Workflow у твоєму n8n: [link]
Перевір 1-2 виконання, дай знати, якщо щось
треба доопрацювати - у тебе 30 днів revisions.
Бонус: якщо хочеш monthly maintenance ($75/міс)
- я моніторю errors, оновлюю n8n, додаю до 2
небольших workflows. Дай знати.
[Your name]
5 portfolio templates для GitHub
Перед запуском gig - заходь у GitHub з готовим repo "n8n-templates". 5 робочих JSON-ів = доказ профі. Клієнти на Fiverr заходять перевірити "хто це взагалі".
Template 1: Form → CRM + Slack + Email confirmation
- Trigger: Webhook (Typeform/Tally form submit).
- Flow: enrich через Clearbit → save до HubSpot як deal → Slack notify sales-team → email "thanks for inquiry".
- Error: Slack alert у #ops.
- Selling point: "Lead-to-CRM в 1 крок без manual data entry".
Template 2: RSS daily digest → Telegram
- Trigger: Schedule (09:00 daily).
- Flow: RSS Read x3 джерела → Aggregate → AI summarize (gpt-4o-mini) → Telegram message.
- Bonus: для personal use - твій morning brief.
- Selling point: "Newsletter без email-bloat".
Template 3: Stripe webhook → Discord + Google Sheets log
- Trigger: Webhook з signature verification.
- Flow: Switch by event.type → Discord embed + Sheet append.
- Idempotency: check by event.id у Sheets.
- Selling point: "Real-time revenue tracking без custom backend".
Template 4: AI chatbot з Postgres memory + Google Sheets RAG
- Trigger: Chat Trigger (вбудоване UI).
- Flow: AI Agent з OpenAI + Postgres memory (threadId) + Google Sheets як knowledge base tool.
- Selling point: "Customer support 24/7 з FAQ-based AI".
- Хедлайнер для premium gig.
Template 5: Schedule API health check → multi-channel alert
- Trigger: Schedule (every 5 min).
- Flow: HTTP Request до твого API → IF status != 200 || responseTime > 2000 → Telegram alert + Asana task create + log до Sheets.
- Selling point: "Custom uptime monitoring дешевше за StatusCake".
Github repo structure
n8n-templates/
├── README.md # обзор кожного template
├── 01-form-to-crm/
│ ├── workflow.json # імпортуваний у n8n
│ ├── README.md # setup steps + screenshot
│ └── env.example # потрібні credentials
├── 02-rss-telegram-digest/
├── 03-stripe-discord/
├── 04-ai-chatbot-rag/
└── 05-api-health-monitor/
Червоні прапори клієнтів
Деякі запити - чітко "не починай". Економить тебе тижні нервів.
🚩 "Зроби as Zapier but our own SaaS"
Запит на white-label/multi-tenant з n8n. Заборонено Sustainable Use License. Або відмовляй, або refer клієнта до n8n.io sales для commercial agreement.
🚩 "Збирай credentials наших users"
"User credential collection: Using n8n to collect end users' own credentials to access their data and feed it into your application" - заборонено. Не починай.
🚩 "Бюджет $20, треба завтра, AI з 5 інтеграціями"
Underpriced unrealistic request. Або клієнт не розуміє вартості (виховуй), або шукає naive seller. Скажи real estimate і йди далі.
🚩 Немає admin access до VPS / API credentials
Без доступу не зможеш доставити. Якщо клієнт скаже "потім" - не починай, чекай поки буде усе.
🚩 "Просто скопіюй цей готовий workflow з YouTube"
OK скопіювати template, але якщо клієнт думає що це 30 хв роботи - дійсно скопіюй за $30 і не обіцяй support. Не вкладай години у "просту" річ.
🚩 Не хоче sticky notes "бо це непотрібно"
Не хоче документацію зараз = звинуватить тебе у "погано пояснив" пізніше. Включай sticky notes завжди, навіть якщо клієнт каже "пропусти".
🚩 Просить hardcoded credentials у Code node
Якщо клієнт наполягає "впиши API key прямо у код" - він не розуміє безпеку. Пояси про Credentials feature. Якщо все одно наполягає - зеленим маркером у offer "I am not responsible for security implications" або відмовляй.
🚩 "Хочемо як у Zapier, але дешевше"
n8n != Zapier-clone. Якщо клієнт хоче drag-and-drop без code, не розуміє differences - можливо йому реально Zapier краще підходить. Чесно скажи це і збережи репутацію.
Куди далі
Курс пройдено. Подальші кроки - building practice і community.
Тиждень 1-2 після курсу
- Підняти власну n8n instance на твоєму VPS (Hetzner CX22).
- Реалізувати 5 portfolio templates з 8.6. Закомітити у public Github.
- Записати 1 Loom walkthrough на один з template-ів.
Тиждень 3-4
- Створити Fiverr gig: фокус 1 ніша - наприклад "AI chatbot with n8n + OpenAI".
- Gallery: скріншоти твоїх template workflows.
- Pricing: Basic / Standard / Premium (з 8.4).
- FAQ: про license, hosting, scope.
Тиждень 5-12
- Перші замовлення - ціни на 20% нижче market для review collection.
- 3-5 reviews → починай піднімати ціни.
- Кожен closed gig → запропонуй monthly maintenance ($50-150/міс) = passive income.
Постійні ресурси
- Templates: n8n.io/workflows - 900+ community templates. Подивись як інші вирішують.
- Community: community.n8n.io - форум. Питай, відповідай. Якісні відповіді = visibility.
- Release notes: github.com/n8n-io/n8n/releases - підпишися на email або RSS. Кожен тиждень новий relize.
- YouTube: офіційний канал n8n, Max Tkacz, Jonathan Bouman - вирізки на 5-15 хв з конкретними patterns.
Куди розширюватися
- Custom nodes - TypeScript SDK для n8n. Окрема велика тема, але якщо твій клієнт має API без вбудованої інтеграції в n8n - custom node = $300-1500 gig.
- Kubernetes - для great scaling (10K+ workflows/hour). Helm chart офіційно підтримується. Для агенцій з 50+ клієнтами.
- LangChain deep - складніші AI patterns: multi-agent systems, custom retrievers. Premium AI consulting niche.
Чек-лист "ready for Fiverr"
- ☐ Можу підняти n8n у Docker за 10 хв
- ☐ Розумію Sustainable Use License і свої обмеження
- ☐ Маю 5 робочих template workflows у Github
- ☐ Зробив принаймні 1 Loom walkthrough
- ☐ Розгорнув production n8n з HTTPS на власному домені
- ☐ Маю backup стратегію і тест-restore процедуру
- ☐ Готовий gig у Fiverr з clear scope і pricing tiers
Курс пройдено ✓
- Підняли n8n у Docker (dev, queue mode, production з Traefik)
- Зрозуміли модель даних n8n: items, json/binary, pin data
- Опанували 20 основних нод: Trigger/IF/Switch/Set/Code/HTTP Request/Webhook
- Навчилися писати expressions
{{ $json.x }}і Code (JS + Python) - Підключили AI Agent з memory і tools, побудували chatbot з RAG
- Розгорнули production з queue mode, retention, metrics, 2FA
- Зрозуміли Sustainable Use License: що дозволено для Fiverr, що ні
- Розробка кастомних n8n nodes (окремий TypeScript SDK курс)
- Глибокий LangChain (за межами cluster nodes)
- Embedded n8n у власному SaaS (заборонено ліцензією)
- Kubernetes Helm chart (тема для DevOps на high-scale)
- Enterprise features (RBAC, SSO, audit logs)
- Збирай портфоліо: 5 шаблонів з розділу 8 → твій GitHub
- Створи Fiverr gig: фокус на 1 нішу (AI або CRM integration)
- Підписуйся на release notes: github.com/n8n-io/n8n/releases
- Community templates: n8n.io/workflows
- Forum для проблем: community.n8n.io