A webhook trigger lets any tool that can send an HTTP request start one of your Inrō scenarios. Your CRM, a form tool, Zapier, Make, a custom backend: if it can POST to a URL, it can fire a flow. For a short intro to where webhooks sit in the trigger list, see Triggers: The Complete Reference. This article covers the full setup.
Getting your webhook URL
Each scenario that uses a webhook trigger gets its own unique URL:
Create a new scenario (or open an existing one) in Automation → Scenarios.
In the trigger picker, go to External → Webhook is called.
Save the scenario. The URL appears in the trigger node.
Copy the URL and paste it into your external tool. The webhook trigger is available on every plan.
⚠️ The URL is unique and unguessable, so treat it like a secret. If you delete and recreate the scenario, you get a new URL and will need to update your external tool.
Sending the request
Your external app sends a request shaped like this:
Method:
POSTContent-Type header:
application/jsonBody: a JSON object that includes at least one contact identifier.
Identifying the contact
Inrō needs to know which contact to run the scenario for. Include at least one of these, and Inrō checks them in this order:
Parameter | Type | Description |
| integer | The Inrō contact ID |
| string | The contact's saved email address |
| string | The contact's Instagram username |
⚠️ The webhook fires only for a contact that already exists in Inrō. It doesn't create new contacts, so if none of your identifiers match an existing contact, the request returns "Contact not found" and nothing runs. Make sure the contact is in Inrō first (for example, they've messaged you before).
Example request body
{ "username": "jane_example", "appointment_date": "March 24th, 2026", "plan": "Pro"}
To test it quickly from a terminal, send that body with cURL:
curl -X POST "https://your-webhook-url" \ -H "Content-Type: application/json" \ -d '{"username": "jane_example", "plan": "Pro"}'
Using webhook data inside the scenario
Every parameter you send is available as a variable using {{webhook.parameter_name}}. From the example above:
{{webhook.appointment_date}}returnsMarch 24th, 2026{{webhook.plan}}returnsPro
So a message like:
Hi {{contact.name}}, your {{webhook.plan}} plan is confirmed. Your appointment is on {{webhook.appointment_date}}.
becomes a personalised DM. You can also read {{webhook.url}} (the URL that called you) and {{webhook.body}} (the raw payload). For the full reference, see Variables & Personalisation Guide.
Practical examples
Follow up after a purchase. Your e-commerce platform posts to Inrō when an order is confirmed, including the customer's username and order details. Your scenario fires a DM with the tracking link.
Respond to a form submission. A Typeform or Tally submission runs a Make scenario, which posts to your Inrō webhook with the contact's username and their answers. Your scenario fires a personalised DM.
Sync a CRM status change. When a contact is marked "Deal closed" in your CRM, the CRM's automation posts to Inrō and an onboarding sequence fires on Instagram.
🐾 Netsuke's Tips
Test with a real, existing contact before going live. Send a test request (Postman or a quick script) and confirm the scenario fires and your variables resolve.
Send more parameters than you think you need. Extra fields don't cause errors, and having the data available later saves you from updating the external app.
If you're using Make, prefer its trigger-a-scenario step over calling the URL by hand. It handles authentication and contact matching for you. See Make: Connect Inrō to 8,000+ Apps.
Because the trigger needs an existing contact, pair it with a flow that captures the contact first if your source app might reference people who've never messaged you.
What's next?
To send data out of Inrō from inside a scenario (the reverse direction), see HTTP Requests: Connect Inrō to Any External API.

