Channels and timing

In-app is immediate and complete. Everything on this page is about the other three: being told without looking.

Email

An email is not sent the instant something happens. It is scheduled a few minutes out (five, by default) and cancelled if you read the notification first. Most incidents that resolve themselves in two minutes therefore never reach anyone's mailbox, and the ones that matter still arrive while they matter.

Every notification uses one message layout — a title, the body, a button to the thing it is about and a link to your preferences. If you have in-app switched off for a kind of notification, there is no row to read and so nothing ever cancels its email: email is your only channel for it, and it always sends.

Some mail is not part of this system at all and never will be. Password resets, address verification and the invitation sent to somebody who does not have an account yet do not consult preferences, do not wait for a digest and are never delayed.

Digests

Setting a kind of notification to digest replaces its per-event email with one rollup — email only, since it is a way of reading less rather than a delivery setting, grouped by workspace, delivered at an hour you choose in your own timezone — every day, or on one weekday.

A digest that would be empty is not sent. Moving your digest time takes effect immediately rather than after the bucket you were already filed under, so shifting from morning to evening does not cost you a further day of silence.

Quiet hours

Quiet hours defer email: the notification still arrives, one by one, once the window ends. A window that wraps past midnight is normal and handled.

The exception is deliberate and worth knowing about: critical notifications ignore quiet hours. A connection that dies at 3am is precisely what an unattended automation platform needs to be able to wake somebody for, and only two kinds carry that urgency — no flow can raise one.

Quiet hours and digests never apply to in-app rows, and never to a webhook either — a machine does not sleep, and holding a callback until morning would make the receiver's own clock a lie.

Your own webhook

One endpoint, configured on your account rather than per workspace, receiving every notification you have switched webhook on for. It is sent straight away: no delay, no quiet hours, no digest, because a machine has no clock to spare.

Two body formats:

{
  "id": "…",
  "type": "DEPLOYMENT_FAILING",
  "urgency": "CRITICAL",
  "title": "…",
  "body": "…",
  "link": "/w/…/deployments/…",
  "wsId": "…",
  "occurredAt": "2026-08-19T09:41:07.284Z",
  "count": 3
}

Slack sends {"text": "…"} instead, so a Slack incoming-webhook URL works with nothing in between.

Verifying it came from us

Give the endpoint a signing secret and every request carries an X-KonnectHub-Signature: sha256=<hex> header — an HMAC-SHA256 of the exact bytes of the body. Verify against the raw body, never a re-serialisation of the parsed JSON:

const expected = "sha256=" + createHmac("sha256", secret).update(rawBody).digest("hex");
if (!timingSafeEqual(Buffer.from(expected), Buffer.from(header))) return unauthorized();

The secret is stored encrypted and never shown again after you save it — the form always starts empty, and saving a new endpoint clears the old key with it.

What we will refuse to call

The URL must be a public HTTPS address. Addresses inside private networks are rejected, at the moment you save and again on every send, because a name that resolved somewhere public today can be pointed somewhere private tomorrow.

Deliveries are retried with a growing backoff. An endpoint that keeps failing is eventually switched off — your URL and secret are kept, so re-enabling is a save away — and you are told that it happened, in the app and by email. That one notification is never sent to the webhook, for reasons that should be obvious the moment you picture it.

Browser toasts

While a KonnectHub tab is open and in the background, in-app notifications can also appear as toasts from your operating system. They need the browser's permission, which is asked for once, when you switch them on.

Stated plainly, because it is the whole trade: nothing arrives when KonnectHub is not open. There is no push service here — closing that gap means depending on a browser vendor's push infrastructure, which we deliberately do not. Email and the digest are what cover the hours when you are not looking at a tab.

Next