Overview
A webhook sends an HTTPPOST to a URL you choose whenever something happens
in a project. Use it to post to a Slack channel, open a ticket in your own
system, or start an automation in Zapier.
issue.created fires once per issue, not for every occurrence, so a crash
loop doesn’t flood your channel.
Add a webhook
1
Open the settings
In the project, open Settings → Webhooks & Slack and click Add
webhook. You need permission to change project settings.
2
Pick a destination
- Webhook: any
https://URL that is publicly reachable. Lerix signs every request (see below). - Slack: an incoming-webhook URL, created in Slack under Apps →
Incoming Webhooks. It starts with
https://hooks.slack.com/. Lerix posts a formatted message with a link back to the dashboard.
3
Pick the events
Choose at least one of
feedback.created, nps.detractor and
issue.created.4
Copy the signing secret
For a generic webhook, the signing secret (
whsec_...) is shown once,
right after you create it. Store it with your endpoint’s configuration.
If you lose it, delete the webhook and add it again to get a new one.5
Send a test
Click Test to send a
webhook.test event. The dashboard shows the
status code your endpoint answered, or the error if it couldn’t be
reached.Payload
Every generic webhook request has a JSON body with the same envelope:data by event
- feedback.created
- nps.detractor
- issue.created
- webhook.test
email, externalId and bugId are null when they don’t apply.
bugId is set when the same install reported an error just before the
feedback.data over time. Ignore fields you don’t know
rather than rejecting the request.
Verify the signature
Lerix-Signature is an HMAC-SHA256 of the timestamp and the raw body,
t + "." + body, keyed with the webhook’s signing secret. Check it before you
trust a request:
- Split the header on
,and readtandv1. - Reject the request if
tis more than 5 minutes away from your clock. This stops an old delivery from being replayed. - Compute
HMAC-SHA256(secret, t + "." + rawBody)as hex and compare it tov1in constant time.
Delivery and retries
- Lerix waits up to 5 seconds for your endpoint. Answer with any
2xxstatus quickly, and do slow work after responding. - On a network error, a timeout,
429or a5xx, Lerix retries up to 3 times, after 2, 10 and 30 seconds. Every attempt is signed again with a fresh timestamp and keeps the sameLerix-DeliveryID. - Any other status (for example
400or404) is not retried. - Redirects aren’t followed.
- The URL must use
httpsand resolve to a public address. Private, loopback and link-local addresses are refused, both when you save the webhook and when each request is sent.
createdAt in the body
if order matters to you.