How it worksDispatch N°06

What happens between Submit and your inbox

Seven form types scored by Google's engine. Keys provisioned for you, so there is no console to visit and nothing to paste. Nothing loaded on the pages that do not need it. Every decision written down with the score behind it. And a job that runs every night to check the whole thing still works. Here is exactly how it fits together.

A customer types a question into your contact form and presses Send. What happens in the next moment decides two things: whether the spam in your inbox stops, and whether that customer ever notices anything happened at all. Spambuster is built so the answer is yes to the first and no to the second.

This is the whole route a submission takes, written out stage by stage. It is worth reading before you install anything in this category, because the differences between products in this market are almost entirely in the parts that listings do not show: which forms an app can see, what it loads onto your pages, what it does when something upstream breaks, and whether it can tell you afterwards what it did and why.

Two minutes, and no Google console

Using Google reCAPTCHA normally means a trip to the Google Cloud console: create a project, generate a site key and a secret, choose the right protection type, register your domains, then paste two long strings into an app. It is the step at which most merchants give up on doing it themselves, and several apps in this category still ask you to do it before their product will work at all.

Spambuster does all of it for you through Google's API. During setup the app provisions a dedicated reCAPTCHA Enterprise key for your store, of the correct type for the protection mode you chose, and registers your domains against it. There is no console to visit, nothing to generate and nothing to paste. Install, switch on the app embed, and you are protected.

One key per store Keys are not shared between merchants. reCAPTCHA scores by learning the traffic on a specific site, so a key shared across stores would be scoring a blend of them.

Two details in that arrangement save merchants trouble months later, and both are worth knowing about.

Your key keeps up with your store. A reCAPTCHA key does not learn about new domains by itself, so a merchant who adds a custom domain six months after setup would normally find verification failing on the new domain only, which is a genuinely baffling fault to diagnose. Spambuster reconciles your key's domain list against your store on an ongoing schedule, so the problem never arrives.

Your own Enterprise keys stay yours. If you supply a key from your own Google Cloud project, the app uses it and reports any faults on it rather than modifying it. Your project may hold keys used by other software, and we leave those alone.

Eleven stages, and how few of them your customers pay for

Here is every stage a submission passes through, in order. Note how much of the work never happens: on a page with no form, the app does nothing at all, and two of the four ways a submission can be resolved are settled in the browser before a single network request is made.

Figure 01 — The route a submission takesN°01
01 Page load

The theme app extension injects one script: 65 KB uncompressed, about 18 KB over the wire. Its configuration travels with it as data attributes rather than as a separate fetch, so there is no round trip to wait for and no flash of unprotected form.

Storefront
02 Form discovery

The script looks for the seven Shopify form types, and for the markup patterns of a named list of third-party form plugins and embed services. Observers watch the containers those forms usually appear in, so forms injected after load are picked up too. This stage decides whether stage 05 happens at all.

Storefront
03 No forms found

Nothing further happens. No reCAPTCHA library is fetched and no request goes to Google. On a catalogue page, a collection, a blog index or a product page without a review form, the entire cost of having Spambuster installed is 18 KB. On most stores that is the majority of page views.

Exit · no cost
Storefront
04 Idle-time environment checks

Browser and environment checks run inside requestIdleCallback, meaning they wait for the browser to be free rather than competing with your theme for it. Behavioural listeners for mouse, keyboard, scroll and form timing attach passively, so they never block scrolling. Premium plan.

Storefront
05 reCAPTCHA library fetched

Google's library is requested only once discovery has found a form that uses it. A page with no such form never causes the request, which on most stores is the majority of the catalogue. A second path loads it on first form interaction, as a fallback for detection cases that the first path misses.

Storefront
06 Submit

The submit handler intercepts before the browser posts the form.

Storefront
07 Honeypot check

A field your customers never see and automation fills anyway. If it is populated the submission stops here, in the browser, with no token requested and nothing sent to Google. Faster for you and invisible to the customer. Every trigger is counted per form so you can see which forms are being probed. Premium plan.

