Skip to content

Data Integrity

How Fusionaly protects your analytics from fake events and bot traffic

Fusionaly blocks fake events, bots, and spoofing attempts. It does this on your server. The code is open source, so you can check how it works.

Every event must come from a real browser. There are no exceptions.

Fusionaly runs three checks. All three must pass:

  1. Sec-Fetch-Site header: Browsers include this automatically. Fusionaly rejects requests without it.
  2. Valid header value: The value must match a real browser value (same-origin, same-site, cross-site, or none). Fusionaly rejects fake values.
  3. Origin or Referer header: Browsers always send at least one of these on POST requests. Fusionaly rejects the request if both are missing.
Request TypeBlocked?Why
curl/wgetNo Sec-Fetch-Site header
Postman/InsomniaNo Sec-Fetch-Site header
Backend HTTP clientsMissing browser headers
Forged headersInvalid values
Real browsersPass all checks

The Sec-Fetch-* headers are forbidden headers. JavaScript cannot set or change them. Only the browser can set them. Backend clients do not send them at all.

This makes spoofing hard:

Terminal window
# Rejected: missing headers
curl -X POST https://your-site.com/x/api/v1/events \
-d '{"url": "https://fake-page.com"}'
# Also rejected: missing Origin/Referer
curl -X POST https://your-site.com/x/api/v1/events \
-H "Sec-Fetch-Site: cross-site" \
-d '{"url": "https://fake-page.com"}'

User-Agent analysis filters known bots and crawlers, for example Googlebot, bingbot, and headless browsers.

For stronger protection, put Cloudflare in front of your instance. Cloudflare’s bot detection catches sophisticated bots that User-Agent checks miss.

Fusionaly allows 100 requests per minute, per IP address. This blocks:

  • Denial of service attempts
  • Automated probing
  • Runaway client loops
Request → Rate Limit → Browser Check → Bot Filter → Store
↓ ↓ ↓
503 error 403 error Ignored

Each layer catches a different kind of attack. Together, they let only real browser events reach your database.

Unlike cloud analytics with proprietary filtering, everything here is:

  • Auditable: read the code
  • Configurable: adjust it to your needs
  • Local: runs on your server, with no external calls