AutomationFlowsSlack & Telegram › Sellf: Monitor Nieudanych Webhooków + Auto-retry

Sellf: Monitor Nieudanych Webhooków + Auto-retry

Sellf: Monitor nieudanych webhooków + auto-retry. Uses httpRequest, telegram. Scheduled trigger; 10 nodes.

Cron / scheduled trigger★★★★☆ complexity10 nodesHTTP RequestTelegram
Slack & Telegram Trigger: Cron / scheduled Nodes: 10 Complexity: ★★★★☆ Added:

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 →

Download .json
{
  "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
  }
}
Pro

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 →

More Slack & Telegram workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Slack & Telegram

Auto Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.

HTTP Request, Google Sheets, RSS Feed Read +1
Slack & Telegram

Auto-Hunt. Uses httpRequest, googleSheets, rssFeedRead, telegram. Scheduled trigger; 78 nodes.

HTTP Request, Google Sheets, RSS Feed Read +1
Slack & Telegram

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

Telegram, Google Drive, HTTP Request
Slack & Telegram

. Uses googleSheets, telegram, httpRequest, wise. Scheduled trigger; 36 nodes.

Google Sheets, Telegram, HTTP Request +2
Slack & Telegram

GNCA AI News Pipeline. Uses rssFeedRead, httpRequest, telegram, errorTrigger. Scheduled trigger; 31 nodes.

RSS Feed Read, HTTP Request, Telegram +1