A VSL works in a fixed order. An ad click lands a viewer on a page. The video starts and has five seconds to earn a minute. The story carries them to the pitch. The buy button appears when the offer lands. They click through to a checkout that knows which session sent them, and the cart confirms the order back to the video. Each step leaves a record, and joined together those records say which ad, which video, which second, and which viewer produced each sale.
Rather than list features, this article follows one viewer through that order, in the present tense, and stops at each point where the sale is usually lost.
Before the video exists: the click
Someone is scrolling and stops on your ad. They tap. The link they are carrying has more on it than a destination: a click id from the platform, a Meta fbclid or a Google gclid or a TikTok ttclid, plus the UTM parameters and the affiliate sub-ids the media buyer added. They land on the page, and for a moment nothing has happened yet.
Something has, though. The player reads those parameters once and decides where this session came from, in a strict order: click id first, then UTM, then affiliate id, then referrer. If none of them settle it, the session is filed as Unknown. It is never rounded up to Direct. Bot and datacenter traffic is flagged at the same instant, before it can inflate anything later. From here on, every event this viewer produces carries that click identity with it.
Zero seconds: the load
The one embed on the page resolves everything for this particular view. The billing gate is checked. If the video is running a split test, this viewer is assigned an arm and will keep it for 30 days, so they never see two different hooks on two visits. The poster is painted into a space that was reserved before anything loaded, so the page does not jump.
Then the stream itself asks permission. Every playlist request passes the billing check, the domain allowlist, and content protection before a single frame is served. On a stranger's domain, or from a download tool, the request gets nothing or a decoy. The viewer notices none of this. They notice the first frame, and how long it took to arrive, which is why startup time is measured on every view.
Still zero seconds: the play
The video tries to start with sound. It almost certainly cannot, because every modern browser blocks autoplay with sound until the visitor has interacted with the page (Chrome, Safari). So it starts muted, and Smart Autoplay waits. The viewer scrolls a little, or taps anywhere on the page, and the sound comes on without the video restarting. Unmute Rate records whether that happened.
This is also the moment the play is counted, and the counting is stricter than it sounds. A play is one session in which the viewer genuinely played the video. A muted autoplay nobody watched is not a play. A reload is not a second play. A bot is not a play at all. TrackPlay publishes that definition, and the reason to care is that the same number appears on the invoice and in every report that follows.
Five seconds to earn a minute: the hook
The viewer is now watching and listening, and has not decided anything. The opening has about five seconds to give them a reason to stay. Hook Rate is the share of plays still watching past that point, and it is the first number to read on any VSL, because every number after it is multiplied by it. A hook that loses a third of the audience has lost a third of the sales before the pitch was ever heard.
From here the player reports progress every ten seconds, along with every seek, so the record of this session has the resolution of seconds rather than one average at the end.
The long middle: the story
Problem, mechanism, proof. This is most of the video and most of the places to leave. Each session keeps one row holding the furthest second reached, and thousands of those rows become the retention curve: for every five seconds of the video, what share of viewers were still there. A slope is people drifting. A cliff is one sentence.
Our viewer does something at 4:10 that turns out to matter. They scrub back twenty seconds and watch a claim again. The rewind is recorded, and later, if they do not buy, it will count in their favour when non-buyers are scored. Hold Rate, the share of plays that reached the midpoint, is the checkpoint for this stretch, and they pass it.
The pitch, and everything that moves with it
At 11:40 the offer and the price are revealed. That second is read from the transcript automatically, so it becomes the Pitch marker on the retention graph, and "how many people reached the pitch" is a count rather than an estimate. Our viewer is one of them.
Three things happen on the page at once, and the viewer sees only the first. A timed CTA appears, or a watch gate releases the order box and the guarantee that were hidden until now. A pixel fires at this watch milestone, from the browser and from the server, so the ad platform learns from someone who listened rather than someone who loaded a page. And if the timed event carries a CRM tag, and the viewer has already been identified by a lead form, they are tagged as having reached the pitch in GoHighLevel or ActiveCampaign.
The click that carries the key
At 12:05 they click the button. This is where most video hosts lose the thread, because the viewer is leaving the player. The fix is small and it is the hinge of the whole system. As the checkout link opens, the player writes the session key into it, using the cart's own passthrough parameter. Sixteen carts' link formats are supported. Nothing else about the link changes. The viewer lands on exactly the checkout they would have reached anyway. The only difference is that the cart now knows which session sent them.

