Why this costs you more than it looks like
Spam on a lead form doesn't end at "one annoying row in a table." On a CRM wired to automation like GoHighLevel, every form submission can trigger a chain: a new contact, an opportunity opening in a pipeline, an automatic welcome SMS or email, and sometimes assignment to a sales rep. When the submission is fake, that entire chain fires on a lead that doesn't exist - which means a real sending cost (SMS is billed per message), distorted conversion reporting, and sometimes a human rep calling a number that belongs to no one. The more aggressive your automation, the more spam costs you - not less.
The most common tool - and also the least precise: visible reCAPTCHA
reCAPTCHA (a checkbox, an image challenge, or the silent v3 version that scores suspicion) is the default most website builders offer, but it comes at a price: it's a challenge shown to everyone filling out the form, human or bot, and it sometimes fails real visitors on a mobile browser, behind a VPN, or on a carrier network. reCAPTCHA alone doesn't solve spam - it adds one filtering layer, at a friction cost to everyone. It can be a useful complementary layer, but it isn't a substitute for a server-side check where a bot simply never reaches the submission step at all.
What actually works: invisible traps on the server
- A honeypot field - an extra form field, hidden from human eyes with CSS (not with
type="hidden", which sophisticated bots detect and skip), but visible to a script that fills in every field it finds in the HTML. A field that arrives filled in = the submission is blocked before it creates any record. - A fill-time check - humans don't fill a five-field form in under one or two seconds; a bot that submits the instant the page loads does. A hidden timestamp on form load, measured server-side on submit, blocks this pattern with zero added UX.
- Server-side validation, not just JavaScript - a sophisticated bot never loads the page at all; it POSTs straight to the form's endpoint. If your checks (required fields, email format, phone format) only live in client-side code, they don't exist at all from that bot's point of view.
- Rate limiting by IP - blocks a burst of submissions from one source in a short window, the typical signature of an automated spam run.
Connecting to GoHighLevel - not every submission should auto-create an opportunity
When a custom form posts directly to the GoHighLevel API, or goes through a webhook first, you get a chance to stop spam before it ever enters the system - not after. The right approach: the form posts to an endpoint that runs all the checks above, and only a submission that passes creates a real contact and opportunity in GHL. A suspicious submission gets tagged (e.g. lead_source: flagged) and routed to a human review queue - not auto-deleted (so you don't lose a real lead with an unusual input pattern), but also not allowed to trigger the immediate follow-up workflow until it's confirmed.
What definitely isn't a good idea
Don't rely on client-side JavaScript validation alone - it's the most common wrong assumption, and also the easiest for a bot to bypass entirely. Don't let every new contact automatically trigger SMS, email, and rep assignment with no filtering layer in front of it - that's exactly where spam turns from "an annoying data row" into real cost and a dent in your reputation. And don't auto-delete flagged submissions with no review queue - a real lead with an unusual phone format or a non-Latin name often looks "suspicious" to a generic check without actually being spam.
Fake leads flooding your CRM?
We build custom forms with server-side spam filtering, wired correctly into GoHighLevel - so your automation responds to real leads only.
Get started