Integrations overview
Eleven destinations, connected once at the workspace level and routed per project.
Integrations are connected once for the whole workspace, in Integrations in the sidebar, then routed per project.
Except for email, integrations require Pro or above.
What's available
Notify your team
| Integration | Setup | Page |
|---|---|---|
| Slack | Incoming webhook URL | Slack |
| Discord | Channel webhook URL | Discord |
| Microsoft Teams | Channel webhook URL | Teams |
| An address | ||
| Webhook | Any URL you control | Webhooks |
Create issues and tasks
| Integration | Setup | Page |
|---|---|---|
| Linear | API key + team id | Linear |
| Jira | API token + domain + project key + email | Jira |
| GitHub | Personal access token + owner + repo | GitHub |
| GitLab | Personal access token + project id | GitLab |
| Asana | Personal access token + project id | Asana |
| Trello | API key + token + list id | Trello |
Two ways feedback reaches a tool
Automatic, on every new thread. Every integration that's connected and toggled on for the project fires when feedback arrives. Notification channels post a message; issue trackers create an issue, task, or card.
Connecting Jira, Linear, GitHub, GitLab, Asana, or Trello and enabling it for a project means every new thread becomes a ticket. That's right for a dedicated triage board and wrong for a shared sprint board. If you only want some threads to become tickets, leave the tracker off for the project and create tickets on demand instead.
On demand, per thread. Right-click a thread in the inbox and choose Integrations to create a ticket in Linear, Jira, or GitHub.
The on-demand path sends more: the thread's title, page path and URL, issue type, priority, status, expected and actual behaviour, and the element selector. The automatic path sends the comment, the author, and a link back to the page. Where you have the choice, on demand produces the better ticket.
For conditional routing — say, only critical production threads — use an automation or a webhook into your own logic.
Connecting one
Get the credential
Each provider's page walks through this. Most are a webhook URL or a personal access token.
Connect it
Integrations in the sidebar → pick the provider → paste the credential → Connect.
Credentials are encrypted at rest with AES-256-GCM before they're stored.
Test it
Hit Test. Annot8 sends a real delivery and records the outcome. The integration row shows the result of the most recent delivery — test or live — so "is this actually working?" is visible instead of hidden in a log.
Route it to projects
Project → Integrations lists every workspace integration with a toggle. Turn on the ones this project should use.
Per-project overrides
A project can override the workspace configuration for an integration — most usefully, a different Slack channel per project, or a different Jira project key.
Set it in Project → Integrations, expand the integration, and save an override. Clear the override to fall back to the workspace configuration.
That means one Slack app, one credential, and per-project routing — rather than a separate connection per project.
Delivery status and failures
Every integration records the outcome of its last delivery, with the error text when something went wrong.
A failing integration never blocks feedback. A thread is created and stored first; delivery is attempted afterwards, and a broken webhook produces a visible error on the integration rather than a lost thread.
Disconnecting
Disconnect removes the integration and its stored credentials. New feedback stops being delivered there. Threads, tickets, and messages that already exist are untouched.
Not seeing anything arrive?
In order:
- Is the integration toggled on for this project?
- Does the last-delivery status show an error?
- Does the Test button succeed?
- Is the webhook URL still valid — Slack and Discord webhooks die with the channel they were created for.
- Is your plan still paid? Integrations stop when a subscription lapses.