How to analyze Etsy competitors: 5 shops, 4 datasets, no sales estimates
Search visibility alone makes these five mushroom-lamp shops look similar. Their catalogs, merchandising, and recent reviews show where they actually differ: catalog depth ranges from 35 to 67 listings, video coverage from 50% to 100%, and seller responses from 0% to 79% of sampled reviews—all without converting public signals into invented sales numbers.
// methodology
run 2026-07-22- captured rows
- 2,029
- unique listings
- 1,090
- unique shops
- 561
- run / charge
- 1m 12s / $8.03
analysis unit
- Start with the July 18 US search run for mushroom lamp: 1,275 rows, deduplicated to 1,090 listing IDs. Select the five shops with the most unique listings.
- Collect each selected shop's complete catalog sorted newest-first. All five catalogs exhausted below the 100-listing per-shop cap, producing 240 rows.
- For each shop, select its ten unique search listings with the smallest captured rank, then enrich those 50 listing IDs with product-level fields. All 50 resolved as active.
- Collect up to 100 reviews per shop sorted by recency. Four shops reached the cap; GennybooFinds exhausted its available history at 64, producing 464 reviews total.
- Compare observable search placement, catalog, product, and review fields. Do not estimate sales, revenue, conversion, ad spend, traffic, profitability, or causal ranking effects.
limits
- The shop cohort comes from one US keyword at one point in time. It is a worked competitor-analysis example, not a representative sample of Etsy.
- Captured rank mixes sponsored and organic result rows. It records this run's placement order, not a stable search position.
- Catalog specialization is a title-keyword classification: a title must contain a mushroom term and a lighting term. It can miss relevant products or include unusual phrasing.
- The product sample is rank-selected, not random. Product fields reflect the Etsy page rendered for the US on July 22 and may change.
- Recent-review samples cover different calendar windows, and a review is not a sale. Review counts and window length must not be converted into order volume.
- Review-theme counts use overlapping keyword rules. They measure mentions, not sentiment, importance, or customer satisfaction. Buyer identities, photos, and raw review text are not republished.
Inspect the run behind the findings.
- collection window · UTC
- 2026-07-18T17:52:55.702Z
to 2026-07-22T17:41:37.458Z - four private source exports
- 2,029 source records · raw exports not redistributed
- primary search CSV · SHA-256
- 727d71391b4074a7e3942feae86655d7fe03b7cf76e27472e86e69b8d6a1fc4c
The four private exports contain public listing, shop, buyer, review-text, media, and URL fields and are not redistributed. The primary search CSV checksum anchors cohort selection; the manifest records all actor run and dataset IDs. Public artifacts contain aggregate shop-level results, methodology, and no buyer identities, photos, or verbatim review text.
python3 analyze.py search.csv catalog.json products.json reviews.json
Search presence does not tell you catalog depth
The five shops were chosen because they contributed the most unique listings to the original search run, but search representation and total catalog size are different measures. Fangfangstory placed 29 unique listings in the search dataset from a 35-listing catalog. GennybooFinds had the largest catalog at 67 listings and the most search listings at 35, yet its best captured result was only rank 287. Comptonclothes and StarArtisans reached ranks 5 and 7 with smaller catalogs.
| shop | unique search listings | best captured rank | full catalog |
|---|---|---|---|
| GennybooFinds | 35 | 287 | 67 |
| Comptonclothes | 30 | 5 | 50 |
| Fangfangstory | 29 | 49 | 35 |
| StarArtisans | 26 | 7 | 42 |
| PurpleForestUS | 21 | 164 | 46 |
// rank is descriptive of one captured search run; it is not a persistent organic position
A useful competitor shortlist can begin with search presence, but the next collection should be the shop catalog. Otherwise, a search page is easily mistaken for the seller's complete assortment.
All five catalogs cluster around the same price center
The full-catalog median prices occupy a narrow $49.89–$59.89 range—a spread of $10. StarArtisans has the highest median and the broadest upper range at $139. The title classifier also shows that these are highly specialized catalogs: 84.8% to 100% of titles contain both a mushroom term and a lighting term. This cohort competes through dense niche coverage, not five radically different price tiers.
| shop | listings | median price | displayed range | mushroom-light titles |
|---|---|---|---|---|
| GennybooFinds | 67 | $53.95 | $5.00–$99.00 | 61 · 91.0% |
| Comptonclothes | 50 | $56.70 | $2.80–$59.50 | 47 · 94.0% |
| Fangfangstory | 35 | $52.65 | $6.50–$57.00 | 34 · 97.1% |
| StarArtisans | 42 | $59.89 | $28.90–$139.00 | 42 · 100% |
| PurpleForestUS | 46 | $49.89 | $42.00–$59.00 | 39 · 84.8% |
// current displayed USD prices; title classification uses mushroom/fungi/toadstool plus lamp/light/lighting/nightlight
The merchandising baseline is uniform; video coverage is not
Every one of the 50 rank-selected products was marked on sale and offered free US shipping when enriched. Median displayed prices remain tightly grouped, while the median discount varies from 30% to 45%. Video is the sharper separator: all ten StarArtisans samples include video, compared with five of ten for PurpleForestUS. Those are observable listing-page choices—not proof that one choice causes better placement or more sales.
| shop | median price | median discount | on sale + free ship | has video |
|---|---|---|---|---|
| GennybooFinds | $53.95 | 35% | 10 / 10 | 7 · 70% |
| Comptonclothes | $57.40 | 30% | 10 / 10 | 9 · 90% |
| Fangfangstory | $53.30 | 35% | 10 / 10 | 8 · 80% |
| StarArtisans | $57.95 | 40% | 10 / 10 | 10 · 100% |
| PurpleForestUS | $49.55 | 45% | 10 / 10 | 5 · 50% |
// discount and price are current displayed values; selection uses smallest captured search rank per shop
Recent reviews reveal operational differences without estimating sales
The review layer produces the widest separation. Sample-average ratings range from 4.50 to 4.97. StarArtisans responded to 79 of its 100 sampled reviews; three shops had no seller response in their samples. Its 100 recent reviews also fit into a 34-day window, while other 100-review samples span 125 to 245 days. That compression is a review-activity observation only: review propensity, repeat buyers, removed reviews, and unobserved purchases prevent a sales inference.
| shop | reviews | observed window | average rating | 5-star | seller response |
|---|---|---|---|---|---|
| GennybooFinds | 64 | 2025-08-11 → 2026-06-23 | 4.70 | 84.4% | 0% |
| Comptonclothes | 100 | 2026-03-18 → 2026-07-20 | 4.81 | 86.0% | 0% |
| Fangfangstory | 100 | 2025-11-16 → 2026-07-18 | 4.50 | 77.0% | 0% |
| StarArtisans | 100 | 2026-06-19 → 2026-07-22 | 4.97 | 98.0% | 79.0% |
| PurpleForestUS | 100 | 2025-12-02 → 2026-07-21 | 4.89 | 92.0% | 1.0% |
// GennybooFinds exhausted at 64; the other shops reached the 100-review cap; reviews are not orders
Appearance dominates the rule-based review themes
Across the 464 review texts, the appearance dictionary matches 248 rows, followed by gift language in 113, shipping in 90, and quality in 75. Because a review can match multiple themes, the bars do not sum to 100%. The result is useful for deciding which product attributes deserve manual reading or another structured collection—not for assigning sentiment automatically.
// case-insensitive English keyword rules; categories overlap and do not encode positive or negative sentiment
The practical output is a comparison matrix and a list of questions to investigate next. It is not an Etsy shop score, and it deliberately stops where the public data stops.
Etsy niche research workflow
Exact actor inputs, handoffs, deduplication rules, and cost controls.
// reproduce the source run
These commands use the exact input behind this case study. The CLI and HTTP API start the same Actor run.
apify call astravalabs/etsy-listings-scraper --input '{"keywords":["mushroom lamp"],"maxPages":30,"maxTotalResults":2000,"country":"US","sortOrder":"most_relevant"}'# Set API token
API_TOKEN=<YOUR_API_TOKEN>
# Prepare Actor input
cat > input.json << 'EOF'
{
"keywords": [
"mushroom lamp"
],
"maxPages": 30,
"maxTotalResults": 2000,
"country": "US",
"sortOrder": "most_relevant"
}
EOF
# Run the Actor using the HTTP API
# Full API reference: https://docs.apify.com/api/v2
curl "https://api.apify.com/v2/acts/astravalabs~etsy-listings-scraper/runs?token=$API_TOKEN" \
-X POST \
-d @input.json \
-H 'Content-Type: application/json'// Replace <YOUR_API_TOKEN> before running the cURL example. Keep tokens out of committed files.