Available on | ❌ Free | ❌ Starter | ❌ Pro | ✅ Business |
Webhooks let involve.me automatically send submission data (as JSON) to your server the moment a participant completes your funnel. Unlike polling an API, webhooks push data to you in real time — no code 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 (e.g., https://www.your-website.com/your-webhook).
⚠️ Your endpoint must use HTTPS (SSL). HTTP endpoints are not supported for live connections.
Step 4. Click "Test Webhook" to verify your endpoint works. 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 only. This response cannot be used inside your funnels.
Step 5. Click "Connect" to save and activate the webhook.
Testing Your Webhook
Before going live, we recommend testing your webhook to make sure 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. 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.
Custom Header (Optional)
You can add a custom header to authorize webhook requests on your server — a recommended security practice.
To enable this, tick "Add Custom Header (optional)" during setup, then enter your Header Name and Header Value. 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 It Fires
The finished_participant webhook fires when a participant reaches the last page of your funnel (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 has a webhook configured, the webhook settings are duplicated as well. The duplicate funnel will send data to the same endpoint. Update the endpoint on the duplicate if needed.
Troubleshooting
Webhook is not firing:
Make sure your endpoint uses HTTPS. HTTP endpoints are only accepted for testing.
Check that the webhook is connected (not just saved). Go to Integrations → Webhooks to verify the status.
The webhook only fires when a participant reaches the last page (thank you or outcome page). Partial submissions do not trigger it.
Data is not matching expectations:
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.
Getting an error in the Response section:
A
4xxerror usually means your server is rejecting the request. Check if you need to add a custom header for authorization.A
5xxerror 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 don't cover your use case, check out the Zapier integration for a no-code alternative that connects to 5,000+ apps.