Exit · blocked locally
Storefront
08 Token request

A reCAPTCHA token is requested for the form being submitted, carrying the action name so Google scores it in the right context.

Storefront
09 Verification call

The token goes to our backend, which calls Google. If our backend is ever unreachable, the submission is allowed through and the event is beaconed to our daily report so we see it. A problem at our end must never cost you a customer. This is the single most important line in this article and it is worth asking every vendor about.

Exit · fail open
Our backend
10 Score against threshold

Google returns a score. The submission passes only if the score is strictly greater than your threshold, so a score exactly at the threshold is blocked. If Google reports the token as invalid the submission is blocked and the customer sees a message rather than silence, so they can try again.

Exit · pass or block
Our backend
11 Record and release

The decision, the score, the form type, the threshold in force and the reason are written to your event log. Then the form submits normally, and your customer carries on without having seen a puzzle, a checkbox or a delay.

Our backend
The cheapest outcome is the one where there is no form at all, and on most stores that is most page views. The rest is deliberate too. The small bundle, the conditional reCAPTCHA fetch and the local honeypot check are all decisions about not doing work on your customers' machines, which on a storefront is the most valuable kind of decision there is.

Three decisions that protect your page speed

Three of those stages could have been built the easy way. Each was not, and each choice shows up in what your storefront costs a visitor.

Google's library could be fetched on every page. That is the simple way to build it, and it means every visitor to every page downloads a third-party library that most of them will never need. Spambuster fetches it only once form discovery has found a form that uses it, so the cost lands on the pages that have something to protect and nowhere else. On a catalogue-heavy store that is a small minority of page views.

The honeypot could be checked on our server. Checking it in the browser instead removes a network round trip for the submissions least worth scoring, which during an attack is a large share of the volume. It also means the trap keeps working even if our backend is unreachable, which is precisely when you would least like to be undefended.

The environment checks could run immediately. They wait for idle time instead, because a spam filter that costs you your Largest Contentful Paint has made a bad trade on your behalf. The checks are valuable. They are not more valuable than your page rendering.

Two minutes, and then it is somebody else's problem

Install it, tick the app embed, and stop thinking about form spam

Keys provisioned for you. Seven form types covered. Every decision logged with the score behind it. A nightly job that repairs its own configuration while you sleep. And no puzzle, ever, for a real customer. Basic is $3 a month, Premium $12 for honeypot traps and the behavioural layer. Fourteen days free, no card required, billed through your normal Shopify invoice.

Start the free 14-day trial →
Live in 2 minutes·No keys to paste·Cancel anytime

The night shift: a filter that repairs itself

This is the feature no other listing in the category claims, and it exists because reCAPTCHA configuration decays quietly. An installation that worked in March can be silently failing by September with nothing in the dashboard to say so.

Keys get deleted from Google projects. A protection mode is switched and the key type no longer matches. A custom domain is added and never registered. A theme is republished and the metafields carrying the key go stale. In every one of those cases the app still appears installed, the dashboard still looks healthy, and the spam quietly starts coming back.

Every night, Spambuster reads the last 48 hours of verification errors across the fleet, works out which shops have a real configuration fault, and fixes them. You do not have to notice, diagnose or report anything.

Figure 02 — Fault classes and remediationsN°02
As implemented in the nightly self-heal job
FaultRemediationTouches keys?
No key and no secret presentProvision a v3 score-based Enterprise keyOurs
Our Enterprise key was deletedRegenerate, same protection typeOurs
Key type does not match v2/v3 settingRegenerate with the correct typeOurs
Legacy site key and secret failingUpgrade the store to an auto-generated Enterprise keyReplaced
Key is fine, storefront copy is staleRe-sync metafields to the themeNo
Merchant-owned Google Cloud key brokenReport only. Never modified.No
Errors are shopper-side token noiseLeft aloneNo
Note the last two rows, because the restraint is the point. Most reCAPTCHA errors are ordinary shopper-side noise: expired tokens, abandoned tabs, a customer who wandered off mid-form. Those need no action and get none. Keys the merchant owns are reported on but never modified. And where a key is otherwise healthy but has fallen behind the store's domains, the job adds the missing ones, which quietly prevents the custom-domain fault before it happens.

