Why Real Form Submissions Get Marked as Spam (and How to Get Them Back)
A false positive costs more than a hundred spam messages, and the most common cause is the one nobody looks for: the filter learned to distrust you from your own testing. What to check, in order.
The ShipMyForm team
· 6 min read
Check the spam folder first, then check whether the verdict was about the message or about the sender. Message-based false positives (links, keywords, a short body) are a tuning problem you can fix in a setting. Sender-based ones — where the filter has decided your address or your visitor's address is untrustworthy — keep firing no matter what the message says, and they are the ones that quietly eat real enquiries for weeks.
Full disclosure: ShipMyForm is our product, and the second half describes a bug we shipped and fixed in October 2026. The failure modes in the first half apply to any filtered form on any backend.
The number nobody measures
Every form backend advertises how much spam it caught. None of them advertise how much real mail they ate, because neither they nor you can see it without looking.
The asymmetry is the whole problem. A spam message that reaches you costs a few seconds of annoyance, and you know it happened. A quote request that silently went to the spam folder can cost you the customer, and you never find out. One is visible and cheap; the other is invisible and expensive. Yet almost all filter tuning optimises the visible one.
So before changing any setting, do the thing almost nobody does: open your spam folder and read a week of it. Sort every item into "should have reached me" and "correctly caught". That ratio is the only number that tells you whether your filter is set correctly, and most people have never calculated it.
Why testing your own form is the worst case
If you are reading this because your own test submission went to spam, that is not a coincidence. Testing is close to the hardest thing for a filter to get right, for three reasons that compound.
A test message carries no information. Real enquiries have a subject, a request, specifics. Tests say "test", "asdf", "hello". A content classifier scores by what the text tells it, and these tell it nothing, so they land in the uncertain middle where the filter has to guess.
Testing looks mechanical. Many filters treat a submission sent within a second or two of the page loading as automated, because that is what a bot does. It is also what you do when you reload the page, paste a value and hit submit. On some systems — ours included — that is treated as near-certain evidence of a bot.
And then the verdict can stick to you. This is the part that turns an annoyance into a real problem. Filters that track sender reputation record the verdict against the address and IP that sent it. A handful of tests judged as spam become a handful of votes against you. Cross the threshold and the filter stops reading your messages at all — it recognises the sender and files them.
The message is obviously legitimate, nothing about it resembles spam, and changing the wording makes no difference. That last part is the tell. If rewriting the message entirely does not change the verdict, the filter is not judging the message.
A bug we shipped, and what it teaches
In October 2026 a customer told us that real enquiries to their contact form were landing in spam — including one from the person who built the form. They had turned their spam filtering down to the lowest setting to make their form usable at all, which is a workaround, not a fix.
The cause was a mismatch between two correct-looking pieces of code. Our classifier marks a sender as untrustworthy only when two independent sites have seen them misbehave — a sensible rule, designed so that one site cannot blacklist a sender for everyone else. But we issue the classifier one key per form, not per customer. A customer with eight forms was eight "independent sites" as far as that rule was concerned.
So a person wiring up their own forms would test two of them, trip the fast-submission rule both times, and in doing so provide the "two independent sites agree" corroboration — about themselves. After five such observations their address was filtered on identity alone, on every form they owned, with the content no longer read at all.
There was a second-order effect that made it worse. A reputation verdict scores very high, and our rule for adding a message to the known-spam fingerprint index only excluded verdicts based on metadata. Reputation was not on that list. So a legitimate "please schedule a call" message, filtered because of who sent it, was filed as known spam content — and then the same ordinary wording from anyone, on any customer's form, matched it.
The fixes were small once the cause was clear: count distinct customers rather than distinct keys, add reputation to the list of verdicts that must never index the message text, and never filter a submission from a verified member of the form's own account. The last one is the general lesson, and it is not specific to us:
Filtering exists to protect an owner's inbox from strangers. The owner is not a stranger.
What to check, in order
If real submissions are being filtered, work through these before changing a threshold.
1. Read the spam folder. Establish whether you have a false-positive problem at all, and how big. Everything else is guesswork until you have.
2. Find out why each one was filtered. A good backend tells you. If yours gives you a score and nothing else, you cannot distinguish the fixable causes from the structural ones, and that is worth knowing about your backend.
3. Separate message-based from sender-based. Keywords, link counts and message length are message-based: a setting change fixes them. Reputation, rate and duplicate detection are sender-based: they need the record cleared, not the dial turned.
4. Check your own blocklist. An old entry — a keyword that is now a legitimate industry term, a domain you blocked during an attack — catches real mail silently and forever. This is the most common self-inflicted cause and the easiest to miss.
5. Mark things "not spam", then verify it changed anything. Ask your provider whether corrections are fed back as training signal or merely move the row. If corrections do nothing, a recurring false positive recurs forever.
6. Only then, loosen the filter. And prefer a setting that flags rather than hides. A flagged submission still reaches you and lets you judge; a hidden one relies on you remembering to check.
Choose the failure you can afford
The useful question is not "how strict should my filter be" but "which mistake can I live with".
For a high-volume form where spam is genuinely unmanageable, a strict filter and a weekly spam-folder review is reasonable. For most small sites — a consultancy, a restaurant, a conference registration page — the arithmetic runs the other way. A dozen spam messages a week cost a minute. One missed enquiry costs a customer, and it costs it silently.
That asymmetry is why we think a filter should be able to be turned down, and why the loosest setting still leaves the defences that have no false positives — a hidden field no human ever fills, rate limits that stop floods — switched on. Those protect you without ever being wrong about a real person. Thresholds and classifiers are judgement calls, and judgement calls are yours to make.
If you want to see how ours behaves before trusting it with anything, send a few real submissions through a form and read the spam folder honestly. That is the same advice we would give about any backend, including the ones we compete with.
Frequently asked questions
- Why did my own test submission go to the spam folder?
- Usually because testing does not look like a real enquiry to a filter. Test messages are short and low-information ('test', 'asdf'), which gives a classifier nothing to judge, and many filters treat a submission sent within a second or two of the page loading as automated — which is exactly what testing looks like. The more serious version is that some filters record the verdict against your address or IP, so a few tests teach the system to distrust you, and your real submissions start being filtered too.
- How do I tell a false positive from real spam?
- Read the spam folder rather than trusting the count. Open every filtered submission for a week and sort them into 'should have arrived' and 'correctly caught'. Most people have never done this, which is why most people do not know their false-positive rate. If your backend shows the reason for each verdict, check whether the reasons are about the message itself (keywords, links) or about the sender (reputation, rate) — sender-based verdicts are the ones that misfire on legitimate repeat senders.
- Does marking something 'not spam' actually teach the filter?
- It depends entirely on the backend, and it is worth asking rather than assuming. Some services use the correction only to move that one row. Others feed it back as a training signal for your form, and a few weight a customer's correction more heavily than their own model's guess. If corrections are not fed back, a recurring false positive will recur forever no matter how many times you fix it by hand.
- Is it better to have a strict filter or a loose one?
- That depends on what a missed message costs you. A spam message you see and delete costs seconds. A quote request that never arrives can cost a customer, and you never learn it happened. For most small sites that asymmetry argues for a looser filter that flags rather than hides, so borderline submissions still reach you and you decide. Strict settings make sense when the volume of spam is genuinely unmanageable, and even then it is worth checking the spam folder weekly.
- Can a spam filter learn to distrust a legitimate sender?
- Yes, and it is one of the harder failures to spot because it is invisible from the message itself. Filters that track sender reputation across sites build up counters for an address or IP, and once a sender crosses the threshold their messages are filtered on identity rather than content. If the evidence that built those counters was wrong — our own bug counted one customer's forms as independent corroboration — the sender stays distrusted until the counters decay or someone clears them.
Related guides
Why Your Contact Form Suddenly Started Getting Spam
It is not personal and it is not targeted: a crawler found a <form> tag. Here is how that happens, why it starts on an ordinary Tuesday, and what each kind of spam is actually trying to get out of you.
How ShipMyForm Fights Form Spam (So You Never Have To)
Why we think spam is the backend's problem, not your visitors' — and how a layered defense keeps your inbox clean without a single CAPTCHA.
How to Stop Contact Form Spam Without reCAPTCHA
Honeypots, rate limiting, and Turnstile — layered spam defenses that beat reCAPTCHA without the puzzles.