I run a visa agency in Bali. The other half of my week goes into Apify Actors, and several of them read TikTok Shop. The question buyers ask them is almost always the same one: what is selling right now. TikTok Shop answers a different question, and does it in large friendly digits.
Every product page carries one sales figure — "items sold" — and it means units sold since this listing opened. A product that shipped 900,000 units over two years and 40 units last week shows 900,000. A product launched in September that is doing 11,000 a week shows a much smaller number. Sort a catalogue by that field and you have sorted it by seniority.
Here is how far apart the two orderings are on real data.
The run
12 November 2026, 03:16 UTC. TikTok Shop US best-seller ranking, 30 products, full product pages on, creators and reviews off. 74 seconds, 31 rows — 30 products and one free notice row that reports what was charged ($0.0768 for the lot).
Every row came back with both numbers: soldCount (lifetime) and sold7d (last seven days). Ranking the same 30 products by each:
by 7d by life sold7d lifetime 7d as % price product 1 1 25,616 2,281,919 1.12 49.97 Toplux Magnesium Complex 2 11 20,055 553,846 3.62 31.20 Dr.Melaxin Dark Spot Eye Cream 3 6 16,505 743,499 2.22 36.27 Dr.Melaxin Peel Shot Spray 4 2 14,118 1,154,722 1.22 29.90 Dr.Melaxin Calcium Multi Balm 5 17 13,777 365,537 3.77 21.99 PUTARE Speaker Stand 6 15 12,368 412,435 3.00 14.29 CEELIKE Oral Spray 7 26 11,428 224,859 5.08 123.50 Comfrt Dreamer Blanket 8 7 11,371 635,711 1.79 17.37 LeeFar Probiotics Gummies 9 5 11,236 752,391 1.49 15.97 YCZ Midnight Marine Perfume 10 10 10,989 561,158 1.96 57.93 SEESE Pressure Washer Gun Two of the top five appear in both top fives. Six of the top ten in both top tens. The product at number 7 this week is 26th by lifetime units. And going the other way: NOBS Toothpaste Tablets is third by lifetime with 941,226 units sold and 24th by last week with 5,325; NeoCell Collagen Peptides is fourth by lifetime, 17th by the week.
The share column is the whole argument. Across these 30 best sellers, the last seven days account for between 0.57% and 5.08% of lifetime units — a nine-fold spread. There is no constant you can multiply the public counter by to get current pace, which is exactly what a ranking by soldCount quietly assumes.
The same gap shows up in money. Multiply lifetime units by current price for all 30 and you get $590.6M; the last seven days are $10.3M of it. If you are pitching a seller, or sizing a niche, those are not interchangeable figures — one of them includes 2024.
Where the weekly number comes from
Not from the product page — the page has no history. It comes from keeping my own.
A private collector Actor walks the US and UK best-seller ranking, the US category tree three levels deep and a keyword search per category name every day, and writes one point per product per day into a named Apify key-value store: [day, soldCount, price], sharded 256 ways by a hash of the product ID, 45 days kept. The store is readable by anyone who has its ID, so a buyer's run reads the baseline without a token and gets 7- and 30-day figures on their first run, with no waiting period and no analytics vendor in the price.
Sales over a window are then a subtraction, and the subtraction has rules worth spelling out, because this is where made-up numbers come from in other people's tools:
// newest point at or before the start of the window let base = null; for (const p of pts) if (p[0] <= target) base = p; if (!base) for (const p of pts) if (p[0] <= target + 1 && p[0] < nowDay) base = p; if (!base || nowDay - base[0] < days - 1) return null; // not enough history → null const w = { sold: Math.max(0, nowSold - base[1]), days: nowDay - base[0] }; sold7d = Math.min(nowSold, Math.round((w.sold / w.days) * 7)); // scaled, capped at lifetime Three things in there are scars.
return null instead of a guess. If a product has no point old enough, the field is empty. That is unhelpful and honest, and it is common: I pulled one of the 256 shards (US-00) while writing this — 3,364 products, 12,917 daily points, median two snapshots per product, and only 1,647 of 3,364 (49%) span seven days or more. The 30 best sellers above all had full history because the ranking is exactly what gets visited daily. A long-tail product from a store link may well come back with sold7d: null.
The scaling. Collector runs get missed, so points have gaps: of the ~9,500 intervals in that shard, 4,009 are one day and the rest are longer. One product in my run, a lash kit, had 9 snapshots instead of 30, with a 10-day hole from 1 to 11 November. Its window base is therefore 1 November at 99,879 units, its live counter read 107,402, and 7,523 units over 11 days is 684 a day. Its sold7d is 4,787, which is 684 × 7. The row tells you it is interpolated: salesHistory is right there with its dates, and salesHistoryDays says how many snapshots exist.
The cap. Math.min(nowSold, …) and the "point at or before the target" preference both date from 16 October 2026, when a product listed a week earlier reported 278 units in seven days against 264 lifetime. A window base one day late was being stretched to a full seven days. Scaling up a six-day window is fine; scaling it past the product's entire existence is a bug a buyer will screenshot.
What the pace is actually good for
Two reads, not one. Compare the 7-day run rate against the 30-day one and you get acceleration for free:
sold7d × 30/7 ÷ sold30d 1.04 Toplux Magnesium (flat) 1.09 CEELIKE Oral Spray 1.25 Dr.Melaxin Eye Cream 1.42 PUTARE Speaker Stand 1.46 Comfrt Dreamer Blanket 1.54 LeeFar Probiotics Gummies (last week was 54% above its month) The lifetime leader is flat; three products near the bottom of the lifetime ranking are selling half again faster this week than their monthly average. 29 of the 30 rows carried a Black Friday label, which is the obvious reason — and the only way to see it is two windows on the same product.
There is a third number for people who schedule the Actor against their own list. With sales tracking on, each run stores units sold per product in the buyer's own Apify account and reports the delta next time. On the Toplux magnesium product my run reported soldSinceLastCheck: 4,067 and dailySalesEstimate: 3,145. The ratio is 1.29, and my previous run of that input was 31 hours earlier: 31/24 = 1.29. The estimate is normalised by elapsed time, not by assuming you ran yesterday.
Running it
Input for the list above — best sellers, sorted by last week, full product pages:
{ "bestSellers": true, "country": "US", "maxProductsPerSource": 30, "sortBy": "sold7d", "productDetails": true, "trackSales": true } The same thing in one call, with the fields that matter pulled out:
curl -s -X POST \ "https://api.apify.com/v2/acts/lergassy~tiktok-shop-sales-tracker/run-sync-get-dataset-items?token=APIFY_TOKEN" \ -H 'content-type: application/json' \ -d '{"bestSellers":true,"country":"US","maxProductsPerSource":30,"sortBy":"sold7d","productDetails":true}' \ | jq -r '.[] | select(.type=="product") | [.position, .sold7d, .sold30d, .soldCount, .price, .title[0:40]] | @tsv' Swap bestSellers for searchQueries: ["air fryer"], or paste store, category or product links into startUrls. The Actor is TikTok Shop Sales Tracker: $3.20 per 1,000 products on the free Apify plan, product page included, no start fee, no login, no proxy setup, and no paid data vendor behind the 7- and 30-day numbers — which is why it is the cheapest of my TikTok Shop Actors rather than the most expensive.
When it is the wrong tool. If you need the seller's revenue split between livestreams, short videos and the shop window, or the affiliate commission rate, those are vendor estimates and they are not in here. If you need a product TikTok's own ranking and category tree never show — deep long tail, or a market outside the US and UK — expect sold7d: null and plan on scheduling the same input daily so the account-local delta fills in instead. And if all you want is today's price and stock, the history is dead weight: turn sales tracking off and read the page.
One last thing, and it generalises past TikTok. Any marketplace that prints a single cumulative counter — units sold, downloads, views, reviews — is reporting a career, not a quarter. The derivative is not in the page. Somebody has to write down yesterday's value, and if no one did, nobody has it.

