Abuja Digital Studio · Est. 2018
Start a Project
DocsOrravo Spam ShieldDetection stack
Reference

Detection stack

Orravo Spam Shieldorravo.com/docs/orravo-spam-shield/detection-stack

Order of operations

OSpam_Checker::run() runs each check in order. Allowlist matches short-circuit immediately; hard-fail checks (honeypot, rate limit, bot UA, geo, blocklist) block the submission outright; soft checks add to a score that is compared to ospam_score_threshold.

Hard-fail checks

CheckTriggerNotes
AllowlistIP/email/domain in wp_ospam_allowlistSkips everything else
HoneypotInvisible ospam_confirm_email field is non-emptyAuto-blocklist after N hits in 24h if enabled
Rate limitMore than ospam_ratelimit_max (default 5) submissions per IP per ospam_ratelimit_window seconds (default 3600)Transient-backed
User-agentEmpty or known-bot UAOpt-in
GeoCountry code in ospam_geo_blocked_countriesLookup via ip-api.com, 24h cache
BlocklistIP/email/domain/keyword in wp_ospam_blocklistSubstring match for keywords

Soft (score-based) checks

CheckScore addedNotes
Timing+80 if submitted faster than ospam_timing_threshold (default 2s)JS sets ospam_ts on page load
Disposable emailconfigurableDomain match against ~500 known throwaway providers
Link density+20 / +50 / +801-2 / 3-4 / 5+ URLs across all fields
Patternup to +405+ repeated chars, ALL CAPS >20 chars, fields >2000 chars
Keywordsum of weighted matchesJSON list in ospam_score_keywords
StopForumSpam+60Opt-in, only if email frequency > 5
Akismet+70Opt-in, requires Akismet API key

Honeypot field

A visually-hidden <input name="ospam_confirm_email"> wrapped in a div with position:absolute;left:-9999px and aria-hidden="true". Real users never see it; bots that fill every field do.

Detection stack · Orravo Spam Shield Docs | Orravo