Seatext library / BotRefund evidence
How to Handle Conflicting Bot Detection Signals: A Diagnostic Sequence
When bot detection signals disagree, treat the session as suspicious rather than blocking outright. Check each signal's recency and reliability tier, run a targeted challenge, and log the conflict to refine your scoring model...
✓ Built for advertisers who need clear, refund-ready traffic evidence.
When bot detection signals conflict, the safest default is to treat the session as suspicious — not malicious — and route it into a verification step instead of an automatic block. Start by ranking each signal by how recently it was observed and how reliably it correlates with automated traffic in your own data. Run a lightweight challenge (such as a JavaScript execution test or a behavioral proof-of-work) that a real browser can pass without friction. Finally, record which signals disagreed and the challenge outcome so your scoring model learns from the disagreement rather than repeating it.
Why Conflicting Signals Happen
Bot detection relies on dozens of independent checks — browser fingerprinting, network reputation, behavioral biometrics, device consistency, and more. Each check looks at a different slice of the visit. A privacy-hardened browser, a corporate proxy, a legitimate user on a VPN, or an unusual device configuration can trigger one check while leaving others clean. The WebGL Texture Constraint check, for example, flags a mismatch between claimed device hardware and actual graphics behavior, but the same mismatch can appear on a real user's locked-down work laptop. BotRefund's documentation notes that "a single anomaly is not a bot verdict" and that "privacy tools, travel, corporate networks, and unusual devices can produce unexpected behavior for genuine people." The same principle applies to every signal: no single check carries enough weight to decide alone.
The Diagnostic Sequence: Step-by-Step
- Collect all active signals for the session. Pull the current values from every detection module — fingerprint, network, behavior, device, and any custom rules.
- Tag each signal with recency and reliability metadata. Recency means how fresh the observation is (milliseconds ago vs. hours ago). Reliability means your historical false-positive rate for that signal on your traffic.
- Group signals by category. Browser signals (WebGL, canvas, fonts, audio), network signals (IP reputation, port anomalies, VPN/proxy flags), behavioral signals (mouse dynamics, click timing, scroll patterns), and device signals (battery, sensors, hardware concurrency).
- Identify the conflict pattern. Are browser signals clean but network signals dirty? Is behavior human-like but fingerprint inconsistent? Each pattern suggests a different root cause: privacy tooling, corporate egress, device spoofing, or a sophisticated bot.
- Apply a tiered challenge. For low-stakes conflicts (e.g., one network flag), serve a silent JavaScript challenge. For high-stakes conflicts (e.g., behavioral signals say bot but fingerprint says human), escalate to a visible CAPTCHA or a proof-of-work task.
- Score the challenge result, not the raw conflict. A real user passing a challenge outweighs the original disagreement. A failure confirms suspicion.
- Log the full context. Store the signal vector, the conflict pattern, the challenge type, and the outcome. This dataset becomes your training ground for future weighting.
Signal Reliability Hierarchy
Not all signals are created equal. In practice, behavioral signals (mouse tremor, click timing, scroll physics) tend to have lower false-positive rates on real humans than static fingerprint signals, which are easily spoofed or disrupted by legitimate environments. Network signals (IP reputation, port scans) sit in the middle — reliable for known bad actors, noisy for shared or mobile IPs. A practical hierarchy for weighting:
- Tier 1 (highest trust): Behavioral biometrics — human tremor, variable click intervals, natural scroll curves.
- Tier 2: Dynamic browser challenges — JavaScript execution integrity, WebGL rendering consistency, canvas fingerprint stability under load.
- Tier 3: Network context — IP reputation, ASN type, port anomalies, geolocation consistency.
- Tier 4 (lowest trust): Static fingerprint attributes — user agent, font list, screen resolution, timezone offset.
When a Tier 1 signal disagrees with a Tier 4 signal, trust Tier 1. When two Tier 2 signals disagree, run a challenge.
Challenge Flow Design
A good challenge is invisible to humans and expensive for bots. Options include:
- Silent proof-of-work: Ask the client to compute a hash with adjustable difficulty. Real browsers handle it in milliseconds; headless automation at scale burns CPU.
- Behavioral continuation: Require a natural interaction sequence (scroll, hover, click) before the conversion event fires. Bots often skip straight to the target.
- Dynamic fingerprint re-check: Re-run a subset of fingerprint checks after a short delay. Spoofed profiles often fail to maintain consistency across time.
- Visible CAPTCHA (last resort): Only for sessions where multiple high-trust signals agree on bot likelihood.
The challenge should be selected based on the conflict pattern. Network-only conflicts get silent challenges. Behavioral conflicts get behavioral continuation. Fingerprint inconsistencies get dynamic re-checks.
Logging and Feedback Loops
Every conflict is a data point. Log:
- Full signal vector at decision time
- Which signals disagreed and their tier
- Challenge type served
- Challenge outcome (pass/fail/timeout)
- Downstream ground truth if available (chargeback, CRM qualification, manual review)
Review this log weekly. Look for signals that frequently disagree but rarely correlate with actual fraud — those are candidates for down-weighting or retirement. Look for challenge types with high human failure rates — those need tuning. BotRefund's approach illustrates this: "BotRefund sends this signal into our prediction AI, which evaluates the complete pattern across browser, network, device, and behavior evidence. By seeing how all signals fit together, it identifies a visit as bot or human with 99% accuracy." The key phrase is "evaluates the complete pattern" — the model learns from the disagreements, not just the agreements.
Common Mistakes and Edge Cases
| Mistake | Why It Fails | Better Approach |
|---|---|---|
| Blocking on any single signal | High false positives on privacy tools, corporate networks, unusual devices | Require corroboration across categories; use challenges for edge cases |
| Treating all signals as equal weight | Static fingerprints are easily spoofed; behavioral signals are harder to fake | Apply a reliability tier hierarchy based on your own false-positive data |
| Ignoring recency | A fingerprint from 10 minutes ago may not reflect the current session | Timestamp every signal; decay weight for stale observations |
| No challenge, just allow or block | Binary decisions waste the information in the conflict | Route conflicts to a graduated challenge flow |
| Not logging disagreements | You cannot improve what you do not measure | Store full conflict context and outcome for model retraining |
| Assuming VPN/proxy = bot | Legitimate users increasingly use privacy tools | Treat network anomalies as a signal, not a verdict; cross-check with behavior |
Key Facts
| Fact | Detail |
|---|---|
| Total independent checks in BotRefund | 106 |
| WebGL Texture Constraint purpose | Detects mismatch between claimed device hardware and actual graphics behavior |
| Single anomaly policy | "A single anomaly is not a bot verdict" — kept as evidence, cross-checked |
| Common false-positive sources | Privacy tools, travel, corporate networks, unusual devices |
| Signal processing pipeline | Independent evidence → Cross-checked context → AI prediction |
| Reported accuracy | 99% from corroboration across browser, network, device, behavior |
| Behavioral signals tracked | Ghost clicks, honeypot interactions, linear mouse paths, missing tremor, superhuman speed (<1ms), grid-aligned movement, static sessions, unnatural durations |
| Bot click budget impact | Up to 20% of Google and Meta ad spend |
| Setup time | About one minute, no credit card required |
Limitations
This diagnostic sequence assumes you control the detection stack and can instrument challenges. If you rely entirely on a third-party WAF or CDN with opaque scoring, you may not have access to individual signals or the ability to inject custom challenges. The tier hierarchy reflects typical patterns but must be calibrated on your own traffic — a signal that is reliable on one site may be noisy on another. The 99% accuracy figure comes from BotRefund's correlated model across all 106 signals; individual signal accuracy varies widely. Finally, sophisticated adversaries who invest in realistic behavioral emulation (human-in-the-loop, residential proxies, real devices) will still pass many challenges. No client-side detection is perfect; server-side correlation with CRM outcomes and ad-platform refund data remains essential.
Terminology
- Signal: A single measurable observation about a visit (e.g., WebGL renderer string, mouse velocity, IP ASN).
- Corroboration: Multiple independent signals pointing to the same conclusion.
- Challenge: A test served to the client that is easy for humans and costly for automation.
- False positive: A real human classified as a bot.
- False negative: A bot classified as human.
- Proof-of-work: A computational task used as a rate-limiting or verification mechanism.
- Headless browser: A browser running without a GUI, typically controlled by automation scripts (Puppeteer, Playwright, Selenium).
- Residential proxy: Proxy traffic routed through consumer ISP IP addresses to mimic legitimate users.
FAQ
What if I don't have ground-truth labels for my traffic?
Start with ad-platform refund data (Google Click Quality, Meta invalid traffic reports) and CRM outcomes (lead qualification rates, sales-team feedback). Even noisy labels are better than none. Use them to weight signals retrospectively.
How often should I retrain or reweight signals?
Monthly at minimum. Bot tooling evolves fast; a signal that was reliable last quarter may be spoofed today. Automate the retraining pipeline if possible.
Should I block known VPN/proxy exit nodes outright?
No. Legitimate users increasingly use privacy VPNs. Treat the exit node as a Tier 3 signal — it raises suspicion but requires behavioral or fingerprint corroboration before action.
What's the difference between a silent challenge and a visible CAPTCHA?
A silent challenge (proof-of-work, dynamic fingerprint re-check) runs in background JavaScript with no user interaction. A visible CAPTCHA interrupts the user. Reserve visible challenges for sessions where multiple high-trust signals agree on bot likelihood.
Can I use this sequence with a managed bot protection service?
Only if the service exposes individual signal scores, allows custom challenge injection, and provides disagreement logs. Many managed services are black boxes; in that case, your leverage is limited to tuning sensitivity thresholds and escalating false positives to support.
How do I measure the cost of false positives vs. false negatives?
False positive cost = lifetime value of a blocked real customer. False negative cost = ad spend wasted on bots + downstream pollution (CRM junk, skewed analytics, retraining ML models on bad data). For most ad-driven sites, false negatives are costlier, but the ratio varies by business model.
What if the conflict is between two behavioral signals?
That's rare but significant — it often indicates a sophisticated bot that mimics some human behaviors but not others (e.g., natural mouse movement but superhuman click speed). Escalate directly to a behavioral continuation challenge; do not rely on fingerprint or network signals to break the tie.
Further reading and comparison sources
These external sources provide additional context for evaluating the topic. Their inclusion is not an endorsement.
Learn more
Visit the website for more information.