SheetLink Forms beta

Spam defense · 2026-07-29 · 9 min read

The anatomy of form spam in 2026

Four different senders with four different motives hit the same submit button. Knowing which one you are looking at is half of defending against it.

A ledger-styled illustration of four rows of spam submissions, each stamped with a different sender icon, being sorted into labeled columns.

Your form is a public API

Every HTML form is an unauthenticated POST endpoint published to the entire internet. The moment a page with a form gets indexed, its action URL joins the lists that crawlers compile and resell, and traffic starts arriving that has nothing to do with your audience. None of it is personal. The senders have never read your site and mostly never will.

That framing matters because the instinctive response to spam - "why is someone doing this to me?" - leads to bad defenses. Nobody is doing anything to you. Several distinct industries are doing something to every reachable endpoint at once, and your form is one of millions on the list. Understanding who those industries are, and what each one wants, is the difference between a defense that works and a CAPTCHA bolted on in frustration.

Sender one: the SEO link drop

The oldest commercial motive on the list. These bots stuff the message field with URLs and keyword anchor text - pharmaceuticals, casinos, essay mills, replica goods - hoping the text gets republished somewhere a search engine can see it: a comment section, a guestbook, a public profile, a testimonial widget.

In a submission log the pattern is unmistakable: three to fifteen links per message, anchor text that reads like a search query, a name field containing a keyword instead of a name, and often a language mismatch with your site. The strangest part is that these bots hit forms whose submissions will never be published anywhere. They cannot see where the data lands, and sending is free, so they spray everything. Our glossary entry on form spam covers the taxonomy in brief.

Sender two: scam outreach aimed at you

The second category is not trying to reach your audience. It is trying to reach you, the site owner. Fake invoices, "we noticed errors on your website," copyright infringement threats designed to panic you into clicking, vague business proposals, and offers to buy your domain all arrive through the contact form because the contact form is the one channel guaranteed to be read.

These messages look far more human than link drops: complete sentences, a plausible pitch, usually a single link or a phone number rather than a wall of URLs. The tells are in the metadata - a free or disposable email domain, a reply address that does not match the claimed company, and the same text arriving at thousands of other sites the same week.

Sender three: the vulnerability probe

The third sender does not want a human to read anything. Automated scanners submit payloads designed to test whether your form handler is exploitable: ' OR 1=1 -- for SQL injection, <script> tags for XSS, {{7*7}} for template injection, encoded newlines with Bcc: headers for email header injection. In the log these look like garbage - fields full of syntax rather than sentences.

OWASP catalogs this whole family of behavior in its Automated Threats to Web Applications project. Probes are mostly harmless against a well-built handler, but their presence tells you something useful: your endpoint has been enumerated, and everything else on this list will follow.

The spreadsheet-specific probe: formula injection

When your destination is a spreadsheet, one probe deserves its own paragraph. A cell that begins with =, +, -, or @ is a formula, and a submission like =IMPORTXML(...) or =HYPERLINK(...) becomes live code the moment it lands in a sheet someone opens. This is formula injection, and it is the one spam category where the payload is aimed at the spreadsheet itself rather than at a reader.

The defense is mechanical: escape the leading character before the value is ever written to a cell. We do this on every row, on every plan, with no configuration - the details are on our security page. If you run your own form handler into a sheet, this guard belongs in your code too.

Sender four: AI-written spam

The newest arrival is the most discussed. Language models now write outreach that is fluent, correctly spelled, on-topic, and sometimes references your actual pages. The classic content heuristics - broken grammar, template phrasing, obvious boilerplate - are worth much less against it than they were five years ago.

But AI-written spam still betrays itself in ways that have nothing to do with prose quality: it arrives seconds after page load, in bursts, from addresses at throwaway domains, with the same structural skeleton across thousands of sites. The lesson is not that spam became undetectable. It is that the signal moved from what the message says to how the message arrived - timing, rate, origin, and reputation. Defenses that only read the text are the ones in trouble.

Reading a submission log like a field guide

Put the four side by side and a log becomes legible. Many URLs and keyword anchors: link drop. One pitch, one contact channel, plausible sentences: scam outreach. Syntax where sentences should be: probe. Fluent, flattering, oddly generic: AI outreach. Then look past the content at the behavior - submissions that arrive at machine speed after page load, identical payloads across several of your forms, bursts at 3 a.m. from a single subnet.

