Notifications and webhooks
Send run, issue and organization events by email, Slack, in the app and to signed webhooks.
Autonomy tells people when something happens: a run fails, a run finds a new issue, a member joins. Admins decide what the organization sends and where. Each member then chooses what reaches them.
| Page | Who | What you set |
|---|---|---|
| Organization → Notifications | Owners and admins | Which events the organization sends, its channels, and each project's Slack channel. |
| My notifications | Every member | Which events reach you by email, Slack and in the app, digest frequency, quiet hours and filters. |
| Organization → Integrations → Webhooks | Owners and admins | Endpoints that receive signed JSON. |
Events
| Event | Sent when |
|---|---|
| Run started | A run starts. |
| Run completed | A run finishes, whatever its result. |
| Run failed | A run ends without passing. Always on for the organization; you choose where you get it. |
| New issues | A run finds a new issue, or reopens a resolved one, even if every step passed. |
| Report ready | A PDF or HTML report is ready. |
| Threshold breach | The failure rate or run time goes over your limits. |
| Member joined | Someone joins the organization. |
| Member removed | A member's access is removed. |
| Infrastructure alert | Runner or device capacity problems. Admins only. |
Run failed always reaches you somewhere: if you switch off both email and Slack for it, one comes back on. New issues stays quiet when a run sees an issue that is already open; it fires once per new or reopened issue. By default it goes to Slack and the app, not email.
Organization settings
On Organization → Notifications:
- Events: what the organization sends at all.
- Channels: email to each member who keeps it on, the Slack workspace, and webhook endpoints (Manage opens them).
- Route by project: each project's Slack channel. Run failed always goes to the project channel and the default channel. See Slack.
Click Save preferences when you're done.
Your settings
On My notifications, choose for each event whether it reaches you by Email, Slack or In-app. Under Digest settings:
- Frequency: Real-time, Daily at 9:00 AM or Weekly on Monday. Daily and weekly bundle your mail into one summary.
- Quiet hours: a time when nothing is sent.
- Only my runs: run events only for runs you started.
- Always notify on production failures: failures in production environments reach you even during quiet hours.
Every email has an unsubscribe link that opens these settings.
The weekly digest of a project's environment, with what ran, what broke and which issues were found, is a separate thing: you review and publish it on the project's Digests page.
Webhooks
Webhooks send events to your own systems as signed JSON.
- Open Organization → Integrations → Webhooks and click Add endpoint.
- Enter the endpoint URL and choose its events.
- Under Projects, leave every project unticked to get every project's events, or tick some to get only theirs. Organization events, such as members and infrastructure alerts, go to every endpoint that subscribes to them.
- Save, then copy the Signing secret and send a Test event.
To change the secret, use Roll secret: the current secret stops working immediately, so update your receiver. Each endpoint shows its health, its last delivery and its delivery history. Failed deliveries are retried with backoff for about 24 hours. An endpoint that keeps failing is turned off.
The payload
Each delivery is a POST with a JSON body:
1{2 "type": "issue.found",3 "timestamp": "2026-10-05T14:30:00.000Z",4 "data": {5 "eventKey": "issueFound",6 "label": "New issues",7 "title": "issue.found",8 "body": "New bug: Checkout total ignores the discount code",9 "ctaLabel": null,10 "ctaUrl": null,11 "runId": "...",12 "runExecutionId": "...",13 "reportId": null,14 "actorUserId": null,15 "targetUserId": null,16 "project": {17 "id": "...",18 "name": "Storefront",19 "slug": "storefront"20 },21 "environment": "Staging",22 "isProduction": false,23 "metadata": {24 "issueId": "...",25 "issueHeadline": "New bug",26 "issueTitle": "Checkout total ignores the discount code",27 "issueKind": "Bug",28 "issueStatus": "new",29 "issueUrl": "https://app.autonomyqa.com/p/storefront/issues/...",30 "projectName": "Storefront",31 "environment": "Staging",32 "runName": "Checkout with a discount",33 "runUrl": "https://app.autonomyqa.com/p/storefront/runs/..."34 },35 "createdAt": 179121060000036 }37}type is one of run.started, run.completed, run.failed, issue.found, report.ready, threshold.breach, member.joined, member.removed and infrastructure.alert.
data.project is the event's project, or null for organization events. data.metadata carries only an allowlisted set of facts: the run's name, environment, result, duration, counts, step results and links; the issue's ID, headline, title, kind, status and link; and the threshold, member or alert fields. Nothing about how Autonomy works internally is sent.
A run.failed event also has data.cause, which says why the run didn't pass:
cause | Meaning |
|---|---|
"app" | The run failed. Open it to see which step failed and why. |
"couldnt_start" | The run Couldn't start, for example because the app didn't open or no test device was available. Fix the setup, then rerun. |
Verify the signature
Deliveries follow Standard Webhooks. Each carries webhook-id, webhook-timestamp and webhook-signature headers. The signature is an HMAC-SHA256 of <webhook-id>.<webhook-timestamp>.<body> with the endpoint's signing secret, sent as v1,<base64>. Use a Standard Webhooks library to verify it, reject anything that doesn't match, and reject old timestamps to stop replays. Use webhook-id to ignore a delivery you already handled.
Choosing what to send
Start with Run failed and New issues, sent to the team that owns the journey. Add Run completed only for a channel or system that exists to record every result. A channel that gets every run is a channel nobody reads.
Didn’t find it?