Alerts & reports

Alerts & reports New

Be told when money lands or traffic jumps, and get a short digest of what made money, without opening the dashboard. Rules say what to tell you; channels say where.

Set it up#

  1. Add a channel

    Settings, Alerts, Channels, Add channel. Pick where messages should go (see below) and use Send test to check it works.

  2. Turn on rules

    Choose a site (if you have several) and switch on the rules you want. Every rule sends to every channel that is turned on. You can have up to 10 channels.

  3. Preview the digest (optional)

    The digest rule has a preview that builds it from your real data without sending anything.

Rules#

RuleWhen it firesNotes
New saleAs soon as a paid order is saved (from the provider's webhook, or the next sync).Shows amount, product, source and the page the buyer landed on when Pulse can trace the visit. Several sales at once are summarised. Refunded orders are skipped.
Traffic spikeDistinct visitors in the last 30 minutes are at least N times the usual for that time, and at least a minimum number of visitors.“Usual” is the median of the same 30 minutes on each of the 7 days before. Defaults: 3 times, at least 20 visitors. At most one alert every 2 hours. Sites tracked by the Pulse script only.
Goal firedEvery time a custom event you name happens (for example signup).Counts events from the moment you turn the rule on, batched into one message per check. Sites tracked by the Pulse script only. See custom events.
DigestDaily or weekly, at an hour you pick in the site's time zone.Covers the previous day, or the previous 7 full days: visitors, revenue and sales against the period before, top sources (by revenue when there is revenue, else by visitors), top pages, the biggest change, and one thing to act on. If the server was down for more than 12 hours around the send time, that digest is skipped instead of arriving late.

Channels#

ChannelYou provideNotes
EmailNothing: it goes to your account email.Needs email to be set up on the server (self-hosters add a Resend key, see self-hosting).
TelegramA bot token from BotFather and a chat id.After you message your bot, Pulse can look up the chat id for you.
SlackAn incoming-webhook URL (hooks.slack.com).Create it in api.slack.com/apps under Incoming Webhooks.
DiscordA channel webhook URL (discord.com/api/webhooks/…).Channel settings, Integrations, Webhooks.
WebhookAn HTTPS endpoint of yours.Pulse POSTs signed JSON and shows you the signing secret once, when you add it.

Channel secrets (bot tokens, webhook URLs, signing secrets) are encrypted at rest. If a channel fails, the error is shown next to it and on the rule, and Pulse does not retry every minute.

Webhook format#

Each message is a JSON POST with two extra headers: X-Pulse-Event (sale, spike, goal, digest or test) and X-Pulse-Signature: sha256=<hex>, the HMAC-SHA256 of the raw body using your signing secret.

json
{
  "event": "sale",
  "title": "New sale on example.com",
  "text": "New sale on example.com\n…",
  "data": { "...": "fields depend on the event" },
  "sentAt": "2026-10-19T09:00:12.000Z"
}
js
import { createHmac, timingSafeEqual } from 'node:crypto';

// rawBody: the request body exactly as received; secret: the whsec_… shown when you added the webhook
const want = createHmac('sha256', secret).update(rawBody).digest('hex');
const got = req.headers['x-pulse-signature'].replace('sha256=', '');
const ok = got.length === want.length && timingSafeEqual(Buffer.from(got), Buffer.from(want));

Webhook URLs must be https, must not contain a username or password, and must resolve to a public address. Pulse does not follow redirects and gives up after 10 seconds.

Common issues#

Nothing arrives
Make sure at least one channel is switched on and press Send test. A rule with no active channel says so. Failures show the provider's message next to the channel.
Email is greyed out
Email is not configured on this server. Use another channel, or add a Resend key if you self-host.
Spike and goal rules are disabled
They need the Pulse script's own events. Sites imported from Umami only get sale alerts and the digest.
I get a sale alert without a source
Pulse could not trace the order to a visit. See revenue attribution.