Alert channels

A channel is somewhere Advec sends alerts: an email address, a Slack channel or your own webhook. This page covers what an alert contains, when alerts repeat, and how to receive them on a webhook. To add a channel, see Set up alerts.

What an alert contains

Every alert carries the issue's title and tier, the client, the entity it's about (such as a campaign), who made the change ("unknown" when the platform doesn't say), the reasons for its tier, and a link to the issue in Advec.

  • Email: the subject is [Critical] or [Operational] followed by the title. Emails end with an Open the issue link and a Manage alert channels link.
  • Slack: a message with the title, Tier, Client, Entity and Actor fields, the reasons, and an Open the issue button.
  • Webhook: a signed JSON request (see below).

How alerts are delivered

TierFirst alertRepeatsRecovery notice
CriticalStraight awayEvery 5 minutes until someone acknowledges, snoozes or resolves itOnce, if it resolves on its own after you were alerted
OperationalOnce when it opens, and once each time it comes backNeverNever
AmbientNeverNeverNever

If an operational issue comes back within an hour of its first alert, the comeback alert waits until that hour has passed. An unacknowledged critical can escalate to another channel after 30 minutes. Recovery notices are prefixed RESOLVED.

If a send to a channel fails, Advec retries it about a minute later, up to 3 attempts within an hour, then gives up. A first alert, or an alert that an issue came back, that can't go out within an hour of the problem being seen (for example after an outage) is dropped rather than sent late. The issue stays in your inbox.

Webhook reference

Advec sends a POST with a JSON body. The event is one of created, renotify, escalated, regressed or resolved, or test for a test send.

{
  "event": "created",
  "sent_at": "2026-09-21T08:01:12.345678+00:00",
  "client": { "id": "4b1e…", "name": "Acme" },
  "issue": {
    "id": "7f3c…",
    "kind": "budget_underpacing",
    "tier": "operational",
    "status": "new",
    "title": "Acme is on track to spend 75% of its 10,000 monthly budget"
  },
  "link": "https://…/issues/7f3c…"
}

issue is the issue as you see it in the app: its id, kind, tier, status, title, entity, actor, reasons and timestamps. It has more fields than shown here.

Each request has these headers:

  • X-Advec-Signature: sha256=<hex> — an HMAC-SHA256 of the exact raw request body, keyed with the channel's signing secret. Advec shows the signing secret once, when you create the channel.
  • X-Advec-Event — the event kind.
  • X-Advec-Delivery — a unique id for the delivery. A retry gets a fresh sent_at, so its body and signature change. Use this id to ignore duplicates. Test sends don't include it.

To verify, compute the HMAC over the raw bytes you received, before parsing them:

import hashlib, hmac

def is_from_advec(raw_body: bytes, signature: str, secret: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

Only a 2xx response counts as delivered. Redirects aren't followed, and Advec waits 10 seconds for a response.

Channel health

Open Settings and click Manage channels under Alert channels. Each channel shows whether it's verified, when it last sent, how many sends failed in the last 24 hours, and the last error. There's no per-issue delivery history. If alerts aren't arriving, see I'm not getting alerts.

Channels receive alerts on the Pro and Agency plans. On Free you can add and test channels, but alerts aren't sent to them. To choose which channels get which tier for a client, see Alert rules and quiet hours.