# TikTok Shop Sales Tracker (`lergassy/tiktok-shop-sales-tracker`) Actor

Track TikTok Shop sales: units sold and revenue for the last 7 and 30 days, a day-by-day sales history and lifetime units sold for best sellers, keywords, categories, stores or product links. Sorted by 7-day sales. No login.

- **URL**: https://apify.com/lergassy/tiktok-shop-sales-tracker.md
- **Developed by:** [Matvey](https://apify.com/lergassy) (community)
- **Categories:** E-commerce, Social media, AI
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.92 / 1,000 products

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

**TikTok Shop Sales Tracker** shows how fast TikTok Shop products are selling right now: **units sold and revenue for the last 7 and 30 days**, a **day-by-day sales history**, and lifetime units sold, for the **best-seller ranking, keyword searches, categories, stores or single product links**. Results come **sorted by 7-day sales**, so the products that are taking off right now are on top.

The 7- and 30-day figures come from our own daily sales history of TikTok Shop, so most products have them **in your first run**, with no waiting and no analytics subscription. **$3.20 per 1,000 products** ($0.0032 per row, down to $0.00192 on higher Apify plans), no start fee, no login, no proxy setup.

This is the sales-first entry point of [TikTok Shop Scraper](https://apify.com/lergassy/tiktok-shop-scraper): the same engine, with the input set up for tracking sales. Need creators, full reviews or every product detail? They are all here too, see **Input**.

### Tested head-to-head — 16 October 2026

Same request for every Actor: keyword "air fryer", TikTok Shop US, 20 products, the five most-used TikTok Shop scrapers in the Store plus a dedicated sales scraper.

| | This Actor | Other TikTok Shop scrapers |
|---|---|---|
| Products returned of 20 asked | **20** | 5 to 20 (four of six stopped at 5 or 10) |
| Units sold in the last 7 days | **20 of 20 products** | only one, through a paid analytics API, at $15 per 1,000 |
| Day-by-day sales history | **yes** | no |
| Price per 1,000 products (free plan) | **$3.20**, product page included | $2 to $15; the full product page costs $3 to $5 more where offered |
| Stock per variant, shipping, shop stats | **yes** | stock per variant in one of six |

Our 7-day figure for the top air fryer was 462 units; the analytics-based scraper reported 447 for the same product.

### What does it track?

| Field | What it means |
|---|---|
| `sold7d`, `sold30d` | Units sold in the last 7 and 30 days |
| `revenue7d`, `revenue30d` | Those units × the current price |
| `salesHistory` | Units sold since listing, one point per day, up to 30 days |
| `trackedSince`, `soldSinceTracked` | When our history first saw the product, and units sold since then |
| `soldCount`, `estimatedRevenue` | Units sold since listing and lifetime revenue estimate |
| `soldSinceLastCheck`, `dailySalesEstimate` | Units sold since your previous run of the same input (with **📈 Track sales between runs** on) |
| `price`, `discountPercent`, `rating`, `reviewCount`, `shopName`, `categories` | The product itself |

### Where do the 7- and 30-day numbers come from?

Every day our own collector records units sold for the US best-seller ranking, the TikTok Shop US category tree (three levels deep, about 2,000 categories), a keyword search for every category name, and the UK top categories, about 110,000 products a day. Any product in that history gets `sold7d`, `sold30d`, `revenue7d`, `revenue30d` and `salesHistory` in your first run, at no extra cost.

**The history started on 7 October 2026: 7-day figures fill from 14 October 2026, 30-day figures from 6 November 2026.** Until a product has enough days, those fields are `null` and the list is ordered by units sold since listing. Products our collector has not seen yet also show `null`; for them, schedule the same input once a day and `soldSinceLastCheck` / `dailySalesEstimate` fill from your second run.

### How to track TikTok Shop sales

1. Keep **🏆 Best sellers** ticked, or type keywords into **🔍 Search keywords**, or paste category, store or product links into **🔗 Start URLs**.
2. Leave **↕️ Sort products by** on *Units sold, last 7 days* (or pick 30 days, revenue, lifetime units sold).
3. Set **💯 Max products per source** and press **Start**. Download JSON, CSV or Excel, or call it from the API, n8n, Make, Zapier or an AI agent.
4. For a daily report, add a schedule in Apify: every run shows the fresh 7-day numbers.

### How much does it cost?

Pay per event, no start fee:

| Event | Free plan | Bronze | Silver | Gold and up |
|---|---|---|---|---|
| Product row | $0.0032 | $0.00256 | $0.00224 | $0.00192 |
| Creator row (only with creators on) | $0.0032 | $0.00256 | $0.00224 | $0.00192 |
| Review row (only with full reviews on) | $0.0015 | $0.00135 | $0.0012 | $0.00105 |

- **1,000 products with full product-page details and 7/30-day sales: $3.20** on the free plan. On $1 you get 312 products.
- **1,000 reviews: $1.50** on the free plan, $1.05 on Gold and above. A product with 3,000 reviews costs $0.0032 + $4.50.
- Product-page details, sales tracking, creator profile stats: **included**, no add-on fee.
- Products removed by filters, duplicates across inputs, notices and errors: **$0**.
- Set **Max cost per run** in the run options and the run stops by itself at that amount, with every delivered row paid for.
- **Free Apify plan:** US and UK shops work as usual; Thailand, Malaysia, Singapore, the Philippines and Vietnam open only through a paid unblocking service and need a paid Apify plan.

### ⬇️ Input

[![TikTok Shop Sales Tracker input form on Apify: keywords, country, products per source, sorting, creators and full reviews](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/tiktok-shop-scraper/tiktok-shop-scraper-input-form.png)](https://console.apify.com/sign-up)

```json
{
  "searchQueries": ["lip gloss"],
  "startUrls": [
    { "url": "https://shop.tiktok.com/us/store/deejey-hair-accessories/8646927657038942592" },
    { "url": "https://shop.tiktok.com/gb/c/beauty-personal-care/601450" }
  ],
  "bestSellers": true,
  "maxProductsPerSource": 100,
  "productDetails": true,
  "includeCreators": true,
  "maxCreatorsPerProduct": 5,
  "maxReviewsPerProduct": 500,
  "reviewsSort": "newest",
  "minSoldCount": 100
}
```

Accepted links: product (`/pdp/…`), store (`/store/…`), category (`/c/…`), search (`/s?q=…`), best sellers (`/events/ranking-list`) and keyword pages (`/k/…`), on `shop.tiktok.com/<country>/…` or `www.tiktok.com/shop/…`.

**Markets.** The **US** shop is fully supported: search, best sellers, categories, stores and products. The **UK, Thailand, Malaysia, Singapore, the Philippines and Vietnam** work through category, store and product links, with prices in the local currency. TikTok publishes keyword search and the best-seller ranking for the US only, so a search in another market becomes a free notice row that explains this. Creator rows and full reviews are available for the US and UK (TikTok's Southeast Asian web shops show no creator videos). Other countries have no public web shop yet and redirect to the TikTok app.

**Search depth.** If a keyword runs out before your limit, the run widens to TikTok's own related searches and then to the related category. `foundVia` shows how each product was reached.

### ⬆️ Output

[![TikTok Shop products dataset preview: title, price, units sold, estimated revenue, rating, reviews, stock, shop](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/tiktok-shop-scraper/tiktok-shop-scraper-output-products.png)](https://console.apify.com/sign-up)

[![TikTok Shop reviews dataset preview: stars, review text, date, verified purchase, variant, photos, country](https://raw.githubusercontent.com/lergassy/apify-actor-assets/main/tiktok-shop-scraper/tiktok-shop-scraper-output-reviews.png)](https://console.apify.com/sign-up)

A product row (from a real run on 16 October 2026, long lists shortened):

```json
{
  "type": "product",
  "productId": "1732278276252013282",
  "title": "Sweetcrispy 6.34QT Stainless Steel Air Fryer - Chicken Fryer for Busy Homes, 8 Food Presets…",
  "url": "https://shop.tiktok.com/us/pdp/sweetcrispy-6-34qt-air-fryer-with-window-8-presets-400-f/1732278276252013282",
  "country": "US",
  "currency": "USD",
  "price": 76.67,
  "originalPrice": 116.99,
  "discountPercent": 34,
  "soldCount": 13588,
  "estimatedRevenue": 1041792,
  "sold7d": 434,
  "revenue7d": 33275,
  "sold30d": null,
  "revenue30d": null,
  "trackedSince": "2026-10-07",
  "soldSinceTracked": 496,
  "salesHistory": [
    { "date": "2026-10-07", "soldCount": 13092 },
    { "date": "2026-10-09", "soldCount": 13192 },
    { "date": "2026-10-12", "soldCount": 13401 },
    { "date": "2026-10-14", "soldCount": 13514 }
  ],
  "rating": 4.6,
  "reviewCount": 2403,
  "shopName": "Sweetcrispy Official",
  "categories": ["Household Appliances", "Kitchen Appliances", "Fryers"],
  "totalStock": 410,
  "previousSoldCount": null,
  "soldSinceLastCheck": null,
  "dailySalesEstimate": null,
  "source": "search",
  "sourceInput": "air fryer",
  "foundVia": "search",
  "position": 1
}
```

`sold30d` stays `null` until a product has 30 days of history (from 6 November 2026). `soldSinceLastCheck` fills from your second run of the same product.

A creator row:

```json
{
  "type": "creator",
  "username": "user2974478526650",
  "profileUrl": "https://www.tiktok.com/@user2974478526650",
  "nickname": "Wink Global",
  "followers": 893,
  "likes": 4448,
  "videos": 1241,
  "earnsCommission": false,
  "promotedProductCount": 1,
  "promoVideoCount": 9,
  "promoViews": 4327,
  "promoLikes": 26,
  "promoEngagementRate": 0.6,
  "promoVideos": [{ "videoId": "7597010976390581518", "views": 855, "likes": 5, "durationSec": 18, "uploadedAt": "2026-01-19T10:04:18.000Z", "url": "https://www.tiktok.com/@user2974478526650/video/7597010976390581518" }]
}
```

### Integrations

Run it from the Apify API (`POST /v2/acts/lergassy~tiktok-shop-sales-tracker/run-sync-get-dataset-items`), the Python and JavaScript clients, n8n, Make, Zapier, Google Sheets, or as a tool for AI agents through the Apify MCP server. Schedules and webhooks are available in the console.

### Troubleshooting

- **A notice row "Keyword search is published on TikTok Shop US only"**: use category, store or product links for the UK.
- **Fewer products than the limit**: the store or category has fewer products, or your filters removed the rest. Removed products are counted in the run's `STATS` record and are not billed.
- **Creator fields like `followers` are empty**: turn on **👤 Creator profile stats** (on by default).
- **No review rows**: full reviews are for TikTok Shop US and UK products, and a product with no reviews (or none matching the chosen star filter) gives none. The product row's `ratingBreakdown` shows how many reviews each star rating has.
- **`soldSinceLastCheck` is empty**: the product is seen for the first time in your account. It fills from the next run.

### ❓ FAQ

#### Is it legal to scrape TikTok Shop?

The Actor reads only public product, shop and video pages that anyone can open without logging in, and it does not collect private data. Creator rows contain only what creators publish on their public profiles. Check that your use complies with TikTok's terms and with data-protection law in your country (GDPR, CCPA), especially before contacting creators.

#### Does it need a TikTok account or cookies?

No. Nothing to log in to, no API key, no cookies — reviews included.

#### How accurate is "units sold"?

It is the number TikTok Shop shows on the product page ("items sold globally since this item was listed"). `estimatedRevenue` multiplies it by the current price, so it is an estimate: past prices and discounts were different.

#### How do I get daily sales like analytics tools show?

Products in our shared daily history come with `sold7d`, `sold30d` and `salesHistory` in your first run. For anything else, keep **📈 Track sales between runs** on and schedule the same input once a day: the Actor remembers each product's units sold in your own Apify account (key-value store `tiktok-shop-sales-history`, or `tiktok-shop-sales-tracker-history` if TikTok Shop Scraper already made the first one) and reports the difference.

#### Which countries are supported?

The US fully; the UK, Thailand, Malaysia, Singapore, the Philippines and Vietnam through category, store and product links. See *Markets* above.

### Your feedback

Something missing or wrong? Open an issue on the Issues tab: we read every one.

### You might also like

- [TikTok Shop Scraper](https://apify.com/lergassy/tiktok-shop-scraper): the full product scraper with creators and reviews
- [TikTok Shop Top Products Scraper](https://apify.com/lergassy/tiktok-shop-top-products-scraper)
- [TikTok Shop Reviews Scraper](https://apify.com/lergassy/tiktok-shop-reviews-scraper)

# Actor input Schema

## `searchQueries` (type: `array`):

Give this, <b>Start URLs</b> or <b>Best sellers</b>. Product keywords as a shopper would type them — <b>air fryer</b>, <b>phone case</b>, <b>protein powder</b>. Each keyword is one source; up to <b>Max products per source</b> rows each. Keyword search works on TikTok Shop US. When a keyword runs out before the limit, the run widens to TikTok's related searches and category (see foundVia).

## `startUrls` (type: `array`):

Give this, <b>Search keywords</b> or <b>Best sellers</b>. TikTok Shop links: product (<code>/pdp/…</code>), store (<code>/store/…</code>), category (<code>/c/…</code>), search (<code>/s?q=…</code>) or best sellers (<code>/events/ranking-list</code>). Both <code>shop.tiktok.com/us/…</code> and <code>www.tiktok.com/shop/…</code> work. The country is taken from the link: US, UK, Thailand, Malaysia, Singapore, Philippines and Vietnam shops are supported.

## `bestSellers` (type: `boolean`):

Add TikTok Shop's own best-seller ranking ("Trending Now: Top Best Sellers") for the chosen country — the most sold products right now, up to Max products per source. Ticked in the form by default: untick it when you only want your own keywords or links.

## `country` (type: `string`):

TikTok Shop market for keywords and best sellers. Keyword search and best sellers exist on the US shop; for the UK and Southeast Asia (Thailand, Malaysia, Singapore, Philippines, Vietnam) use category, store or product URLs. Links carry their own country.

## `maxProductsPerSource` (type: `integer`):

Upper limit of product rows from each keyword, category, store or ranking. Products dropped by filters and duplicates are not charged.

## `sortBy` (type: `string`):

Any order other than TikTok's reads deeper into the list (up to 5× your limit) and returns the top products by this measure. Last 7 / 30 days come from our daily sales history; products we have not tracked yet go last.

## `productDetails` (type: `boolean`):

Open every product page: variants with stock, total stock, min/max price, rating breakdown 1–5, description, specifications, all images, shipping fee and delivery days, category path, latest reviews and shop stats (shop units sold, followers, rating). Included in the product price.

## `includeCreators` (type: `boolean`):

Adds one creator row per TikTok creator whose videos sell the products: username, promo videos with views and likes, "earns commission" flag, promoted products. Product rows get creatorCount and creatorVideoViews. Each creator row is charged as a creator.

## `creatorProfiles` (type: `boolean`):

With creators on: add followers, total likes, video count, bio, bio link, e-mail in bio and verified flag from each creator's TikTok profile. No extra charge.

## `maxCreatorsPerProduct` (type: `integer`):

How many creators to take from each product's video block (TikTok shows up to ~20 videos per product).

## `maxReviewsPerProduct` (type: `integer`):

0 = off. Adds one row per buyer review of each product: star rating, text, date, photos, variant bought, verified-purchase flag and reviewer. Up to 25,000 per product (TikTok shows about 5,000 per order and filter; above that the run walks every star rating, both orders, photo and verified filters and drops duplicates). TikTok Shop US and UK products. Each review row is charged as a review.

## `reviewsSort` (type: `string`):

Newest first is the one to schedule for tracking new reviews.

## `reviewsFilter` (type: `string`):

Pick one star rating to read complaints (1–2 stars) or praise (5 stars) in depth.

## `trackSales` (type: `boolean`):

Also remembers each product's units sold in your own account (key-value store <code>tiktok-shop-sales-history</code>) and adds soldSinceLastCheck and dailySalesEstimate from your second run on. Daily sales for the last 7 / 30 days (sold7d, sold30d) come from our shared history and do not need this.

## `minSoldCount` (type: `integer`):

Skip products with fewer units sold. Skipped products are free.

## `minPrice` (type: `integer`):

Skip products cheaper than this, in the market's currency (USD, GBP, THB, MYR, SGD, PHP, VND). 0 = no floor.

## `maxPrice` (type: `integer`):

Skip products more expensive than this, in the market's currency. 0 = no ceiling.

## `minRating` (type: `integer`):

Skip products rated below this (1–5). 0 = keep all, including products without reviews.

## `concurrency` (type: `integer`):

How many product pages to open at the same time.

## Actor input object example

```json
{
  "bestSellers": true,
  "country": "US",
  "maxProductsPerSource": 30,
  "sortBy": "sold7d",
  "productDetails": true,
  "includeCreators": false,
  "creatorProfiles": true,
  "maxCreatorsPerProduct": 10,
  "maxReviewsPerProduct": 0,
  "reviewsSort": "newest",
  "reviewsFilter": "all",
  "trackSales": true,
  "minSoldCount": 0,
  "minPrice": 0,
  "maxPrice": 0,
  "minRating": 0,
  "concurrency": 5
}
```

# Actor output Schema

## `products` (type: `string`):

One row per TikTok Shop product: price, discount, units sold, estimated revenue, rating, variants with stock, shipping, shop stats and sales since the previous run.

## `creators` (type: `string`):

One row per creator promoting the products: followers, promo videos with views and likes, commission flag and promoted products. Present when creators are on.

## `reviews` (type: `string`):

One row per buyer review: stars, text, date, photos, variant, verified purchase. Present when full reviews are on.

## `allRows` (type: `string`):

Every row of the run, products, creators, reviews and notices, in one list; the type field tells them apart.

## `runStats` (type: `string`):

JSON counters for the run: rows delivered, filtered out, duplicates, errors and request statistics.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "bestSellers": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("lergassy/tiktok-shop-sales-tracker").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "bestSellers": True }

# Run the Actor and wait for it to finish
run = client.actor("lergassy/tiktok-shop-sales-tracker").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "bestSellers": true
}' |
apify call lergassy/tiktok-shop-sales-tracker --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,lergassy/tiktok-shop-sales-tracker"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/koTXIscbJ7zPkJdOT/builds/pfBpgQ89196AbD0T3/openapi.json
