Skip to main content
Build your own

Signed webhooks: events in, alerts out

Send events to Pulseri and get alerts back, signed so you know they are real. Works with any tool that can post.

All plans

What it does

A webhook is a web request one system sends to another. Pulseri uses signed webhooks in both directions.

Events in. When something happens in your system, such as a ticket closing, send Pulseri a signed request. A trigger can then start a survey for that person.

Alerts out. When an alert rule matches an answer, Pulseri can call a web address you choose. Each call is signed so your system can verify it, and each is listed with its result.

Send a signed event

Sign the exact bytes you send. Use the receiver URL and signing secret from Settings, then Webhooks.

import { createHmac } from 'node:crypto'

const body = JSON.stringify({
  event_key: 'ticket.closed',
  external_event_id: 'evt_8f14e45f',
  person_id: 'user_123',
  payload: { email: '[email protected]' },
  occurred_at: '2026-10-15T09:30:00Z',
})
const signature = 'sha256=' + createHmac('sha256', process.env.PULSERI_SIGNING_SECRET).update(body).digest('hex')

const res = await fetch(process.env.PULSERI_RECEIVER_URL, {
  method: 'POST',
  headers: { 'Content-Type': 'application/json', 'X-Pulseri-Signature': signature },
  body,
})
console.log(res.status) // 200 when Pulseri accepts the request

Who it suits

Anyone with a tool Pulseri does not connect to natively, or who wants alerts to start work in their own systems.

Fields in the request

Only the event key is required. The rest helps Pulseri find the right person and ignore repeats.

  • event_key

    The name of what happened, such as "ticket.closed". Pulseri uses it to pick the trigger. Required.

  • external_event_id

    Your own ID for this event. If you send the same ID twice, Pulseri keeps one.

  • person_id

    Your own ID for the person, such as a customer ID. Pulseri matches on it before the email.

  • payload.email

    The person's email, used to find them when there is no person ID. If nobody matches, Pulseri adds them.

  • occurred_at

    When it happened, in ISO 8601 format. If omitted, Pulseri uses the time it received the request.

How to set it up

Most people finish in minutes.

  1. An administrator opens Settings, then Webhooks, and copies the receiver URL and signing secret.
  2. In your system, build a JSON body with an event key, such as "ticket.closed", and who it is about. Add an event ID so repeats are ignored.
  3. Sign the body with your signing secret (HMAC-SHA-256) and send it in the X-Pulseri-Signature header as sha256= plus the hex value.
  4. POST the body to the receiver URL as application/json. Pulseri answers 200 when it accepts the request.
  5. Create a trigger in Pulseri for that event, choose the survey and add a delay if you like.

Which plans have it

This comes from the current plan table.

All plansSee plans and pricing

Common questions

It proves the sender knows your signing secret. A request without a valid signature gets a 401.
  • REST API

    Send people and events in, and read answers and reports out.

    Build your own

    All plans
  • Slack

    Low-score alerts in the channel you pick, with the full comment.

    Alerts in your chat

    All plans
  • Stripe

    Ask for feedback after an invoice is paid or a checkout is completed.

    Start a survey from your tools

    All plans

Try it on your own feedback

Start a free trial and connect it today.

Free for 14 days. Cancel any time before it ends.