Skip to Content
Lead Capture WidgetCapturing Leads

Capturing Leads

Every form submission creates two artifacts in your account: a row in the Captures activity feed (90-day retention, your dashboard view) and a permanent Contact record (no expiry, lives in /contacts).

What gets stored

For every successful submission:

On app_contacts (permanent)

  • display_name — the visitor’s name (or +<phone> if name field was off)
  • whatsapp_id / phone_number — normalised E.164
  • tags["lead-widget"]
  • column_data — JSON with attribution metadata:
    • lead_source: "lead_widget"
    • widget_id: the widget that captured them
    • lead_page_url: which page on your site they were on
    • lead_referrer: where they came from before that

On app_lead_widget_captures (90-day TTL)

  • All of the above plus IP address, user agent, raw message, captured timestamp. Used by the activity feed in the settings page so you can see recent submissions at a glance.

On app_conversations

  • A new conversation linked to the contact. So when the visitor sends their first WhatsApp message after the redirect, it lands in Messages already attached to the right contact.

Building segments off captured leads

Every contact tagged lead-widget shows up in Settings → Segments when you build a segment with that tag condition. Use this to:

  • Send a follow-up broadcast to recent leads who didn’t reply
  • Apply automation flows to all widget submissions
  • Track conversion rates from widget → paid customer in analytics

You can also segment by lead_page_url to target visitors who came from specific pages (pricing, demo request, etc.) using contact attribute conditions.

Viewing recent captures

Settings → Lead Widget → Captures shows the last 100 submissions with:

ColumnWhat it shows
WhenRelative timestamp
NameWhat the visitor entered
PhoneNormalised E.164
MessageTheir note (truncated)
From pagePage URL where they submitted (linked)

Click the row → open the linked conversation in /messages.

The tab auto-refreshes every 30 seconds, so new submissions appear without a manual reload.

Re-submissions

If a visitor submits the form twice with the same phone number:

  • The contact is not duplicated — the existing contact is reused.
  • A new capture row IS created (so the activity feed shows both).
  • Tags are not reset — if you’d manually added other tags to the contact, they’re preserved.

Privacy + compliance

The widget stores IP address + user agent on each capture for abuse investigation. These age out automatically after 90 days via the table TTL. Names + phones on app_contacts are permanent (until you delete them) since that’s the persistent CRM record.

If you need to delete a captured contact for GDPR / DPDP compliance:

  1. Open /contacts.
  2. Find the contact (filter by tag lead-widget).
  3. Delete — wipes the contact, conversation, and all captures.

Data export

The Captures tab doesn’t currently have a CSV export. Use Contacts → Export with the lead-widget tag filter for full data including the attribution column_data.

Webhook delivery (coming soon)

v1 doesn’t fire a webhook on capture. To trigger automations now, use the Flows builder with the trigger condition:

  • “Inbound message arrives on conversation tagged lead-widget

Once the visitor sends their first WhatsApp message, the flow runs. A direct on-capture webhook is on the v2 roadmap so you can act before the visitor even reaches WhatsApp.