Stream Settings Reference
Every field on a stream, what it controls, and how it interacts with the check pipeline.
Name & Traffic Source#
name is the only required field on a stream. trafficSource (google / facebook / tiktok / bing / yandex / twitter / snapchat / pinterest / linkedin / taboola / other) is stored as a tag on every logged click for reporting — it doesn't change any filtering behavior.
Destination Pages & Rotation#
A stream can hold one or more destination URLs (moneyPages). With two or more configured, rotationMode decides how a passed visitor picks one:
- random — a uniformly random page on every request (the default).
- sequential — cycles through the list in order, one page per visitor.
- timer — all traffic gets the same page for a fixed window (
rotationIntervalseconds), then the whole stream advances to the next page together.
With zero or one destination page configured, rotation settings have no effect.
Per-OS Overrides#
appleMoneyPage, windowsMoneyPage, and androidMoneyPage let you send specific operating systems to a dedicated destination instead of the general rotation. appleMoneyPage covers both iOS and macOS. These are checked before the rotation logic above — if a matching override is set for the visitor's detected OS, it wins.
Fallback Page#
safePage is where blocked visitors are sent. It is always delivered as a direct render — never a redirect — by design, regardless of your stream's Money Page Delivery setting below (which only applies to the destination page). If it's left empty, a blocked visitor simply isn't redirected anywhere.
Mode#
filter (full enforcement), moderation (record and score, but still deliver everyone to the destination page), off (no evaluation at all), or review (send every visitor to your Fallback Page instead, for the duration of an ad-platform review — see below). See the Block Reason Reference's mode section for exactly how each mode changes what a block reason results in.
Switch a stream to review while an ad platform (Google, Meta, TikTok, etc.) is reviewing a campaign that points at it. Every visitor — including entries on your own whitelist — is sent to your Fallback Page instead of the destination page for as long as the mode stays set, with no exceptions. Scoring and logging keep running normally underneath, so Reports still shows exactly who arrived during the review window.
review, "my money page isn't showing" is expected, not a bug — that includes testing from your own whitelisted IP. See Troubleshooting if this catches you off guard. There's no auto-expiry — once the campaign is approved, switch the stream back to filter (or moderation) yourself.Threshold#
A number from 0 to 1 (default 0.5) that controls how aggressively this stream filters. Lower it to divert more traffic to your Fallback Page; raise it to let more borderline visitors through to your money page. See the Automated risk checks reference for what each individual block reason means.
Allowed Countries / OS / Devices#
Three independent allow-lists. Each is empty by default (no restriction). Once you add entries to one, a visitor who doesn't match is blocked immediately — before risk scoring even runs — with geo_blocked, os_blocked, or device_blocked respectively.
Require Click ID#
When enabled, any visitor arriving without a click ID from a recognized ad platform on the URL — gclid (Google), fbclid (Meta), ttclid (TikTok), msclkid (Microsoft/Bing), yclid (Yandex), twclid (X/Twitter), ScCid (Snapchat), epik (Pinterest), li_fat_id (LinkedIn), or tblci (Taboola) — is treated as bot/direct traffic — the check returns immediately with no risk evaluation.
Visitor IP Detection#
Your PHP filter (the standalone file, or the WordPress plugin) resolves each visitor's real IP itself — it doesn't need any setting here for the most common cases. It automatically checks whether the connecting request genuinely belongs to Cloudflare's, Gcore's, or Bunny.net's own published network, and only then trusts that CDN's own forwarding header. A forwarded header is never trusted without that network proof, so a visitor with no CDN in front of them can't forge one to pick their own IP.
If this stream sits behind a different CDN or reverse proxy — one this automatic check doesn't recognize — open the stream's Filtering settings and turn on Advanced — my CDN isn't auto-detected, then enter the exact header name your CDN adds (e.g. X-Forwarded-For). That header is trusted unconditionally once set — there's no network check possible for an edge this filter doesn't know the ranges of, so only turn this on for a CDN/reverse proxy you actually control.
Money Page Delivery#
moneyAction controls how a passed visitor is actually delivered to the destination page. Every existing stream defaults to proxy. A permanent 301 redirect is deliberately not offered as an option at all — browsers cache a 301 permanently, which would let a visitor bypass this filter forever after their first visit.
proxy (default)The server fetches the destination's HTML and serves it directly at your own URL. Can break on destinations built as a JavaScript-framework SPA (Next.js, Nuxt, Angular, React) — those apps try to take over the browser's address bar themselves and crash when served from a different domain. On the Hosted Ad Link integration, a shell like that is detected automatically (by its near-empty page content) and falls back to a real navigation instead; the downloadable PHP filter has no such detection and will show the broken shell as-is — see the FAQ.
redirect302A temporary (not permanently cached) client-side redirect, using history replace rather than a normal navigation so the Back button can't bounce the visitor into a loop.
js_redirectA straightforward client-side navigation to the destination URL.
meta_refreshReveals the current page first, then inserts a meta-refresh tag. Not a guaranteed-synchronous navigation the way a script redirect is — some browsers/extensions can delay or strip a meta-refresh.
iframeRenders the destination in a full-viewport iframe instead of navigating away. The wrapper iframe src is a same-origin relay (money is not in the outer page source). On PHP/WordPress the framed document is a same-origin rewrite; on Hosted Ad Link and the JS snippet hop-2 302s the framed document onto the money origin. Fails silently whenever the destination blocks framing.
iframe_cross_originSame wrapper as iframe (same-origin relay src). Hop-2 is a 302 so the framed document is the real money origin — required on PHP/WordPress for domain-locked players (VTurb/ConverteAI) that refuse a same-origin rewrite. Visible in DevTools/Network, never the address bar. On Hosted Ad Link and the JS snippet, regular iframe already does this hop.
click_revealOn the JavaScript snippet, shows a Continue button and gates delivery on a genuine click — the destination isn't referenced until then. On PHP, WordPress, and Hosted Ad Link this aliases to iframe (no page exists to wait for a click on the first response).
mirrorFetches the destination's HTML server-side and rewrites every asset reference to route through your own tracking domain instead — the destination's URL never appears anywhere the visitor can see, not even in the page source. Works best on static landing pages; a detected JavaScript-heavy app renders in place with a compatibility shim instead of being skipped, though that's best-effort and can still misbehave on complex apps. If the destination can't be fetched at all, the visitor now sees your configured Safe Page instead of a blank one — never a redirect to the destination. Currently applies to the Hosted Ad Link integration on a live custom tracking domain only — falls back automatically otherwise.
proxy does not hide your money page's own hostname from a visitor's browser: the destination's <base href> and every asset it loads (images, scripts, stylesheets) resolve directly against the money origin, in plaintext, for every passed visitor. That's a structural property of this mode, not a bug — the browser has to reach the real origin somehow. For high-risk verticals (betting, adult, pharma) that plaintext hostname is exactly the kind of link between your ad-facing domain and the money brand that gets accounts suspended for cloaking. Use mirror instead for these streams — it routes every asset through your own tracking domain so the money origin's hostname never reaches the visitor at all.Active / Paused#
Pausing a stream (isActive: false) makes every visitor pass through untouched — no risk evaluation, no redirect, and no Reports entry at all. A visitor on a paused stream simply ends up looking at whatever HTML already exists on the page the snippet is installed on.
Read-only fields#
clickCount, blockCount, and createdAt are maintained by the server and can never be set directly, including through the API.