
Lead Enrichment
Automatically capture web form leads, sync contacts and notes to HubSpot CRM, and trigger an instant personalised email auto-reply via SMTP in under 15 seconds.
Make.com · HubSpot CRM · SMTP · Webhooks
1-Click Clone to Make.com: Opens Make.com. Create a free account, then import the blueprint file below at Scenarios -> Create a new scenario -> Import Blueprint.
Download Free Blueprint (.JSON): Downloads as soon as you submit, and a copy lands in your inbox with the setup documentation.
Visual Proof
Make prices per operation, not per task, and this scenario is six operations per lead. A thousand leads a month sits inside the Core plan rather than forcing a tier upgrade.
HubSpot is searched on the lowercased address before anything is written, so a repeat enquiry updates the existing contact instead of creating a second one.
First name, company, and the submitted message are mapped into the reply, with fallbacks so a blank field never renders as "Hi ,".
If HubSpot fails, the run stops before telling the sender their message arrived somewhere it did not. Failures land in the dead-letter queue with the payload intact.
A lead fills in your contact form and then hears nothing for six hours while the notification sits in a shared inbox. Meanwhile nobody has created the CRM record, so when someone does reply they are working from the email rather than from a contact with a history. The first response is the one that decides whether you are still in the running, and it is the one nobody owns.
Everything this blueprint calls. Check you have them before you start - the usual reason a build stalls halfway is a key that takes a day to get approved.
The automation engine. Six operations per lead, so 1,000 free operations covers roughly 160 enquiries a month before you need a paid plan.
1,000 operations a month, no card
Holds the contact and the timeline note. The free tier covers everything this blueprint does - unlimited contacts, notes, and the search API it dedupes against.
Free forever, unlimited contacts
Sends the auto-reply. Google Workspace, Microsoft 365, or standard webmail all work - it is a generic SMTP send, not a Gmail-specific module.
Some links above are partner links and we earn a commission if you sign up through them. It costs you nothing extra, and it does not decide what goes in a blueprint - the self-hosted option is recommended wherever it is genuinely the better call.
Monthly, at the volumes this blueprint was tested against. Worth comparing against what the manual version of this work costs you in hours.
| Component | Cost | At what volume |
|---|---|---|
| Make.com | $0 - $10.59/mo | Free to 1,000 ops; Core covers ~1,600 leads |
| HubSpot CRM | $0 | Free tier, unlimited contacts |
| SMTP | $0 - $7/mo | A mailbox you almost certainly already pay for |
The files
The scenario file imports straight into Make. It arrives in your browser immediately and in your inbox as a backup, so you still have it tomorrow when you actually sit down to build.
hubspot_lead_responder_blueprint.json - the full Make scenario
The webhook payload contract your form has to post
The HTML auto-reply template with the fallback tags already in place
SMTP settings for Google Workspace, Microsoft 365, and cPanel mail
Make scenario blueprint (.json)
A copy of this blueprint and API documentation has also been sent to your inbox.
The decisions that matter, in the order you will meet them. Everything here is a thing that broke in testing before it was a rule.
Add a Custom Webhook as the trigger and copy the URL it gives you into your form handler. Submit the form once with real values before building anything else - Make learns the payload shape from a live request, and a webhook with no data structure makes every later field mapping guesswork. Post these five fields as JSON.
{
"firstname": "Dana",
"lastname": "Whitfield",
"email": "dana@northwind-logistics.com",
"company": "Northwind Logistics",
"message": "We need our order intake wired into NetSuite.",
"source": "https://techzapp.com/contact/"
}Search Objects on contacts with a filter of email EQ the lowercased address, limit 1. Route on whether hs_object_id came back: create when it did not, update when it did. Then attach the enquiry as a NOTE engagement rather than writing it into a contact property - a property holds one value, so the second enquiry from the same person would overwrite the first.
Search Objects -> contacts, email EQ {{ lower(trim(1.email)) }}, limit 1
Router
Route A -> Create Object (filter: 3.hs_object_id does not exist)
firstname, lastname, email, company, lifecyclestage = lead
Route B -> Update Object (filter: 3.hs_object_id exists)
firstname = {{ ifempty(1.firstname; 3.firstname) }}
Create Engagement -> NOTE, associated to the contact id from whichever route ranAdd an Email > Send an Email module with an SMTP connection: your mail host, port 465 for implicit TLS or 587 for STARTTLS, and the full mailbox address as the username. Send from a real monitored mailbox on your own domain - a no-reply address on a domain without SPF and DKIM is the single most reliable way to land this in spam. Wrap every merge tag in a fallback.
Subject: Thanks {{ ifempty(1.firstname; "there") }} - we have your message
<p>Hi {{ ifempty(1.firstname; "there") }},</p>
<p>Thanks for getting in touch{{ if(length(trim(1.company)) > 0; " from " + 1.company; "") }}.
Your message reached us and a real person is reading it - we reply within one business day.</p>
<blockquote>{{ replace(1.message; newline; "<br>") }}</blockquote>
<p>If anything else comes up in the meantime, just reply to this email.</p>The difference between a demo and something you can leave running is entirely in this table. Every row is a failure the blueprint handles explicitly rather than hoping about.
| Failure | What happens |
|---|---|
| Form posts a missing or malformed email | Stopped at the validation step before any HubSpot write, so no junk contact is created and no reply is attempted. |
| Contact already exists in HubSpot | The search finds it and the router takes the update branch. ifempty() keeps existing values where the new submission left a field blank. |
| HubSpot returns a 429 | Make retries with backoff. The auto-reply is sequenced last, so a CRM failure never sends a confirmation for a lead that was not saved. |
| SMTP authentication fails | The run errors after the CRM write succeeded, so the lead is safe in HubSpot and the incomplete run sits in the dead-letter queue for a manual reply. |
| The same form is submitted twice | Second run finds the contact, updates rather than duplicates, and adds a second timeline note - which is the correct record of two enquiries. |
What HubSpot holds after one run.
{
"contact": {
"hs_object_id": "70251983104",
"email": "dana@northwind-logistics.com",
"firstname": "Dana",
"company": "Northwind Logistics",
"lifecyclestage": "lead",
"hs_lead_status": "NEW",
"created": true
},
"note": {
"engagement_type": "NOTE",
"body": "Website enquiry - We need our order intake wired into NetSuite.",
"associated_contact": "70251983104"
},
"autoreply": {
"to": "dana@northwind-logistics.com",
"sent_at": "2026-09-18T09:14:07Z",
"elapsed_seconds": 11.4
}
}Done-For-You
If your team uses custom enterprise properties, multiple pipelines, or is mid-way through a Salesforce to HubSpot migration, the three-module version above stops being enough quickly.
A TechZapp sprint is a fixed-scope, fixed-price week. A senior engineer builds it in your environment, hands over the repository and the runbook, and you own every part of it afterwards. No platform of ours to keep paying for.
Mapped to your custom properties and pipelines, with a dry run against a sandbox portal first
Routing by territory, product line, or lead score - assigned to the right owner on creation
Deduplication across existing records, plus the backfill for whatever is already duplicated
Sprint pricing
48-hour fixed-fee setup sprint
Fixed scope agreed before we start
Built in your environment, not ours
Repository, infrastructure, and runbook handed over
Two weeks of support after handover included
Scope This SprintTell us what you are integrating with. We reply within one business day, and we will say plainly if the blueprint above already covers it.