Two safeguards make that safe to run against live stores.

Every change is audited, so there is a record of what was altered and why. And changes are capped per run: if a change at Google's end ever caused the classifier to conclude that hundreds of stores needed new keys, it would repair a handful and stop rather than rewriting the fleet overnight. Careful beats clever when the thing being edited is somebody's live storefront.

Every decision, on the record

The most common complaint about spam apps is not that they block too much or too little. It is that merchants cannot tell what they did. A blocked count is a number you have to take on faith. Spambuster records every submission individually, so when you want to know what happened to a specific message you can simply look.

Figure 03 — Recorded per submissionN°03
resultpass, fail, or error. Error is distinct from fail, because a verification that could not be completed is not the same as one that was completed and rejected.
scoreThe value Google returned. Recorded as −1 where verification errored, so the two cases stay separable in the data.
thresholdThe threshold in force at the time of the decision, not the current one. A merchant who changed the setting last week can still read old decisions correctly.
formTypeWhich of the seven forms. This is what tells a merchant that 61 percent of their blocks are on one form.
errorReasonThe machine-readable reason, which is also what the nightly repair job classifies against.
apiTypeWhether the check ran against Enterprise, the legacy API, or a fallback. Useful precisely once, when something is wrong.
ipHashA hash of the requesting address, used to recognise a source that keeps coming back across many submissions.
The threshold field is the one nobody asks for and everybody eventually needs. Because the log records the setting that was in force at the time, your history stays readable after you change it, and you can always answer the question that actually matters: what would have happened at a different setting? Most logs in this category cannot tell you.

What it is built for

Spambuster protects the seven forms on your storefront: contact, newsletter, blog comments and reviews, login, account registration, password reset, and the order form on Premium. Those are the doors a stranger can push text through, and they are where the overwhelming majority of Shopify form spam arrives.

It is built to do that job invisibly. Your customers never see a puzzle, never tick a box, and never wait. Google's engine does the scoring, you set the strictness, and the app handles everything in between including the parts that normally require a Google Cloud account.

Two things worth knowing about the scope, because they save you time rather than because they are caveats.

Checkout is Shopify's own infrastructure. Requests that go straight to the checkout endpoint never load any storefront app, ours or anyone else's, which is why we wrote a whole dispatch on it. If your problem is a flood of fake abandoned checkouts, start there rather than with any app.

Automation is what gets filtered. Everything above tests whether a submission came from a machine, which is what the overwhelming bulk of form spam is. The residue that arrives from a human typing a sales pitch is a mail-rule problem, and our first dispatch shows how to write those in about fifteen minutes.

Within that scope, this is a narrow thing done carefully. Every submission on seven forms scored by Google's engine. No console, no keys, no puzzles. Nothing loaded on pages that do not need it. Every decision written down with the score behind it. And a job that checks, every night, that the whole arrangement still works.

Fourteen days free is enough to see all of it on your own store.

About this report

Every stage, fault class and log field described above is taken from our own source as shipped in client v301, July 2026. The 65 KB and 18 KB figures are the actual file and its gzipped size, and you can check both from your page source once installed. We do not publish latency figures, because we do not have numbers we would trust across the full range of themes and networks our customers run on. Questions and corrections to contact@jola.com.au

Two minutes, then forget about it.

Keys provisioned for you. Seven form types. Every decision logged with the score behind it. A nightly job that repairs its own configuration. No puzzles for your customers, and nothing loaded on the pages that do not need it. Protecting Shopify storefronts in fifteen languages.

Start your free 14-day trial →
Basic $3 · Premium $12·No credit card to try·Cancel anytime