Triggers

Public Webhook

Gives one flow a public HTTPS address, so GitHub, Stripe, or any internet sender can start it — no port forwarding, no tunnel, no server of your own.

trigger.public_webhook
TRIGGERPublic Webhook

Direct download only. This feature isn't in the Setapp edition. Compare editions

At a glance

Fires when
A request arrives on your relay channel
Emits
Body, headers, method, path, timestamp, channel id
Needs
An owned license or a Watchflows Cloud subscription

Set it up

Select the node and press Create Public URL. Watchflows provisions a channel and the How to Use section shows its full address, https://hooks.watchflows.app/<channel-id>. Paste that into whatever should call you.

The inspector for Public Webhook. Create Public URL provisions the channel; signature checking is set up below it.
The inspector for Public Webhook. Create Public URL provisions the channel; signature checking is set up below it.

The relay is a pipe. It accepts the request, holds it in a queue, and hands it to your Mac over a secure connection. Signature checking and payload parsing happen locally — the relay never sees your signing secret and never sends a reply from your flow back to the caller. Senders always get 202 Accepted.

Configure

FieldDefaultWhat it does
Verify HMAC SignatureOffCheck each request's signature on this Mac before the flow fires.
Signature SchemeGitHubGitHub (x-hub-signature-256), Stripe (stripe-signature), or Generic (x-signature: sha256=…).
Signing Secret—The shared secret from the sending service. Stays on this Mac and is scrubbed from exports.
Custom Arguments—Extra key-value pairs merged into the payload.

The channel id is not a field you type. It is written by Create Public URL, and the inspector shows only its first 8 characters everywhere except How to Use.

Output

Every key is available downstream as {{key}}.

KeyTypeValue
bodyObjectThe JSON body — reach inside it with body.field
headersObjectRequest headers, names lowercased
methodStringThe HTTP method used
pathStringThe request path
timestampStringWhen the relay received the request, ISO 8601
channelIdStringThe channel id's first 8 characters

Example: a GitHub push reaches your Mac

Public Webhook receives the delivery and verifies it with the GitHub scheme. Template reads {{body.repository.name}} and {{body.ref}}. Notification shows the result.

Three nodes. A push on GitHub ends as a notification here.
Three nodes. A push on GitHub ends as a notification here.

Paste this into the Flow Builder to get the same flow:

Give me a public webhook that verifies GitHub signatures and notifies me which repo and branch was pushed.

Good to know

The URL is the credential. There is no separate token — anyone holding the address can post to your channel. Exports scrub it automatically, but if it leaks, press Regenerate: the old address stops working at once. Revoke kills the channel without replacing it.

Turn on Verify HMAC Signature for anything that supports it. A request with a missing or wrong signature is dropped with a trigger error and the flow does not fire. Verification runs here, over the exact bytes the sender transmitted.

Nothing is lost while the Mac is asleep. Deliveries queue for about 24 hours and arrive in order on reconnect. The trigger remembers what it already ran, so a redelivered duplicate is discarded rather than fired twice — even across a restart. Deliveries that failed verification are not confirmed, so fixing a wrong secret recovers them on the next reconnect.

Fair-use caps per channel: 60 requests a minute (senders over it get 429); about 100 KB per request, and less for binary, which is base64-expanded on the way through (413 over it); an offline queue of 200 requests or 5 MB; 24 hours of retention. Each license can hold 10 channels.

Needs an owned license or Watchflows Cloud. Creating, regenerating, and revoking a channel requires either an owned license or an active Cloud subscription, activated here. Public webhooks are included with both at no extra cost. Settings ▸ Webhooks also has an Enable public relay switch — with it off, these nodes receive nothing.