A contact form that sorts junk from leads before anyone reads it

· Json Knepper

A contractor’s contact form fills up with two kinds of junk: bots, and agencies pitching the contractor. The KneppKraft form now scores every submission before anyone reads it, and only the real ones land in the inbox.

How it started

KneppKraft’s inbox had been taking a steady stream of junk through the form. Then one night a bot got through. The name was a string of capital letters and digits, the email came from a throwaway domain, and the message was gibberish. The form already had a honeypot, a hidden field only a bot would fill in. This one didn’t touch it.

A honeypot is a single check. It needed a few more.

The score

Every submission now gets a score, capped at 100, before the email step. Each signal is a small named check that adds or takes away points and writes a one-line reason.

A real phone number adds 25. It has to be ten digits, with an area code that doesn’t start with 0 or 1, and not the same digit ten times. A missing or fake number takes away 20.

The email adds 10, unless it comes from a disposable-address domain on a list the site ships with. That costs 40.

The name adds 10 if it looks like a name: a vowel, no digits, between 2 and 60 characters. A name with no vowels, five consonants in a row, or digits in it costs 40.

The message costs 40 if it has two or more links in it, and 15 if it’s under 12 characters with no photos attached.

The job itself is the strongest signal. Picking a property type adds 10. An address or photos adds 25. A real job has a place or a picture.

Timing catches the fast ones. The form notes when it loaded. If it comes back in under four seconds, that’s 40 off. If there’s no timestamp at all, it’s JavaScript off or a bot, and that’s 20 off.

The honeypot still runs, and filling it costs 100.

Turnstile, Cloudflare’s bot check, adds 20 when it passes and takes 60 when it fails. If it isn’t switched on, it’s skipped.

The pitches

The second kind of junk isn’t a bot. It’s a person selling something to the contractor: estimating and takeoff services, virtual assistants, lead generation, SEO, “page one of Google,” free trials, “reply STOP.” There’s a list of those phrases, and one match costs 60. So does an email domain with words like agency, marketing or SEO in it.

That’s usually enough on its own to sink a submission into junk, and that’s where those belong.

Three piles, nothing lost

The score sorts every submission into one of three piles.

Qualified, 40 and up. The email goes to the inbox as it always did, and the sender gets the usual reply. The top of the email now carries one line, like “Score 72 (qualified): real phone, address given, photos (3).”

Held, 0 to 39. No email goes out. The submission is saved, and a digest arrives at 8 in the morning listing yesterday’s held ones: name, email, phone, score, the reasons and the start of the message. Releasing one is a reply for now. If there’s nothing held, there’s no digest.

Junk, under 0. Saved, never emailed, counted in one line at the bottom of the digest. The sender still sees a thank-you.

The rule underneath all of it: a lead is never dropped. Every submission is written to the database first, before any scoring decides where it goes. If the gate ever gets one wrong, it’s still there to find.

Why a score, not a filter

A filter says yes or no, and a wrong no is a lost job. A score says how sure it is and why. When something lands in the held pile, the reasons are right there next to it, so a person can make the call in a few seconds.

It also means the checks can be tuned. Each signal is its own small function with its own points, and there are tests that run known submissions through it: the bot from that night has to score junk, a plausible homeowner with a phone and an address has to score qualified, and a message with two links has to score junk.

What it means for an owner

The inbox goes back to being a list of people who might hire you. The doubtful ones get one look a day, and the junk gets counted so you know it’s out there without ever having to read it.

Prefer us on Google If you read us often, tell Google to show our pages first.