AutomationFlowsGeneral › Log Errors and Audit Events with N8n Data Tables

Log Errors and Audit Events with N8n Data Tables

ByVenkata V @vvrr22042026 on n8n.io

This workflow provides a reusable error handling, audit logging, and observability pattern for n8n workflows using two n8n custom Data Tables: and .

Event trigger★★★★☆ complexity17 nodesError TriggerData TableExecute Workflow Trigger
General Trigger: Event Nodes: 17 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #15347 — we link there as the canonical source.

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
{
  "id": "r1u7GZ6a5PoMGgHC",
  "name": "Reusable Error Handling and Observability Logger with Data Tables",
  "tags": [
    {
      "id": "MLviT5lQTqI8G8FG",
      "name": "observability",
      "createdAt": "2026-04-28T00:02:06.189Z",
      "updatedAt": "2026-04-28T00:02:06.189Z"
    },
    {
      "id": "5RJ1TQycQr3pHG5c",
      "name": "error-handling",
      "createdAt": "2026-04-28T00:02:06.158Z",
      "updatedAt": "2026-04-28T00:02:06.158Z"
    },
    {
      "id": "hIcjTw7k0KHMShxf",
      "name": "reusable",
      "createdAt": "2026-04-28T00:02:06.168Z",
      "updatedAt": "2026-04-28T00:02:06.168Z"
    }
  ],
  "nodes": [
    {
      "id": "d4400c34-d020-4a0c-a516-0536f716a282",
      "name": "\ud83d\udcd8 README - Observability Core",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -784,
        16
      ],
      "parameters": {
        "color": 5,
        "width": 616,
        "height": 1244,
        "content": "## How it works\n\nThis workflow provides a reusable error handling, audit logging, and observability pattern for n8n workflows using two n8n custom Data Tables: `AuditLog` and `ErrorLog`.\n\nIt is designed to be used across multiple workflows as a central logging workflow.\n\nAt a high level, it:\n\n\u2022 Captures unhandled workflow errors using the n8n Error Trigger  \n\u2022 Stores technical error details in an `ErrorLog` Data Table  \n\u2022 Allows other workflows to write business/audit events into an `AuditLog` Data Table  \n\u2022 Adds useful observability metadata such as workflow name, workflow ID, execution ID, error message, failed node, severity, and correlation ID  \n\u2022 Redacts sensitive values such as passwords, tokens, API keys, and authorization headers before logging  \n\u2022 Includes scheduled cleanup logic to purge old log records after a configurable retention period  \n\nThis template is useful for production-grade n8n setups where multiple workflows need a consistent and reusable logging approach.\n\n## Set up steps\n\nSetup should take around 10\u201315 minutes.\n\nBefore using this template:\n\n\u2022 Create two n8n Data Tables named `AuditLog` and `ErrorLog`  \n\u2022 Make sure the table columns match the expected structure described below\n\u2022 Import this workflow into n8n  \n\u2022 Re-select your actual Data Tables in the Data Table nodes after import  \n\u2022 Set the retention period, for example 90 days, in the configuration node  \n\u2022 Activate the workflow  \n\u2022 In other workflows, select this workflow as the Error Workflow in Workflow Settings  \n\u2022 For audit logging, call this workflow using the Execute Workflow node  \n\nNo hardcoded API keys are used in this template.\n\n## Data Tables used\n\nThis template expects two n8n Data Tables.\n\n### AuditLog\n\n| Column | Type |\n|---|---|\n| logID | String |\n| logType | String |\n| logDate | Date & Time |\n| WorkflowName | String |\n| WorkflowID | String |\n| logData | String / JSON text |\n\n### ErrorLog\n\n| Column | Type |\n|---|---|\n| ErrorLogID | String |\n| ErrorLogDate | Date & Time |\n| ErrorMessage | String |\n| WorkflowID | String |\n| WorkflowName | String |\n| BusinessData | String / JSON text |\n\nUse **Date & Time** for `logDate` and `ErrorLogDate`.\n\nThe workflow writes ISO-8601 timestamps, for example:\n\n2026-04-28T10:30:00.000Z\n\nThis allows the purge logic to delete records older than the configured retention period, for example 90 days."
      },
      "typeVersion": 1
    },
    {
      "id": "5b65b1d7-092d-4b28-8219-e82b6b7779d6",
      "name": "Error Trigger - Global",
      "type": "n8n-nodes-base.errorTrigger",
      "position": [
        208,
        464
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "40e9f583-6588-4f81-a999-7122c5aaadfa",
      "name": "Normalize Error Event",
      "type": "n8n-nodes-base.code",
      "position": [
        496,
        464
      ],
      "parameters": {
        "jsCode": "const crypto = require('crypto');\n\nconst safeStringify = (value, max = 12000) => {\n  try {\n    const text = typeof value === 'string' ? value : JSON.stringify(value ?? {}, null, 2);\n    return text.length > max ? text.slice(0, max) + `... [truncated ${text.length - max} chars]` : text;\n  } catch (e) {\n    return String(value ?? '').slice(0, max);\n  }\n};\n\nconst redact = (obj) => {\n  const deny = /password|passwd|pwd|secret|token|api[_-]?key|authorization|cookie|set-cookie|client_secret|refresh_token|access_token/i;\n  const walk = (v) => {\n    if (Array.isArray(v)) return v.map(walk);\n    if (v && typeof v === 'object') {\n      return Object.fromEntries(Object.entries(v).map(([k, val]) => [k, deny.test(k) ? '[REDACTED]' : walk(val)]));\n    }\n    return v;\n  };\n  return walk(obj);\n};\n\nconst now = new Date().toISOString();\nreturn $input.all().map((item) => {\n  const j = item.json || {};\n  const error = j.error || j.execution?.error || j.trigger?.error || {};\n  const workflow = j.workflow || j.execution?.workflowData || {};\n  const execution = j.execution || {};\n  const source = redact(j);\n  const correlationId = j.correlationId || execution.id || crypto.randomUUID();\n  const message = error.message || error.description || j.message || j.errorMessage || 'Unknown n8n workflow error';\n  const stack = error.stack || error.stacktrace || null;\n  const failedNode = error.node?.name || error.nodeName || execution.lastNodeExecuted || null;\n\n  const businessData = {\n    correlationId,\n    severity: j.severity || 'ERROR',\n    failedNode,\n    executionId: execution.id || j.executionId || null,\n    executionUrl: execution.url || j.executionUrl || null,\n    mode: execution.mode || j.mode || null,\n    retryRecommended: Boolean(j.retryRecommended ?? true),\n    retryCount: Number(j.retryCount || 0),\n    stack,\n    inputSummary: source.businessData || source.payload || source.body || null,\n    rawErrorEvent: source,\n  };\n\n  return {\n    json: {\n      ErrorLogID: `ERR-${Date.now()}-${crypto.randomUUID().slice(0, 8)}`,\n      ErrorLogDate: now,\n      ErrorMessage: String(message).slice(0, 2000),\n      WorkflowID: String(workflow.id || j.workflowId || $workflow.id || 'unknown'),\n      WorkflowName: String(workflow.name || j.workflowName || $workflow.name || 'unknown'),\n      BusinessData: safeStringify(businessData),\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "b2e11d10-8c56-432a-bfb3-37d1bb0e2ea5",
      "name": "Insert ErrorLog",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        816,
        464
      ],
      "parameters": {
        "columns": {
          "value": {
            "ErrorLogID": "={{ $json.ErrorLogID }}",
            "WorkflowID": "={{ $json.WorkflowID }}",
            "BusinessData": "={{ $json.BusinessData }}",
            "ErrorLogDate": "={{ $json.ErrorLogDate }}",
            "ErrorMessage": "={{ $json.ErrorMessage }}",
            "WorkflowName": "={{ $json.WorkflowName }}"
          },
          "schema": [
            {
              "id": "ErrorLogID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "ErrorLogID",
              "defaultMatch": false
            },
            {
              "id": "ErrorLogDate",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "ErrorLogDate",
              "defaultMatch": false
            },
            {
              "id": "ErrorMessage",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "ErrorMessage",
              "defaultMatch": false
            },
            {
              "id": "WorkflowID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "WorkflowID",
              "defaultMatch": false
            },
            {
              "id": "WorkflowName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "WorkflowName",
              "defaultMatch": false
            },
            {
              "id": "BusinessData",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "BusinessData",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "optimizeBulk": false
        },
        "dataTableId": {
          "__rl": true,
          "mode": "name",
          "value": "ErrorLog",
          "cachedResultName": "ErrorLog"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "b9b26a2f-2c2a-448e-9803-ead19affa651",
      "name": "Execute Workflow Trigger - Audit API",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        208,
        768
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "4b63caaa-c291-4846-a79b-524f24ed9fd1",
      "name": "Normalize Audit Event",
      "type": "n8n-nodes-base.code",
      "position": [
        496,
        768
      ],
      "parameters": {
        "jsCode": "const crypto = require('crypto');\n\nconst safeStringify = (value, max = 12000) => {\n  try {\n    const text = typeof value === 'string' ? value : JSON.stringify(value ?? {}, null, 2);\n    return text.length > max ? text.slice(0, max) + `... [truncated ${text.length - max} chars]` : text;\n  } catch (e) {\n    return String(value ?? '').slice(0, max);\n  }\n};\n\nconst redact = (obj) => {\n  const deny = /password|passwd|pwd|secret|token|api[_-]?key|authorization|cookie|set-cookie|client_secret|refresh_token|access_token/i;\n  const walk = (v) => {\n    if (Array.isArray(v)) return v.map(walk);\n    if (v && typeof v === 'object') {\n      return Object.fromEntries(Object.entries(v).map(([k, val]) => [k, deny.test(k) ? '[REDACTED]' : walk(val)]));\n    }\n    return v;\n  };\n  return walk(obj);\n};\n\nconst now = new Date().toISOString();\nreturn $input.all().map((item) => {\n  const j = item.json || {};\n  const workflowName = j.WorkflowName || j.workflowName || j.sourceWorkflowName || $workflow.name || 'unknown';\n  const workflowId = j.WorkflowID || j.workflowId || j.sourceWorkflowId || $workflow.id || 'unknown';\n  const logType = (j.logType || j.eventType || j.status || 'INFO').toString().toUpperCase();\n  const correlationId = j.correlationId || crypto.randomUUID();\n  const payload = redact({\n    correlationId,\n    event: logType,\n    message: j.message || j.summary || null,\n    businessKey: j.businessKey || j.recordId || j.customerId || null,\n    durationMs: j.durationMs || null,\n    status: j.status || null,\n    data: j.logData || j.BusinessData || j.payload || j.body || j,\n  });\n\n  return {\n    json: {\n      logID: `AUD-${Date.now()}-${crypto.randomUUID().slice(0, 8)}`,\n      logType,\n      logDate: now,\n      WorkflowName: String(workflowName),\n      WorkflowID: String(workflowId),\n      logData: safeStringify(payload),\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "d8be6351-504b-440f-9b6a-91e8fafd5e83",
      "name": "Insert AuditLog",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        816,
        768
      ],
      "parameters": {
        "columns": {
          "value": {
            "logID": "={{ $json.logID }}",
            "logData": "={{ $json.logData }}",
            "logDate": "={{ $json.logDate }}",
            "logType": "={{ $json.logType }}",
            "WorkflowID": "={{ $json.WorkflowID }}",
            "WorkflowName": "={{ $json.WorkflowName }}"
          },
          "schema": [
            {
              "id": "logID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logID",
              "defaultMatch": false
            },
            {
              "id": "logType",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logType",
              "defaultMatch": false
            },
            {
              "id": "logDate",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logDate",
              "defaultMatch": false
            },
            {
              "id": "WorkflowName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "WorkflowName",
              "defaultMatch": false
            },
            {
              "id": "WorkflowID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "WorkflowID",
              "defaultMatch": false
            },
            {
              "id": "logData",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logData",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "optimizeBulk": false
        },
        "dataTableId": {
          "__rl": true,
          "mode": "name",
          "value": "AuditLog",
          "cachedResultName": "AuditLog"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "57632970-2b7f-4046-b120-c08a82408f97",
      "name": "Schedule Trigger - Daily Purge",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        32,
        1216
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 2
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "adedda04-8f9a-4fea-991a-02808031a8cd",
      "name": "Build Purge Config",
      "type": "n8n-nodes-base.code",
      "position": [
        400,
        1184
      ],
      "parameters": {
        "jsCode": "// Configure retention here, or pass retentionDays into this workflow input.\n// Default = 90 days.\nconst retentionDays = Number($json.retentionDays || 90);\nconst dryRun = String($json.dryRun || 'false').toLowerCase() === 'true';\nconst purgeBefore = new Date(Date.now() - retentionDays * 24 * 60 * 60 * 1000).toISOString();\nreturn [{ json: { retentionDays, dryRun, purgeBeforeISO: purgeBefore } }];"
      },
      "typeVersion": 2
    },
    {
      "id": "f215b1aa-6081-489e-8201-b96c9f3d56fb",
      "name": "Delete old ErrorLog rows",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        752,
        1072
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "ErrorLogDate",
              "keyValue": "={{ $json.purgeBeforeISO }}",
              "condition": "lte"
            }
          ]
        },
        "options": {},
        "matchType": "allConditions",
        "operation": "deleteRows",
        "dataTableId": {
          "__rl": true,
          "mode": "name",
          "value": "ErrorLog",
          "cachedResultName": "ErrorLog"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "9368ad8f-6bcc-4bbe-bd4f-64e98fe9a5fd",
      "name": "Delete old AuditLog rows",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        752,
        1328
      ],
      "parameters": {
        "filters": {
          "conditions": [
            {
              "keyName": "logDate",
              "keyValue": "={{ $json.purgeBeforeISO }}",
              "condition": "lte"
            }
          ]
        },
        "options": {},
        "matchType": "allConditions",
        "operation": "deleteRows",
        "dataTableId": {
          "__rl": true,
          "mode": "name",
          "value": "AuditLog",
          "cachedResultName": "AuditLog"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "1bc4ca41-4394-4a2d-b8f1-ba716b1a02c0",
      "name": "Build Purge Audit Event",
      "type": "n8n-nodes-base.code",
      "position": [
        1040,
        1216
      ],
      "parameters": {
        "jsCode": "return [{\n  json: {\n    logType: 'PURGE',\n    WorkflowName: $workflow.name,\n    WorkflowID: $workflow.id,\n    message: `Purged Data Table rows older than ${$('Build Purge Config').item.json.retentionDays} days`,\n    logData: {\n      retentionDays: $('Build Purge Config').item.json.retentionDays,\n      purgeBeforeISO: $('Build Purge Config').item.json.purgeBeforeISO,\n      note: 'Check Data Table delete node execution output for row counts / dry-run results.'\n    }\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "a10c2ce7-c838-4680-b6fc-f9db0c4cd676",
      "name": "Insert Purge AuditLog",
      "type": "n8n-nodes-base.dataTable",
      "position": [
        1344,
        1200
      ],
      "parameters": {
        "columns": {
          "value": {
            "logID": "={{ 'AUD-' + Date.now() + '-PURGE' }}",
            "logData": "={{ JSON.stringify($json.logData) }}",
            "logDate": "={{ $now.toISO() }}",
            "logType": "={{ $json.logType }}",
            "WorkflowID": "={{ $json.WorkflowID }}",
            "WorkflowName": "={{ $json.WorkflowName }}"
          },
          "schema": [
            {
              "id": "logID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logID",
              "defaultMatch": false
            },
            {
              "id": "logType",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logType",
              "defaultMatch": false
            },
            {
              "id": "logDate",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logDate",
              "defaultMatch": false
            },
            {
              "id": "WorkflowName",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "WorkflowName",
              "defaultMatch": false
            },
            {
              "id": "WorkflowID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "WorkflowID",
              "defaultMatch": false
            },
            {
              "id": "logData",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "logData",
              "defaultMatch": false
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "dataTableId": {
          "__rl": true,
          "mode": "name",
          "value": "AuditLog",
          "cachedResultName": "AuditLog"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "57767303-92eb-41a8-923c-31e43c0178c4",
      "name": "\u2699\ufe0f Caller Payload Example",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -48,
        -128
      ],
      "parameters": {
        "color": 4,
        "width": 470,
        "height": 360,
        "content": "# Call from any workflow\n\nAdd **Execute Workflow** node and select this workflow. Send for audit logging:\n\n```json\n{\n  \"logType\": \"START | SUCCESS | WARNING | BUSINESS_ERROR\",\n  \"workflowName\": \"={{ $workflow.name }}\",\n  \"workflowId\": \"={{ $workflow.id }}\",\n  \"correlationId\": \"={{ $execution.id }}\",\n  \"businessKey\": \"invoice-123\",\n  \"message\": \"Invoice extracted successfully\",\n  \"payload\": { \"invoiceNo\": \"INV-123\", \"amount\": 100 }\n}\n```\n\nFor automatic failures, configure each workflow setting: **Error Workflow = this workflow**."
      },
      "typeVersion": 1
    },
    {
      "id": "c580768a-bc3c-4b9e-b77d-508ff0066040",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        304
      ],
      "parameters": {
        "color": 7,
        "width": 1248,
        "height": 400,
        "content": "## Error handling Framework"
      },
      "typeVersion": 1
    },
    {
      "id": "54e678ae-c0fd-481c-b73a-106c79dcd183",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        736
      ],
      "parameters": {
        "width": 1280,
        "height": 256,
        "content": "## Audit logging"
      },
      "typeVersion": 1
    },
    {
      "id": "d57cbea7-1c2b-4c83-8967-dec6844fba99",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -112,
        1040
      ],
      "parameters": {
        "width": 1728,
        "height": 448,
        "content": "## Scheduled Audit purging"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1"
  },
  "versionId": "bddff541-b9ee-4a17-9fde-e4117c1c6f5c",
  "connections": {
    "Build Purge Config": {
      "main": [
        [
          {
            "node": "Delete old ErrorLog rows",
            "type": "main",
            "index": 0
          },
          {
            "node": "Delete old AuditLog rows",
            "type": "main",
            "index": 0
          },
          {
            "node": "Build Purge Audit Event",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Audit Event": {
      "main": [
        [
          {
            "node": "Insert AuditLog",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Error Event": {
      "main": [
        [
          {
            "node": "Insert ErrorLog",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error Trigger - Global": {
      "main": [
        [
          {
            "node": "Normalize Error Event",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Purge Audit Event": {
      "main": [
        [
          {
            "node": "Insert Purge AuditLog",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger - Daily Purge": {
      "main": [
        [
          {
            "node": "Build Purge Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute Workflow Trigger - Audit API": {
      "main": [
        [
          {
            "node": "Normalize Audit Event",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow provides a reusable error handling, audit logging, and observability pattern for n8n workflows using two n8n custom Data Tables: and .

Source: https://n8n.io/workflows/15347/ — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

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

General

Agendamiento. Uses n8n-nodes-evolution-api, redis, dataTable, executeWorkflowTrigger. Event-driven trigger; 60 nodes.

N8N Nodes Evolution Api, Redis, Data Table +2
General

If you're in need of a quick and dirty cache that doesn't need anything other than the current version of N8N, boy do I have a dodgy script for you to try!

Execute Workflow Trigger, Data Table, Stop And Error
General

send_image. Uses executeWorkflowTrigger, dataTable, n8n-nodes-evolution-api-english, httpRequest. Event-driven trigger; 5 nodes.

Execute Workflow Trigger, Data Table, N8N Nodes Evolution Api English +1
General

tableToSheet. Uses executeWorkflowTrigger, dataTable, googleSheets. Event-driven trigger; 3 nodes.

Execute Workflow Trigger, Data Table, Google Sheets
General

A production-ready authentication workflow implementing secure user registration, login, token verification, and refresh token mechanisms. Perfect for adding authentication to any application without

Crypto, Data Table, Execute Workflow Trigger