<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stepan Nikonov</title>
    <description>The latest articles on DEV Community by Stepan Nikonov (@floxolab).</description>
    <link>https://dev.to/floxolab</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3997568%2Fdc0559e7-3a3a-4f2c-9dfe-01c4402a72ff.jpg</url>
      <title>DEV Community: Stepan Nikonov</title>
      <link>https://dev.to/floxolab</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/floxolab"/>
    <language>en</language>
    <item>
      <title>Website Uptime Monitoring with n8n</title>
      <dc:creator>Stepan Nikonov</dc:creator>
      <pubDate>Mon, 06 Jul 2026 01:21:10 +0000</pubDate>
      <link>https://dev.to/floxolab/website-uptime-monitoring-with-n8n-3c6g</link>
      <guid>https://dev.to/floxolab/website-uptime-monitoring-with-n8n-3c6g</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A 4-node workflow checks your website every 5 minutes and sends a Telegram, Slack, or Google Chat alert the moment it goes down, so you find out before a customer does.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most small business websites do not go down often. But when they do, the owner usually finds out the wrong way: a message from a customer saying the site is not loading, or a drop in bookings that only becomes obvious the next day.&lt;/p&gt;

&lt;p&gt;A basic uptime monitoring workflow changes that. Instead of waiting for someone to notice, n8n checks your site on a schedule and sends a direct alert to the place you already look when something needs attention: Telegram, Slack, Google Chat, or email.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Trigger&lt;/th&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Alert&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Every 5 minutes&lt;/td&gt;
&lt;td&gt;HTTP GET + status code&lt;/td&gt;
&lt;td&gt;Telegram (or Slack / Google Chat)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The workflow
&lt;/h2&gt;

&lt;p&gt;The whole setup fits in four nodes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schedule Trigger (every 5 min)
-&amp;gt; HTTP Request (GET your site)
-&amp;gt; IF (status code not 200?)
  -&amp;gt; true: send alert
  -&amp;gt; false: do nothing, site is up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl6duw0xol2bbg36je22z.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fl6duw0xol2bbg36je22z.webp" alt="n8n uptime monitoring workflow canvas: Schedule Trigger, HTTP Request, IF node, Telegram alert" width="800" height="239"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The false path connects to nothing. The workflow only acts when there is a problem. No alert means the check passed.&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  How each node is configured
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The false path does nothing on purpose.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No alert means the site responded with 200. The workflow stays quiet until something actually breaks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Schedule Trigger:&lt;/strong&gt; set to every 5 minutes. That gives a maximum 5-minute window before an alert fires. A 1-minute interval would generate noise from transient blips that recover on their own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;HTTP Request:&lt;/strong&gt; method GET, URL is the site homepage or a lightweight status endpoint. Set a &lt;strong&gt;Timeout&lt;/strong&gt; of around 10 000 ms. If the server takes longer than 10 seconds to respond, it is effectively down for a real user. In Settings, enable &lt;strong&gt;Continue on Fail&lt;/strong&gt; so a completely unreachable server does not stop the workflow before it reaches the IF node.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IF node:&lt;/strong&gt; condition checks whether &lt;code&gt;statusCode&lt;/code&gt; is not equal to 200. True path triggers the alert. False path is left unconnected.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Telegram node:&lt;/strong&gt; sends the alert message. n8n has native nodes for &lt;a href="https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.telegram/" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;, &lt;a href="https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/" rel="noopener noreferrer"&gt;Slack&lt;/a&gt;, and &lt;a href="https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.googlechat/" rel="noopener noreferrer"&gt;Google Chat&lt;/a&gt;. The channel matters less than whether the responsible person will actually see the message when it arrives.&lt;/p&gt;
&lt;h2&gt;
  
  
  The alert message
&lt;/h2&gt;

&lt;p&gt;The message uses node name referencing to pull the status code from the HTTP Request result:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🔴 Site Down Alert

