Webhooks from Slack, Stripe, GitHub and more
A webhook is another service calling your site when something happens: a payment goes through, someone types a Slack command, a pull request opens. On Tessryx it lands on a route of your site, and a workflow decides what to do with it.
Before that workflow runs, Tessryx checks that the request was signed by the service you named, with the signing secret you stored. Anything unsigned or forged gets a 401, so your logic only ever sees the real thing.
Try it
Send a webhook to a verified route
The request
POST https://acme.tessryx.app/hooks/stripe
- content-type: application/json
- stripe-signature: signed when you press Sendchecked, not passed on
{"id":"evt_1Q8xYz","type":"payment_intent.succeeded","data":{"object":{"id":"pi_3Q8xYz","amount":2000,"currency":"usd"}}}
What happens
Press Send to deliver it to the route.
How it works
- 01
Store the signing secret
Copy it from the service into Secrets: Stripe's whsec_ key, your Slack app's Signing Secret, a GitHub hook's Secret. From then on it can't be read back.
- 02
Add verify to a POST route
Name the service and the secret on a route that takes POST only. Your AI can set this up for you.
- 03
Point the service at the address
Paste the route's address into the service's webhook settings. Slack's and Discord's setup checks are answered for you.
Questions
Which services work?
Slack, Discord, Stripe, GitHub, GitLab and Shopify, plus any sender that follows Standard Webhooks, which covers Svix, Clerk, Resend, OpenAI and others.
Can I see the secret?
No. Secrets are write-only: once saved, the dashboard shows only the last four characters, and the workflow that handles the webhook never sees the value either.
What if my work takes longer than a few seconds?
Reply right away and finish in the background. Senders retry a slow reply, Slack and Discord after about 3 seconds and others after about 10, so the workflow answers at once and hands the long part to the next run of a chain.
Does it work on the free plan?
Yes, on every plan. Each webhook that runs your workflow uses credits like any other run.
Under the hood
The technical details
- verify.provider
- slack, discord, stripe, github, gitlab, shopify or standard_webhooks (Svix, Clerk, Resend, OpenAI and others).
- verify.secret
- The stored secret holding the signing secret. Neither the route nor the workflow ever sees its value; the signature is checked over the body exactly as it arrived.
- 401
- An unsigned or wrongly signed request is refused before the workflow runs. The route takes POST only and has no sign-in gate.
- handshakes
- Slack's url_verification and Discord's PING are answered for you.
- request.headers
- Only the service's delivery headers, like x-github-event, x-shopify-topic or x-slack-retry-num. Never the signing headers.
- body
- JSON or form-encoded, as Slack slash commands send. Slack's payload field arrives already parsed.
- retries
- Senders retry a slow reply, Slack and Discord after about 3 seconds and others after about 10. Reply at once and hand longer work to continue_with.
{
"workflow": "payments/record@published",
"methods": ["POST"],
"input_mode": "transform",
"input_transform": "{ \"type\": body.type, \"id\": body.id }",
"verify": { "provider": "stripe", "secret": "stripe-signing-secret" }
}Related features
Form submissions and JSON posts
Forms and buttons on your pages can send things in, like a sign-up or a vote, and a workflow saves it or passes it along. A plain HTML form works as is, and submissions are always handled fresh.
Write-only secrets
Once a key is saved, no one can read it back, including you and your AI. You see its name and the last few characters, and rotating it means pasting a new value over the old one.
API integrations
Connect a service like Stripe or your email provider once, and any workflow can call it. Your AI sets up the call and you paste in the key.
Authentication for outside services
Calls sign in to the other service with a token, a password or a key, and can sign each request the way X (formerly Twitter) requires. The credential comes from a stored secret.