Webhook payloads
Exact schema for the lead.captured event POSTed to your webhook URL.
When a visitor submits an email-capture form, Wiqly POSTs a JSON body to your configured webhook URL. There's currently one event type: lead.captured.
Content-Type
application/json
Request
Method: POST Body:
{
"event": "lead.captured",
"widget_id": "string",
"widget_name": "string",
"faq_item_id": "string | null",
"faq_label": "string | null",
"name": "string | null",
"email": "string",
"phone": "string | null",
"message": "string | null",
"session_id": "string | null",
"captured_at": "ISO 8601 timestamp"
}
Field semantics
event— always"lead.captured"for now. New event types will be added with new string values, never by changing this one.widget_id— the internal widget UUID. Stable; useful for keying records on your side.widget_name— the human-readable name you set when creating the widget. Can change if you rename. Don't use as a unique key.faq_item_id— the FAQ question the visitor watched before submitting.nullif the lead came from the welcome video's CTA.faq_label— the button label for that FAQ, in case you want to log it alongside.nullfor welcome leads.name/phone/message—nullif the visitor didn't fill them in. The form lets visitors skip everything except email.email— always present. We validate the basic format before accepting the submission, but you should still treat it as untrusted user input.session_id— an anonymous session identifier, useful for correlating with analytics events. Not linkable to anything outside Wiqly.captured_at— when we received the submission, in UTC ISO 8601.
Example
{
"event": "lead.captured",
"widget_id": "0d4f7a1c-3b2e-4d5f-9c1a-8b3e6f2d1c5a",
"widget_name": "Pricing page widget",
"faq_item_id": "f8a2b1c4-5d6e-7f8a-9b1c-2d3e4f5a6b7c",
"faq_label": "How does the trial work?",
"name": "Jane Doe",
"email": "jane@example.com",
"phone": null,
"message": "Want to know about volume discounts",
"session_id": "anon-9k2j4h5g6f7d",
"captured_at": "2026-05-22T14:30:00.000Z"
}
Delivery guarantees
- At-most-once. We send the request once. If your endpoint is down, the lead is not retried via webhook. It's still saved to the dashboard and (if configured) emailed.
- Fire-and-forget. Your response is not awaited by the visitor's submit flow. Return a 200 within a reasonable time (under ~5s); after that we consider the delivery attempted-and-done.
- No signing. We don't currently sign payloads. Recommended verification pattern: include a secret token in your webhook URL path.
Retry-with-backoff and HMAC signing are both on the roadmap.
Future events
Likely additions:
widget.ready— fires when all videos finish generatinglead.notified— fires after the email notification is sent (so you can build "first response time" SLAs)widget.flagged— fires when the kill criterion triggers
None of these are live yet. Watch the changelog for announcements.