Site: yoursite.com
Status: {{ $('Check Site').item.json.statusCode ?? 'offline' }}
Time: {{ $now.toISO() }}

Checked by n8n monitoring workflow.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiv6qgkyaqj1zz65tnft4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiv6qgkyaqj1zz65tnft4.webp" alt="Telegram alert messages from n8n uptime monitoring workflow showing site down notifications" width="403" height="507"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The alert fires in Telegram when the site check fails. Same pattern works in Slack, Google Chat, or email.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What to check when the alert fires
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cloudflare dashboard first.&lt;/strong&gt; Sometimes the origin is up but Cloudflare is returning a cached error or a 522. The dashboard shows recent errors and whether the issue is between Cloudflare and the origin.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Open the site from a different network.&lt;/strong&gt; Rules out a local DNS or ISP issue.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the VPS or hosting control panel.&lt;/strong&gt; A crashed process, full disk, or out-of-memory condition takes the site down without an application-level error.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Check the n8n execution log.&lt;/strong&gt; The HTTP Request output shows the exact status code and response body.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Monitoring multiple sites
&lt;/h2&gt;

&lt;p&gt;For several URLs, add a &lt;a href="https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.splitinbatches/" rel="noopener noreferrer"&gt;Loop Over Items&lt;/a&gt; node before the HTTP Request. Keep the URL list in a Code node or Google Sheets row, process each one at a time, and include the site URL in the alert message so you know which one triggered.&lt;/p&gt;

&lt;p&gt;For two or three sites, duplicating the workflow per site is simpler and easier to debug than building a loop.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This workflow handles HTTP-level availability. It complements, but does not replace, &lt;a href="https://floxolab.com/blog/n8n-error-workflow-telegram-alerts" rel="noopener noreferrer"&gt;n8n Error Workflow alerts&lt;/a&gt;, which protect your automations from failing silently. One watches the infrastructure, the other watches the workflows running on top of it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;em&gt;I originally published this on my site, &lt;a href="https://floxolab.com" rel="noopener noreferrer"&gt;FloxoLab&lt;/a&gt;, where I document practical automation and technical SEO for small business in the Philippines. If a workflow here is useful for your team, &lt;a href="https://floxolab.com/#contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>monitoring</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to Debug Failed n8n Workflows: Step-by-Step Guide</title>
      <dc:creator>Stepan Nikonov</dc:creator>
      <pubDate>Sun, 28 Jun 2026 20:41:45 +0000</pubDate>
      <link>https://dev.to/floxolab/how-to-debug-failed-n8n-workflows-step-by-step-guide-fej</link>
      <guid>https://dev.to/floxolab/how-to-debug-failed-n8n-workflows-step-by-step-guide-fej</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A workflow failed. The execution log shows a red node, but the error message is not obvious. This guide covers where to look first, how to reload real data and rerun, and the five errors that cause most n8n failures.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most n8n failures are not mysterious. They repeat the same patterns: a credential expired, an expression pointed to the wrong field, a webhook URL was the test one instead of the production one. The hard part is knowing where to start when all you see is a red node and a generic error message.&lt;/p&gt;

&lt;p&gt;This guide walks through the tools n8n gives you for debugging, the five errors that cover most real-world failures, and two nodes that help you handle failures more intentionally going forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Start with Execution History
&lt;/h2&gt;

&lt;p&gt;Every time a workflow runs, n8n records the execution: what data came in, what each node did, and where it stopped. This is the first place to go after a failure.&lt;/p&gt;

&lt;p&gt;Open the workflow and select the &lt;strong&gt;Executions&lt;/strong&gt; tab at the top. You will see a list of past runs with their status: Success, Failed, or Waiting. Select a failed one to open it.&lt;/p&gt;

