Documentation
n8n workflow error notifications on your phone
Import an n8n Error Trigger workflow, send a bounded error report to Ntfyx, and verify a real automatic failure with an authenticated test webhook.
Updated
One handler for workflow failures
#This uses n8n’s built-in Error Trigger, Code and HTTP Request nodes; it does not require a dedicated Ntfyx node. The report identifies the workflow, failed node and execution link when available. It deliberately omits the raw error message, stack and input records, which may contain credentials or personal data.
n8n remains the place to inspect the full failure.
Start with one working HTTPS notification
#As of 2026-10-29, confirmed public releases are iOS 1.8.3 and Android 1.8.2. Update from your store, then use the public Topic or private connection entry on your phone. Android background push requires Google Play services. Open HTTPS Push in Ntfyx, send its hello test and confirm the matching message in your Inbox.
Copy the complete private sending URL. These tutorials POST JSON to that fixed URL and need no CLI pairing. First verify your own phone receipt before configuring an automation. If setup is blocked, follow troubleshooting and check the installed version.
1. Import and configure the error handler
#Download the error-handler JSON and use n8n’s Import from File menu. Open Send to Ntfyx and replace its .invalid placeholder with your complete HTTPS Push URL. Leave the method as POST and the JSON/header expressions unchanged. Save the workflow as Ntfyx error notifications. In each source workflow’s Settings, select it as Error workflow and save.
The error handler itself does not need to be published to receive errors.
The complete importable handler
#The Code node prepares the same body and key from the original error event. HTTP Request sends that prepared input, records the response status, stops on failure and does not follow redirects. Missing stable event IDs stop before sending instead of inventing an ID for an uncertain event.
{
"name": "Ntfyx error notifications",
"nodes": [
{
"parameters": {},
"id": "010f3ff8-b200-46c3-9bac-a617f43e8c51",
"name": "Error Trigger",
"type": "n8n-nodes-base.errorTrigger",
"typeVersion": 1,
"position": [
0,
0
]
},
{
"parameters": {
"jsCode": "const source = $input.first().json;\nconst execution = source.execution || {};\nconst workflow = source.workflow || {};\nconst triggerError = source.trigger?.error || {};\nconst event = execution.id ? `execution-${execution.id}` : (triggerError.timestamp ? `trigger-${triggerError.timestamp}` : null);\nif (!/^[A-Za-z0-9_-]{1,64}$/.test(String(workflow.id || '')) || !event) throw new Error('No stable source event ID. Inspect and retain the original error before sending.');\nconst name = String(workflow.name || workflow.id).replace(/[\\u0000-\\u001f\\u007f]/g, ' ').trim().slice(0, 80) || String(workflow.id);\nconst lines = [`Workflow: ${name}`, `Event: ${event}`];\nif (execution.lastNodeExecuted) lines.push(`Node: ${String(execution.lastNodeExecuted).slice(0, 120)}`);\nif (execution.retryOf) lines.push(`Retry of execution: ${execution.retryOf}`);\nif (typeof execution.url === 'string' && /^https?:\\/\\//.test(execution.url)) lines.push(execution.url.slice(0, 1000));\nelse lines.push('No execution URL; inspect the workflow in n8n.');\nreturn [{json: {idempotency_key: `n8n-${workflow.id}-${event}`, payload: {title: 'n8n workflow failed', text: lines.join('\\n'), session_id: `ntfyx-n8n-${workflow.id}`.padEnd(22, '_'), session_name: name}}}];"
},
"id": "bb55223f-21c0-43d0-a641-2081b4fac836",
"name": "Prepare bounded report",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
240,
0
]
},
{
"parameters": {
"method": "POST",
"url": "https://replace-with-your-private-ntfyx-url.invalid/",
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Idempotency-Key",
"value": "={{ $json.idempotency_key }}"
}
]
},
"sendBody": true,
"specifyBody": "json",
"jsonBody": "={{ JSON.stringify($json.payload) }}",
"options": {
"redirect": {
"redirect": {
"followRedirects": false
}
},
"response": {
"response": {
"fullResponse": true,
"neverError": false,
"responseFormat": "json"
}
},
"timeout": 15000
}
},
"id": "f6af45c3-e92b-4775-9053-7226964ce3d8",
"name": "Send to Ntfyx",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [
480,
0
],
"retryOnFail": false,
"onError": "stopWorkflow",
"notes": "Replace the URL privately with the complete HTTPS Push URL copied from Ntfyx. The full URL is a send-only secret; scrub it before sharing any workflow export. Automatic retries are disabled: after an uncertain send, retain this node's exact input and Idempotency-Key; inspect Retry-After before retrying."
}
],
"connections": {
"Error Trigger": {
"main": [
[
{
"node": "Prepare bounded report",
"type": "main",
"index": 0
}
]
]
},
"Prepare bounded report": {
"main": [
[
{
"node": "Send to Ntfyx",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1"
},
"pinData": {},
"tags": []
}
2. Trigger an automatic, harmless failure
#Manual Execute Workflow runs do not trigger an error workflow. Import the separate test JSON below. It contains an authenticated POST Webhook connected to Stop And Error. In its Webhook node, create a Header Auth credential with Name X-Ntfyx-Demo-Key and a new private random Value; choose your own path.
Select Ntfyx error notifications as this test workflow’s Error workflow. Publish or activate only this test workflow, then copy its Production URL.
# Set N8N_TEST_URL and N8N_TEST_KEY privately first.
curl --fail --silent --show-error --request POST "$N8N_TEST_URL" \
--header "X-Ntfyx-Demo-Key: $N8N_TEST_KEY" \
--header "Content-Type: application/json" \
--data '{"tutorial":"ntfyx-error-test"}'3. Match all three results
#Look for a failed source execution, an error-handler execution whose Send to Ntfyx node returns 2xx, and a phone Inbox message titled “n8n workflow failed”. The message should identify the source workflow and Intentional failure node, with the same execution ID and its link. Check phone banners separately.
An error in the source trigger may have no saved execution URL; the report says so and uses its trigger timestamp when present.
| Observed state | Next check |
|---|---|
| Source failed, handler absent | Confirm automatic execution and the source’s Error workflow setting. |
| HTTP node failed | Check the private URL, Topic state, quota and HTTP error; retain the original input. |
| 2xx, no Inbox message | Check the intended Topic, sync and phone connectivity. |
| Inbox message, no alert | Check notification permission, mute and quiet hours. |
Retry the notification without rerunning the business task
#Automatic Retry On Fail is off in the template. For 429 or 503, wait for Retry-After; for a timeout, the send outcome is unknown. Inspect the phone and the failed handler, then retry Send to Ntfyx with its saved, unchanged input and Idempotency-Key. Do not rerun the source merely to resend an alert. Fix 401/403 authentication or permission errors before trying again.
Keep failures visible in n8n Executions; this handler is not a substitute for monitoring n8n itself.
Validation scope and next steps
#Both files are checked locally for JSON structure and node connections. The report code is exercised with saved-execution, retry, trigger-error and missing-ID fixtures, then checked against Ntfyx’s webhook parser. Import into a running n8n instance and physical-phone receipt have not been verified for this template.
Follow the automatic test above before using it for real workflows. An HTTPS notification reports an error; use a protected Topic and the agent reply flow if a task must wait for a verified human answer.