Incoming Webhook
The Incoming Webhook trigger gives you a unique URL. When any system sends an HTTP POST to that URL, your workflow fires with the request payload as input.
Internal name: CUSTOM_WEBHOOK
Node color: Blue (#3B82F6)
Setting it up
-
Click the Trigger Setup node on your canvas
-
Select Webhooks → Incoming Webhook
-
The Configure tab opens with these fields:
Configuration fields
| Field | Type | Required | Description |
|---|---|---|---|
| Webhook Name | Text | Yes | A label for this webhook (e.g., "Stripe events", "Form submissions"). Default: "My webhook" |
| Webhook URL | Auto-generated | – | Click Generate Webhook URL to create a unique URL. Read-only once generated. Has a copy button. |
| Sample CURL | Auto-generated | – | A ready-to-paste CURL command based on your webhook URL. Copy and run it in your terminal to test. |
| Allowed IPs | IPv4 list | No | Restrict which IP addresses can call this webhook. Leave empty to allow all. Add IPs one at a time; they appear as removable badges. |
| Data Structure | Schema editor | No | The expected payload schema. Auto-detected when you send a test request, or manually define fields. |
Generating the webhook URL
Click Generate Webhook URL. The system creates a unique, unguessable URL like:
https://hooks.tinycommand.com/wh/a1b2c3d4-e5f6-7890-abcd-ef1234567890
This URL is permanent for this trigger; it won't change unless you regenerate it.
If you regenerate the webhook URL, the old URL stops working immediately. Update it everywhere it's used (Stripe, GitHub, Shopify, etc.).
Auto-detecting the data structure
After generating the URL, TinyCommand polls for an incoming request (up to 300 seconds, checking every 5 seconds). To detect your payload structure:
- Generate the webhook URL
- Copy the CURL command
- Open a terminal and paste it, or trigger a real event from your source app
- TinyCommand captures the payload and auto-populates the Data Structure fields
- Click Redetermine data structure to poll again if needed
The detected fields become available as variables in downstream nodes: {{trigger.body.fieldName}}.
IP filtering
If your webhook should only accept requests from known servers:
- Enter an IPv4 address in the Allowed IPs field
- Click Add; the IP appears as a badge
- Repeat for additional IPs
- Requests from other IPs are rejected with 403
Leave the field empty to accept requests from any IP.
Output variables
| Variable | What it contains |
|---|---|
{{trigger.body}} | The full JSON body of the incoming request |
{{trigger.body.fieldName}} | A specific field from the body |
{{trigger.headers}} | HTTP request headers |
{{trigger.method}} | The HTTP method (POST, PUT, etc.) |
Example: Stripe webhook
When Stripe sends a charge.succeeded event:
{
"type": "charge.succeeded",
"data": {
"object": {
"amount": 2000,
"currency": "usd",
"customer": "cus_abc123"
}
}
}
Access the amount as {{trigger.body.data.object.amount}} in any downstream node.
Webhook behavior
- TinyCommand responds with
200 OKimmediately; the workflow runs asynchronously - HTTPS only: all webhook URLs use TLS
- No request size limit documented, but keep payloads reasonable (< 1MB)
- The webhook URL is unique per trigger; different workflows get different URLs
Use the auto-generated CURL command to test your webhook before connecting it to a production system. It sends a sample POST with the right content-type headers.