Webhook Triggers
A webhook-triggered automation runs whenever an external system sends an HTTP POST to the automation's unique URL. This is how you wire PSA/RMM alerts, monitoring tools, or automation platforms (Zapier, n8n, Power Automate) into a StackJack automation.
Set up a webhook automation
- Create an automation (or edit an existing one) and choose the Webhook trigger.
- Pick a Payload mode (how much of the sender's request body reaches the agent — see below).
- Optionally set Max payload size (bytes). Leave blank for the server default of 32 KB; the hard ceiling is 65,536 bytes (64 KB).
- Save, then open the automation detail page. The Webhook card shows everything the sending system needs.
The webhook URL is a credential
The webhook URL has the form:
https://agents.stackjack.io/webhooks/<automation-id>/<secret>
The secret is embedded in the URL itself — anyone who has the URL can trigger your automation. Treat it like a password:
- Use the Copy button rather than transcribing it.
- Don't paste it into tickets, chat, or documentation.
- If it leaks, click Rotate secrets immediately.
Payload modes — how the body reaches your agent
| Mode | What the agent receives |
|---|---|
| None — discard body | Nothing from the request body. The run starts with the automation's own instructions only. |
| Full context — pass body verbatim | The entire request body is handed to the run as its trigger payload. |
| Selected fields — extract specific paths | Only the JSON fields you list (simple dotted paths like ticket.id or alert.severity — no array indices or wildcards) are extracted and passed to the run. |
Whatever payload survives filtering becomes the run's trigger payload — it is given to the agent as the context for that run, and you can see exactly what was received on the run's detail page in the Trigger payload card.
Payloads that exceed the size cap after filtering are rejected with HTTP 413 and no run starts.
Optional request signing (HMAC)
Beyond the URL secret, you can have senders prove the body wasn't tampered with:
On the Webhook card, click Reveal next to Signing secret (it is masked by default) and copy it.
Configure the sender to compute
HMAC-SHA256(raw request body, signing secret)and send the result as a header:X-StackJack-Signature: sha256=<hex digest>The header is optional — omit it and only the URL-secret check applies. If the header is present, an invalid signature is rejected with
401.
The Webhook card includes copy-paste curl examples — an unsigned one always, and a signed one that renders only after you click Reveal (so the secret never sits hidden on the page).
Rotating the secrets
Click Rotate secrets and confirm. Rotation generates a new URL secret and a new signing secret, and it takes effect immediately — the old URL stops working the moment you confirm, so update every external sender right away.
Delivery limits and response codes
- Rate limit: 10 webhook invocations per minute per automation. Excess requests get
429. - Transport cap: request bodies over 64 KB are rejected.
What a sender sees:
| HTTP status | Meaning |
|---|---|
202 |
Accepted — the response body contains the new run's id and status. |
400 |
The automation is not webhook-triggered. |
401 |
Bad URL secret, or the signature header was present but invalid. |
402 |
Out of credits — the run was refused before it started. Top up credits; don't retry. |
404 |
Unknown, inactive, or archived automation (also returned when automations are disabled for the tenant). |
413 |
Payload too large (after filtering). |
429 |
Rate-limited (retry after the minute window), or all agent execution slots are busy (this case includes a Retry-After: 30 header). |
500 |
The run could not be started due to a server error. |
503 |
The run was created but its background monitor failed to launch. Retryable — this case includes a Retry-After: 30 header. |
Webhook receipts (delivery log)
Every webhook attempt against an active automation is logged, whatever the outcome — so you can always answer "did the sender actually reach us, and what happened?" (Attempts against unknown, inactive, or archived automations get a 404 and are not logged.)
- Inline panel: the automation detail page includes a collapsed Recent webhook receipts panel showing the last 20 receipts with a Refresh link.
- Full page: a dedicated receipts page at
/automations/<automation-id>/webhook-logsshows up to 500 receipts with a limit selector (50 / 100 / 250 / 500) and a Refresh button. There is currently no menu link to this page — open it by entering the URL directly (take the automation id from your browser's address bar on the detail page).
Each receipt row shows: received time, outcome, the HTTP status returned to the sender, the sender's IP address, payload size in bytes, and a short detail string. Possible outcomes:
| Outcome | Meaning |
|---|---|
Accepted |
A run was started (the receipt records the new run's id). |
WrongTriggerType |
The automation is not webhook-triggered. |
InvalidSecret |
The URL secret was wrong. |
InvalidSignature |
The X-StackJack-Signature header failed verification. |
RateLimited |
The 10/minute limit was hit. |
PayloadTooLarge |
The payload exceeded the size cap. |
CapacityExceeded |
All agent execution slots were busy. |
TenantDisabled |
Automations are disabled for the tenant. |
OrchestrationFailed |
The run failed to start server-side. |
CreditExhausted |
The tenant is out of credits; the run was refused at pre-flight (HTTP 402). |
LaunchFailed |
The run was created but its background monitor failed to launch (HTTP 503). |
Requests aimed at an unknown automation id are deliberately not logged (internet scanner noise); the same applies to inactive and archived automations. A tenant-side kill switch (TenantDisabled) is logged.