This workflow follows the HTTP Request → Telegram recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"name": "Sellf: Monitor nieudanych webhook\u00f3w + auto-retry",
"nodes": [
{
"id": "sticky-overview",
"name": "Overview",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-760,
-400
],
"parameters": {
"color": 1,
"width": 700,
"height": 440,
"content": "## Monitoruj nieudane dostawy webhook\u00f3w Sellfa i ponawiaj je automatycznie\n\n### Jak to dzia\u0142a\nWebhooki padaj\u0105 po cichu - odbiorca le\u017ca\u0142 minut\u0119 i Twoja automatyzacja faktur/CRM bezg\u0142o\u015bnie przegapi\u0142a sprzeda\u017c. Co godzin\u0119 ten workflow listuje endpointy webhook\u00f3w [Sellf](https://github.com/jurczykpawel/sellf) - self-hostowana platforma checkout dla produkt\u00f3w cyfrowych, \u015bci\u0105ga logi nieudanych dostaw ka\u017cdego z nich, alarmuje Ci\u0119 na Telegramie (endpoint + nieudane eventy) i od razu kolejkuje retry do pi\u0119ciu dostaw na endpoint przez API Sellfa. Samonaprawiaj\u0105ca si\u0119 hydraulika dla wszystkiego, co zbudowa\u0142e\u015b na webhookach.\n\n### Konfiguracja\n1. W adminie Sellfa utw\u00f3rz klucz API (**Settings \u2192 API keys**).\n2. Uzupe\u0142nij **Configuration (EDIT ME)**: adres Sellfa, klucz API i id czatu Telegrama.\n3. Pod\u0142\u0105cz credentials bota Telegrama w **Alert on Telegram**.\n4. Aktywuj.\n\n### Mo\u017cliwo\u015bci modyfikacji\nPodnie\u015b limit ponowie\u0144 w **Split Log IDs** (domy\u015blnie 5 na endpoint na przebieg). Nie chcesz auto-retry? Skasuj ga\u0142\u0105\u017a retry i zostaw same alerty. Telegram \u2192 Slack/Discord przez HTTP z incoming webhookiem."
}
},
{
"id": "sticky-scan",
"name": "Section: Scan Deliveries",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
-760,
340
],
"parameters": {
"color": 7,
"width": 820,
"height": 220,
"content": "## Skan dostaw\nCo godzin\u0119: jedno wywo\u0142anie API listuje wszystkie nieudane dostawy webhook\u00f3w."
}
},
{
"id": "sticky-act",
"name": "Section: Alert & Retry",
"type": "n8n-nodes-base.stickyNote",
"typeVersion": 1,
"position": [
140,
180
],
"parameters": {
"color": 7,
"width": 820,
"height": 540,
"content": "## Alert i retry\nTy dostajesz podsumowanie na Telegramie, a workflow kolejkuje ponowienia (do 5 na endpoint)."
}
},
{
"id": "trigger-1",
"name": "Every Hour",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [
-700,
400
],
"parameters": {
"rule": {
"interval": [
{
"field": "hours",
"hoursInterval": 1
}
]
}
}
},
{
"id": "config-1",
"name": "Configuration (EDIT ME)",
"type": "n8n-nodes-base.set",
"typeVersion": 3.4,
"position": [
-400,
400
],
"parameters": {
"assignments": {
"assignments": [
{
"id": "a1",
"name": "sellfUrl",
"value": "https://your-sellf.example.com",
"type": "string"
},
{
"id": "a2",
"name": "apiKey",
"value": "paste-your-sellf-api-key",
"type": "string"
},
{
"id": "a3",
"name": "telegramChatId",
"value": "your-telegram-chat-id",
"type": "string"
}
]
},
"includeOtherFields": true,
"options": {
"stripBinary": false
}
},
"notes": "apiKey from Sellf admin -> Settings -> API keys."
},
{
"id": "http-2",
"name": "Get Failed Logs",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
-100,
400
],
"parameters": {
"method": "GET",
"url": "={{ $('Configuration (EDIT ME)').item.json.sellfUrl }}/api/v1/webhooks/logs?status=failed&limit=50",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ 'Bearer ' + $('Configuration (EDIT ME)').item.json.apiKey }}"
}
]
},
"options": {
"timeout": 30000
}
},
"notes": "One call lists failed deliveries across all endpoints."
},
{
"id": "code-2",
"name": "Check for Failures",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
200,
400
],
"parameters": {
"jsCode": "const config = $('Configuration (EDIT ME)').first().json;\nconst baseUrl = String(config.sellfUrl || '').replace(/\\/+$/, '');\nconst logs = ($input.first().json.data) || [];\nif (!Array.isArray(logs) || logs.length === 0) return [];\n\nconst byEndpoint = new Map();\nfor (const l of logs) {\n const key = l.endpoint_id || 'unknown';\n const agg = byEndpoint.get(key) || { lines: [], retries: [] };\n agg.lines.push(`\\u2022 ${l.event_type || 'unknown'} @ ${l.created_at || ''} (${l.http_status || 'timeout'})`);\n agg.retries.push({ retryUrl: `${baseUrl}/api/v1/webhooks/logs/${l.id}/retry` });\n byEndpoint.set(key, agg);\n}\n\nreturn [...byEndpoint.entries()].map(([endpointId, agg]) => ({ json: {\n endpointId,\n failedCount: agg.lines.length,\n retries: agg.retries.slice(0, 5),\n alertMessage: `\\u{1F534} *${agg.lines.length} failed webhook delivery(ies)*\\nEndpoint: ${endpointId}\\n\\n${agg.lines.slice(0, 5).join('\\n')}`,\n} }));"
},
"notes": "Groups failures per endpoint - nothing fails, nothing flows."
},
{
"id": "tg-1",
"name": "Alert on Telegram",
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
500,
240
],
"parameters": {
"resource": "message",
"operation": "sendMessage",
"chatId": "={{ $('Configuration (EDIT ME)').item.json.telegramChatId }}",
"text": "={{ $json.alertMessage }}",
"additionalFields": {
"parse_mode": "Markdown"
}
},
"notes": "Connect your Telegram bot credentials. Prefer Slack/Discord? Swap for an HTTP node posting to an incoming webhook."
},
{
"id": "code-3",
"name": "Split Log IDs",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
500,
560
],
"parameters": {
"jsCode": "const out = [];\nfor (const item of $input.all()) {\n for (const r of (item.json.retries || [])) out.push({ json: r });\n}\nreturn out;"
},
"notes": "Cap: 5 retries per endpoint per run - raise it here if you need more."
},
{
"id": "http-3",
"name": "Retry Failed Delivery",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
800,
560
],
"parameters": {
"method": "POST",
"url": "={{ $json.retryUrl }}",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "={{ 'Bearer ' + $('Configuration (EDIT ME)').item.json.apiKey }}"
}
]
},
"options": {
"timeout": 30000
}
},
"notes": "Queues the delivery for a fresh attempt through Sellf's own retry pipeline."
}
],
"connections": {
"Every Hour": {
"main": [
[
{
"node": "Configuration (EDIT ME)",
"type": "main",
"index": 0
}
]
]
},
"Configuration (EDIT ME)": {
"main": [
[
{
"node": "Get Failed Logs",
"type": "main",
"index": 0
}
]
]
},
"Get Failed Logs": {
"main": [
[
{
"node": "Check for Failures",
"type": "main",
"index": 0
}
]
]
},
"Check for Failures": {
"main": [
[
{
"node": "Alert on Telegram",
"type": "main",
"index": 0
},
{
"node": "Split Log IDs",
"type": "main",
"index": 0
}
]
]
},
"Split Log IDs": {
"main": [
[
{
"node": "Retry Failed Delivery",
"type": "main",
"index": 0
}
]
]
}
},
"settings": {
"executionOrder": "v1"
},
"meta": {
"templateCredsSetupCompleted": true
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
Sellf: Monitor nieudanych webhooków + auto-retry. Uses httpRequest, telegram. Scheduled trigger; 10 nodes.
Source: https://github.com/jurczykpawel/sellf/blob/a87a0242e14da363fdc6b069d7dd6f59aaf66f79/n8n/sellf-failed-webhooks-monitor-PL.json — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Auto Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.
Auto-Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.
This workflow runs daily at 9 AM, uses Perplexity to compile vaping industry news, optionally captures article screenshots via Browserless, and generates a HeyGen avatar video from a template. It then
. Uses googleSheets, telegram, httpRequest, wise. Scheduled trigger; 36 nodes.
GNCA AI News Pipeline. Uses rssFeedRead, httpRequest, telegram, errorTrigger. Scheduled trigger; 31 nodes.