# Webhooks

Canonical page: https://www.questionpunk.com/support/webhooks

Receive real-time event notifications when responses are submitted or surveys change status.

Time: 10-15 minutes to configure

Level: Intermediate

Audience: Developers, Product teams

## Steps

### 1. Create a webhook

Go to **Settings > Developer** and click **Create Webhook**. Enter a publicly accessible HTTPS URL that will receive POST requests.

### 2. Select events

Choose which events to subscribe to: **response.completed**, **response.started**, **survey.published**, **survey.unpublished**, **survey.response_limit_reached**, **recruitment.started**, **recruitment.fulfilled**, **recruitment.partial**, **recruitment.failed**, **panel.submission.approved**, **panel.submission.rejected**, **panel.submission.payout_released**, **panel.submission.paid**, or use a wildcard (*****) to receive all events.

### 3. Verify signatures

Each webhook delivery includes a SHA-256 HMAC signature in the header. Verify this signature using your webhook secret to confirm the request came from QuestionPunk.

### 4. Monitor deliveries

The Developer settings page shows delivery history including HTTP status codes and response times, so you can diagnose failures.

## Details

Webhooks let you react to QuestionPunk events in real time. Common use cases include sending Slack notifications when a response is completed, syncing data to a CRM, or triggering analysis pipelines.

Thirteen event types are available across four categories. **Response events:** **response.completed** (a respondent finishes the survey) and **response.started** (a respondent begins). **Survey events:** **survey.published** (a survey goes live), **survey.unpublished** (taken offline), and **survey.response_limit_reached** (hits its response cap). **Recruitment events:** **recruitment.started**, **recruitment.fulfilled**, **recruitment.partial**, and **recruitment.failed** track panel recruitment lifecycle. **Panel submission events:** **panel.submission.approved**, **panel.submission.rejected**, **panel.submission.payout_released**, and **panel.submission.paid** track individual participant payouts and approvals.

Webhook secrets are encrypted at rest using AES-256-GCM. Each delivery is signed with SHA-256 HMAC so your server can verify authenticity.

If a delivery fails, check the delivery log in Developer settings for the HTTP status code and response body to diagnose the issue.

## Related articles

- [API and developer access](https://www.questionpunk.com/support/api-access.md)
- [Exporting results](https://www.questionpunk.com/support/data-exports-exporting-results.md)
