Every registration form has a hidden honeypot input, per-IP rate limiting, and 6 more heuristic checks — disposable email domains, repeating mobile numbers, IP burst detection, gibberish names. Bots silently drop. Suspicious registrations get an admin flag so you can review, not a rejection that turns a real attendee into an angry email.
No hCaptcha friction, no Cloudflare interstitial. Real attendees never notice.
website is rendered in the form but positioned off-screen with tabindex="-1". Real users never see it. Bots that submit every input fill it. If filled, we silently drop the submission.is_suspicious = true + a list of reasons. Admin filters "Suspicious" on the registrations page and reviews. Real attendees who tripped one heuristic never get an angry error message.More can be added. All fire independently — one signal is a hint, two signals is a probable bad actor.
honeypot_trippeddisposable_emailrepeating_mobilesequence_mobileduplicate_email_x3ip_burstgibberish_nameThe obvious answer to "we're getting spam" is to bolt on hCaptcha, Cloudflare Turnstile, or a "please prove you're human" popup. And it works — spam drops. But a percentage of real attendees fail the challenge, close the tab, and never register. On a free meetup that percentage might be 2%. On a paid ₹10,000 conference, that's real revenue walking out.
Then there's the CAPTCHA fatigue tax: every extra step in the form kills conversion. Baymard's checkout research is unambiguous — every field, every popup, every "extra step" bleeds paying customers.
So we went the other direction. Invisible defences — honeypot, rate limit, heuristic scoring — that real attendees never see. When we're 99% sure something is a bot (honeypot tripped, rate limit exceeded), we silently drop it. When we're uncertain (disposable email, one gibberish signal), we save the registration and flag it for admin. The organiser opens the registrations list, filters "Suspicious", reviews the 3 flagged rows, deletes the fakes, welcomes the real attendees.
Nothing turns a real attendee into an angry email faster than "your registration was rejected: suspicious activity." So we don't reject. We flag. Admin decides.