&lt;p&gt;Inside the execution view you can see the canvas in its failed state: the node that caused the failure is marked in red, and the bottom panel shows the error message and the log. This tells you which node broke and what the error was, before you touch anything.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3uch0qegiymjmzp5n0vh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3uch0qegiymjmzp5n0vh.png" alt="n8n Executions tab showing a failed execution with the error details panel and the Debug in editor button in the top right corner" width="800" height="489"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Executions tab shows past runs with their status. Open a failed execution to see which node broke, read the error message in the log panel, and find the Debug in editor button in the top right corner.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Read the error message before doing anything else. Many failures explain themselves: "401 Unauthorized", "Cannot read properties of undefined", "The provided authorization grant is invalid". The node name plus the error text is usually enough to know what went wrong.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Debug in Editor: reload real data and rerun
&lt;/h2&gt;

&lt;p&gt;Once you understand what failed, use the &lt;strong&gt;Debug in editor&lt;/strong&gt; button. This loads the actual input data from the failed execution into your current canvas. You can then make changes to the broken node and rerun the workflow using the same real data, without needing to trigger a new event.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8oz7rzrrxasmex4ki10o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8oz7rzrrxasmex4ki10o.png" alt="n8n editor canvas with execution data loaded from a failed run, showing the error in the bottom panel" width="800" height="434"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;After clicking Debug in editor, the canvas loads the data from the failed execution. Fix the broken node and rerun with the same real input. No need to trigger a new event.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is especially useful for workflows triggered by external events: a form submission, a webhook call, or an email. Reproducing that exact input manually takes time. Debug in Editor gives you the original payload immediately.&lt;/p&gt;

&lt;p&gt;For successful executions, the same panel offers &lt;strong&gt;Copy to editor&lt;/strong&gt; instead. That is useful when you want to test changes against a known-good input rather than a failed one.&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Retry a past execution
&lt;/h2&gt;

&lt;p&gt;If you only need to run the failed execution again, you do not have to open the editor at all. n8n can rerun a past execution directly from the Executions tab, reusing the exact input data from the original run.&lt;/p&gt;

&lt;p&gt;Hover over a failed execution in the list, or open it, and use the retry option. n8n gives you two choices:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Retry with original workflow:&lt;/strong&gt; runs the execution again using the workflow exactly as it was when it first ran. Use this when the failure was temporary, like a rate limit or a service that was briefly down, and the workflow itself did not need changing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Retry with currently saved workflow:&lt;/strong&gt; runs the same input data through the latest saved version of the workflow. Use this after you have fixed the broken node, to confirm the fix against the data that originally failed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Both options reuse the original trigger data from that execution, so you do not need to resend the webhook, resubmit the form, or wait for the next scheduled run. The retry appears as a new entry in the Executions list.&lt;/p&gt;

&lt;p&gt;Retry is the fastest way to rerun an execution when you already know the cause. Debug in Editor is the better choice when you still need to inspect the data and change a node before running it again.&lt;/p&gt;
&lt;h2&gt;
  
  
  4. The 5 most common errors
&lt;/h2&gt;

&lt;p&gt;These five patterns account for most of the failures you will actually see in production n8n workflows.&lt;/p&gt;
&lt;h3&gt;
  
  
  Credential or auth error (401, 403)
&lt;/h3&gt;

&lt;p&gt;The node could not authenticate with the external service. Common causes: the credential expired, the API key was regenerated, OAuth tokens were revoked, or the connected account lost the required permissions.&lt;/p&gt;

&lt;p&gt;Fix: open the node settings and re-test the credential. If it fails the test, reconnect or regenerate it in the credentials panel. For OAuth-based services like Gmail or Google Sheets, you may need to re-authorize from scratch.&lt;/p&gt;

&lt;p&gt;A 403 is slightly different: the credential is valid but the account does not have permission to perform that specific action. Check the API scopes or the account's role in the connected service.&lt;/p&gt;
&lt;h3&gt;
  
  
  Expression error (undefined, wrong syntax)
&lt;/h3&gt;

