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

  1. Click the Trigger Setup node on your canvas

  2. Select Webhooks → Incoming Webhook

  3. The Configure tab opens with these fields:

Configuration fields

FieldTypeRequiredDescription
Webhook NameTextYesA label for this webhook (e.g., "Stripe events", "Form submissions"). Default: "My webhook"
Webhook URLAuto-generatedClick Generate Webhook URL to create a unique URL. Read-only once generated. Has a copy button.
Sample CURLAuto-generatedA ready-to-paste CURL command based on your webhook URL. Copy and run it in your terminal to test.
Allowed IPsIPv4 listNoRestrict which IP addresses can call this webhook. Leave empty to allow all. Add IPs one at a time; they appear as removable badges.
Data StructureSchema editorNoThe 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.

Warning

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:

  1. Generate the webhook URL
  2. Copy the CURL command
  3. Open a terminal and paste it, or trigger a real event from your source app
  4. TinyCommand captures the payload and auto-populates the Data Structure fields
  5. 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:

  1. Enter an IPv4 address in the Allowed IPs field
  2. Click Add; the IP appears as a badge
  3. Repeat for additional IPs
  4. Requests from other IPs are rejected with 403

Leave the field empty to accept requests from any IP.

Output variables

VariableWhat 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 OK immediately; 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
Tip

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.