Vet Typeform leads with ZeroBounce before they hit HubSpot
Every new Typeform response gets its email checked. Verified leads sync to HubSpot, suspicious ones go to a Slack triage channel.
Build a code workflow that gates Typeform lead submissions through ZeroBounce email validation before they ever reach HubSpot. This is a deterministic pipeline with discrete nodes, so a code workflow is the right fit.
Trigger: an incoming webhook from Typeform. The form is our demo request form, and Typeform's outgoing webhook delivers the full form response payload. The submitter's email lives inside form_response.answers, alongside the other form fields and form_response.form_id.
Step 1. Parse the webhook payload. Pull out the submitter's email address, the other form answers (first name, last name, company, phone if present), and the form_id.
Step 2. Call ZeroBounce Validate Email on that address. The response returns a status field that will be one of valid, invalid, catch-all, unknown, spamtrap, abuse, or do_not_mail, plus a sub_status field with more detail.
Step 3. Branch on status. If status is valid, send the lead to HubSpot. If status is catch-all, make a second ZeroBounce call to AI Email Scoring on the same address; if the returned score is 8 or higher, send the lead to HubSpot, otherwise treat it as bounced. If status is invalid, spamtrap, abuse, do_not_mail, or unknown, treat it as bounced.
Good path. Call HubSpot Batch Upsert Contacts with email as the unique property. Map the form answers onto standard contact properties (firstname, lastname, company, phone) and set lead_source = "typeform" so we can attribute the contact later.
Bounced path. Call Slack Send a Message to a #leads-bounced channel with a short summary: the submitter's email, the ZeroBounce status, the sub_status, the AI score if one was fetched, and the Typeform form_id. Marketing ops will use this channel to investigate suspicious submissions.
Make the Slack channel name, the lead_source value, the catch-all score threshold, and the HubSpot property mapping easy to edit later, so I can reuse this same flow on other Typeform forms without rewriting nodes.
Additional information
What does this prompt do?
- Catches each new Typeform submission in real time and checks the submitter's email with ZeroBounce.
- Sends only verified leads into HubSpot as new or updated contacts, tagged with the source form.
- Runs a second quality score on catch-all addresses so only high-confidence catch-alls reach the CRM.
- Drops bad, abusive, or low-scoring submissions into a Slack triage channel for your marketing ops team.
What do I need to use this?
- A Typeform account with the form already configured to send outgoing webhooks on submission.
- A ZeroBounce account with credits for email validation and AI email scoring.
- A HubSpot account where new contacts should land.
- A Slack workspace and a channel for bounced or suspicious leads, for example #leads-bounced.
How can I customize it?
- Point the workflow at any Typeform that collects an email, not just a demo request form.
- Change which form answers map to which HubSpot properties, including the lead source or campaign tag.
- Tune the catch-all score threshold, or change which result statuses count as bounced.
- Send the Slack alert to a different channel and add extra form fields to the message.
Frequently asked questions
What is a catch-all email and why does it get a second check?
Can I use this with a form other than a demo request?
Will this overwrite existing HubSpot contacts?
What happens to a lead that gets flagged as bad?
How fast does it run?
Stop letting bad emails pollute your HubSpot.
Connect Typeform, ZeroBounce, HubSpot, and Slack once, and every new lead gets vetted before it touches your CRM.