Webhooks
Webhooks let Preface notify an external URL whenever a visitor submits the gate form on one of your demos. Use webhooks to push lead data into your CRM, trigger automation workflows in tools like Zapier, Make, or n8n, or connect to any system that accepts an HTTP request.
A screenshot of the Webhooks tab in demo settings, showing a configured webhook with a Test button will go here.
Webhooks are available on the Growth and Scale plans. On other plans, the Webhooks tab shows a preview of the feature.
Adding a webhook
- Open a demo and click Settings in the toolbar
- Go to the Webhooks tab
- Click Add webhook
- Fill in the form:
- Label — a friendly name for this webhook (e.g. "HubSpot", "Zapier CRM")
- URL — the endpoint to send the request to (must be HTTPS)
- Method —
POSTorGET(POST is recommended for most integrations) - Authentication — see Authentication below
- Click Save webhook
Each demo can have up to the number of webhooks defined by your instance's MAX_WEBHOOKS_PER_DEMO limit (default: 3).
Authentication
Preface supports three authentication options:
| Type | Description |
|---|---|
| None | No authentication headers are added |
| HTTP Basic Auth | Sends a standard Authorization: Basic … header using the username and password you provide |
| Custom header | Sends a single custom header with a name and value you specify — use this for bearer tokens, API keys, or any proprietary auth scheme (e.g. X-Api-Key: abc123 or Authorization: Bearer abc123) |
Passwords and header values are encrypted at rest and are never returned to the browser after saving.
Enabling and disabling webhooks
Each webhook has an enable toggle. Disabled webhooks are stored but never fire, even when gate submissions occur. Use this to temporarily pause a webhook without deleting it.
Testing a webhook
Click the Test button on any webhook to send a sample payload to the configured URL immediately. The result is shown inline:
- Green — the endpoint responded with an HTTP 2xx status
- Red — the endpoint returned an error status or the request failed entirely, with the status code and any error message shown
Use the Test button after adding or editing a webhook to confirm your endpoint is reachable and your authentication is correct before your first real submission.
Payload
Every webhook request sends a JSON body with the following structure:
{
"event": "gate_submission",
"demo": {
"id": "demo-uuid",
"title": "My Product Demo",
"slug": "my-product-demo"
},
"lead": {
"email": "[email protected]",
"fields": {
"name": "Jane Smith",
"company": "Acme Corp"
},
"submitted_at": "2026-01-15T10:30:00+00:00"
}
}
| Field | Description |
|---|---|
event | Always gate_submission |
demo.id | The internal UUID of the demo |
demo.title | The demo's title |
demo.slug | The demo's URL slug |
lead.email | The email address submitted |
lead.fields | Any additional gate fields (name, company, phone, etc.) as key/value pairs |
lead.submitted_at | ISO 8601 timestamp of the submission |
Delivery
Webhooks are fired asynchronously after the gate form is submitted — the visitor receives their session token immediately and the webhook is dispatched in the background.
Preface will attempt delivery up to 3 times with a backoff of 10 seconds, then 60 seconds between retries, before giving up.
If ALLOW_WEBHOOKS is set to false on your instance, no webhooks will fire regardless of their configuration in the UI.
Deleting a webhook
Click the delete icon on the webhook row. This permanently removes the webhook and stops all future deliveries.