Checklist: Bot filtering — blacklist vs allowlist approach
Blacklist (block known-bad):
☐ Block datacenter ASNs, known crawler UAs, flagged IP ranges
☐ Lets everything else through — high fill, lower friction
☐ Always one step behind new bot patterns
Allowlist (only pass known-good):
☐ Permit only residential/carrier ASNs with real browser signals
☐ Tightest fraud control — bots can't pass what isn't allowed
☐ Risks blocking real users on unusual networks (VPNs, corporate)
Step — Choose by offer sensitivity.
☐ High-payout, fraud-strict advertiser → allowlist, eat the false negatives
☐ Volume CPI/CPA, tolerant advertiser → blacklist, keep fill high
Step — Log every block with reason so you can measure false-positive cost.
Tradeoff: blacklists maximize traffic but leak fraud; allowlists stop fraud but reject legit edge users.
Review blocked-traffic samples weekly to tune the line.
—
Для любителей finding broken backlinks — @DeadLinkDetective
Blacklist (block known-bad):
☐ Block datacenter ASNs, known crawler UAs, flagged IP ranges
☐ Lets everything else through — high fill, lower friction
☐ Always one step behind new bot patterns
Allowlist (only pass known-good):
☐ Permit only residential/carrier ASNs with real browser signals
☐ Tightest fraud control — bots can't pass what isn't allowed
☐ Risks blocking real users on unusual networks (VPNs, corporate)
Step — Choose by offer sensitivity.
☐ High-payout, fraud-strict advertiser → allowlist, eat the false negatives
☐ Volume CPI/CPA, tolerant advertiser → blacklist, keep fill high
Step — Log every block with reason so you can measure false-positive cost.
Tradeoff: blacklists maximize traffic but leak fraud; allowlists stop fraud but reject legit edge users.
Review blocked-traffic samples weekly to tune the line.
—
Для любителей finding broken backlinks — @DeadLinkDetective
SOP: Build a 3-deep fallback chain that never dead-ends
Purpose: ensure no click ever lands on a blank page when an offer pauses or caps out.
☐ Step 1 — Set the primary by EPC, not payout. The highest-paying offer is useless if it rejects 60% of the geo.
☐ Step 2 — Pick fallback A from a different advertiser. Same advertiser often pauses a whole vertical at once.
☐ Step 3 — Pick fallback B as a house offer or your own catch-all page. Zero downtime, you control it.
☐ Step 4 — Add a final hard redirect to a safe landing, never a 404.
☐ Step 5 — Log which level served each click. If fallback B fires above 5%, your primary is broken.
Repeat the audit weekly; advertiser status changes faster than you think.
Purpose: ensure no click ever lands on a blank page when an offer pauses or caps out.
☐ Step 1 — Set the primary by EPC, not payout. The highest-paying offer is useless if it rejects 60% of the geo.
☐ Step 2 — Pick fallback A from a different advertiser. Same advertiser often pauses a whole vertical at once.
☐ Step 3 — Pick fallback B as a house offer or your own catch-all page. Zero downtime, you control it.
☐ Step 4 — Add a final hard redirect to a safe landing, never a 404.
☐ Step 5 — Log which level served each click. If fallback B fires above 5%, your primary is broken.
Repeat the audit weekly; advertiser status changes faster than you think.
Framework: Geo-rule precedence order
Purpose: stop rule collisions where a click matches two geo blocks and routes to the wrong offer.
Rank your rules narrow-to-broad and read them top-down:
— City / region rules first (highest specificity)
— Country rules second
— Region groups (Tier-1, GCC, LATAM) third
— Continent rules fourth
— Global default last (the floor that catches everyone)
Checklist before publishing:
☐ Confirm every country in a region group still resolves to a live offer
☐ Confirm no country sits inside two groups (overlap = undefined behavior)
☐ Confirm the global default is a real offer, not 'pause'
☐ Send one test click per tier and read the served offer
First match wins, so order is the logic. Document the order in a comment block beside the smartlink.
Review monthly when you add new geos.
Purpose: stop rule collisions where a click matches two geo blocks and routes to the wrong offer.
Rank your rules narrow-to-broad and read them top-down:
— City / region rules first (highest specificity)
— Country rules second
— Region groups (Tier-1, GCC, LATAM) third
— Continent rules fourth
— Global default last (the floor that catches everyone)
Checklist before publishing:
☐ Confirm every country in a region group still resolves to a live offer
☐ Confirm no country sits inside two groups (overlap = undefined behavior)
☐ Confirm the global default is a real offer, not 'pause'
☐ Send one test click per tier and read the served offer
First match wins, so order is the logic. Document the order in a comment block beside the smartlink.
Review monthly when you add new geos.
SOP: Weighted split-test burn-in
Purpose: rotate a new offer into a smartlink without tanking revenue while it proves out.
☐ Step 1 — Start the new offer at 10% weight, incumbent at 90%.
☐ Step 2 — Hold until the new offer reaches at least 300 clicks. Below that, EPC is noise.
☐ Step 3 — Compare EPC, not conversion rate. A 2% CR at $40 beats 6% at $9.
☐ Step 4 — If new EPC is within 15% of incumbent, raise to 30%. If it wins, go 50/50.
☐ Step 5 — Never jump straight to 100%. Caps and quality scores lag; a sudden flood gets you throttled.
☐ Step 6 — Freeze weights for 48h after any change so you measure the offer, not the transition.
Repeat the cycle every time you add a candidate.
Purpose: rotate a new offer into a smartlink without tanking revenue while it proves out.
☐ Step 1 — Start the new offer at 10% weight, incumbent at 90%.
☐ Step 2 — Hold until the new offer reaches at least 300 clicks. Below that, EPC is noise.
☐ Step 3 — Compare EPC, not conversion rate. A 2% CR at $40 beats 6% at $9.
☐ Step 4 — If new EPC is within 15% of incumbent, raise to 30%. If it wins, go 50/50.
☐ Step 5 — Never jump straight to 100%. Caps and quality scores lag; a sudden flood gets you throttled.
☐ Step 6 — Freeze weights for 48h after any change so you measure the offer, not the transition.
Repeat the cycle every time you add a candidate.
Worth your feed
@ArbFiles. Real traffic-arbitrage case studies with actual spend, revenue and ROI — the… We read it, you probably should too.
@ArbFiles. Real traffic-arbitrage case studies with actual spend, revenue and ROI — the… We read it, you probably should too.
SOP: Daily cap management
Purpose: stop sending paid clicks to an offer that's already capped and won't pay.
☐ Step 1 — Pull each offer's daily cap and current count at start of day. Set them in the smartlink, not just your notes.
☐ Step 2 — Set the smartlink to auto-pause an offer at 90% of cap, not 100%. Postback lag means you overshoot.
☐ Step 3 — Route capped offers to the fallback automatically — never to a 'sorry, paused' page.
☐ Step 4 — Stagger caps across timezones. A US offer capping at midnight EST shouldn't dark your EU morning traffic.
☐ Step 5 — Flag any offer that caps before noon — demand exceeds supply, ask the manager to raise it.
Reset and re-pull every morning. Caps reset on the advertiser's clock, not yours — confirm which timezone.
Purpose: stop sending paid clicks to an offer that's already capped and won't pay.
☐ Step 1 — Pull each offer's daily cap and current count at start of day. Set them in the smartlink, not just your notes.
☐ Step 2 — Set the smartlink to auto-pause an offer at 90% of cap, not 100%. Postback lag means you overshoot.
☐ Step 3 — Route capped offers to the fallback automatically — never to a 'sorry, paused' page.
☐ Step 4 — Stagger caps across timezones. A US offer capping at midnight EST shouldn't dark your EU morning traffic.
☐ Step 5 — Flag any offer that caps before noon — demand exceeds supply, ask the manager to raise it.
Reset and re-pull every morning. Caps reset on the advertiser's clock, not yours — confirm which timezone.
Framework: Device-based routing tiers
Purpose: stop serving desktop offers to mobile clicks and watching them bounce.
Split traffic on four signals, in this order:
— OS first: iOS and Android convert on different offers; never lump them
— Device type second: phone vs tablet vs desktop
— Connection third: WiFi vs carrier (mobile-content offers need carrier)
— Browser last: in-app webviews (Facebook, TikTok) break some flows
Checklist:
☐ Set a distinct offer per OS, not a shared 'mobile' bucket
☐ Route in-app browsers to webview-safe landings only
☐ Confirm carrier detection works — WiFi clicks shouldn't hit pin-submit offers
☐ Keep a desktop fallback; 8-15% of 'mobile' traffic is mislabeled
Mislabeled device data is normal. Always keep a catch-all so misreads still monetize.
Review the device split monthly.
Purpose: stop serving desktop offers to mobile clicks and watching them bounce.
Split traffic on four signals, in this order:
— OS first: iOS and Android convert on different offers; never lump them
— Device type second: phone vs tablet vs desktop
— Connection third: WiFi vs carrier (mobile-content offers need carrier)
— Browser last: in-app webviews (Facebook, TikTok) break some flows
Checklist:
☐ Set a distinct offer per OS, not a shared 'mobile' bucket
☐ Route in-app browsers to webview-safe landings only
☐ Confirm carrier detection works — WiFi clicks shouldn't hit pin-submit offers
☐ Keep a desktop fallback; 8-15% of 'mobile' traffic is mislabeled
Mislabeled device data is normal. Always keep a catch-all so misreads still monetize.
Review the device split monthly.
SOP: Click deduplication rules
Purpose: stop the same user from being counted twice and skewing your split-test math.
☐ Step 1 — Set a dedup window. Same click ID inside 24h = one click, not two.
☐ Step 2 — Dedup on click ID first, IP+user-agent second. IP alone over-dedups shared networks.
☐ Step 3 — Decide where a duplicate goes: re-serve the same offer (sticky) so the user sees consistency.
☐ Step 4 — Make routing sticky per user for the window — flipping a returning user to a different offer wrecks attribution.
☐ Step 5 — Exclude duplicates from weight calculations, count them for traffic reporting. They're different numbers.
☐ Step 6 — Watch for a dup rate above 20% — that's a bot or a broken pixel firing twice.
Audit the dup rate weekly; a spike is your earliest fraud signal.
Purpose: stop the same user from being counted twice and skewing your split-test math.
☐ Step 1 — Set a dedup window. Same click ID inside 24h = one click, not two.
☐ Step 2 — Dedup on click ID first, IP+user-agent second. IP alone over-dedups shared networks.
☐ Step 3 — Decide where a duplicate goes: re-serve the same offer (sticky) so the user sees consistency.
☐ Step 4 — Make routing sticky per user for the window — flipping a returning user to a different offer wrecks attribution.
☐ Step 5 — Exclude duplicates from weight calculations, count them for traffic reporting. They're different numbers.
☐ Step 6 — Watch for a dup rate above 20% — that's a bot or a broken pixel firing twice.
Audit the dup rate weekly; a spike is your earliest fraud signal.
SOP: Smartlink naming and tagging convention
Purpose: make any smartlink readable at a glance six months later when you've built 200 of them.
Name pattern:
Example:
☐ Step 1 — Lock the field order and never reorder it. Sorting depends on consistency.
☐ Step 2 — Use the same source codes everywhere: fb, gg, tt, push, native. No synonyms.
☐ Step 3 — Bump the version on every routing-logic change, never edit in place silently.
☐ Step 4 — Tag with the date created and the owner. Orphaned smartlinks are how dead offers keep running.
☐ Step 5 — Keep a single index sheet: name, purpose, last edited, status.
The convention is worthless if one person ignores it. Enforce it on every new link.
Review the index monthly and archive anything dark for 30 days.
Purpose: make any smartlink readable at a glance six months later when you've built 200 of them.
Name pattern:
vertical_geo_source_versionExample:
dating_t1_fb_v3☐ Step 1 — Lock the field order and never reorder it. Sorting depends on consistency.
☐ Step 2 — Use the same source codes everywhere: fb, gg, tt, push, native. No synonyms.
☐ Step 3 — Bump the version on every routing-logic change, never edit in place silently.
☐ Step 4 — Tag with the date created and the owner. Orphaned smartlinks are how dead offers keep running.
☐ Step 5 — Keep a single index sheet: name, purpose, last edited, status.
The convention is worthless if one person ignores it. Enforce it on every new link.
Review the index monthly and archive anything dark for 30 days.
