CASE04

From a spam-prone contact form, to one that filters itself and files every lead.

N8N· RESEND· CRM WEBHOOK· BUILT FOR MY OWN BUSINESS

This one is mine. The contact form on my other site was the last part of my own business still held together by hope: nothing stopping spam, nothing formatting what came in, and no record of any of it anywhere except my inbox. I rebuilt it in n8n so that a submission defends itself, answers itself and files itself, and only then asks for my attention.

10steps behind one form
2ways a submission gets turned away
4things that fire the moment it passes
0leads typed into a CRM by hand
Diagram of a contact form posting into n8n, where a hidden field is checked before anything runs, then the lead is mailed, the visitor confirmed, the CRM updated and the browser answered

The problem

The form worked. Everything after the form did not.

The form itself was never broken. It collected a name, an email and a message and it delivered them. What it did not do was any of the work that turns a message into a lead, so all of that stayed with me, mixed in with whatever else had arrived that day.

  1. Spam arrives, because nothing is checking whether a human sent it.
  2. A real enquiry arrives, looking in my inbox exactly like the spam did.
  3. Read it, and work out which of the two it is.
  4. Copy the name into the CRM.
  5. Copy the email address into the CRM.
  6. Paste the message in underneath it as a note.
  7. Reply to the visitor, who has heard nothing at all since they pressed send.
  8. Hope none of the real ones got skimmed past while clearing out the rest.

About fifteen minutes per real lead. The fifteen minutes were never the real cost. The last line was.

Why it was not a simple job

A contact form is not a form. It is a public endpoint.

The moment a form is on the internet it stops being a form and becomes a URL that accepts posts from anybody, including software written specifically to abuse it. So the first question is not what to do with a submission. It is whether this submission has earned anything at all, and that has to be answered before an email is composed or a record is written.

The second constraint is the person. A form has to answer immediately, because somebody is sitting there watching a button spin. Anything the automation wants to do slowly has to happen without making them wait for it.

ROUTE 01

Automated software

Fills in every field it can find, including the one no human being can see. Turned away before a single email or record exists.

  1. Posts
  2. Hidden field filled
  3. 400
  4. Nothing else runs
ROUTE 02

An incomplete submission

Name, email or message missing. Refused the same way, so half a lead never becomes a CRM record that looks like a whole one.

  1. Posts
  2. Hidden field clear
  3. A field missing
  4. 400
  5. Nothing else runs
ROUTE 03

A real person

Everything present, hidden field untouched. Four things happen at once, and the answer reaches their browser in the same breath.

  1. Posts
  2. Passes both checks
  3. 4 actions at once
  4. 200 OK

Three possible answers. A real visitor only ever meets one of them, and it arrives immediately.

What I built

Two gates, then four things at once.

Concretely: the form posts to an n8n webhook. The first node checks a field that is hidden on the page. If anything is in it, the workflow answers 400 and stops there. If it is empty, the next node checks that the name, the email and the message are all actually present, and answers 400 if any of them is not. Only past both gates does a code node build the two emails: the notification to me, carrying the visitor's own address as the reply-to so answering is one keystroke and not a copy and paste, and the confirmation to the visitor. Both leave through Resend. At the same moment the submission is posted into my CRM as its own event, and the webhook answers the browser.

Ten nodes. This is the smallest automation on this page by some distance, and it is the one I would build first for almost anybody, because it sits on the single point where strangers become leads.

The contact form posts to an n8n webhook. Two checks run before anything else: a hidden field that only software fills, and the three required fields. Past both, four things happen at once: the lead is mailed to Frederik, the visitor gets a confirmation, the CRM logs the event, and the browser gets a 200 response. The two checks A hidden field, then three required ones. Both first. The contact form A public endpoint. n8n Turns it away, or turns it into four things at once. 10 NODES · 1 WORKFLOW BEFORE AN EMAIL OR A RECORD EVER EXISTS ALL AT ONCE My inbox The lead, formatted, reply-to already set. The visitor's inbox A confirmation, in the same breath. My CRM The lead logged as an event, not typed in. Their browser Answered before the button stops spinning.