The cart calls back
The payment goes through. The cart posts back. Cart postbacks are live for ClickBank, BuyGoods, Digistore24, WarriorPlus, JVZoo, and Kiwify, and because the postback carries the session key, the conversion inherits everything the session already knew: the video, the watch depth at the click, the split-test arm, the affiliate id, and the ad ids captured before the video existed. Refunds, rebills, and chargebacks post back the same way and land on the same session.
Three guards keep this honest. A postback with no key is recorded as organic rather than guessed onto someone. A key that matches nothing is dropped rather than misattributed. If the analytics store is briefly unavailable, the sale is still recorded, just without the enrichment. An affiliate who does not own the cart gets the same join from the network's postback, with the commission recorded as the value, so their reports price traffic in what they were actually paid.
A thank-you-page script fires on a declined card and never fires on a rebill. The cart's own confirmation is the only sale worth counting.
What the data does afterwards
The sale now lives on the session, and everything reads from it. Meta, TikTok, and GA4 receive the conversion server-side, on real revenue. The retention graph can draw buyers as their own curve, and the buyers' curve holding through minute eleven while the non-buyers' curve dies at minute six is the most useful picture a VSL owner ever gets. The split test scores arm B on revenue per play, not clicks. The Sources tab prices the Meta campaign by conversion rate. And on the viewer's profile page, the session reads as a sentence.
Arrived from a Meta ad. Turned the sound on at 0:02. Rewound 20 seconds at 4:10 and watched the claim again. Reached the pitch at 11:40. Saw the CTA. Clicked it at 12:05. Converted.
An example of the readable session story on a viewer's profile, with made-up timestamps. Real stories are built from the events recorded at each stage above.
The viewers who did not buy are not discarded. Their sessions are scored from 0 to 100 on what they did: whether they reached the offer, clicked the CTA, rewatched, returned, and how deep they watched, with bot traffic penalised. The high scorers are the hot leads worth retargeting or calling. And if any of them come back within 90 days, on any device, they are offered Continue or Restart instead of the beginning.
What each stage leaves behind
The same journey as a ledger. The right-hand column is the number each record feeds, so you can see which report to open when a stage looks wrong.
| Stage | What is recorded | The number it feeds |
|---|---|---|
| The click | Session, device, country, click id, sub-ids, bot flag | Sources report, traffic quality |
| The load | Split-test arm, billing check, startup time | Time to Play, Video Ready Time |
| The play | One genuine play per session, unmute event | Plays, Play Rate, Unmute Rate |
| The hook | Still watching at 0:05, ten-second ticks begin | Hook Rate |
| The story | Furthest second reached, seeks and rewinds | Retention curve, Hold Rate |
| The pitch | Pitch reached, CTA shown, milestone pixel, CRM tag | Pitch marker, CTA markers, Click Rate |
| The click-through | CTA click, checkout link with session key | Click Rate |
| The order | Purchase, refund, rebill, with session, arm, ad ids | Conversions, Conversion Rate, Revenue per Play |
| Afterwards | Server-side conversion, lead score, resume position | Buyers' curve, split-test result, Hot Leads |
Where the sale usually goes missing
Read the journey backwards and the losses line up with the stages.

- A sources report that guesses. If it says Meta without a Meta click id, it is telling you a channel works when it may not.
- A slow first frame. Every second between the click and the video is paid-for silence, and some of the people you paid for leave inside it.
- A hook played to silence. If Unmute Rate is low, the script has not been heard yet, so it cannot be the problem yet.
- A button visible from the first second. It invites the viewer to skip the argument. A pixel fired on page load does the same damage on the ad side.
- A checkout link with no key. The sale still happens. It just arrives as organic, and from then on the video and the cart are strangers.
Capture the click, protect the play, record every second, put the key in the checkout link, let the cart post the sale back. Do those five things and every question a VSL owner asks has a number. If you want to watch the sequence run on your own video, the free plan gives you 3,000 plays a month, free forever, with no card, and the VSL hosting page shows each stage as the product does it.