&lt;p&gt;An expression in a field is referencing a value that does not exist. The result shows &lt;code&gt;[undefined]&lt;/code&gt; or the workflow throws a "Cannot read properties of undefined" error.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjs6ul6orp7kldas1g69r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjs6ul6orp7kldas1g69r.png" alt="n8n expression editor showing undefined result for a field path that does not exist in the input data" width="780" height="246"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The expression editor shows [undefined] when the referenced field path does not exist in the input data. Open the left panel to inspect what fields are actually available.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Fix: click on the broken field to open the expression editor. On the left panel, expand the input data from the previous node and check the actual field names and structure. A common mistake is using &lt;code&gt;{{ $json.name }}&lt;/code&gt; when the real field is nested: &lt;code&gt;{{ $json.contact.name }}&lt;/code&gt;. Use the field browser to drag the correct path into the expression.&lt;/p&gt;
&lt;h3&gt;
  
  
  Webhook not firing (test URL vs production URL)
&lt;/h3&gt;

&lt;p&gt;The workflow is active, the external service is configured, but no data arrives. This is almost always a test URL vs production URL mismatch.&lt;/p&gt;

&lt;p&gt;n8n gives each webhook two URLs: one for testing (only works while the workflow is open in the editor), and one for production (only works when the workflow is active). If you configured your external service with the test URL and then activated the workflow, nothing will arrive because the test URL stops listening once you close the editor.&lt;/p&gt;

&lt;p&gt;Both URLs are visible directly inside the Webhook node settings. Many people only notice the first one. The test URL is shown at the top; the production URL is listed below it. Copy the production URL and update it in the external service, then test by triggering the actual event from that service.&lt;/p&gt;
&lt;h3&gt;
  
  
  API timeout or rate limit (429)
&lt;/h3&gt;

&lt;p&gt;The HTTP Request node or an API-connected node stops responding. You may see a 429 Too Many Requests error, or the execution simply times out.&lt;/p&gt;

&lt;p&gt;n8n's default HTTP Request node timeout is 5 minutes (300,000 ms), but many workflows hit limits earlier because the external API enforces its own rate limits or because a slow response blocks the execution. A 429 means you are sending too many requests too fast.&lt;/p&gt;

&lt;p&gt;Fix for rate limits: add a Wait node between batched requests to slow down the pace. Fix for timeouts: check whether the external API is responding at all (test it directly in a browser or with a manual HTTP call), then increase the timeout in the HTTP Request node settings if the service is just slow.&lt;/p&gt;
&lt;h3&gt;
  
  
  Data type mismatch (array vs object, null values)
&lt;/h3&gt;

&lt;p&gt;A node expects a single object but receives an array, or a field contains null and the next expression tries to read a property from it. This often surfaces as "Cannot read properties of null" or unexpected behavior where only the first item is processed.&lt;/p&gt;

&lt;p&gt;Fix: use the Input panel to inspect what the previous node actually returned. If it returned an array when you expected an object, add a Split Out node to break it into individual items before processing. If null values cause crashes, add an IF node upstream to filter them out before they reach the sensitive step.&lt;/p&gt;
&lt;h2&gt;
  
  
  5. Enable debug logging (self-hosted only)
&lt;/h2&gt;

&lt;p&gt;If you run &lt;a href="https://floxolab.com/cases/self-hosted-n8n-deployment-docker-cloudflare" rel="noopener noreferrer"&gt;n8n on a self-hosted VPS&lt;/a&gt; and the execution log does not give enough detail, you can turn on verbose logging by setting &lt;code&gt;N8N_LOG_LEVEL=debug&lt;/code&gt; in your &lt;code&gt;.env&lt;/code&gt; file and restarting the container.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;N8N_LOG_LEVEL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;debug
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With debug logging active, the server logs include detailed HTTP request and response data, credential resolution steps, and node input/output at each stage. This is useful for intermittent failures that are hard to reproduce by opening the editor: connection timeouts, credential handshake errors, and SSL issues tend to surface in the logs before they appear clearly in the execution view.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Reset after debugging.&lt;/strong&gt; Debug output is verbose and will fill disk space quickly on a small VPS. Set &lt;code&gt;N8N_LOG_LEVEL=info&lt;/code&gt; or remove the variable once you have found what you needed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  6. The Debug Helper node
&lt;/h2&gt;

