Generic Webhook
The Generic Webhook is the most powerful integration — it doesn’t assume a vendor shape at all. Point any system that can POST JSON to a URL at Splashify, define conditions on the payload, and attach actions (send template, update contact tags, delay, chain). Used for custom back-office systems, internal events from your own backend, or niche platforms that aren’t in the first-class integration list.
What makes it different from the vendor integrations
| Feature | Vendor integration | Generic Webhook |
|---|---|---|
| Fixed slug per vendor | ✅ | ❌ (custom) |
| Fixed event detection | ✅ | ❌ (conditions) |
| One template per event | ✅ | ❌ (multi-action) |
| Capture mode to inspect payload | ❌ | ✅ |
| Chain actions (delay + tag + send) | ❌ | ✅ |
| ALL / ANY condition matching | ❌ | ✅ |
Setup
1. Create a connection
Splashify Pro → Integrations → Generic Webhook → Create Connection. You’ll get a unique URL:
https://apis.splashifypro.com/api/v1/webhooks/generic/<connection-id>2. Turn on Capture Mode
Capture Mode is the secret weapon. When enabled:
- Fire a test request from your source system at the URL above.
- Splashify stores the first payload it receives and shows it to you in the connection editor.
- You now know the exact JSON shape — field names, nesting, types.
- Capture Mode auto-disables after the first payload, so production traffic doesn’t fill up storage.
3. Build workflows
Each connection can have up to 5 workflows. A workflow is conditions → actions.
Conditions (all or any must match):
| Operator | Behaviour |
|---|---|
| Equal | Exact string match |
| Not equal | — |
| Contains | Substring |
| Starts with | Prefix |
| Ends with | Suffix |
| Exists | Field is present in payload |
| Not exists | Field is absent |
Example conditions:
body.eventequalsuser.upgradedbody.customer.countrystarts withINheaders.x-sourceexists
Actions:
- Send message — pick template, map variables using
{{body.field}}or{{headers.x-custom-header}}tokens, optional delay (0s / 60s / 5min / 1h). - Update contact tags — adds or removes tags on the contact matched by phone. Silent no-op if contact doesn’t exist yet.
Actions chain in order — a workflow can send a template now, update a tag, and send a follow-up template after 1 hour.
4. Variable tokens
Unlike vendor integrations (which use numeric {{1}}, {{2}} keyed to a field path), Generic Webhook uses inline tokens. Inside any template variable value you can write:
{{body.customer.name}}— nested payload field{{headers.x-event-id}}— request header (lowercased)- Plain text around tokens:
Hi {{body.customer.first_name}}, your order {{body.order_id}} is ready
Use cases
- Custom SaaS signup flow — Your backend fires
POST /webhooks/generic/{id}when a new user signs up → Splashify sends welcome template + tags contact asnew-signup. - Stock back-in-stock alerts — Inventory system fires when SKU crosses threshold → Splashify sends template to everyone tagged
wishlist-SKU-1234. (You’d build this as a broadcast, not per-event — but the trigger could come from here.) - Internal ops notifications — Fire from your CI/CD on a failed deploy → Splashify pings ops team’s WhatsApp.
- CRM that isn’t in the first-class list — If your CRM can fire webhooks (most can), use Generic Webhook instead of waiting for us to add first-class support.
Limits
- 5 workflows per connection (hard cap; upgrade request: support)
- Condition operators are plain string ops — no regex yet
- Delays are discrete values (0 / 60 / 300 / 3600 seconds) — no arbitrary timestamps
- Array indexing in paths isn’t supported (
body.items[0].namewon’t resolve) — use Zapier or Make as a formatting proxy if you need it
Troubleshooting
- Payload isn’t matching my conditions. Re-enable Capture Mode, fire the request, and verify the exact field path Splashify sees.
- Phone lookup fails for tag updates. The phone has to exist as a contact first. Either create the contact via the send-message action (which implicitly writes it) or import/sync contacts first.
- Same webhook fires my message multiple times. Generic Webhook doesn’t have per-request idempotency like the vendor integrations. Add a content-hash condition or debounce at the sender.