وبهوک
Webhook
دریافت درخواست HTTP و فعالسازی workflow به عنوان Trigger اصلی n8n
نمای کلی
نود Webhook مهمترین و اساسیترین Trigger نود در n8n است. این نود یک URL اختصاصی HTTP ایجاد میکند که هر زمان درخواستی به آن ارسال شود، workflow مربوطه فعال میشود. بدون Webhook، بسیاری از اتوماسیونهای مبتنی بر رویداد غیرممکن خواهند بود.
قابلیتهای کلیدی:
- پشتیبانی از متدهای HTTP: GET, POST, PUT, DELETE, PATCH, HEAD
- احراز هویت: None (عمومی)، Basic Auth، Header Auth، JWT
- حالتهای پاسخدهی: فوری (Immediately)، آخرین نود (Last Node)، پاسخ سفارشی (Respond to Webhook)
- دریافت و پردازش Binary Data (فایلها)
- دسترسی به Query Parameters، Headers و Path Parameters
- دو نوع URL: Test URL (برای توسعه) و Production URL (برای استفاده واقعی)
- تنظیمات CORS برای درخواستهای Cross-Origin
- امکان IP Whitelisting برای افزایش امنیت
تفاوت Test URL و Production URL:
- Test URL: فقط در حالت Test Workflow فعال است. برای توسعه و دیباگ استفاده میشود. پس از بستن تست غیرفعال میشود.
- Production URL: فقط وقتی Workflow فعال (Active) باشد کار میکند. برای استفاده واقعی و اتصال سرویسهای خارجی.
تفاوت با HTTP Request Node:
- Webhook: منتظر دریافت درخواست از خارج میماند (منفعل/Passive) - یک Trigger است
- HTTP Request: درخواست را به سرویس خارجی ارسال میکند (فعال/Active) - یک Action است
چرا Webhook مهمترین Trigger است؟
بسیاری از سرویسها و پلتفرمها (درگاههای پرداخت، GitHub، GitLab، فروشگاههای آنلاین، CRM، سیستمهای مانیتورینگ) رویدادهای خود را از طریق HTTP Webhook اطلاعرسانی میکنند. بدون این نود، ارتباط بلادرنگ با اکثر سیستمها ممکن نیست.
احراز هویت
احراز هویت Webhook
1. بدون احراز هویت (None)
سادهترین حالت. URL عمومی است و هر کسی میتواند آن را فراخوانی کند.
- مناسب برای تست و webhookهای عمومی
- برای سرویسهایی که خودشان امنیت دارند (مثل GitHub Webhook Secret)
https://your-n8n.example.com/webhook/abc-123-def2. Basic Auth
احراز هویت با Username و Password. کلاینت باید هدر Authorization را ارسال کند:
Authorization: Basic base64(username:password)تنظیم در n8n:
- 1Authentication: Basic Auth
- 2در Credential: Username و Password را وارد کنید
- 3n8n خودکار هدر Authorization را بررسی میکند
مثال فراخوانی با curl:
curl -u myuser:mypass https://your-n8n.example.com/webhook/my-path3. Header Auth
بررسی یک Header سفارشی با مقدار مشخص:
X-API-Key: your-secret-api-key-hereتنظیم در n8n:
- 1Authentication: Header Auth
- 2در Credential: Header Name و Expected Value وارد کنید
- 3هر درخواست بدون هدر صحیح رد میشود
4. JWT (JSON Web Token)
برای سناریوهای پیشرفتهتر، میتوانید JWT را در Code node بعد از Webhook اعتبارسنجی کنید:
const token = $json.headers.authorization?.replace('Bearer ', '');
// اعتبارسنجی JWT tokenنکات امنیتی:
- برای webhookهای حیاتی (پرداخت، احراز هویت) حتماً از Header Auth یا Basic Auth استفاده کنید
- URL webhook به تنهایی امنیت کافی نیست - حتی اگر طولانی و تصادفی باشد
- HTTPS را همیشه فعال کنید تا دادهها رمزنگاری شوند
- از IP Whitelisting در Reverse Proxy (nginx/Caddy) استفاده کنید
عملیاتهای موجود
receivePostData
دریافت داده JSON یا Form Data از طریق متد POST. رایجترین حالت استفاده از Webhook.
receiveGetRequest
دریافت درخواست GET با Query Parameters. مناسب برای verificationها و callbackهای ساده.
handleFileUpload
دریافت فایلهای باینری از طریق multipart/form-data. مناسب برای آپلود تصویر، PDF و غیره.
customResponse
ارسال پاسخ HTTP سفارشی با هدرها و بدنه دلخواه. از نود Respond to Webhook استفاده میشود.
waitForWebhook
توقف workflow تا دریافت درخواست Webhook. مناسب برای تایید کاربر یا callback پرداخت.
handleFormSubmission
دریافت و پردازش داده فرم HTML (application/x-www-form-urlencoded یا multipart/form-data).
apiEndpoint
ایجاد endpoint اختصاصی REST API با Webhook. مناسب برای ساخت Microservice.
multiMethodHandling
پاسخ به چندین متد HTTP در یک Webhook با استفاده از ALL یا Switch بر اساس متد.
binaryResponse
ارسال فایل (تصویر، PDF، ZIP) به عنوان پاسخ Webhook. مناسب برای API تولید فایل.
corsConfiguration
تنظیم Cross-Origin Resource Sharing برای فراخوانی از مرورگر و فرانتاند.
pathParameters
استفاده از پارامترهای داینامیک در مسیر webhook مثل :id یا :action.
rawBody
دریافت بدنه خام درخواست بدون پارس شدن. مناسب برای HMAC signature verification.
کاربردهای متداول
کاربردهای رایج
۱. Callback درگاه پرداخت (ZarinPal / IDPay)
پس از پرداخت موفق، درگاه کاربر را به URL callback هدایت میکند:
Webhook (GET: /payment/verify)
→ Set (Authority = query.Authority, Status = query.Status)
→ IF (Status == "OK")
→ HTTP Request (POST: ZarinPal Verify API)
Body: { merchant_id, authority, amount }
→ IF (verified)
→ MySQL (بهروزرسانی وضعیت سفارش)
→ Telegram (اعلان پرداخت موفق)
→ Respond to Webhook (redirect به صفحه موفقیت)
→ Else: Respond to Webhook (redirect به صفحه خطا)۲. دریافت Webhook از GitHub
اعلان push، pull request، issue و سایر رویدادهای مخزن:
Webhook (POST: /github-events)
Authentication: Header Auth (X-Hub-Signature-256)
→ Switch (بر اساس headers.x-github-event)
→ push: Telegram (اعلان push جدید به تیم)
→ pull_request: MySQL (ثبت PR) + Telegram
→ issues: Telegram (اعلان issue جدید)
→ release: Telegram (اعلان نسخه جدید)۳. دریافت فرم وبسایت (Contact Form)
پردازش فرم تماس یا ثبتنام از سایت:
Webhook (POST: /contact-form)
→ Set (name, email, phone, message)
→ IF (email معتبر AND phone معتبر)
→ MySQL (ذخیره در دیتابیس)
→ Email (ارسال تایید به کاربر)
→ Telegram (اعلان به تیم پشتیبانی)
→ Respond to Webhook (200: "پیام شما دریافت شد")
→ Else: Respond to Webhook (400: "اطلاعات نامعتبر")۴. دریافت داده از دستگاههای IoT
سنسورها و دستگاههای هوشمند دادهها را به webhook ارسال میکنند:
Webhook (POST: /iot/sensor-data)
Authentication: Header Auth (X-Device-Key)
→ Set (deviceId, temperature, humidity, timestamp)
→ MySQL (ذخیره داده سنسور)
→ IF (temperature > 40 OR humidity > 90)
→ Telegram (هشدار: مقدار غیرعادی سنسور!)
→ Respond to Webhook (200: "received")۵. یکپارچهسازی با CRM
دریافت رویدادهای CRM مثل ثبت مشتری جدید یا تغییر وضعیت معامله:
Webhook (POST: /crm/deal-update)
→ Switch (بر اساس event_type)
→ deal_won:
→ MySQL (بهروزرسانی وضعیت)
→ Email (فاکتور به مشتری)
→ Telegram (تبریک به تیم فروش)
→ deal_lost:
→ MySQL (ثبت دلیل از دست دادن)
→ Telegram (گزارش به مدیر فروش)
→ new_lead:
→ MySQL (ثبت سرنخ جدید)
→ Telegram (اعلان به تیم فروش)۶. اعلان سفارش فروشگاه آنلاین (WooCommerce / Shopify)
دریافت سفارش جدید از فروشگاه:
Webhook (POST: /shop/new-order)
→ Set (فرمت فارسی سفارش)
→ MySQL (ذخیره سفارش)
→ Telegram (sendMessage)
Text: "سفارش جدید #{{$json.order_id}}
مشتری: {{$json.customer_name}}
مبلغ: {{$json.total}} تومان"
→ Email (ایمیل تایید سفارش)
→ Respond to Webhook (200)۷. هشدارهای مانیتورینگ (Grafana / Prometheus / UptimeRobot)
دریافت alertها از سیستمهای مانیتورینگ:
Webhook (POST: /alerts/monitoring)
→ Switch (بر اساس severity)
→ critical:
→ Telegram (هشدار فوری با ایموجی قرمز)
→ Email (اعلان به تیم DevOps)
→ HTTP Request (ریستارت سرویس خودکار)
→ warning:
→ Telegram (هشدار با ایموجی زرد)
→ resolved:
→ Telegram (اعلان حل شدن مشکل)۸. Backend چتبات
ساخت API برای چتبات وبسایت یا اپلیکیشن:
Webhook (POST: /chatbot/message)
Authentication: Header Auth
→ Set (userId, message, sessionId)
→ Switch (بر اساس intent تشخیص داده شده)
→ سوال قیمت: MySQL (استعلام قیمت) → پاسخ
→ وضعیت سفارش: MySQL (بررسی سفارش) → پاسخ
→ پشتیبانی: ایجاد تیکت → پاسخ
→ Respond to Webhook (JSON پاسخ چتبات)۹. API Gateway ساده
ساخت API برای اپلیکیشن موبایل یا فرانتاند:
Webhook (ALL: /api/v1/products)
Authentication: Header Auth (X-API-Key)
→ Switch (بر اساس $json.method)
→ GET: MySQL (لیست محصولات) → Respond (JSON)
→ POST: MySQL (ثبت محصول) → Respond (201: created)
→ PUT: MySQL (بهروزرسانی) → Respond (200: updated)
→ DELETE: MySQL (حذف) → Respond (204)۱۰. Trigger خط لوله CI/CD
فعالسازی workflow توسط GitLab CI یا GitHub Actions پس از deploy:
Webhook (POST: /ci/deploy-complete)
Authentication: Header Auth
→ Set (branch, commit, environment, status)
→ IF (status == "success")
→ Telegram (اعلان deploy موفق)
→ HTTP Request (بررسی health سرویس)
→ MySQL (ثبت تاریخچه deploy)
→ Else:
→ Telegram (هشدار: deploy ناموفق!)
→ Email (لاگ خطا به تیم)۱۱. دریافت Webhook از GitLab
مدیریت رویدادهای مخزن GitLab:
Webhook (POST: /gitlab-hook)
Authentication: Header Auth (X-Gitlab-Token)
→ Switch (بر اساس object_kind)
→ push: اعلان commit جدید
→ merge_request: بررسی و اعلان MR
→ pipeline: اعلان وضعیت pipeline
→ tag_push: اعلان تگ جدید۱۲. سیستم تایید دو مرحلهای
ایجاد لینک تایید برای کاربران:
Workflow اول:
→ تولید token تایید
→ Email (لینک: https://n8n.example.com/webhook/verify?token=xxx)
Webhook (GET: /verify)
→ Set (token = query.token)
→ MySQL (بررسی و اعتبارسنجی token)
→ IF (valid)
→ MySQL (فعالسازی حساب)
→ Respond to Webhook (HTML: "حساب شما فعال شد!")
→ Else: Respond to Webhook (400: "لینک نامعتبر")نکات حرفهای
نکات حرفهای
۱. همیشه از Production URL استفاده کنید
Test URL فقط برای توسعه است. برای اتصال سرویسهای واقعی، Workflow را Active کنید و از Production URL استفاده نمایید.
۲. Response Mode را درست انتخاب کنید
- Immediately: فوراً پاسخ 200 میدهد (بهترین برای callbackهای پرداخت و سرویسهایی که timeout کوتاه دارند)
- When Last Node Finishes: بعد از اتمام workflow پاسخ میدهد (برای APIهایی که نتیجه لازم دارند)
- Using Respond to Webhook Node: پاسخ سفارشی با هدر و بدنه دلخواه (حرفهایترین)
۳. دسترسی به اجزای درخواست
// بدنه درخواست (POST body)
{{$json.body}}
// Query Parameters (GET ?key=value)
{{$json.query.key}}
// Headers
{{$json.headers['content-type']}}
{{$json.headers['x-api-key']}}
// متد HTTP (وقتی از ALL استفاده میکنید)
{{$json.method}}
// Path Parameters
{{$json.params.id}}
// IP فراخوان
{{$json.headers['x-forwarded-for']}}۴. پاسخ سفارشی با Respond to Webhook
برای ارسال پاسخ کامل سفارشی:
Webhook (Response Mode: Using Respond to Webhook Node)
→ پردازش دادهها
→ Respond to Webhook
Response Code: 200
Response Body: { "status": "success", "data": ... }
Response Headers:
Content-Type: application/json
X-Custom-Header: value۵. امنیت webhook را جدی بگیرید
- حتماً از Authentication (Header Auth یا Basic Auth) استفاده کنید
- برای سرویسهایی مثل GitHub از Webhook Secret و HMAC Signature استفاده کنید
- IP Whitelisting در Reverse Proxy تنظیم کنید
- HTTPS اجباری باشد
- داده ورودی را همیشه validate کنید
۶. تست webhook با curl
# تست ساده POST
curl -X POST https://n8n.example.com/webhook/test-path \
-H "Content-Type: application/json" \
-d '{"name":"test","value":123}'
# تست با Header Auth
curl -X POST https://n8n.example.com/webhook/secure-path \
-H "Content-Type: application/json" \
-H "X-API-Key: my-secret-key" \
-d '{"event":"order.created"}'
# تست GET با Query Params
curl "https://n8n.example.com/webhook/verify?token=abc&status=OK"
# تست آپلود فایل
curl -X POST https://n8n.example.com/webhook/upload \
-F "file=@/path/to/document.pdf" \
-F "description=فاکتور فروش"
# تست Basic Auth
curl -u admin:secretpass https://n8n.example.com/webhook/protected۷. HMAC Signature Verification
برای سرویسهایی مثل GitHub و Stripe که signature ارسال میکنند:
// در Code node بعد از Webhook
const crypto = require('crypto');
const secret = 'your-webhook-secret';
const payload = JSON.stringify($json.body);
const signature = $json.headers['x-hub-signature-256'];
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(payload)
.digest('hex');
if (signature !== expected) throw new Error('Invalid signature');۸. مدیریت Idempotency
از تکرار پردازش جلوگیری کنید:
Webhook → Set (eventId = body.event_id)
→ MySQL (SELECT WHERE event_id = ?)
→ IF (قبلاً پردازش نشده)
→ پردازش اصلی
→ MySQL (INSERT event_id)
→ Else: Respond (200: "already processed")۹. Multi-Method API با Switch
Webhook (ALL: /api/resource)
→ Switch (بر اساس {{$json.method}})
→ GET: خواندن از دیتابیس → Respond (لیست)
→ POST: ذخیره در دیتابیس → Respond (201)
→ PUT: بهروزرسانی → Respond (200)
→ DELETE: حذف → Respond (204)۱۰. Webhook URL را از Environment Variable بگیرید
N8N_HOST=n8n.example.com
WEBHOOK_URL=https://n8n.example.com/
N8N_PROTOCOL=https
N8N_PORT=5678۱۱. پاسخ HTML برای Redirect
// در Respond to Webhook
Response Code: 302
Response Headers:
Location: https://mysite.com/success?order=123
// یا پاسخ HTML:
Response Body: "<html><body>با تشکر! <a href='https://mysite.com'>بازگشت</a></body></html>"
Content-Type: text/html۱۲. لاگ تمام درخواستهای ورودی
برای Debug و مانیتورینگ:
Webhook → Code (لاگ جزئیات)
console.log('Method:', $json.method);
console.log('Headers:', JSON.stringify($json.headers));
console.log('Body:', JSON.stringify($json.body));
console.log('Query:', JSON.stringify($json.query));
→ ادامه workflow۱۳. مدیریت خطا در webhook workflow
Webhook
→ Error Trigger (on error in workflow)
→ Telegram (اعلان خطا به ادمین)
→ Respond to Webhook (500: "Internal Error")
// یا از try/catch در Code node استفاده کنید۱۴. تنظیمات nginx برای Webhook
location /webhook/ {
proxy_pass http://localhost:5678/webhook/;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_buffering off;
client_max_body_size 50m;
}۱۵. Rate Limiting در Reverse Proxy
برای جلوگیری از حمله DDoS به webhook:
limit_req_zone $binary_remote_addr zone=webhook:10m rate=10r/s;
location /webhook/ {
limit_req zone=webhook burst=20 nodelay;
proxy_pass http://localhost:5678/webhook/;
}۱۶. Webhook برای چندین Environment
از path متفاوت برای محیطهای مختلف استفاده کنید:
Production: /webhook/payment/verify
Staging: /webhook/staging/payment/verifyرفع مشکلات
رفع مشکلات رایج
۱. Webhook درخواست دریافت نمیکند (404 Not Found)
علت: Workflow فعال نیست یا URL اشتباه است
راهحل
- مطمئن شوید Workflow حتماً Active (فعال) است
- از Production URL استفاده کنید نه Test URL
- مسیر webhook را دقیق بررسی کنید (case-sensitive است)
- بررسی کنید n8n در حال اجرا باشد
- اگر پشت Reverse Proxy هستید، مسیر /webhook/ به درستی proxy شده باشد
۲. اشتباه بین Test URL و Production URL
علت: رایجترین اشتباه کاربران n8n
راهحل
- Test URL فقط وقتی دکمه "Listen for Test Event" فعال باشد کار میکند
- Production URL فقط وقتی Workflow فعال (Active) باشد کار میکند
- فرمت Test:
https://n8n.example.com/webhook-test/path - فرمت Production:
https://n8n.example.com/webhook/path - برای اتصال سرویسهای واقعی همیشه از Production استفاده کنید
۳. مشکلات SSL/HTTPS
علت: گواهی SSL نامعتبر یا ناقص، یا استفاده از HTTP بجای HTTPS
راهحل
- اکثر سرویسها (GitHub, Stripe, ZarinPal) فقط HTTPS قبول میکنند
- از Let's Encrypt یا Cloudflare SSL استفاده کنید
- مطمئن شوید زنجیره گواهی کامل است (fullchain)
WEBHOOK_URLدر تنظیمات n8n باید HTTPS باشد- تنظیم محیطی:
N8N_PROTOCOL=https
۴. Timeout و عدم پاسخ به موقع
علت: Workflow طولانی است و سرویس فراخوان timeout میکند
راهحل
- Response Mode را روی Immediately تنظیم کنید
- ابتدا پاسخ 200 برگردانید، سپس پردازش سنگین انجام شود
- برای پرداختها: فوراً تایید دریافت بفرستید
- اکثر سرویسها ۵ تا ۳۰ ثانیه timeout دارند
- از Respond to Webhook Node در ابتدای workflow استفاده کنید
۵. خطا در دریافت Binary Data (فایل)
علت: تنظیمات باینری فعال نیست یا Content-Type اشتباه است
راهحل
- گزینه Binary Data را در تنظیمات Webhook فعال کنید
- Content-Type درخواست باید
multipart/form-dataباشد - نام فیلد فایل را در Binary Property Name مشخص کنید
- حداکثر حجم فایل n8n را بررسی کنید:
N8N_PAYLOAD_SIZE_MAX
۶. مشکلات CORS (Cross-Origin)
علت: مرورگر درخواست Cross-Origin را مسدود میکند
راهحل
- در تنظیمات Webhook، Response Headers اضافه کنید:
Access-Control-Allow-Origin: * (یا دامنه خاص)
- n8n خودکار به OPTIONS respond میکند
- اگر مشکل ادامه دارد، CORS را در Reverse Proxy (nginx) تنظیم کنید
- از
Access-Control-Allow-HeadersوAccess-Control-Allow-Methodsاستفاده کنید
۷. خطای احراز هویت (401 Unauthorized)
علت: اطلاعات احراز هویت اشتباه یا ارسال نمیشود
راهحل
- مطمئن شوید Header Auth دقیقاً با نام و مقدار تنظیمشده مطابقت دارد
- برای Basic Auth: هدر
Authorization: Basic base64(user:pass) - با Postman یا curl ابتدا تست کنید
- توجه: نام Header در n8n حساس به حروف بزرگ/کوچک نیست
۸. خطای Payload Too Large (413)
علت: حجم داده ارسالی بیش از حد مجاز n8n
راهحل
- محدودیت پیشفرض n8n: حدود 16MB
- متغیر محیطی
N8N_PAYLOAD_SIZE_MAXرا افزایش دهید - اگر پشت nginx هستید:
client_max_body_size 100m; - برای فایلهای بزرگ: فایل را روی Object Storage آپلود کنید و فقط URL را ارسال کنید
۹. تکرار اجرای Webhook (Duplicate Triggers)
علت: سرویس فراخوان چندبار retry میکند
راهحل
- اکثر سرویسها (Stripe, GitHub) در صورت عدم دریافت 2xx، مجدداً تلاش میکنند
- فوراً پاسخ 200 برگردانید (Response Mode: Immediately)
- از Idempotency Key استفاده کنید:
ذخیره شناسه رویداد در دیتابیس و بررسی تکراری نبودن
- برای ZarinPal: Authority را بررسی کنید که قبلاً پردازش نشده باشد
۱۰. n8n پشت Reverse Proxy کار نمیکند
علت: تنظیمات proxy webhook path را تغییر میدهد
راهحل
WEBHOOK_URLرا با آدرس عمومی تنظیم کنید:
WEBHOOK_URL=https://n8n.yourdomain.com/
- در nginx:
location /webhook/ { proxy_pass http://localhost:5678/webhook/; } location /webhook-test/ { proxy_pass http://localhost:5678/webhook-test/; }
- هدرهای proxy:
proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto $scheme;
۱۱. داده خالی دریافت میشود
علت: Content-Type اشتباه یا بدنه خالی ارسال میشود
راهحل
- بررسی Content-Type: برای JSON باید
application/jsonباشد - برای فرم:
application/x-www-form-urlencodedیاmultipart/form-data - دادهها در
$json.body(POST) یا$json.query(GET) هستند - از Raw Body برای بررسی داده خام استفاده کنید