This is a practical argument for keeping every submission visible somewhere. Patterns that are invisible one row at a time are obvious in aggregate, which is why a delivery log and a reviewable quarantine earn their place in a form backend: they turn spam from a nuisance into data you can act on.

Why there is no single switch

Each sender has different capabilities, so each is stopped by a different thing. Naive link-drop bots do not execute JavaScript, so a honeypot and a timing check erase them. Volume senders run into rate limits. Scam outreach is written by humans or good models, so it passes every bot check and only content heuristics or review catch it. Probes are caught by input handling, not filtering.

A single switch - any single switch - covers exactly one of those profiles and waves the rest through. Worse, a switch has only two outputs, block or allow, so every mistake it makes is either a lost lead or delivered spam. A stack lets each layer be aggressive about the one thing it detects well, and lets uncertainty fall through to review instead of into a verdict.

A stack that maps onto the anatomy

Here is the mapping we ship, layer by layer. The honeypot field catches bots that fill every input. The timing signal from our embed script catches submissions that arrive faster than a human could type. Per-form and per-IP rate limits cap volume. Content heuristics - link stuffing, disposable email domains, empty payloads - flag the link drops and much of the scam outreach, with a per-form strictness dial. Optional Cloudflare Turnstile covers the targeted campaigns that defeat passive signals.

And everything uncertain lands in quarantine for one-click review rather than being dropped. Only the honeypot marks a submission as spam outright; the full argument for that design is in quarantine vs CAPTCHA, and the mechanics are on how it works.

The economics are on your side

Form spam exists because sending is nearly free and one response in a million pays for the campaign. That arithmetic cuts both ways. You do not need a perfect defense; you need to make your particular form slightly more expensive than the next endpoint on the list. Generic operators do not debug individual sites - they route around friction, because their economics demand breadth.

So the realistic goal is layered friction that costs attackers compute and costs your real users nothing, with a review queue that turns the residue into a few seconds of reading per day. That is a solved problem, and it does not require making humans prove their humanity at the door. Our form spam protection guide walks through the practical setup end to end.

FAQ

What exactly counts as form spam?

Any submission sent for a purpose other than the form's - link placement, scam outreach, security probing, or bulk automated noise. The form spam glossary entry gives the short taxonomy; this post covers who sends each kind and why.

My site is brand new with almost no visitors. Why am I already getting spam?

Because spam volume tracks discoverability, not popularity. Crawlers find new forms within days of indexing, and probes and link-drop bots hit every endpoint on their lists regardless of traffic. Early spam is evidence you have been enumerated, not evidence you have an audience.

Is form spam actually dangerous, or just annoying?

Mostly annoying. The dangerous minority is the probe category - injection payloads and spreadsheet formula injection - which target your handler and your sheet rather than your attention. Those are stopped by escaping and input handling, not by filters; see our security page for how we handle it.

Why do bots post spam links to a form that only writes to my private spreadsheet?

They cannot see where submissions go. A form is an opaque endpoint; the bot fires and forgets. Since sending costs effectively nothing, spraying every discovered form is cheaper than checking which ones publish content anywhere.

Can I still tell from the text alone whether a human wrote a message?

Less and less. Fluent AI-written text has devalued grammar and phrasing as signals. Behavioral evidence - fill time, submission rate, origin, email domain reputation - now carries more weight than the prose, which is why modern stacks lean on timing and rate signals.

Will AI make form spam unstoppable?

It raises the bar for content-based filtering, but it does not touch the behavioral and economic layers. AI-written spam still arrives too fast, too often, and from throwaway infrastructure, and it still has to be profitable. Defense in depth was the right answer before language models and remains the right answer after.

Should I just remove my form and publish an email address instead?

Usually not. A published address gets harvested and spammed with no filtering hooks at all, while a form gives you structure, validation, and a defense stack. A form posting to a hardened endpoint is the better trade - see our static site contact form guide.

How does SheetLink Forms decide what to block versus what to quarantine?

Only the honeypot marks a submission as spam outright, because it is the one near-certain signal. Everything else the stack distrusts - heuristics, timing, strictness rules - goes to quarantine for one-click review, and approving delivers the row to your sheet. Details in the docs.

Spam defense that never eats a lead

Honeypot, timing, rate limits, heuristics, and optional Turnstile - with quarantine review instead of silent drops, free during beta.

Request an invite See the live demo

← The anatomy of a landing page form that closes the loop