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. null if 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. null for welcome leads.
  • name / phone / messagenull if 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 generating
  • lead.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.