Two gates on the left. Four things on the right, and none of them waiting on the other three.

The part I care about most

The best spam check is a question only software answers.

There is a text field on that form that is present in the page and invisible on it. A person will never type into it, because a person cannot see it. Automated software does not look at the page at all. It reads the form, finds every field in it, and fills them all in, because filling everything is how you get past a form you do not understand.

So the check is not "does this look like spam." It is "did you fill in the field that only a machine would have found." One node, no service, no score, no blocklist, and it never has to make a judgement call about a real human being. And it runs before anything else, because the cheapest spam to handle is the spam you never process.

A person sees three fields on the page and fills in three. Software reads the form markup, finds four fields including the hidden one, and fills all four. If the hidden field has anything in it the workflow answers 400 and stops. If it is empty the submission continues to field validation. WHAT A PERSON SEES Three fields, fills three WHAT SOFTWARE SEES Four fields, fills four Hidden field empty? NO YES 400, and it stops No email built, no record written. On to the real check Name, email and message all present?

Where this one bites back

Browsers do not look at the page either. That is the catch.

I have also taken a honeypot back out of a form, on this very site, for exactly the reason you would expect once you have seen it happen. Password managers and browser autofill read the markup the same way the bots do. They find a field, decide it looks like one they know, and helpfully fill it in on the visitor's behalf. The visitor sees nothing, presses send, and gets silently rejected as a bot.

That form leans on a challenge widget and server-side validation instead. Which is the actual lesson worth taking from this build: the hidden field is free and it is excellent, right up to the moment somebody's browser starts being helpful. Name it carefully, and think about what a password manager will make of the name you chose.

A spam filter that quietly eats real enquiries is worse than the spam. At least you can see the spam.

The detail nobody notices until it is missing

Four things fire together, and one is allowed to fail.

The validation node hands off to four nodes side by side rather than in a chain. The notification, the confirmation, the CRM event and the answer to the browser all leave at the same moment. That matters most for the last one: a form that sits thinking for two seconds while it talks to a CRM feels broken to the person waiting, even while it is working perfectly.

And the CRM call is deliberately allowed to fail. It has a five second limit and it is set to carry on regardless, so if the CRM is slow or down, the lead still reaches my inbox and the visitor still gets their confirmation. A lead I have to file by hand later is an annoyance. A lead that never arrived is gone.

Decide in advance which part of an automation is allowed to break. If you do not, the least important step gets to take the most important one down with it.

What changed

The work did not get faster. It stopped existing.

Spam stopped being mine to deal with

It is refused at the first node, before an email is composed or a record is created. I do not see it, sort it, or decide about it.

A lead arrives ready to answer

Formatted, with the sender's own address already set as the reply-to, so replying is pressing reply rather than copying an address out of the body of a message.

The CRM fills itself

The record exists before I have opened my inbox. Nothing to copy across, and nothing that only got filed because I happened to have a quiet afternoon.

Why this one is on the page

This is not client work. It is my own front door.

Every other case here was built for somebody else. This one runs on my own site, on my own n8n, into my own CRM, and if it breaks it breaks for me first and I find out because a week goes quiet. That is the only honest way to sell an automation to anybody: put it on the part of your own business you cannot afford to lose.

It is also the smallest build on this page, which is the point. Most of what I do for people is not enormous. It is one gap, closed properly, at the place where the money actually enters.

About fifteen minutes of manual CRM entry per lead, gone. Plus every spam submission that used to be mine to read.


Get the template

I'll send you the blueprint for this automation, free. You'll also hear when I go live or ship a new template, unsubscribe anytime.

What happens to a lead between your form and your follow-up?

If the answer involves you reading it, judging it, and typing the same details into a second system, that gap is where enquiries go quiet without anybody deciding they should. Book a free audit call and I will map it with you.

Get your free audit call →