I built both actors used here; they're paid tools on Apify (DHgate $0.15, Alibaba $1.50 per 1,000 products) with a free trial credit.
"Should I buy this on DHgate or Alibaba?" usually gets answered with vibes: DHgate is for small orders, Alibaba is for bulk. That's roughly right, but it doesn't tell you where the line is for your product. The line is a number, and you can compute it.
This post runs the same four keywords through DHgate Scraper and Alibaba Scraper, normalises the units, and compares three things per keyword: unit price at one piece, unit price at volume, and the cash a first order needs. Alibaba data: 75 listings per keyword from a run on 24 Sep 2026. DHgate data: 40 listings per keyword from a run on 27 Oct 2026. Different dates, so treat small gaps as noise and big gaps as signal.
The result
Only listings sold per piece/pair/set/unit are counted, so a $2 "per meter" LED strip isn't compared with a $14 "per piece" one. Medians in USD, exactly as the script below prints them:
| Keyword | DHgate price at 1 piece | DHgate best tier | Alibaba price at MOQ | Alibaba price at 1,000 | DHgate median MOQ | Alibaba median MOQ | First order, DHgate | First order, Alibaba |
|---|---|---|---|---|---|---|---|---|
| yoga mat | $38.26 | $18.71 | $11.26 | $9.72 | 1 | 50 | $38.26 | $377.00 |
| bluetooth earbuds | $17.07 | $11.41 | $7.16 | $6.30 | 1 | 10 | $23.95 | $87.40 |
| led strip lights (per piece) | $14.43 | $9.05 | $2.30 | $2.20 | 1 | 20 | $14.43 | $138.75 |
Reading it:
- Per unit, Alibaba is cheaper: 1.6-4x below DHgate's best quantity tier and 2.4-6x below its one-piece price, before shipping.
- Per first order, DHgate is 3.5-10x cheaper, because most listings have an MOQ of one (all 40 yoga mats, 33 of 40 earbuds, 25 of 40 LED strips).
- The crossover is simple arithmetic: for yoga mats, 10 units on DHgate at $38.26 ≈ $383, about the same cash as the median Alibaba first order of 50 units ($377). If you need more than about 10 mats, Alibaba wins; for a 1-3 unit quality test, DHgate wins. For earbuds the crossover is about 5 units ($87.40 / $17.07).
Shipping changes this at the margin: about half the DHgate listings ship free (19 of 40 yoga mats, 20 of 40 earbuds), while Alibaba search prices never include shipping.
The keyword trap
The fourth keyword, "custom tote bags", came out as a median lowest price of $0.45 per bag on Alibaba vs $46.64 on DHgate. That's not a price gap, it's a different product: Alibaba returns blank printable promo totes at MOQ 100, DHgate returns finished fashion tote handbags at MOQ 1. Always look at the titles before trusting a comparison; matching on keyword alone compares whatever each marketplace ranks for that word.
A second trap: DHgate's best sellers for "bluetooth earbuds" (259 and 258 sold) were lookalikes of a big brand's earbuds. Cheap, popular, and a trademark problem if you resell them. Alibaba's cheapest verified earbud listings at MOQ 2-5 were the suppliers' own brands at $3-5.
The script
pip install apify-client
from apify_client import ApifyClient
from statistics import median
import re
client = ApifyClient("<YOUR_APIFY_TOKEN>")
KEYWORDS = ["yoga mat", "bluetooth earbuds", "led strip lights"]
PER_PIECE = re.compile(r"piece|pcs|pair|set|unit", re.I)
def run(actor, run_input):
r = client.actor(actor).call(run_input=run_input)
return list(client.dataset(r["defaultDatasetId"]).iterate_items())
dh = run("rel8ble/dhgate-scraper", {"searchTerms": KEYWORDS, "maxResultsPerSearch": 60})
ali = run("rel8ble/alibaba-product-search-scraper",
{"searchTerms": KEYWORDS, "maxResultsPerSearch": 100, "includeAds": False})
def ali_price_at(p, qty):
"""Unit price at a quantity from Alibaba's price ladder."""
tiers = [t for t in (p.get("priceTiers") or []) if t["minQuantity"] <= qty]
return tiers[-1]["price"] if tiers else None
def m(values):
values = [v for v in values if v]
return round(median(values), 2) if values else None
print(f"{'keyword':<20}{'DH 1pc':>8}{'DH best':>9}{'ALI moq':>9}{'ALI 1k':>8}{'DH 1st':>8}{'ALI 1st':>9}{'crossover':>11}")
for kw in KEYWORDS:
d = [p for p in dh if p["searchTerm"] == kw and PER_PIECE.search(p.get("moqUnit") or "")]
a = [p for p in ali if p["searchTerm"] == kw and PER_PIECE.search(p.get("moqUnit") or "")]
dh_1pc = m(p["priceMax"] for p in d)
dh_best = m(p["priceMin"] for p in d)
ali_moq = m(ali_price_at(p, p["moq"] or 1) for p in a)
ali_1k = m(ali_price_at(p, 1000) for p in a)
dh_first = m((p["moq"] or 1) * p["priceMax"] for p in d if p["priceMax"])
ali_first = m((p["moq"] or 1) * (ali_price_at(p, p["moq"] or 1) or 0) for p in a)
cross = round(ali_first / dh_1pc) if ali_first and dh_1pc else None
print(f"{kw:<20}{dh_1pc:>8}{dh_best:>9}{ali_moq:>9}{ali_1k:>8}{dh_first:>8}{ali_first:>9}{cross:>11}")
crossover is the order size (in units) where buying on DHgate at the one-piece price costs as much as the median Alibaba first order. Below it, test on DHgate; above it, source on Alibaba.
The run above (180 DHgate + 300 Alibaba products) costs about $0.48 in actor fees. Both actors work over plain HTTP, so it finishes in well under a minute.
Going further
-
Filter before comparing. On Alibaba,
verifiedSuppliersOnly: trueandmaxMoqrun on Alibaba's side; on DHgate,minRating,minSoldandfreeShippingOnlydo the same. Comparing "verified Alibaba factories" with "DHgate sellers with 50+ sales and free shipping" is fairer than comparing everything. - Track it. Schedule both actors weekly and store the medians; a widening gap is often a promotion on one side.
- Add a third market. Global Sources and AliExpress have the same shape of output, so the same script extends to four marketplaces.
- No code? Both actors run from a form on their Store page and export CSV or Excel; Make, n8n and Zapier have Apify modules that run an actor and return its dataset.
Store pages:
Need a custom scraper or a ready dataset? Hire me on Fiverr: https://www.fiverr.com/rel8ble
This article was drafted with AI and published by me.
Top comments (0)