What Are Webhooks?
Webhooks let external apps send data to Spur to trigger automations. Think of them as a doorbell: when someone rings (sends data), your flow answers (executes actions).
Important distinction:
Inbound webhooks (triggers): External services send data TO Spur to start a flow
Outbound webhooks (actions): Spur sends data OUT to external services using the "Send HTTP Request" action
This guide focuses on inbound webhooks as triggers.
If you are interested in sending data OUT from Spur to external services, please read this guide instead.
How Webhook Triggers Work
When you create a webhook triggered flow:
Spur generates a unique URL
You paste this URL into your external app (Klaviyo, Webflow, Zapier, custom backend, etc.)
When that app sends a POST request to the URL, your flow starts
The data sent in that request becomes available in your flow as variables
Setting Up Your First Webhook Flow
Go to Automations → Automation Flows → Create New Flow
Then choose WhatsApp as the channel
Only WhatsApp messages can be sent via Webhooks, since you can't initiate a business conversation from Instagram or Facebook channels.
Choose Webhook as the trigger from the drop down
Copy the generated webhook URL
Paste it into your external app's webhook settings
As soon you create the trigger, a URL is generated. You can either add this url to the app /tool of you choice. Or just send a POST request to this URL and mention the
phone
andname
of the contact. So that we know which number to send the message to.
This is the URL you will copy from Spur and paste in the other app.Example of other App:
- Past URL in the URL box.
- Sending Phone Number & Name is required for the flow to Trigger.
- This is how you will send phone number, name and any other info in the Body of the Post request through the other app.
- Sometimes you need to select an event before you're able to add the body.Send a test request from that app
Here is an example post request (data you'd send to the webhook endpoint on Spur):
curl --location 'https://api.spurnow.com/profiles/2/workflows/60/webhooks' --header 'Content-Type: application/json' --data '{
"phone": "919871739359",
"name": "Raju Mohan"
}'
For a framework like axios, it should be like:
const axios = require('axios');
let data = JSON.stringify({
"phone": "919871739359",
"name": "Raju Mohan"
});
let config = {
method: 'post',
maxBodyLength: Infinity,
url: 'https://api.spurnow.com/profiles/2/workflows/60/webhooks',
headers: {
'Content-Type': 'application/json'
},
data : data
};
axios.request(config)
.then((response) => {
console.log(JSON.stringify(response.data));
})
.catch((error) => {
console.log(error);
});You can also send any other data available on the other app in the body of the Post Request like this.
This is how you can use it in Spur in a condition block - just enter
{{trigger.key}}
key here is whatever value you're sending from the other app. In this case the key ischoice
, but it can be any key named anything that you're sending to the endpoint in the request body -In Spur, click on ''Test Webhook'' → "Check for Received Requests"
View the JSON payload and click fields to map data to phone number and name
Use the mapped variables in your flow
You can use them in templates, in conditions, in free form messages, in actions. Wherever there's a field where you can type anything into and it allows variable insertion, you can use a mapped variable there.
Test end to end. Always test the connection before making it live for everyone. Make sure it is working as expected.
Common Webhook Use Cases
Klaviyo to Spur
Klaviyo sends customer actions (viewed product, abandoned cart) to Spur via webhook. Spur starts a WhatsApp follow up.
Webflow to Spur
A form submission on Webflow triggers a Spur flow that sends a confirmation message and adds the contact to a segment.
Zapier to Spur
Zapier receives data from hundreds of apps and forwards it to Spur to start messaging flows.
Custom Backend to Spur
Your own application sends events (payment received, booking confirmed) to Spur webhooks to notify customers.
The Debugging Interface
Spur has a very easy way to test and map webhook data.
Testing Your Webhook
Create a flow with a webhook trigger
Copy the generated webhook URL
In the flow builder, look for the "Test Webhook" section
Send a test POST request from your external app
Click "Check for Received Requests" in Spur
You'll see the exact JSON payload that arrived
Full detailed guide on that is here.
One Click Data Mapping
The new interface shows your webhook payload in a live JSON viewer. Instead of manually typing paths like {{trigger.customer.phone}}
, you can:
View the full payload structure
Click on any field in the JSON
Spur automatically generates the correct variable path and copies it to your clipboard
This replaces the old method of checking "Spur Tables" or guessing the data structure.
Troubleshooting
"My webhook flow isn't starting"
Check the webhook URL is pasted correctly in the external app
Verify the app is actually sending requests (check their logs)
Use the "Check for Received Requests" button to see if Spur is receiving anything
"My variables are blank"
Confirm youre using the correct variable paths from the JSON viewer
Make sure the external app is actually sending those fields in the payload
Verify the flow is being triggered by the webhook, not linked from another flow
"I want to manually trigger this webhook flow" You can;t without the data. Webhook flows need their payload. If you need manual triggering, consider:
Creating a separate flow with a keyword trigger
Duplicating the logic instead of linking flows
Using Spur's "Send HTTP Request" action within a dummy flow to hit your own webhook URL in the main flow with test data