Fraud Defense
Bad installs get stopped, and each rejection says why.
We check every tap, keep watching traffic after it and reject users behind what looks wrong. Their conversions are held, unpaid and uncharged.
Four checkpoints, one offer
Four checkpoints, one offer
Skip this animation Skip these steps- 01 At the tap
Every tap goes through our checks
Before the redirect, each tap passes our checks. One that fails never reaches the advertiser, so nobody pays for it.
Harbor Blocks on Pebble Rewards
- u_48213 Passed iPhone, Texas
- u_48262 Passed Android, Texas
- u_48190 Passed iPhone, Ohio
What our checks said about u_48213
- Device
- Nothing wrong found
- Pass
- Connection
- Nothing wrong found
- Pass
- Account
- Not on a reject list
- Pass
-
- 02 Around the clock
Patterns are checked across accounts
We keep comparing each offer's traffic across publishers and over time, so what looks fine in one click still shows up. u_48262 looks like a farm account, so it's rejected.
Harbor Blocks on Pebble Rewards
- u_48213 In line iPhone, Texas
- u_48262 Rejected Android, Texas
- u_48190 In line iPhone, Ohio
What the pattern checks compared
- This offer's traffic
- In line with other publishers on it
- Pass
- Against itself
- In line with its own history
- Pass
- u_48213
- Nothing found
- Pass
- u_48262
- Looks like a farm account
- Rejected
-
- 03 At the conversion
A rejected user's conversion pays nobody
Their taps are refused at the click page. A conversion that still arrives is held: the advertiser isn't charged, the publisher isn't paid and no postback goes out.
Harbor Blocks on Pebble Rewards
- u_48213 Paid $4.20 iPhone, Texas
- u_48262 Rejected Android, Texas
- u_48190 Paid $4.20 iPhone, Ohio
When the conversions arrive
- u_48213, install
- $4.20 to the publisher, postback sent
- Paid
- u_48190, install
- $4.20 to the publisher, postback sent
- Paid
- u_48262
- Taps refused. A conversion that still arrives is held: $0, no postback, no charge
- Held
-
- 04 Looking back
Farm accounts found later are reversed
When a user we paid for turns out to be one of several accounts, we reverse that pay and send a reversal postback with the same action ID and the reason.
Harbor Blocks on Pebble Rewards
- u_48213 Paid $4.20 iPhone, Texas
- u_48262 Rejected Android, Texas
- u_48190 Reversed iPhone, Ohio
When something turns up later
- u_48190
- Found to be a farm account
- Rejected
- Its install
- $4.20 reversed, dated on the day it was earned
- Reversed
- Reversal postback
- Same action ID, with the reason
- Sent
- u_48213
- Nothing found
- Paid
-
Step 1 of 4
01What we stop
The install fraud we stop.
We use more signals than we name here, and we don't publish them or where their limits sit. A published limit is one people stay just under.
-
Farms
Account farms.
One person behind many accounts, whether on one device or many.
-
Devices
Faked devices.
Emulators, and devices made to look like something they aren't.
-
Locations
Hidden locations.
Traffic dressed up to look like it comes from somewhere else.
-
Bots
Automated traffic.
Bots and scripted browsers tapping offers in place of people.
02Real-time fraud defense
Fraud flagged before you count the money.
Elsewhere, fraud shows up at the reconciliation, 15 to 60 days after the install. We flag most of it in real time, before anyone is credited.
The usual way
Fraud found at the reconciliation
-
The install
Install credited Credited
$4.20 counted as owed to you.
2,100 pebbles credited to the player. -
15 to 60 days
Waiting on the reconciliation
The player can spend or cash out the pebbles meanwhile.
-
The reconciliation
Reversal arrives Reversed
- Your books
- $4.20 marked down
- Player balance
- 2,100 pebbles clawed back
On AffiliateOS
Fraud flagged as it happens
-
The install
Install rejected Rejected
$4.20 kept off your books.
2,100 pebbles kept off the player's balance. -
The reconciliation
Nothing to reverse
Cleaner books, happier players. Anything found later is reversed as usual, with a reversal postback carrying the original action ID and the reason.
03Over-blocking
Built to leave real users alone.
A rule that blocks real users costs the publisher and the user. These limits are written into the rules.
-
Offer stays on
The offer keeps running.
When one publisher's traffic on an offer looks wrong, we reject the flagged users. Our checks never pause the offer; a person decides that.
-
Second look
A person checks what you question.
Send us the user ID. If we got it wrong, we release the user and their new conversions pay.
-
End dates
Every rejection ends.
A rejection expires 30 days after it's set, or sooner if a person reviews it and releases the user.
04What each side sees
What publishers and advertisers each see.
Publishers see every rejected user and why. Advertisers see what each channel cost them. Neither sees the other's numbers.
Publishers · Traffic Quality
Traffic Quality
| User (sub id) | Offer | Reason | Rejected | Expires |
|---|---|---|---|---|
| u_48262 | Harbor Blocks | One device, many users | 10/29/2026 | 11/28/2026 |
| u_48277 | Harbor Blocks | Failed our connection checks | 10/29/2026 | 11/28/2026 |
| u_48251 | Harbor Blocks | Failed our connection checks | 10/24/2026 | 11/23/2026 |
| u_48239 | Tidewater Putt | Failed our device checks | 10/22/2026 | 11/21/2026 |
- Every rejected user, the offer, the reason in plain words and the day it expires.
- Their conversions show as rejected in Conversions: not paid, no postback.
- The same list by API:
GET /publisher/traffic-quality.
Advertisers · By channel
By channel
Spend and conversions for each channel. Traffic sources show as channel IDs.
| Channel | Conv. | Spend | Cost/conv | Action |
|---|---|---|---|---|
| 7fKa9cZ2eQ… | 38 | $117.80 | $3.10 | Report an issue |
| 1bXd4aT05w… | 21 | $69.30 | $3.30 | Report an issue |
| c4Ne20fR7k… | 12 | $42.00 | $3.50 | Report an issue |
- Spend, conversions and cost per conversion for each channel.
- Each traffic source appears as a channel ID, never a publisher's name.
- Report an issue on any row. Our team reviews every report.
This offer isn't available for your account.
What the player sees
On a tracking link, a rejected user's tap stops at our click page with this line and never reaches the advertiser. It doesn't say the offer ended, so nobody reports a live offer as dead. On the Hosted Offerwall, a rejected player can't start a new offer.
Our promise
A rejected user charges nobody and pays nobody.
Their taps stop at our click page. A conversion that still arrives is held.
-
Not charged
The advertiser's balance isn't touched.
-
Not paid
The publisher earns nothing on it, and the line shows as rejected.
-
No postback
Nothing is sent, so no player is credited by mistake.
Will this block my real users?
Our checks are built to catch what real users don't do. A flagged offer keeps running, every rejection ends after 30 days and a person reviews any rejection you question.
What if you rejected a real player?
Send the user ID from Traffic Quality to hello@affiliateos.ai. A person checks the rule that fired. If we got it wrong, we release the user and their new conversions pay. Conversions we held while they were rejected aren't paid automatically; a person reviews them.
What do advertisers see?
Spend, conversions and cost per conversion for each channel, with each traffic source shown as a channel ID, never a publisher's name. Every row has a Report an issue button, and our team reviews every report.
Can a conversion wait to be cleared before it pays?
Yes. Our team can turn it on for a publisher. A conversion is then recorded but isn't paid and sends no postback until it's cleared or a person reviews it.
Can you take back pay you already sent?
Yes, for example when a user we paid for turns out to be a farm account. You get a reversal postback with the original action_id and the reason. The reversal is dated on the day of the conversion and takes back exactly what the credit paid. Not every rejection does this; some only hold conversions from then on.
Will I still get reversals later?
Sometimes. An advertiser can still take a conversion back after the fact, and we pass that on as a reversal postback with the original action_id. A rejected user's conversion was never paid, so it never needs reversing.
Every rejection shows its reason and end date.
-
I run an app or site
Sign-up is by request. We reply by email.
-
I'm buying installs, sales or in-app events
Test events are free. Verify each required event before you go live.
-
I run a network
From $500 a month.