Automations
4 min read

How to Create a Webhook in n8n Using the Code Node (Fix 0696 Errors)

Dev Shabbir
Dev Shabbir
February 26, 2026

n8n Webhook Automation: Step-by-Step Guide with Code Node & Error Handling

Master webhook creation in n8n, fix the infamous 0696 error, and build robust automation workflows using the Code node—complete with copy-paste JSON and real-world debugging.

🚀 Ready to Deploy This Workflow?

Get the exact n8n workflow used in this guide—pre-configured with error handling and Code node logic.

Install this Workflow Now

💡 Quick Answer (Google AI Overview Ready)

  • An n8n webhook is an HTTP endpoint that triggers workflows when external services send data.
  • Error 0696 usually means invalid JSON or missing headers—fix by ensuring your Code node returns valid JSON and sets Content-Type: application/json.
  • Unlike Zapier, n8n webhooks are self-hosted, customizable via Code node, and support complex logic without premium plans.

What Is an n8n Webhook?

In n8n, a webhook acts as a real-time trigger for your automation workflows. When an external service (like GitHub, Stripe, or a custom app) sends an HTTP request to your webhook URL, n8n instantly executes the connected workflow—no polling required.

The Webhook node (n8n-nodes-base.webhook) listens for incoming requests, while the Code node (n8n-nodes-base.code) lets you process data, validate payloads, and format responses using JavaScript.

🔧 Common Webhook Use Cases

  • Receive form submissions from websites
  • Process Stripe payment events
  • Sync data from GitHub webhooks to Airtable
  • Trigger AI workflows via LangChain integration

Step-by-Step: Create a Webhook with Code Node

Follow these steps to build a production-ready webhook that processes JSON data and returns structured responses.

1. Add and Configure the Webhook Node

Drag a Webhook node into your workflow canvas. Set the following:

  • HTTP Method: POST (most common for data submission)
  • Path: /webhook/0696-code-example (customize for your use case)
  • Response Mode: On Received (immediate response)

💡 Copy the generated URL—you'll need it to test your webhook.

2. Process Data with the Code Node

Connect a Code node to the Webhook node. Use this JavaScript to validate and transform incoming data:

// Validate incoming JSON
if (!items[0].json.body || typeof items[0].json.body !== 'object') {
  throw new Error('Invalid JSON payload');
}

// Extract key data
const { email, action } = items[0].json.body;

// Add timestamp
const processedData = {
  ...items[0].json.body,
  receivedAt: new Date().toISOString(),
  status: 'processed'
};

// Return data for next nodes
return [{ json: processedData }];
⚠️ Security Tip: Always validate input data to prevent injection attacks. Never trust raw payloads!

3. Return a Proper HTTP Response

In the Webhook node's Response tab, configure:

  • Response Body: ={{$json["status"]}}
  • Content-Type Header: application/json
  • Status Code: 200 (or 400 for errors)

🔍 Debugging the "0696" Webhook Error

The 0696 error is a common n8n webhook issue reported in community forums. It typically occurs when:

  • The Code node returns malformed JSON
  • Missing Content-Type: application/json header
  • Webhook URL is not publicly accessible (firewall/NAT issues)

✅ How to Fix Error 0696

  1. Ensure your Code node returns [{ json: yourData }]
  2. In Webhook node → Response → Headers, add:
    Content-Type: application/json
  3. Test with curl -H "Content-Type: application/json" -d '{"test":1}' YOUR_WEBHOOK_URL
  4. If self-hosting, verify port forwarding and SSL (use ngrok for local testing)

📥 Copy-Paste: Full Workflow JSON

Import this ready-to-use workflow into n8n. Includes Webhook → Code → Response flow with error handling.

{
  "nodes": [
    {
      "parameters": {
        "path": "0696-code-webhook",
        "options": {},
        "responseMode": "onReceived"
      },
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "typeVersion": 1,
      "position": [250, 300]
    },
    {
      "parameters": {
        "functionCode": "// Validate and process webhook data\nif (!items[0].json.body) throw new Error('No body found');\nreturn [{ json: { ...items[0].json.body, status: 'success' } }];"
      },
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "typeVersion": 1,
      "position": [450, 300]
    }
  ],
  "connections": {
    "Webhook": { "main": [[{ "node": "Code", "type": "main", "index": 0 }]] }
  }
}

💡 In n8n: Click "Import from Clipboard" in the workflow menu to load this template.

🎯 Skip the Setup—Use Our Pre-Built Workflow

This template includes advanced error logging, input validation, and Airtable integration hooks.

Install this Workflow Now

🔗 Advanced: Connect to Airtable, LangChain & More

Extend your webhook with these powerful integrations:

📊 Airtable Sync

After Code node, add an Airtable node to create records from webhook data.

  • • Map email → Airtable field
  • • Set base ID and table name

🤖 LangChain AI Processing

Use @n8n/n8n-nodes-langchain to analyze webhook content with LLMs.

  • • Classify incoming requests
  • • Generate dynamic responses

❓ Frequently Asked Questions

Why is my n8n webhook not triggering?

Check: (1) Webhook URL is public (use ngrok for local testing), (2) HTTP method matches (POST/GET), (3) No firewall blocking requests.

Can I secure my n8n webhook?

Yes! Add authentication via: (1) Secret path parameter, (2) Header validation in Code node, (3) IP whitelisting (self-hosted only).

How do I test webhooks locally?

Use ngrok http 5678 to expose your local n8n instance (default port 5678) to the internet.