How to Spot Fake Reviews on TikTok Shop Before You Trust a Product
A product with 4.9 stars and 3,000 reviews looks like a safe bet. Then it shows up, it's junk, and you scroll back to find that half the "reviews" are one-line raves posted in the same three-day window. If you're sourcing products to resell, vetting a supplier, or just trying not to waste $40, the star average alone will lie to you. The pattern underneath it won't.
TikTok Shop actually exposes enough review detail to check that pattern. You can pull the reviews for any product, look at how they're distributed, whether they came from real purchases, and when they landed, and get a much better read than the headline rating gives you.
Why the star average is the least useful number
Here's the thing sellers game first: the average. A 4.8 is easy to manufacture with a burst of five-star filler, especially early in a product's life before real buyers pile in. What's harder to fake convincingly is the shape of the reviews:
- A healthy product has a spread, mostly 4s and 5s, a visible tail of 2s and 3s, the occasional 1.
- A gamed product often has a weird spike of 5s with almost nothing in the middle, or a cluster of near-identical short raves.
- Real reviews arrive steadily over time. Purchased ones tend to arrive in bursts.
None of those signals is proof on its own. Stacked together, they're a decent lie detector. And you can read all of them from public review data.
Pulling the reviews
We'll use SociaVault for the TikTok Shop review endpoint. New accounts get 50 free credits, and each page of reviews is one credit (a page returns up to 100 reviews).
const API_KEY = process.env.SOCIAVAULT_API_KEY;
const BASE = "https://api.sociavault.com/v1";
async function getReviews(productUrl, page = 1) {
const params = new URLSearchParams({ url: productUrl, page: String(page) });
const res = await fetch(
`${BASE}/scrape/tiktok-shop/product-reviews?${params.toString()}`,
{ headers: { "x-api-key": API_KEY } },
);
const json = await res.json();
if (!json.success) throw new Error(json.error);
return json.data;
}
You can pass a product_id instead of the full url if you have it. Each review comes back with real detail, here's a single item trimmed to the fields that matter:
{
"review": {
"rating": 5,
"display_text": "Great product. Good shipping. Exactly as described. Holds charge a long time.",
"review_timestamp_fmt": "June 15, 2025",
"review_timestamp": "1750007337100"
},
"sku_specification": "Item: Blue",
"review_user": { "name": "thedustinppeterson" },
"is_anonymous": false,
"review_source_name": "Purchased on TikTok"
}
Four fields do most of the work: the numeric rating, the display_text, the timestamp, and review_source_name, which tells you whether the review came from an actual TikTok purchase. That last one is the closest thing to a verified-purchase badge.
Signal 1: the verified-purchase ratio
A review marked "Purchased on TikTok" came from someone who actually bought the item on the platform. If a product has thousands of reviews but a low share of purchase-sourced ones, that's a flag.
function verifiedRatio(reviewItems) {
const total = reviewItems.length;
const verified = reviewItems.filter(
(r) => (r.review_source_name ?? "").toLowerCase().includes("purchased"),
).length;
return { total, verified, ratio: total ? verified / total : 0 };
}
Read the field defensively, if it's missing, count it as unverified rather than assuming the best. A product where the vast majority of reviews are purchase-sourced is a good sign. A wall of reviews with no purchase trail is worth a closer look.
Signal 2: the rating distribution
Pull the shape, not the average:
function distribution(reviewItems) {
const buckets = { 1: 0, 2: 0, 3: 0, 4: 0, 5: 0 };
for (const item of reviewItems) {
const r = item.review?.rating;
if (r >= 1 && r <= 5) buckets[r] += 1;
}
return buckets;
}
Now eyeball it. A product with 92% five-star and basically nothing else, especially a newer one, is suspicious. Real products collect a messy middle. The TikTok Shop product data also hands you an official review_count and product_rating at the product level, so you can sanity-check the sample you pulled against the totals.
Signal 3: timing clusters
Genuine reviews trickle in. Bought ones tend to land in a batch. Bucket the timestamps by day and look for spikes:
function byDay(reviewItems) {
const days = {};
for (const item of reviewItems) {
const ts = Number(item.review?.review_timestamp);
if (!ts) continue;
const day = new Date(ts).toISOString().slice(0, 10);
days[day] = (days[day] ?? 0) + 1;
}
return days; // look for days with an unnatural pile-up
}
If a product that averages three reviews a week suddenly has a day with 200, and they're all five-star one-liners, you've found the burst. On its own a spike could just be a viral moment. A spike of identical-sounding five-star reviews is the tell.
Signal 4: near-duplicate text
Fake reviews are often churned from a small set of templates. You don't need fancy NLP, just normalize and count repeats:
function duplicateText(reviewItems) {
const seen = new Map();
for (const item of reviewItems) {
const t = (item.review?.display_text ?? "")
.toLowerCase()
.replace(/[^a-z0-9 ]/g, "")
.trim();
if (t.length < 8) continue;
seen.set(t, (seen.get(t) ?? 0) + 1);
}
return [...seen.entries()].filter(([, n]) => n > 1).sort((a, b) => b[1] - a[1]);
}
A handful of exact-match "great product love it" entries is normal noise. Dozens of identical multi-word reviews is a manufactured set.
Putting it together
No single signal convicts a product. Score them together: low verified-purchase ratio, plus a lopsided distribution, plus a timing burst, plus duplicate text, is a product to walk away from, or at least to test with a tiny order before you commit inventory. One flag on its own usually just means "look closer," not "fake."
If you're doing this for sourcing at scale, this pairs naturally with the broader workflow in analyzing TikTok Shop sellers and finding reliable suppliers and finding affiliate products that actually sell.
What this can't do
- It's pattern detection, not certainty. These signals catch the obvious and clumsy fakes. A sophisticated operation that drips fake reviews slowly, with varied text and real-looking accounts, is much harder to catch, and no public method reliably nails it.
- A burst isn't always fake. A product can genuinely go viral and collect a legitimate spike. Read the burst's content, not just its size.
- You get a sample. You're reading the reviews the endpoint returns, page by page. For a product with tens of thousands, you're analyzing a slice, deep enough to judge, not the entire corpus.
- Missing fields happen. Handle absent timestamps or source labels gracefully instead of assuming. Log one raw response to confirm the shape for your product.
Treat this as a fast triage that flags the products worth doubting. The final call still deserves a small test order.
Who needs this
- Resellers and dropshippers vetting a product before committing to inventory.
- Brands monitoring their own listings for review manipulation (theirs or a competitor's).
- Sourcing teams comparing three similar products and wanting the one with the most honest review base, not just the highest average.
Frequently Asked Questions
Can you tell if TikTok Shop reviews are fake?
Not with certainty, but you can spot the common patterns: a low share of verified-purchase reviews, a lopsided rating distribution, clusters of reviews posted in a tight window, and near-duplicate text. Stacked together, those flag manipulated review sets fairly reliably.
What's the "Purchased on TikTok" label?
It's a review_source_name value on each review indicating it came from an actual purchase on the platform, the closest thing to a verified-purchase signal. A product where most reviews carry it is more trustworthy than one where few do.
Is a 5-star average a red flag by itself?
Not by itself, but a near-perfect average with almost no ratings in the 2 to 4 range is worth a second look, especially on a newer product. Genuine products accumulate a spread of ratings over time.
How many reviews can I pull per product?
The endpoint returns up to 100 reviews per page and costs one credit per page. Paginate to analyze more. For very popular products you'll be reading a representative sample rather than every review.
Can I check my own product's reviews for manipulation?
Yes. The same signals work on your own listings, useful for catching a competitor sabotaging you with fake negatives, or spotting if a fulfillment partner is padding positives.
Is reading review data allowed?
The reviews are public, anyone can see them on the product page. This reads that same public content. As always, use it for product research and fraud detection, not for harassing reviewers or scraping personal data.
Wrapping up
The star rating is the number sellers optimize first, which makes it the number you should trust least. The review pattern underneath, how many came from real purchases, how the ratings spread, when they landed, and whether the text repeats, is far harder to fake and easy enough to read with a bit of code. Run those four checks before you trust a product, and you'll dodge a lot of bad inventory.
Want to run these checks on real listings? Start free with SociaVault, 50 credits, no card, and pull your first product's reviews in a couple of minutes.
Related Articles
Found this helpful?
Share it with others who might benefit
Ready to Try SociaVault?
Start extracting social media data with our powerful API. No credit card required.