Wire PulseSignal into n8n
PulseSignal speaks Standard Webhooks v1, the same shape Stripe, Shopify, and Polar use. n8n's built-in Webhook node accepts that shape natively, so any of the 400+ nodes n8n ships with can act on PulseSignal events. Works identically on n8n.cloud and self-hosted n8n.
4-step setup
- Create a new workflow in n8n and add the Webhook node as the trigger. Set HTTP Method to
POST, give it a unique path (e.g.pulsesignal), and leave Authentication as None (you will verify signatures in a follow-up node, see below). n8n will mint a URL of the formhttps://<your-host>/webhook/pulsesignal(or/webhook-test/pulsesignalwhile the workflow is in Test mode). Copy the production URL. - Add the URL to PulseSignal at Settings → Webhooks. Paste the n8n URL, pick the event types you want forwarded (change_event, narrative, alert_rule_trigger), and save. PulseSignal will fire a
webhook.testpayload immediately so n8n's test panel has a real sample to work with. - Map fields downstream. Add follow-up nodes (Slack, Notion, Airtable, Postgres, HTTP Request, anything in the n8n library) and reference PulseSignal fields with n8n expressions like
{{ $json.event_type }},{{ $json.data.company_name }},{{ $json.data.headline }},{{ $json.data.source_url }}. - Activate the workflow. Flip the toggle in the top-right corner of the n8n editor. From here, every PulseSignal event of the subscribed type flows through within seconds. You can verify deliveries from the webhook history table in PulseSignal and from Executions in n8n.
Verifying signatures (recommended)
n8n exposes the raw request body and headers on the Webhook node, so signature verification is a one-node addition. Drop a Code node (JavaScript) after the Webhook trigger and paste:
const crypto = require('crypto')
const secret = $env.PULSESIGNAL_WEBHOOK_SECRET
const timestamp = $input.first().json.headers['x-pulsesignal-timestamp']
const sig = $input.first().json.headers['x-pulsesignal-signature']
const body = JSON.stringify($input.first().json.body)
const expected = 'v1=' + crypto
.createHmac('sha256', secret)
.update(`${timestamp}.`)
.update(body)
.digest('hex')
if (!crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(sig))) {
throw new Error('PulseSignal signature mismatch')
}
return $input.first()
Store the signing secret in n8n's environment variables panel as PULSESIGNAL_WEBHOOK_SECRET. The full signing scheme (header names, replay-protection window, retry schedule) is documented at /help/webhooks.
Self-hosted notes
- Your n8n instance must be reachable from the public internet so PulseSignal can POST to it. Common shapes: nginx / Caddy reverse proxy with TLS in front of n8n on port 5678, or n8n behind a Cloudflare Tunnel.
- Set
WEBHOOK_URLin your n8n environment so the URLs the editor shows you match the public-facing host. Otherwise the URL you paste into PulseSignal will be the internal docker hostname and deliveries will fail. - Production webhooks fire on the
/webhook/path; test-mode webhooks fire on/webhook-test/. PulseSignal's webhook history will surface 404s immediately if you paste the wrong one.
Native n8n community node
A native PulseSignal node on the n8n community registry (with typed trigger event types, credentials helper, and named output fields) is on the roadmap. Until that ships, the generic Webhook-node path above gives you the same delivery guarantees and the same payload shape. If you have a workflow template you'd like us to prioritize, write to hello@pulsesignal.co.