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.164tags—["lead-widget"]column_data— JSON with attribution metadata:lead_source:"lead_widget"widget_id: the widget that captured themlead_page_url: which page on your site they were onlead_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:
| Column | What it shows |
|---|---|
| When | Relative timestamp |
| Name | What the visitor entered |
| Phone | Normalised E.164 |
| Message | Their note (truncated) |
| From page | Page 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:
- Open
/contacts. - Find the contact (filter by tag
lead-widget). - 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.