n8n

Automate dialnote with n8n: self-hosted workflows triggered by calls and texts, with full control over where your call data ends up going.

n8n is a self-hosted workflow automation tool that connects dialnote to hundreds of apps and services. If your team needs full control over data and infrastructure—or you just prefer running automations on your own servers—n8n is a solid fit. There's no native n8n integration to install. You connect through dialnote's custom webhooks, so call events flow straight into your n8n instance without passing through a third party.

Connecting dialnote to n8n#

dialnote sends real-time event data to n8n through a custom webhook. You set up a webhook node in n8n, then point a dialnote webhook at it. Webhooks are available on the Business and Pro plans.

  1. In your n8n instance, create a new workflow and add a Webhook node as the trigger
  2. Set the HTTP method to POST
  3. Copy the Production URL from the webhook node (it'll look like https://your-n8n.example.com/webhook/abc123)
  4. In dialnote, go to Settings → Webhook Management
  5. Click Add Webhook and choose Custom Webhook as the provider
  6. Paste the n8n Production URL and give it a name (e.g., "n8n - Call Workflows"), up to 100 characters
  7. Under Events to send, tick the events you want: Call logs, Call recordings, Call summaries, Inbound SMS, Inbound MMS, Notes
  8. Click Create Webhook

Building Workflows#

Once n8n receives webhook data from dialnote, you can chain any combination of nodes to process it. n8n's canvas editor makes it easy to add logic, transformations, and connections to other services.

Example: Save Calls to a Database and Send Alerts#

This workflow logs every completed call to Postgres and sends a Slack message for missed calls:

  1. Trigger: Webhook node (receives a dialnote call event)
  2. IF node: Check whether data.status equals not_picked
  3. True branch: Slack → Send Message to your #missed-calls channel with caller details
  4. Always: Postgres → Insert a row with call ID, direction, duration, from/to numbers, and timestamp

The IF node lets you branch logic without duplicating the trigger. Stack as many conditions as you need.

Example: Auto-Create CRM Records#

When a new caller reaches your team, add them to your CRM automatically:

  1. Trigger: Webhook node
  2. IF node: Only continue if call direction is inbound
  3. HTTP Request node: Search your CRM API for the caller's phone number
  4. IF node: If no record is found → HTTP Request node to create a new contact

Since n8n runs on your infrastructure, calls to internal CRMs or databases don't leave your network. That's a big plus for teams with strict data policies.

Available Webhook Data#

dialnote sends a JSON envelope to your n8n webhook. The type tells you which event fired, and the data object holds the details:

json
{
  "id": "01924f8e-1234-7000-8000-000000000006",
  "type": "call.completed",
  "timestamp": "2026-08-04T10:00:00.000Z",
  "organizationId": "01924f8e-1234-7000-8000-000000000001",
  "data": {
    "phoneNumberId": "01924f8e-1234-7000-8000-000000000002",
    "conversationId": "01924f8e-1234-7000-8000-000000000003",
    "callId": "01924f8e-1234-7000-8000-000000000004",
    "callSid": "CA00000000000000000000000000000001",
    "direction": "inbound",
    "fromNumber": "+15551234567",
    "toNumber": "+15559876543",
    "status": "answered",
    "duration": 180
  }
}

call.completed carries phoneNumberId, conversationId, callId, callSid, direction, fromNumber, toNumber, phoneNumber, status, and createdAt on every delivery. When available it also carries duration, hasRecording, endedBy, fromName, toName, initiatedAt, answeredAt, endedAt, contactId, and failureCode / failureMessage on failed calls.

call.summary.completed carries phoneNumberId, conversationId, and a summary object. summary.status is completed, with text and, when the summarizer produced them, title, keyPoints, actionItems and sentiment. It's not_applicable when there was nothing to summarise, with a failureReason saying why. Match it to the call with summary.callId.

call.recording.completed carries phoneNumberId, conversationId, callId, callSid, direction, fromNumber, toNumber, phoneNumber, and conversationUrl on every delivery. When available it also carries recordingSid, duration, fromName, toName, transcriptionStatus, initiatedAt, endedAt, isVoicemail, recordingUrl, and recordingUrlExpiresAt. There's no status field on this event.

note.created carries phoneNumberId, conversationId, and a note object (id, content, authorId, author, createdAt), plus mentionedUserIds when teammates are @-mentioned. It has no call fields and no contact fields, so use conversationId to tie the note back to a call.

Inbound texts arrive as sms.received / mms.received. Full field tables for every event are in the Webhooks guide.

data.status is one of answered, not_picked, failed, voicemail or disconnected — never completed or no-answer.

Map any field in a downstream node with n8n's expression editor — for example, {{ $json.data.fromNumber }} to grab the caller's number on an inbound call, and {{ $json.data.toNumber }} for the dialnote line they dialled.

For the full payload reference and signature details, see the Webhooks guide.

n8n's flexibility and self-hosted nature suit more advanced automations:

  • Call logging to your own database: Every call → insert a row into Postgres, MySQL, or MongoDB running on your servers
  • AI-powered follow-ups: Recording completed → download the audio from recordingUrl and send it to a transcription and LLM node for a summary → email it to the assigned team member
  • Escalation alerts: Missed call → check if the caller has called 3+ times today → if yes, send an urgent Slack alert to a manager
  • CRM sync without third parties: Call completed → update a contact record in your self-hosted CRM via direct API calls
  • Scheduled reports: Use a Cron trigger to query your call-log database daily and email a CSV summary to leadership

Troubleshooting#

If your n8n workflow isn't receiving events, check these common issues:

  • Workflow not active: n8n workflows must be toggled to Active to receive production webhooks. Test mode only works while the editor is open.
  • Webhook paused in dialnote: After 3 deliveries in a row fail every retry, or after a single 410 Gone response, dialnote auto-disables the webhook. Go to Settings → Webhook Management and click Enable once you've fixed the cause.
  • Event not ticked: A webhook only sends what's ticked under Events to send. If recordings never arrive, confirm Call recordings is checked and that recording is enabled on the number.
  • Slow endpoint: Your workflow must accept the payload within 30 seconds, or dialnote counts it as a failure.
  • URL mismatch: Use the Production URL from n8n, not the test URL — they're different endpoints.
  • Firewall or network issues: Since n8n is self-hosted, your server must accept inbound HTTPS from dialnote. Check that port 443 is open and your SSL certificate is valid.

Each webhook card in Settings → Webhook Management shows the last delivery time, consecutive failure count, and the most recent error message.

What's Next#

  • Webhooks — full payload reference, signature verification, and webhook management
  • Make.com — another visual automation tool that accepts dialnote webhooks
  • Zapier — a built-in, no-code path to thousands of apps
  • CRM integrations — push call activity to HubSpot, Salesforce, or Pipedrive without a custom endpoint

The full list of tools dialnote connects to is on the integrations page.