Test results in Discord, without a bot
Paste an incoming webhook URL, pick the events that matter, and a failed test, a dropped session or a finished accessibility scan arrives as a single embed carrying the device, the duration, the reason and a markdown link straight back to the run.
No app to install · outbound webhook only
Automate test failed — Checkout suite
Chrome 152 on Windows 11 · assertion failed on the payment step
- Started by
- [email protected]
- Duration
- 2m 41s
- Started
- 28 Sep 2026, 02:14 UTC
- Product
- Automate
View details →
- No bot
- paste an incoming webhook URL
- Failures-only preset
- or every result, per product
- Colour by severity
- green pass, red fail, grey neutral
- 5 retries
- before a delivery is marked exhausted
What lands in the channel
Every message is a single Discord embed built from one neutral description of what happened.
A severity you can scan past
The embed's colour stripe is set from the severity of the event — green for a pass, red for a failure, grey for anything neutral — so a reader tells a bad card from a good one down the side of the channel without reading a word.
The facts, not a status word
One embed per event: the build or test name where there is one, otherwise the product and the device it ran on, who started it, when, how long it took, and a plain-English reason when a session ended for one. Fields are sent inline, so Discord lays them across the embed as a compact grid.
A readable start time
Discord receives the start time as a readable UTC string built from a fixed month table, so the wording never depends on where the server runs. Slack is the only one of the four channels that renders the run's start time on the reader's own clock.
No 'N/A' clutter
A field with no value is dropped rather than printed as N/A. A test-management event carries its project as the embed footer; a Live session, an Automate test and an accessibility scan have no project, so the footer is simply omitted.
A link straight back to the run
The way back is a markdown “View details” link inside the embed description, not a button — an embed posted through an incoming webhook cannot carry an interactive component. It opens the session or scan, where the recording, console output and network log are waiting.
Reliable delivery
The webhook URL is re-validated before every dispatch, redirects are refused, and a slow channel never holds up the test that triggered it.
Every event you can subscribe to
Pick events per product — by hand, or with a preset (all results, or failures only). These are the only events that exist.
Device farm & accessibility
- Automate test passed, failed or errored
- Live session ended (neutral) or failed
- Accessibility scan completed or failed
Test management
- Test case created or deleted
- Cycle created, completed or deleted
- Plan created, completed or deleted
- Bulk execution completed
Deliberately absent
- Visual — appears in the picker with an empty list; nothing emits a visual event yet.
- No automate.build.completed — a build is a label, not an object with a lifecycle.
- Attempts before a delivery is marked exhausted
- 5
- After which an incomplete send is abandoned
- 10s
- Delivered records are swept after a week
- 7 days
- Unsuccessful records are swept after a month
- 30 days
Sending is fire-and-forget — a slow channel never holds up the run. Retries are spaced a minute, five minutes, half an hour, two hours and eight hours apart. The webhook URL is re-validated before every dispatch; loopback, private, link-local, carrier-grade NAT and multicast addresses are refused, and redirects are not followed.
Frequently asked questions
No. You create an incoming webhook on a Discord channel, paste the URL into TestKase, name the integration and choose its events. There is no OAuth flow, no bot user and no slash command — nothing reads the channel and nothing answers in it. The traffic only goes one way: TestKase posts to Discord and Discord never calls us.
Only if you subscribe to that event. A Live session ending is neutral rather than a success and renders grey, not green, because a tick on every closed tab is noise and noise is what makes a team mute a channel. Most teams take the failures-only preset and never subscribe to ordinary endings at all.
Not yet. Nothing in the product emits a Visual notification event today, so there is nothing to subscribe to. Visual appears in the picker with a deliberately empty list — listing an event before it fires would hand you a webhook that never arrives.
The delivery is retried up to five times, spaced a minute, five minutes, half an hour, two hours and eight hours apart, and then marked exhausted. That also covers Discord throttling a webhook during a burst of parallel results: a throttled send is just another failure. If you switch the integration off part way through, the pending delivery is cancelled rather than retried.
No. One integration is one webhook URL, which means one channel. Failures in one channel and accessibility results in another means two integrations with two URLs. There is no scheduling either: no quiet hours, no digest, no batching.
An embed sent through an incoming webhook cannot carry an interactive component, so the way back to the run is a markdown “View details” link inside the description rather than a button. The embed carries text fields and that link, not media — the screenshot, the recording and the logs stay with the session. Nothing pings a person or a role, nothing reacts, and every card is a new message rather than a thread reply.
Put the failures where your team already is
Create a webhook on a channel, paste the URL, choose failures only. It takes about a minute and there is nothing to install.