&lt;p&gt;Most n8n users do not know this node exists. The Debug Helper is a built-in utility node that lets you deliberately trigger different error types or generate random test data inside a workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bfke8ndyco5ve736hqd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2bfke8ndyco5ve736hqd.png" alt="n8n Debug Helper node settings showing the category options: Do Nothing, Throw Error, Out Of Memory, Generate Random Data" width="780" height="301"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The Debug Helper node has four modes. Throw Error is useful for testing your error workflow before real failures happen in production.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The four modes are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Do Nothing:&lt;/strong&gt; passes through without doing anything. Useful as a placeholder.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Throw Error:&lt;/strong&gt; deliberately fails the workflow with a message you specify. Use this to test your error handling before a real failure happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Out Of Memory:&lt;/strong&gt; generates a large memory allocation to simulate an out-of-memory error. Useful for stress-testing self-hosted setups.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Generate Random Data:&lt;/strong&gt; produces random structured data. Useful when you need test input but do not have a real event to trigger the workflow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most practical use of Debug Helper for most workflows: add it temporarily before your error-handling path and set it to Throw Error. This lets you verify that your Error Workflow actually fires and sends the alert before you see a real failure in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  7. Stop And Error: controlled failures with clear messages
&lt;/h2&gt;

&lt;p&gt;Sometimes a workflow should stop not because something broke unexpectedly, but because the data does not meet a condition you care about. An empty response from an API, a missing required field, a contact that should not be there. Without explicit handling, the workflow either completes silently or fails with a confusing message.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foi3n2l1b2l5w2dnoysvw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Foi3n2l1b2l5w2dnoysvw.png" alt="n8n Stop and Error node configured with Error Message type and a custom error message" width="780" height="205"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Stop and Error lets you define exactly when and why a workflow should fail, with a message that makes the cause clear in the execution log and in any error alerts.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The Stop And Error node ends the workflow at that point and marks the execution as failed, with the message you provide. Two error types are available: Error Message (a plain text string) or Error Object (a JSON object with structured error properties).&lt;/p&gt;

&lt;p&gt;Used with an IF node upstream, this gives you intentional failure points. The workflow says "no valid email found, stopping here" instead of crashing three nodes later with a cryptic null reference. When that controlled failure triggers your error alert, the message is already readable.&lt;/p&gt;

&lt;p&gt;Stop And Error can only be placed as the last node in a workflow branch. It is not a mid-flow control node.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connect failures to alerts
&lt;/h2&gt;

&lt;p&gt;Debugging after a failure is reactive. The better habit is knowing about failures before someone else does.&lt;/p&gt;

&lt;p&gt;n8n's Error Trigger runs a separate workflow when any production workflow fails. That separate workflow sends an alert to Telegram, Slack, Google Chat, email, or wherever your team already pays attention. For small businesses in the Philippines and anywhere else running automated operations, this is the layer that turns silent failures into visible ones. The execution log gives you the workflow name, failed node, error message, and a link back to the execution.&lt;/p&gt;

&lt;p&gt;The full setup, including what the alert should contain and how to point multiple workflows at a single shared error handler, is covered in the &lt;a href="https://floxolab.com/blog/n8n-error-workflow-telegram-alerts" rel="noopener noreferrer"&gt;n8n error workflow and chat alerts guide&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  n8n rerun and retry: common questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  How do I rerun a failed execution in n8n?
&lt;/h3&gt;

