Available on | ❌ Free | ❌ Start | ❌ Grow | ✅ Scale |
Webhooks let involve.me automatically send submission data to your server as JSON as soon as a participant completes your funnel.
Instead of polling an API, webhooks push the data to you in real time. No code is needed on your side to initiate the request.
Common use cases include syncing submissions to a custom CRM, triggering automated workflows, sending data to a database, or building your own custom integration.
How to set up a webhook
Step 1: Open your funnel and click Integrations in the top navigation bar.
Step 2: Find the Webhooks integration card and click Connect.
Step 3: Enter your endpoint URL, for example: (e.g., https://www.your-website.com/your-webhook).
⚠️ For live connections, your endpoint must use HTTPS / SSL. HTTP endpoints can be used for testing only.
Step 4: Click Test Webhook to verify your endpoint.
involve.me will send your most recent participant’s data to the URL you entered. This test also works over HTTP, so you can test locally before going live.
ℹ️ The Response section shows your server’s response for debugging purposes. This response is not used inside your funnels.
Step 5.Click Connect to save and activate the webhook.
Test your webhook
Before going live, we recommend testing your webhook so you can confirm that the data arrives in the format you expect.
Option 1: Use the built-in test. Click Test Webhook in the setup dialog.
involve.me sends your most recent participant’s data to the endpoint.
Option 2: Use a webhook testing service. You can use a free service like webhook.site to inspect the full payload. Paste the webhook.site URL as your endpoint, submit a test entry in your funnel, and review the JSON that arrives
Add a custom header
You can add a custom header to authorize webhook requests on your server. This is a recommended security practice.
To enable it, select Add Custom Header (optional) during setup.
Then enter your Header Name and Header Value, and click Connect to save.
For example, you might use Authorization as the Header Name and Bearer your-secret-token as the Header Value.
Example webhook payload
Here is a complete example of what involve.me sends to your endpoint when a participant completes a funnel:
{
"event": {
"type": "finished_participant",
"version": 1,
"created_at": "2026-03-23 14:30:00"
},
"data": {
"participant_id": "9c3e839e2aacc5bd8bff7deb2ad039eb",
"project_name": "My Lead Gen Quiz",
"project_url": "my-lead-gen-quiz",
"correctly_answered": 3,
"score": "75.0",
"calculator_result": "19.99",
"calculator_results": {
"d79imhx": 112.20,
"f7fj306": 86.30
},
"has_outcomes": true,
"outcome": "Premium Plan",
"outcome_points": "19.99",
"country_code": "US",
"anonymized_ip": "c234a39a7469be63dc31f044e520e43323b9688d",
"seconds_to_complete": 35,
"embed_url": "https://mywebsite.com/pricing",
"device_type": "computer",
"remote_id": null,
"opened_at": "2026-03-23 14:29:25",
"finished_at": "2026-03-23 14:30:00",
"personal_data": {
"first_name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"phone": "+1234567890",
"organization_name": "Acme Inc",
"job_title": "Marketing Manager"
},
"questions": [
{
"id": "8211e586e9b2fd29bc3707c619ca359d",
"type": "default",
"question_text": "What is your team size?",
"answered_correctly": true,
"max_value": "10.0",
"answers_given": [
{
"response_text": "11-50 people",
"connected_outcome": "Premium Plan",
"correct": true,
"value": "7.5"
}
]
}
]
}
}
Webhook Reference
When the webhook sends data
The finished_participant webhook sends data when a participant reaches the last page of your funnel, meaning the thank you page or outcome page.
Request type: POST
User-Agent: involve.me
Host: AWS IP ranges, eu-central-1 only
Event Object
Field | Type | Description |
| string |
|
| integer | Currently always |
| string | UTC timestamp: |
Data Object — Submission Details
Field | Type | Description |
| string | Unique identifier for the participant. May be null during test connections. |
| string | Name of the funnel |
| string | URL slug of the funnel |
| integer | null | Number of correctly answered questions. null if no questions in funnel. |
| string | null | Sum of all answer values (as decimal string). null if no scored questions. |
| string | null | Result of the first calculator element. null if no calculator. |
| object | All calculator results as |
| boolean |
|
| string | Winning outcome name. Only present when |
| string | null | Sum of answer values for the winning outcome. |
| string | null | Two-letter country code based on participant IP. |
| string | Hashed IP. Useful for identifying duplicate entries. |
| integer | Time from funnel load to last page, in seconds. |
| string | null | URL of the page where the funnel was embedded. null if not embedded. |
| string |
|
| string | null | Custom identifier if set via hidden fields. |
| string | UTC timestamp when participant loaded the funnel. |
| string | UTC timestamp when participant reached the last page. |
| object | Contact form data: first_name, last_name, email, phone, organization_name, job_title, street_address, zip_code, city, state, country, etc. Fields are null if not collected. |
| array | Array of question objects (see below). |
Question Object
Each question in the funnel appears as an object in the questions array:
Field | Type | Description |
| string | Unique identifier. Changes if the question is cut/pasted or the funnel is duplicated. |
| string |
|
| string | The question text as shown to the participant. |
| boolean | Only available if |
| string | Max possible score for this question. Only for type |
| boolean | Whether the checkbox was checked. Only for type |
| array | Array of answer objects (see below). Not available for |
ℹ️ Hidden fields are treated as text answers, so hidden field data appears in the question object.
Answer Object
Each answer given by a participant appears in the answers_given array.
The available fields depend on the question type.
Field | Available for | Description |
| default, input, dateTimePicker | The answer text. For dateTimePicker: format is |
| default | URL to the answer image. null if not an Image Answer element. |
| default | Icon class (e.g., |
| default (outcomes only) | The outcome this answer endorses. Only when |
| default (no outcomes) | Whether this specific answer is marked as correct. Only when |
| default | The score value assigned to this answer (decimal as string). |
| rating | Percentage between 0–1 (e.g., 0.75 = 75%). |
| rating | The rating value (e.g., 4 out of 5 stars). |
| rating | Maximum rating (e.g., 5 stars). |
| slider | The value selected on the slider. |
| slider | The slider range boundaries. |
| fileUpload | Download URL for the uploaded file. |
| fileUpload | Original file name (e.g., |
| fileUpload | File size in bytes. |
| fileUpload | MIME type (e.g., |
Duplicated Funnels
If you duplicate a funnel that already has a webhook configured, the webhook settings are duplicated as well.
The duplicated funnel will send data to the same endpoint. You can update the endpoint on the duplicate funnel if needed.
Troubleshooting
Webhook data is not being sent:
Make sure your endpoint uses HTTPS. HTTP endpoints are accepted for testing only.
Check that the webhook is connected, not just saved. Go to Integrations → Webhooks to verify the status.
The webhook sends data only when a participant reaches the last page, meaning the thank you page or outcome page. Partial submissions do not trigger it.
Data does not match what you expected
Fields like
outcomeandconnected_outcomeonly appear whenhas_outcomesistrue. If your funnel uses score-based outcomes, check thescoreandoutcome_pointsfields instead.participant_idmay be null when using the "Test Webhook" button if no participant exists yet.Scores and calculator results are sent as decimal strings (e.g.,
"37.5"), not numbers. Parse them accordingly in your code.
The Response section shows an error
A 4xx error usually means your server is rejecting the request. Check whether a custom header is needed for authorization.
A 5xx error means your server had an internal error. Check your server logs.
A timeout means your server took too long to respond. Webhooks expect a response within a few seconds.
Need a custom integration? If webhooks do not cover your use case, you can also use the Zapier integration as a no-code alternative that connects to 5,000+ apps.




