How the builder track works
Eight sessions, 45 minutes each, one pipeline. Tonight the grain and the table. Session 2 gets the four recordings onto one clock. Sessions 3 and 4 add what the camera shows and what the host says, as columns. Session 5 scores every minute, session 6 works out which traits actually move the money and which only look like they do, session 7 forecasts the next five minutes while the stream is still running, and session 8 cues the host on a replay bench and measures what the cue was worth. The brand throughout is Lumen Glow, one hero SKU, a 29 dollar serum sold by four human hosts and two AI avatars across 60 streams.
★ What you walk out with tonight. A 26-column minute table you can open in pandas, with every later column already reserved: segment, product in hand, close-up ratio, price on screen, comments, replies, room size, product impressions, clicks, orders, GMV. The funnel arithmetic that turns those columns into the metrics a seller dashboard reports, checked to the cent against the stream totals. And a clear head about grain, because the three most common analysis mistakes in live commerce are all grain mistakes wearing a costume.
LiveWhy the minute, and not the frame or the stream3 min▶
Every source has a natural grain. Video is frames, 30 a second. Speech is words, with a start and an end time each. Comments are events with a timestamp. The seller dashboard reports the whole stream as one row, or at best a curve you can hover. None of those grains can hold the others. A frame does not know what was sold, a stream total does not know what was said at minute 43.
The minute is the coarsest grain at which a host can still change something. A host cannot react to a frame, and a stream total arrives after the room has gone home. Every question the leader track asks (which minutes convert, what the host was doing in them, whether a cue at minute 43 paid off by minute 48) is a minute question. So the table is built at the minute, and finer sources are aggregated up to it: share of frames with the product in hand, count of comments, dominant speech segment.
Lumen Glow's first attempt at this joined comments to orders by second and found nothing. The comment "is it good for oily skin?" and the order it produced were 40 to 90 seconds apart, so no second-level join ever matched them. At the minute grain, with a one-minute lag column, the pattern was obvious: minutes with an answered question were followed by minutes with more orders.
Self-studyThe vocabulary the whole track uses4 min▶
- Room - the number of viewers watching at a given minute. Also called concurrent viewers. Rises with arrivals, falls with leavers.
- Views - the count of entries into the stream. One person leaving and coming back is two views. TikTok Shop reports Viewers (unique people) beside it, plus Peak Concurrent Viewers and Average Concurrent Viewers.
- Product impressions - how many times the pinned product card was shown. Roughly the room times the share of viewers who see the card each minute.
- Product clicks and CTR - taps on the product card, and clicks divided by impressions.
- Orders and click-to-order rate - purchases, and orders divided by clicks. TikTok Shop's analytics call the rate CTOR; the course's tables write CVR, the same number.
- GMV - gross merchandise value, the sum of order values before refunds.
- GPM - GMV per thousand views, Watch GPM in TikTok Shop's LIVE analytics. The one number that lets a small room and a large room be compared on how well they sold.
- Segment - what the host is doing in a minute, as a tagger would label it from the transcript: hook, product build, demo, price, CTA, urgency, Q&A, filler, dead air. Session 4 builds the tagger; tonight it is a column.
Four recordings, one row per minute
9 min liveThe four sources arrive at wildly different rates, and the temptation is to build four tables and join them later. Build the minute table first and treat every source as something that contributes columns to it. The join key is the stream id and the minute number, and nothing else.
LiveThe four sources and what each one actually knows3 min▶
Each source answers one question and is nearly blind to the others. Knowing the blind spots is what stops you asking a source for something it never recorded.
| Source | Knows | Blind to | Native grain |
|---|---|---|---|
| Video file | What was in frame: the host, the product, a price card, a cut | Who was watching and what they did | Frame |
| Audio track | What was said, when, how fast | Whether anyone heard it or believed it | Word |
| Comment feed | What the room said back, and how much of it the host answered | The silent majority who never type | Event |
| Seller ledger | Room size, product impressions, clicks, orders, GMV | Why. It has no idea what the host was doing | Minute, or stream |
The whole course is the fourth row's blind spot filled in by the first three. The ledger says minute 43 sold 19 units. The other three say the host was holding the serum up to the camera, had just said the price, and was answering a question about oily skin. Neither half is analysis on its own.
LiveTwo conventions that save you a week3 min▶
Minute t is the interval [t-1, t) from the start of the stream, indexed from 1. Not from the top of the wall-clock hour, not from when the recording started. Every source is shifted to this clock in session 2, and once it is, "minute 43" means the same thing in every column.
Counts are sums, states are end-of-minute. Arrivals, comments, clicks, orders and GMV are what happened during the minute, so they add up: summing a stream's minute rows must give the stream total exactly, and tonight's demo checks that it does. Room size is a state, so it is the value at the end of the minute and it does not add up to anything. Mixing the two is the first grain mistake, and it produces "average room" numbers that are quietly wrong.
Write the check, not the note. A one-line assertion that the minute GMV sums to the stream GMV for every stream is worth more than a paragraph in the README saying it should. It ran on tonight's data and passed for 60 of 60.
Self-studyThe event model behind the minute table4 min▶
The minute table is a derived table. Underneath it, when you have real recordings, sit five raw tables that you keep and never edit:
streams- one row per stream: id, host, host type, start time, weekday, whether it opened with a giveaway, the platform's stream id.frames- one row per sampled frame (1 per second is plenty): stream, offset seconds, then detector outputs as columns. Session 3 fills it.words- one row per transcribed word: stream, start, end, text, confidence. Session 4 fills it and tags segments from it.comments- one row per comment or like event: stream, offset, author hash, text, whether the host replied to it.ledger- the seller dashboard export at whatever grain it gives you, with its own timestamps untouched.
The minute table is rebuilt from these every time a detector or tagger improves. That is the point of keeping them: an analysis you cannot rebuild from raw is an analysis you cannot correct.
The funnel, and what a ratio is a ratio of
8 min liveEvery metric a seller dashboard reports is a count or a ratio of two counts from the minute table. Once you can rebuild each one from the columns, you also know exactly which denominator it stands on, and that is what protects you from the three ways a live-commerce ratio lies.
LiveRebuilding the dashboard's numbers from columns4 min▶
The seller dashboard reports these per stream. Every one of them is a one-line aggregate of the minute table, which means you can recompute them, compare, and find out where your export and the platform disagree before you build anything on top.
| Dashboard number | From the minute table | Kind |
|---|---|---|
| Views | sum(arrivals) | Count |
| Peak viewers | max(room) | State |
| Average watch time | sum(room) / sum(arrivals) minutes | Ratio of viewer-minutes to people |
| Product impressions | sum(impressions) | Count |
| Product clicks, CTR | sum(clicks), / sum(impressions) | Count, ratio |
| Orders, click-to-order rate (CTOR) | sum(orders), / sum(clicks) | Count, ratio |
| GMV | sum(gmv) | Count, in dollars |
| Watch GPM | 1000 * sum(gmv) / sum(arrivals) | Ratio |
Average watch time is the one people get wrong. It is viewer-minutes divided by viewers, which is the sum of the room column divided by the sum of arrivals. Averaging the room column gives you the average room size, a different number with a different meaning.
LiveThe three grains that lie4 min▶
Three mistakes account for most wrong conclusions in this field, and each one is a ratio computed at the wrong grain.
- The per-minute ratio on a small denominator. A minute with 3 clicks and 2 orders has a 67 percent order rate. It means nothing. Session 5 uses orders per thousand viewer-minutes, whose denominator is the room, and weights ratios by their denominators when averaging them.
- The per-stream comparison that is really a traffic comparison. Stream A made 30,000 dollars and stream B made 12,000. If A had three times the room, B sold better. Comparing streams on GMV is comparing them on how much traffic the platform sent. Session 6 is entirely about this.
- The state summed like a count. Adding up room sizes gives viewer-minutes, which is useful and is not "total viewers". Reporting it as viewers overstates the audience by a factor of the average watch time, which here is about nine.
A brand-side report once claimed 74,000 viewers for a stream whose dashboard showed 8,200 views. Nobody had lied: somebody had summed the concurrent-viewer curve, which had been sampled every minute. Nine minutes of average watch time, nine times the audience. The deck went to a CFO before anyone checked the grain.
Self-studyWhat the platform reports, and what it does not4 min▶
TikTok Shop's LIVE analytics reports the stream-level figures in the table above under its own names (Views, Viewers, Peak Concurrent Viewers, Average Watch Duration, Product Impressions, Product Clicks, CTR, CTOR, GMV, Watch GPM, Items Sold), plus New Followers, Comments, Likes, Shares and a traffic-source split (Feed, Promoted, Follow). Its LIVE Diagnosis page reads the funnel in four stages: tap-through rate into the room, average viewing duration per view, CTR, then CTOR. One stage is missing from the minute table on purpose: tap-through rate needs the feed impressions of the LIVE card, which the platform holds and the recording never sees.
It also offers per-product breakdowns. What it does not give you is the minute-by-minute ledger joined to the content. The room curve is visible but not trivially exportable, orders carry a timestamp in the order export, and nothing in the platform knows what the host was saying. That gap is why the pipeline exists.
Where the platform's definitions and yours differ, yours must be documented and reconciled, not silently preferred. Two common gaps: the platform counts a view on entry while your recording starts a few seconds later, so the first minute is short; and the platform's GPM may be computed on a slightly different view count from the one you see. Neither matters for the analysis. Both matter the first time you put your number next to the platform's on a slide.
Open the minute table and rebuild the funnel
★ 20 min · everyone buildsTwo files, twenty minutes, pandas only. The 7,200-row minute table and the 60-row stream summary that the same generator produced. You rebuild every dashboard number from the minute rows, check them against the summary, and find the one that does not reconcile the way you expected.
Load both files and look at the grain. Twenty-six columns, one row per stream and minute. Check the key is unique before anything else: 60 streams times 120 minutes must be exactly 7,200 rows.
Rebuild the funnel per stream from the minute rows. Counts are sums, the room is a state. Average watch time is viewer-minutes over arrivals, not the mean of the room column.
Reconcile against the summary file. GMV, orders, clicks, impressions and views must match to the unit. Watch time and the ratios match to rounding. If anything is off by more than rounding, the grain is wrong somewhere and you stop here until you know where.
Now do the wrong thing on purpose. Compute the "audience" as the sum of the room column, and the "average order rate" as the mean of the per-minute orders-over-clicks ratio. Put them next to the right numbers. The first is about nine times too big. The second is undefined for every minute with no clicks and wildly noisy for the rest; the weighted version is the one the dashboard reports.
Save the funnel table. It is the leader track's session 1 material and the base for session 5. Write it next to the raw files, never over them.
The ledger has a delay you have not corrected yet. In real recordings the seller's per-minute figures land a few seconds after the host's words reached the viewer, because the stream itself is delayed. Tonight's data is already on one clock. Session 2 shows what happens to every result if it is not.
Before session 2
30 min- Export one real stream's data from a seller dashboard you have access to, or take any two-hour LIVE recording you are allowed to use. List which of the four sources you actually have, at what grain, and with what timestamp format. Bring the list.
- From the funnel table, rank the 60 streams by GMV and by GPM. Count how many streams are in the top ten on both lists. Write one sentence about what the streams in the GMV top ten but not the GPM top ten have in common. Session 2 of the leader track answers it.
- Compute average watch time for human hosts and AI hosts separately, the right way. Then compute the mean of the room column for both and notice which comparison changes.
- Read the columns you have not used yet:
segment,product_in_hand,close_up_ratio,price_overlay,replies. For each, write down which of the four sources it will come from once the pipeline is real.
Three questions
A report sums the concurrent-viewer curve, sampled once a minute, and calls the result "total viewers". The dashboard shows 8,200 views and the report shows 74,000. What happened?
Room size is a state, not an event. Adding it across minutes gives viewer-minutes, which divided by the true view count is the average watch time. Nine minutes, nine times the audience.
Why does GPM, not GMV, belong on the line that judges how well a host sold?
Across the 60 streams GMV tracks peak room at 0.96 and GPM tracks conversion at 0.86. The first number is mostly about what the platform sent; the second is mostly about the pitch.
Product impressions for an average stream are 60,000 while views are 9,049. Is something broken?
A viewer who stays nine minutes is shown the card about nine times. It also means CTR is a per-exposure rate that falls as watch time rises even when the pitch is unchanged, which is why session 5 uses a per-viewer-minute rate instead.