Webhook Builder and {{placeholders}}: template any JSON payload

Webhook Builder and {{placeholders}}: template any JSON payload

Vendors that “just POST JSON” rarely let you rewrite the message. AlertHub does: reserved ah_* fields plus Mustache {{path.to.field}} over the rest of the payload (nested objects, up to 10 levels). You can put templates in the query string so Stripe and Shopify never need a middleware server.

The Webhook Builder generates or parses those URLs. The Ingestion API is the contract.

Reserved vs custom

FieldRole
ah_keyProject secret (required)
ah_titleTitle template (required)
ah_descriptionBody template
ah_levelinfo | warning | critical (default info)
ah_sourceLabel in the feed
Anything elseCustom variable for {{name}}

If the same key appears in the URL and JSON body, the body wins. Mix them: keep ah_key in the query (easy to rotate in Shopify Admin) and send a fat Stripe event as POST JSON.

Setup (once)

  1. Copy the secret from app.thealerthub.com.
  2. Open the Webhook Builder, paste the key, set title/source/level/description.
  3. Copy the URL into the vendor, or import an existing URL to see what it encodes.

Example 1: Shopify order (query templates)

Shopify POSTs the order JSON to your URL. Title/description in the query refer to flat fields:

ah_title=New sale {{name}}
ah_description={{email}} spent {{total_price}} {{currency}}

Walkthrough: Shopify order alerts.

Example 2: Stripe nested objects

Stripe events nest under data.object. Use dot paths:

ah_title=Stripe {{type}}
ah_description=Amount {{data.object.amount}} {{data.object.currency}}

Failed-payment widgets live in that guide. Same idea for GitHub: {{repository.name}}, {{sender.login}} — repo webhooks.

Example 3: Full JSON from your app

When you control the client, skip query templates and send:

{
  "ah_key": "YOUR_KEY",
  "ah_title": "Deploy {{commit.id}}",
  "ah_description": "Author {{commit.author}}",
  "ah_level": "warning",
  "ah_source": "API",
  "commit": { "id": "abc1234", "author": "Ada" }
}

Resulting title: Deploy abc1234. Arrays: {{line_items.0.title}}.

Ideas to squeeze more value

  • Never put the key in a public repo. Prefer GitHub Actions secrets or vendor webhook config.
  • Import URL in the Builder when a colleague sends a mystery link.
  • Level in the query (ah_level=critical) is how UptimeRobot and Vercel page without a code change. Levels.

FAQ

Do placeholders run in n8n before the POST?
n8n {{ $json }} runs first. AlertHub {{data.object.id}} runs on the server after ingest. n8n guide.

What if the path is missing?
The placeholder typically renders empty. Inspect a real payload once.

GET or POST?
POST JSON is preferred. Query-only works for vendors that cannot set a body.

Next steps

Build one URL in the Webhook Builder, paste it into Shopify or Stripe, and confirm interpolation in the dashboard.

Related: Ingestion API · send from Node, Python, PHP