&lt;p&gt;Open the Executions tab, hover over the failed run, and choose a retry option. Retry with original workflow reruns it exactly as it was; Retry with currently saved workflow runs the same input through your latest saved version. Both reuse the original trigger data, so you do not need to trigger the workflow again.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between Retry with original workflow and Retry with currently saved workflow?
&lt;/h3&gt;

&lt;p&gt;Retry with original workflow runs the execution using the workflow exactly as it was when it first ran, which suits temporary failures like rate limits or a service that was briefly down. Retry with currently saved workflow runs the same input through the latest saved version, which is what you want after fixing the broken node.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does retrying an n8n execution reuse the original data?
&lt;/h3&gt;

&lt;p&gt;Yes. Both retry options replay the original trigger and input data from the failed execution. You do not need to resend a webhook, resubmit a form, or wait for the next scheduled run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I rerun an n8n workflow from a specific node?
&lt;/h3&gt;

&lt;p&gt;Use Debug in editor to load the failed execution's data onto the canvas, then run a single node or the steps after it without retriggering the whole workflow. This is the better option when you need to change a node before running it again.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I originally published this on my site, &lt;a href="https://floxolab.com" rel="noopener noreferrer"&gt;FloxoLab&lt;/a&gt;, where I document practical automation and technical SEO for small business in the Philippines. If a workflow here is useful for your team, &lt;a href="https://floxolab.com/#contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>automation</category>
      <category>debugging</category>
      <category>nocode</category>
    </item>
    <item>
      <title>Self-hosted n8n Deployment with Docker, Cloudflare, and PostgreSQL</title>
      <dc:creator>Stepan Nikonov</dc:creator>
      <pubDate>Mon, 22 Jun 2026 21:02:12 +0000</pubDate>
      <link>https://dev.to/floxolab/self-hosted-n8n-deployment-with-docker-cloudflare-and-postgresql-3efn</link>
      <guid>https://dev.to/floxolab/self-hosted-n8n-deployment-with-docker-cloudflare-and-postgresql-3efn</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;A private automation server setup for real workflows: domain, Cloudflare proxy, VPS, Docker, n8n, PostgreSQL, HTTPS, and basic hardening.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This setup gives n8n a private place to run real automations: a domain behind Cloudflare, a VPS running Docker, PostgreSQL for workflow data, HTTPS for the editor, and backups to Google Drive. It is the infrastructure layer behind form workflows, chatbots, API jobs, and internal tools.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Domain to Cloudflare to VPS to Docker to n8n.&lt;/strong&gt;&lt;br&gt;
Public traffic, containers, workflow logic, and storage are separated into clear layers so the automation workspace is easier to inspect, restart, and maintain.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Detail&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Public layer&lt;/td&gt;
&lt;td&gt;Domain, Cloudflare proxy, HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;VPS at about $7/mo, around PHP 430&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workflow layer&lt;/td&gt;
&lt;td&gt;30+ workflows in the workspace&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why this setup
&lt;/h2&gt;

&lt;p&gt;A default n8n install can be useful for testing, but a real automation workspace needs a little more structure. The goal here was to make the server usable for private workflows, webhooks, form automations, API jobs, and internal bots while keeping the public surface understandable.&lt;/p&gt;

&lt;p&gt;Cloudflare sits in front of the domain, HTTPS is enforced in the browser, Docker keeps services isolated and restartable, and PostgreSQL gives n8n a proper database layer instead of treating the server as a disposable demo.&lt;/p&gt;

&lt;p&gt;This setup runs on a VPS that costs about $7 per month, roughly PHP 430, which is enough for a focused workspace with dozens of small workflows.&lt;/p&gt;

