Title: Wellenbrecher
Author: hafenstudios
Published: <strong>August 21, 2026</strong>
Last modified: August 21, 2026

---

Search plugins

![](https://ps.w.org/wellenbrecher/assets/banner-772x250.png?rev=3658814)

![](https://ps.w.org/wellenbrecher/assets/icon-256x256.png?rev=3658814)

# Wellenbrecher

 By [hafenstudios](https://profiles.wordpress.org/hafenstudios/)

[Download](https://downloads.wordpress.org/plugin/wellenbrecher.1.3.2.zip)

 * [Details](https://wordpress.org/plugins/wellenbrecher/#description)
 * [Reviews](https://wordpress.org/plugins/wellenbrecher/#reviews)
 *  [Installation](https://wordpress.org/plugins/wellenbrecher/#installation)
 * [Development](https://wordpress.org/plugins/wellenbrecher/#developers)

 [Support](https://wordpress.org/support/plugin/wellenbrecher/)

## Description

Most anti-spam plugins for WordPress guard one door: the comment form. Wellenbrecher
guards the ones that cost you money. User registration, the WooCommerce checkout
and the eight form builders that carry the traffic on real sites are covered the
moment the plugin is active, comments and trackbacks included. Nothing is sent to
a third party, and no visitor is asked to prove they are human.

Every submission is scored on your own server. There is no account to create, no
API key to enter, no request quota, and no data processing agreement to sign, because
no submission ever leaves your site. That is the difference that matters under the
GDPR: a filter that ships every comment and every contact request to a third-party
service is a processing step you have to declare, find a legal basis for and tell
your visitors about. This one is not.

More than thirty small signals contribute points to the score: a hidden honeypot
field, a form token, whether JavaScript ran, how fast the form was filled in, request
headers, link density, mixed writing systems, throwaway email domains, repeat offenders
from your own log, and a filter that learns from your own moderation decisions. 
Three zones decide the outcome: let it through, hold it in quarantine, or block 
it.

Nothing disappears silently. Every decision lands in the log with its score and 
the rules that produced it, so a legitimate submission that was caught is visible
instead of lost. Releasing it takes one click, and the sender is trusted again afterwards.

#### Which forms are covered

Wellenbrecher hooks into each builder’s own submission path, so there is nothing
to configure. Install the plugin, and these are covered as soon as the builder is
active:

 * Contact Form 7
 * WPForms
 * Gravity Forms
 * Jetpack forms
 * Fluent Forms
 * Forminator
 * Ninja Forms
 * MetForm

Alongside them: WordPress comments and trackbacks, user registration including multisite
and the WooCommerce account form, WooCommerce product reviews, the WooCommerce checkout,
and the Hafenstudios Leadlotse form plugin.

Coverage is not identical everywhere, and it should not be sold as if it were. Where
a builder renders an ordinary HTML form, Wellenbrecher adds its own hidden signals
to it and gets the full picture. Ninja Forms and MetForm rebuild their form in the
browser and submit it through their own endpoint, so those extra fields cannot be
attached; both are still scored, but on content and request signals only, not on
behaviour. User registration is scored the same way, on content and request signals,
because the registration form is WordPress’ own and carries no extra fields. The
classic WooCommerce checkout does get the hidden fields and the honeypot; the block-
based checkout submits through the Store API and is scored on content and request
signals as well.

#### What you get

 * An explainable score with three zones. Every rule can be switched off or reweighted,
   and the breakdown is shown for each decision
 * Observation mode for the first seven days: everything is recorded, nothing is
   blocked, so you see what would have happened before you arm it
 * A log with a release button, so a false positive costs one click instead of a
   customer
 * A learning filter trained by your own moderation, entirely on your server
 * Quarantine for form submissions: the log keeps the submitted values and releases
   them per row
 * Comment quarantine in the native WordPress spam folder, with a column that shows
   the score
 * A dashboard widget with the last 14 days, the totals for 7 and 30 days and a 
   breakdown per channel
 * Statistics and a CSV export of the log for your own records
 * Move-in help: reads what a previously installed anti-spam plugin had configured,
   shows what maps across, and imports it on your confirmation. Nothing is deleted
   and no service keys are read
 * Your own keyword list, and the option to remove the XML-RPC methods for comments
   and pingbacks
 * Invisible to visitors. No captcha, no puzzle, no cookie
 * Fail-open by design: if the plugin hits an internal error, the submission passes
   through to normal moderation instead of vanishing

#### No external services

Wellenbrecher makes no outbound request. The scoring, the word lists, the learning
filter, the statistics and the log all live on your server. There is no telemetry,
no remote font, no remote script and no phone-home of any kind.

#### Privacy

 * IP addresses are never stored in clear text, only as a non-reversible check value
   under a key that rotates weekly
 * Of email addresses only the domain is kept
 * Retention is automatic: blocked and flagged rows after seven days, quarantine
   after 30 days, both adjustable
 * Suggested text for the WordPress privacy policy tool, plus hooks into the WordPress
   data export and erasure requests

#### Not a security plugin

Wellenbrecher stops spam, not attacks. It brings no login brute-force protection,
no firewall and no .htaccess changes, so it stays out of the way of a dedicated 
security plugin.

## Screenshots

[⌊Overview: today's decisions per zone, the busiest channels and the state of the
observation window.⌉⌊Overview: today's decisions per zone, the busiest channels 
and the state of the observation window.⌉[

Overview: today’s decisions per zone, the busiest channels and the state of the 
observation window.

[⌊Setup checklist: the observation window, the channels it detected, the privacy
note and arming the protection.⌉⌊Setup checklist: the observation window, the channels
it detected, the privacy note and arming the protection.⌉[

Setup checklist: the observation window, the channels it detected, the privacy note
and arming the protection.

[⌊The log: every decision with its score, the rules that fired and a release button
per row.⌉⌊The log: every decision with its score, the rules that fired and a release
button per row.⌉[

The log: every decision with its score, the rules that fired and a release button
per row.

[⌊A single decision expanded, showing which rule contributed how many points.⌉⌊A
single decision expanded, showing which rule contributed how many points.⌉[

A single decision expanded, showing which rule contributed how many points.

[⌊Settings: every rule can be switched off or reweighted, and the two thresholds
that separate the three zones are set here.⌉⌊Settings: every rule can be switched
off or reweighted, and the two thresholds that separate the three zones are set 
here.⌉[

Settings: every rule can be switched off or reweighted, and the two thresholds that
separate the three zones are set here.

[⌊Dashboard widget with the last 14 days, the totals for 7 and 30 days and the breakdown
per channel.⌉⌊Dashboard widget with the last 14 days, the totals for 7 and 30 days
and the breakdown per channel.⌉[

Dashboard widget with the last 14 days, the totals for 7 and 30 days and the breakdown
per channel.

[⌊Move-in help: what a previously installed anti-spam plugin had configured, and
what of it maps across.⌉⌊Move-in help: what a previously installed anti-spam plugin
had configured, and what of it maps across.⌉[

Move-in help: what a previously installed anti-spam plugin had configured, and what
of it maps across.

## Installation

 1. Install the plugin from the directory, or upload it under Plugins, Add New.
 2. Activate it. Wellenbrecher starts in observation mode for seven days.
 3. Open the Wellenbrecher menu and follow the setup checklist.
 4. After the observation window, arm the protection.

## FAQ

### Does Wellenbrecher send data anywhere?

No. Scoring happens entirely on your server. The plugin makes no outbound request
at all, so there is nothing to declare in your privacy policy beyond the data it
stores locally.

### Do my visitors have to solve a captcha?

No. There is no captcha, no puzzle and no checkbox. The signals run in the background,
and a visitor without JavaScript is never blocked for that reason alone.

### What happens to a legitimate submission that gets caught?

It appears in the log with its score and the rules that fired. Release it, and the
entry leaves the list; when the stored submission carries an email address, that
sender passes freely for the next 90 days. The submitted values stay in the log 
entry, so nothing is lost while you decide.

### I use a page cache or a CDN. Anything to watch out for?

Wellenbrecher bakes nothing dynamic into cached pages. The form token is fetched
through a small REST route (/wellenbrecher/v1/token) that sends no-cache headers.
Exclude that route from full page caching. A missing token is only one signal among
many and never blocks on its own.

### A Forminator submission was held back and I cannot find it in Forminator

That is how Forminator handles a spam verdict: it answers with its own error message
and does not store the submission at all, so there is nothing in its own spam folder
to look at. The submission is in the Wellenbrecher log with its values and can be
released from there.

### My theme renders the comment form itself. Does the protection still work?

Yes. The honeypot and the field swap need markup this plugin renders itself, so 
those two signals fall away; all other rules keep working. One case is worth knowing
about, because it adds a rule instead of removing one: if another template on the
same site does use the standard comment form, the plugin has proof that its fields
render somewhere, and a comment from the hand-built form is then charged 30 points
for the missing form token. On its own that stays below the quarantine threshold;
together with one further signal, a filled-in website field or a link in a short
comment, it can reach it. Such a comment is held for moderation, not rejected, and
one click releases it. If you would rather not have that trade at all, give the 
form-token rule less weight in the settings.

### Does it protect WooCommerce?

Yes. Product reviews are comments and are covered automatically, the checkout has
its own channel, and verified buyers get a trust bonus so their reviews are not 
held back.

### Can I turn off XML-RPC comments and pingbacks?

Yes, in the settings. Only the pingback.ping and wp.newComment methods are removed;
xmlrpc.php itself stays reachable so that apps and services keep working.

### What is left behind when I uninstall it?

Uninstalling removes the plugin’s own tables, options and scheduled task. Comments
that WordPress moved to its spam folder stay where they are, because they belong
to WordPress.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Wellenbrecher” is open source software. The following people have contributed to
this plugin.

Contributors

 *   [ hafenstudios ](https://profiles.wordpress.org/hafenstudios/)

[Translate “Wellenbrecher” into your language.](https://translate.wordpress.org/projects/wp-plugins/wellenbrecher)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/wellenbrecher/), check
out the [SVN repository](https://plugins.svn.wordpress.org/wellenbrecher/), or subscribe
to the [development log](https://plugins.trac.wordpress.org/log/wellenbrecher/) 
by [RSS](https://plugins.trac.wordpress.org/log/wellenbrecher/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.3.2

 * Fixed: on sites behind a reverse proxy on the same machine, every visitor arrived
   with the same internal address and shared a single rate limit for the form token.
   Once a few visitors were active per minute, the token stopped being issued and
   honest submissions were scored as if the browser had never loaded the page. Requests
   without a usable public address are no longer counted at all.
 * Fixed: a crafted request to a Leadlotse form could make the scoring skip the 
   submission entirely. The value that carries the proof-of-work answer is now type
   checked before it is read.
 * Tested with WordPress 7.1.

#### 1.3.1

 * Changed: the entry in the plugin list row is now a plain action link like any
   other. It was a colored, inline-styled button before, which drew more attention
   inside a shared admin screen than it should (directory guideline 11).
 * Changed: the admin stylesheet and script now load only on the plugin’s own pages
   instead of on every admin screen.
 * Changed: activation registers only the single capability this plugin actually
   uses. Earlier versions also created a shared role and eight further capabilities
   that belong to sibling plugins, not to an anti-spam plugin.
 * Changed: internal fail-open notices are written to the PHP error log only when
   WP_DEBUG is enabled.
 * Improved: every server header the scoring reads is unslashed before sanitization,
   matching the WordPress coding standards; the same for the user agent recorded
   by the bundled consent helper.
 * Fixed: the endpoint that remembers a dismissed onboarding card now caps the length
   and number of stored card IDs.
 * Fixed: uninstalling with data removal enabled left two options behind; they are
   removed now.
 * Removed: an unused framework class that shipped with the package.

#### 1.3.0

 * New: the hidden honeypot field now also works in Contact Form 7 and Forminator.
   Those two builders previously ran without the single strongest rule; they no 
   longer do.
 * Changed: detection recalibrated. A filled honeypot on its own is enough for quarantine
   again, which it had not been in the previous build.
 * Changed: a visitor whose browser never ran the JavaScript is no longer charged
   twice for it. The form token cannot exist without that script, so its absence
   is no longer counted separately. A real visitor without JavaScript now stays 
   clearly below the quarantine threshold.
 * Changed: the token and JavaScript rules stand down only when this plugin’s own
   hidden fields were demonstrably never rendered for that channel, instead of whenever
   they are missing from the request. A bot that posts straight to the endpoint 
   is scored again.
 * Improved: the honeypot markup is now built in one place for every channel and
   stays invisible through two independent mechanisms, a stylesheet class and an
   inline style, so a caching or optimisation plugin that drops one of them cannot
   expose the field. A test checks this on every release.
 * Fixed: a database query against the token table was flagged by strict review 
   tooling. The query itself was safe; the annotation was one line off.

#### 1.2.0

 * New: eight form builders are covered out of the box, Contact Form 7, WPForms,
   Gravity Forms, Jetpack forms, Fluent Forms, Forminator, Ninja Forms and MetForm.
   No setup, each builder is hooked on its own submission path.
 * New: the log lets you release a false positive with one click. The entry leaves
   the list, and the sender is trusted again for 90 days.
 * New: a dashboard widget with the last 14 days, the totals for 7 and 30 days, 
   and a breakdown per channel.
 * New: move-in help for sites coming from another anti-spam plugin. It shows what
   was configured there, imports what maps across on your confirmation, and offers
   to switch the old plugin off in a separate second step. No service keys are read.
 * Improved: the learning filter, the proof of work, the checkout channel and the
   reports are part of the standard feature set.

#### 1.1.0

 * New: learning filter, escalating proof of work, WooCommerce checkout protection
   and reports with CSV export.

#### 1.0.0

 * First release: explainable scoring with three zones, observation mode, comments,
   trackbacks, registrations and product reviews, honeypot and field swap, form 
   quarantine, log and statistics, privacy tooling.

## Meta

 *  Version **1.3.2**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.5 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [antispam](https://wordpress.org/plugins/tags/antispam/)[comment spam](https://wordpress.org/plugins/tags/comment-spam/)
   [form spam](https://wordpress.org/plugins/tags/form-spam/)[spam](https://wordpress.org/plugins/tags/spam/)
   [spam filter](https://wordpress.org/plugins/tags/spam-filter/)
 *  [Advanced View](https://wordpress.org/plugins/wellenbrecher/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/wellenbrecher/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/wellenbrecher/reviews/)

## Contributors

 *   [ hafenstudios ](https://profiles.wordpress.org/hafenstudios/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/wellenbrecher/)