Ad tracking
Advertising revenue is measured in impressions and clicks. If your integration renders perfectly but does not fire tracking, the platform's view is that nothing was shown — and reporting and settlement follow that view, not your screen.
The contract
| Event | Fire when | What to pass |
|---|---|---|
| Impression | The item becomes visible to the customer | That item's href |
| Click | The customer taps it | That item's href, via the SDK launch |
Firing an impression
- Android
- iOS
- Headless
CheggoutUtils.Companion.trackLink(href, virtualId)
CheggoutApp.impression(userID: virtualId, impressionInfo: href)
Parse the <track> tag out of the href string and issue a plain GET:
<click>...</click>
<track>https://tracking.cheggout.com/...Impression...</track>
<clicktrack>https://tracking.cheggout.com/...clicks...</clicktrack>
<browser>Native</browser>
<expiryduration>60</expiryduration>
<id>REPLACE_ID</id>
<redirectURL>...</redirectURL>
Fire every URL in the <track> section. No authentication header is required, and the response body
can be discarded.
Firing a click
Pass the item's href in the SDK launch payload when the customer taps. That is the documented
step, and the SDK resolves the destination from it.
TBD Whether the SDK also fires the click URL itself is not documented. Confirm
with Cheggout before you rely on it, and do not assume it is handled for you — if it is not, and you
have not fired the <clicktrack> URLs yourself, your clicks are under-reported.
The exception is a banner with bankLink = 1 — that one is yours, the SDK is not opened, and no
Cheggout click applies. See Banners.
Visible, not loaded
This is the distinction that separates accurate reporting from inflated reporting.
| Situation | Fire when |
|---|---|
| Banner above the fold | The screen appears |
| Banner below the fold | It scrolls into view |
| Carousel | Per slide, as each becomes the visible slide |
| Horizontal store row | Per icon, as each scrolls into view |
| Screen backgrounded before display | Do not fire |
Firing everything at fetch time is the common shortcut, and it corrupts the numbers in both directions: impressions counted for items nobody saw, and a click-through rate that looks far worse than reality.
Deduplication
Fire once per genuine view. Re-firing on every scroll pass or every recomposition inflates counts.
A workable rule: track which item identifiers you have already reported in the current screen session, and skip repeats. Reset when the screen is recreated.
The tracking string also carries an <expiryduration> tag, present with an observed value of 60.
TBD Its meaning is not documented — do not base your suppression window on it
until Cheggout confirms what it represents.
Never block the customer
Tracking is fire-and-forget:
- Asynchronous. Never block rendering or navigation on a tracking call.
- Failure-tolerant. A failed tracking call must not surface an error or stop the customer proceeding.
- Not retried aggressively. One attempt is enough; a retry storm on a flaky network helps nobody.
Frequency capping
Frequency caps — how often a customer can see a given creative — are enforced server-side by Cheggout's decisioning. You do not implement them, and you should not try to.
Their practical effect is that a placement will sometimes return nothing for a customer who saw something a moment ago. That is the system working correctly.
TBD Cap configuration is not publisher-visible. There is no API to read or set caps for your channel. Discuss the policy with Cheggout during campaign setup.
Reporting
TBD No publisher-facing reporting API is published. You cannot pull impression or click totals programmatically; reporting is agreed commercially. Tracked in Open items.
In the meantime, instrument your own side. Count how many items you displayed and how many tracking calls you fired, and monitor the ratio. If displays climb and fires do not, something has broken — and this is the only way you will find out before a revenue conversation.
Verification checklist
- Impression fires on visibility, not on fetch
- Carousel slides and scrolling rows fire per item
-
hrefis passed to the SDK on tap -
bankLink = 1banners bypass the SDK entirely - Duplicate fires suppressed within a screen session
- Tracking failures never block the customer
- Display count and fire count are both instrumented and monitored
Next
- Banners · Stores
- Scratch card tracking — the same principles, different payload
- Production rollout — monitoring fire rates