&lt;h2&gt;
  
  
  Proof screenshots
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9l90ll06e6aodzr0ciyo.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9l90ll06e6aodzr0ciyo.webp" alt="Cloudflare DNS records with proxied status enabled and sensitive IP content hidden" width="800" height="328"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cloudflare DNS proxy is enabled so the public entry point is not a raw VPS port. IP values are hidden.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fge1ruzodxdv5e8e4ven1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fge1ruzodxdv5e8e4ven1.png" alt="Docker ps output showing n8n and PostgreSQL containers running with healthy status" width="799" height="235"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;n8n and PostgreSQL run as Docker services with multi-day uptime. PostgreSQL was added later, so its uptime can be newer than other services.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffbcilimk60dj40nvd69h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffbcilimk60dj40nvd69h.png" alt="n8n dashboard with multiple real workflow rows in a private automation workspace" width="800" height="438"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;A private n8n workspace with 30+ workflows across drafts, prototypes, and live automations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqkn00nt5ftyyav9wcslt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fqkn00nt5ftyyav9wcslt.png" alt="Browser security panel showing a secure HTTPS connection for the n8n domain" width="331" height="283"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;HTTPS is active for the n8n domain. The admin path is hidden in the screenshot.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What was configured
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domain and proxy&lt;/strong&gt; — Cloudflare DNS and proxy are used in front of the VPS, with sensitive origin details hidden from public screenshots.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker runtime&lt;/strong&gt; — n8n and supporting services run as containers so the stack can be restarted, inspected, and extended without mixing every service directly into the host.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PostgreSQL&lt;/strong&gt; — added as the database layer for n8n. The container is newer because it was introduced as a setup refinement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;HTTPS&lt;/strong&gt; — the workflow UI loads over HTTPS, so operators are not using the admin surface over plain HTTP.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic hardening&lt;/strong&gt; — small-business practical hardening: Cloudflare in front, HTTPS enforced, firewall rules for required access, and backups rather than an open default install.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;This is not described as enterprise infrastructure. It is a practical self-hosted automation foundation for small workflows and internal tools, with the sensitive details removed from public screenshots.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Good fits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Owner-run operations&lt;/strong&gt; — a small business that wants leads, forms, email drafts, and internal alerts running from one private n8n workspace instead of scattered one-off tools.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;VA and service teams&lt;/strong&gt; — a VA agency or ops team running several client intake workflows from one server, with separate workflows for forms, CRM updates, reports, and review queues.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhook-heavy tools&lt;/strong&gt; — teams that need stable public endpoints for website forms, chatbots, payment events, WooCommerce actions, Airtable updates, or Google Workspace jobs.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zapier-style migration&lt;/strong&gt; — teams moving recurring automations into a private workflow engine where the logic is visible, documented, and easier to inspect before scaling further.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Backup and maintenance layer
&lt;/h2&gt;

&lt;p&gt;The server and n8n setup already have backups going to Google Drive. That matters because a self-hosted automation server is not only about getting n8n online. It also needs a way to recover workflows, credentials, and service data if an update, server issue, or configuration mistake breaks something.&lt;/p&gt;

&lt;p&gt;The maintenance plan is simple: keep restore steps, update notes, and basic monitoring close to the deployment so the setup is easier to maintain over time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related guide
&lt;/h2&gt;

&lt;p&gt;Self-hosting changes the cost math against managed tools. For a side-by-side on what each option actually costs, read &lt;a href="https://floxolab.com/blog/zapier-vs-make-vs-n8n-pricing" rel="noopener noreferrer"&gt;Zapier vs Make vs n8n Pricing: A Real Lead Form Example&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I originally published this on my site, &lt;a href="https://floxolab.com" rel="noopener noreferrer"&gt;FloxoLab&lt;/a&gt;, where I document practical automation and technical SEO for small business in the Philippines. If you already have a VPS and need n8n configured properly (domain, Cloudflare, Docker, HTTPS, PostgreSQL, backups, handover notes), &lt;a href="https://floxolab.com/#contact" rel="noopener noreferrer"&gt;get in touch&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>docker</category>
      <category>automation</category>
      <category>selfhosted</category>
    </item>
  </channel>
</rss>
