Exposure
Recorded whengetVariant() resolves:
Only where the user genuinely sees it
This is the trap. Exposure means saw, not was assigned. Resolve a variant in a component that renders off-screen, or on a page where the tested element is below the fold and never scrolled to, and you’ve added people to the denominator who never had the chance to convert. The effect is always the same: your measured lift shrinks toward zero, because you’ve diluted both arms with users who couldn’t have responded. A real winner can be buried this way. Two tools:Conversion
Nothing is captured automatically. There is no autocapture, no click tracking, no implicit pageviews. A conversion exists only where you write one:Pick events that mean something
The best conversion events sit as close to real value as you can get while still happening often enough to measure.purchase_completed— unambiguous, but rare, so it needs a lot of trafficcheckout_started— more frequent, and a decent proxybutton_clicked— plentiful and nearly meaningless on its own
Record them server-side where you can
Browser events are lost to ad blockers, closed tabs, and flaky networks. Anything your backend knows about — payments especially — is more reliably recorded there:How they meet
An exposure and a conversion are joined by identity. Trevo counts a conversion toward whichever variant that identity was exposed to. Which is why sending bothuserId and anonymousId from a backend matters: an event
carrying only userId from a user whose exposure was recorded anonymously has nothing to
join on, and that conversion is lost from the results. The SDKs send both automatically when
they can; on REST, it’s your job.