DEV Community

Ibrahim Edhem Harbutlu
Ibrahim Edhem Harbutlu

Posted on

I kept losing leads because I was too slow to check my inbox. So I automated it.

For the last few months I was running everything through a basic contact form on a side project. Every time someone filled it out, I had to remember to check my email, copy their info into a spreadsheet, and reply manually. Half the time I forgot. A couple of leads went cold because I noticed the email two days late, which is annoying when you're the one who built the form in the first place.

So I built an n8n workflow to handle it instead of relying on my own memory.

What it actually does

Seven nodes, end to end:

A webhook catches the form submission
A Set node normalizes the fields (name, email, message, date) regardless of which form tool sent them
An IF node checks the email is present and contains an @; anything that fails gets dropped silently, so bot spam never touches my spreadsheet
Google Sheets appends the lead as a new row
Gmail sends me an internal notification
A second Gmail node sends the person an automatic "we got your message" reply
A NoOp node closes out the run

The whole thing fires the second someone hits submit. No checking inboxes, no copy-paste, no two-day delay.

The two things that actually took effort

Field name mapping. Every form tool sends data slightly differently. Tally, Jotform, Typeform, a raw HTML form, sometimes the fields show up nested under body, sometimes flat. I put all the mapping in one Set node early in the chain. If I switch form tools later I only update expressions in that one node instead of hunting through the whole thing.

Pulling data by node name instead of position. Both Gmail nodes reference the Set node directly, something like {{ $('Set').item.json.email }} rather than {{ $json.email }}. That way if I reorder nodes later, or stick something new in the middle, the emails don't quietly break because they were reading from whatever happened to run right before them.

The spam filter is also worth calling out. It's nothing clever, just "is the email field non-empty and does it contain an @ sign," but it cut a noticeable amount of junk before it ever touched my sheet.

Why I'm posting this here

A couple of people asked how I built it, so I cleaned it up, wrote a proper install guide, and packaged the whole thing as a template. I also just wanted to see whether a personal automation could hold up as an actual product, separate from the curiosity.

If you're dealing with the same problem, form submissions you have to manually track, the template is on Gumroad: https://ibrh96.gumroad.com/l/gqvnho. Credentials ship empty, you connect your own Google account, and it runs on n8n Cloud or self-hosted.

If you've built something similar, I'm curious how you handled spam filtering. Mine is intentionally basic (email present, contains an @, that's it) and I keep wondering if I'm missing an obvious next step.

Top comments (0)