Skip to main content

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

EventFire whenWhat to pass
ImpressionThe item becomes visible to the customerThat item's href
ClickThe customer taps itThat item's href, via the SDK launch

Firing an impression

CheggoutUtils.Companion.trackLink(href, virtualId)

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.

SituationFire when
Banner above the foldThe screen appears
Banner below the foldIt scrolls into view
CarouselPer slide, as each becomes the visible slide
Horizontal store rowPer icon, as each scrolls into view
Screen backgrounded before displayDo 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
  • href is passed to the SDK on tap
  • bankLink = 1 banners 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