Why our numbers and yours differ
Two sets of numbers that track the same users rarely match to the unit, and the gap almost always has one of a few causes: our days are UTC days, our Conversions count only an offer’s first step, reversals lower the day a conversion was earned and postbacks that failed, repeated or were tests count differently on your side than on ours.
See also: Reporting
On this page
To find the exact rows, follow Reconcile our numbers with yours, step by step.
| Cause | What we count | What you might be counting |
|---|---|---|
| Time zones | UTC days. A Texas evening lands partly on tomorrow. | Your local days |
| Conversions and events | Conversions is the first step of an offer only. Later steps are Events. | Every postback as a conversion |
| Reversals | Taken off the day the conversion was earned, so a closed week can drop | Taken off the day the reversal arrived, or not at all |
| Postbacks that never reached you | Every conversion, sent or not | Only what your server received |
| Repeats | One conversion, even when the postback was sent twice | Each copy, if you dedupe on action_id alone or not at all |
| Test postbacks | Nothing: a test creates no conversion | Tests your code credited |
| Rejected or in-review conversions | Not in totals | Nothing, since no postback was sent |
| Money fields | Your earnings | payout on the Hosted Offerwall, which is the player’s reward there |
| Clicks | Taps that reached our tracking link | Taps on your own button, including ones that never loaded the link |
Example, made up: Pebble Rewards’ own database shows 12 Harbor Blocks installs for 29 October, Texas time. Our Dashboard shows 10 conversions for 29 October.
- One install came in at 7:30 PM in Texas, which is 12:30 AM on 30 October in UTC. It’s in our 30 October.
- One “install” in their database is the player reaching level 10. Their code booked every postback as an install. On our side it’s an event.
12, less one on the next UTC day, less one later step, is 10. Nothing is missing.
- Get our rows for the same UTC window. Publishers: Conversions, then Download CSV, or
GET /with your API key; Pull conversions instead has the call. Networks: Reporting, then Flight Recorder lists each postback with its Action ID.publisher/ conversions - Match on action ID and status. Our
actionIdis the postback’saction_id. A reversal repeats theaction_idwithstatus=reversed, so match on both. For conversions first sent before 10 September 2026, match on the end of the ID: the postback’s can be longer. - Rows we have and you don’t: open Reporting, then Flight Recorder, and look at Delivery. failed means your server didn’t answer with a 2xx; skipped_no_url means no postback URL matched. Publishers: with no postback secret, nothing is sent at all. How to answer a postback covers retries.
- Rows you have and we don’t: look for
test=true, and for the sameaction_idandstatusstored twice.
We charge and count an event only when it carries a click ID that matches a tap on your campaign. These never count:
- Events without a click ID, logged as
missing_attribution. - The same
eventIdsent again: we answerduplicateand count only the first. - Events whose
timestampis more than 48 hours from when we received them, logged asoutside_window. - Test events.
Your attribution tool also has its own windows and its own way of picking which tap gets the credit, so its installs from AffiliateOS can be higher or lower than ours. Event logs on each campaign shows each event we logged and its status; a repeated eventId isn’t logged again.
If the gap is still there: the email you sign in with, the UTC window, your count and ours, and a few action_id values (advertisers: event IDs) that you have and we don’t, or the other way round.