How pushing works
Connect an integration to a project and every bug filed into that project is pushed automatically, as it arrives. There is no rule to write and no button to press.
Connect more than one and the bug goes to all of them — a Jira issue and a Slack message from the same report is the common setup, and it is what you get by connecting both.
| Provider | What arrives | Fix there closes the bug here |
|---|---|---|
| Jira | An issue in your project | Yes — with a webhook |
| GitHub | An issue in a repository | Yes — with a webhook |
| Linear | An issue in a team | Not yet — see the note below |
| Slack | A message in a channel | No — a message has nothing to close |
The pushed issue carries the title, the description, the severity, the page URL, and the console and network lines that matter — the failing requests and the error output, not the whole buffer.
Pushing sends bug content outside our encryption boundary. On plans with encryption at rest, a report is stored sealed — but a tracker cannot read ciphertext, so the issue body is decrypted on the way out. That is what connecting an integration asks for, and it is worth knowing before you connect one to a project handling sensitive reports.
Connecting a tracker
All four start the same way, in the dashboard: open the project, then Settings → Integrations → Trackers & Data Sources, and pick a provider. You need the Admin role.
Credentials marked secret are write-only — once saved they come back as
•••••••• and there is no screen that will show them to you again. To
change one, type a new one over the mask; leaving the mask in place means "leave it
alone".
Jira
| Field | Example | Where to get it |
|---|---|---|
| Jira base URL | https://acme.atlassian.net |
Your Jira address, without a path. |
| Project key | ENG |
The short prefix on every issue in the target project. |
| Account email | you@acme.com |
The Atlassian account the issues will be created by. |
| API token secret | ATATT3x… |
id.atlassian.com → Security → API tokens → Create API token. Not your password. |
Use a service account, not your own. Every issue will carry the identity of whichever account this token belongs to, and that account leaving the company takes the integration with it.
GitHub
| Field | Example | Where to get it |
|---|---|---|
| Repository | acme/storefront |
Owner and name, exactly as in the URL. Not the full address. |
| Personal access token secret | github_pat_… |
Settings → Developer settings → Personal access tokens. A fine-grained token scoped to that one repository with Issues: Read and write is enough. |
Issues must be enabled on the repository. If they are turned off, the push fails with a
410 and the bug stays where it is.
Linear
| Field | Example | Where to get it |
|---|---|---|
| Team ID | a1b2c3d4-… |
Linear → Settings → your team → the id in the URL, or from the API. |
| API key secret | lin_api_… |
Linear → Settings → API → Personal API keys. |
Severity is mapped onto Linear's priority scale: critical → Urgent, high → High, medium → Medium, low → Low.
Linear's inbound webhook does not settle bugs yet. Pushing works — issues are created and linked. But completing the issue in Linear does not currently close the report here, because the two ends identify the issue differently. Close the bug in BugCatch as well, or use Jira or GitHub if two-way sync matters to you.
Slack
| Field | Example | Where to get it |
|---|---|---|
| Incoming webhook URL secret | https://hooks.slack.com/services/T…/B…/… |
api.slack.com/apps → your app → Incoming Webhooks → Add New Webhook to Workspace, and pick the channel. |
The URL is the channel — it is bound to whichever one you picked when you created it. To post somewhere else, make a second webhook.
Check it worked
- Save the integration. The page confirms it by name.
- File a test bug into that project — the widget, the extension or a
curlall do. - Within a few seconds the issue or message appears at the other end.
- The bug's timeline in BugCatch shows a pushed to … entry with the issue reference.
If nothing arrives, the timeline is where the reason is: a rejected credential or a missing repository is recorded there rather than silently dropped.
Sending status back — the tracker webhook
Traffic only goes one way until you do this. The engineer who actually fixes the bug closes a ticket in Jira, because that is where they already are, and BugCatch never learns: the bug stays open, the knowledge base never learns the fix, and the customer who reported it is never told.
One webhook fixes all of it. An issue reaching a terminal state settles the bug here, and everything downstream runs on its own — the resolution is stamped, the knowledge base is taught, the reporter's email goes out, and duplicates of it are cascaded.
-
Get the URL
In Settings → Integrations → Trackers & Data Sources, open the connected integration and choose Webhook. You get a full address to paste, and a secret.
For GitHub and Linear the URL is plain and the secret goes in the tracker's own signing field. For Jira — which signs nothing — the secret is carried in the URL itself, so treat that whole address as a credential.
-
Register it in the tracker
See the per-provider steps below.
-
Test it
Close the test issue you created earlier. Within a few seconds the bug in BugCatch should move to resolved, and its timeline should say the tracker closed it.
GitHub
Repository → Settings → Webhooks → Add webhook.
| Payload URL | The URL from the dashboard |
|---|---|
| Content type | application/json |
| Secret | The secret from the dashboard |
| Events | Let me select individual events → Issues only |
The body is verified against X-Hub-Signature-256, so an unsigned or mis-signed delivery is refused.
Linear
Settings → API → Webhooks → New webhook. Subscribe to Issues, and paste
the secret into Linear's signing secret field — deliveries are verified against
Linear-Signature. As noted above, the delivery is
authenticated but will not currently match a bug.
Jira
Jira Settings → System → Webhooks → Create a WebHook. Paste the whole URL,
including its ?token=…, and subscribe to Issue → updated. Scope it
with a JQL filter of project = ENG so you are not sending every issue in
the instance.
Jira webhooks are unsigned, which is why the secret is in the URL. Anyone who obtains that address can post to it, so do not put it in a ticket, a wiki page or a shared document. If it leaks, rotate it from the same screen you got it from — the old address stops working immediately.
What is acted on, and what is deliberately ignored
Only a terminal transition and an explicit reopen. Everything else is dropped on purpose: Jira fires an update webhook when somebody edits a label, and a mapping that read "not done" as "open" would reopen a fixed bug every time a colleague tidied a field.
| Provider | Closes the bug when | Reopens it when |
|---|---|---|
| GitHub | The issue is closed | The issue is reopened |
| Jira | Status category becomes Done | It leaves Done |
| Linear | State type becomes completed or canceled | It leaves those |
Status categories and state types rather than names, because every team renames "Done" to "Shipped" and adds three of its own — the category is the field that survives that. A cancelled Linear issue counts as finished: it is not coming back, and leaving the bug open forever waiting for it is the worse of the two wrong answers.
A delivery that arrives intact always gets a 200, even when there was
nothing to do with it. Trackers disable an endpoint that keeps answering with errors,
and "we have no bug for that issue" is not an error — it is every issue your team files
by hand.
Slack has no webhook of its own, because a message has nothing to close. Connect Jira, GitHub or Linear to have a fix settle the bug.
Recording links
A URL you can send to anyone — a customer on the phone, a tester, a client — that lets them file a report into one project with no account, no extension and nothing embedded in your product. It is the fastest integration on this site, because there is nothing to integrate.
-
Create one
Project Settings → Recording Link → Create. Optionally give it an expiry. You need the Admin role.
-
Send it
The link looks like
https://app.bugcatch.sphoro.com/report/<token>. Anyone holding it can file into that project — so treat it like a password, and give it an expiry when it is for one conversation. -
What they see
A page that records their screen, takes a description, and submits. They can prove their email address with a code if they want to hear back — and unlike an address that arrives through
identify(), that one is proved rather than claimed. -
Revoke it when you are done
From the same screen. Revoking is immediate; existing reports are unaffected.
The link decides the project, not the person using it. Someone holding it cannot aim a report at a different project — which is the difference between this and handing out an API key.
Which of these do you actually need?
| If your team… | Connect |
|---|---|
| Plans work in Jira and closes tickets there | Jira + its webhook. The two-way loop is the point. |
| Lives in GitHub issues | GitHub + its webhook. |
| Wants to see bugs arrive but triages in BugCatch | Slack alone. |
| Needs to collect from people outside the company | A recording link. No tracker involved. |
| Wants something none of these do | The REST API — read a report, do what you like with it. |
Still stuck?
Every answer here describes what the product actually does today. If something behaves differently, that is worth telling us about — it means the page is wrong.
- Support
- support@sphoro.com
- Security
- info@sphoro.com
- Talk to us
- Book 20 minutes