"Are my prices competitive?" is the question I see most from Etsy sellers. The usual answer is a paid research tool. Before you pay for one, here's what you can read for free, what I found when I did it for one niche today, and two traps I hit on the way. I build an Etsy scraper, and the paid part is at the end.
Free route 1. Marketplace Insights, for demand
Etsy has its own tool, in Shop Manager, then Stats, then Marketplace Insights. For a keyword it shows the number of searches and listings on Etsy over the last 30 days, plus related search terms. Sellers get 15 keyword searches a week for free, and each result stays readable for 7 days, per Etsy's help page.
Use it first, because it's Etsy's own search data and not an estimate. It tells you whether people search for a thing. It doesn't tell you what your competitors charge.
Free route 2. Etsy search and a spreadsheet, for prices
Search your keyword on Etsy, then copy the first 40 listings into a sheet, one row each. Write down the price, the struck-out price when there is one, the shop name and the favorites count from the listing page. Forty rows takes a while by hand, but it's free and it's the same data any tool reads.
Then let a few lines of Python do the maths. This works on any CSV with price and originalPrice columns, hand-typed or exported:
import csv
from statistics import median, quantiles
rows = [r for r in csv.DictReader(open("pet-portraits.csv", encoding="utf-8-sig")) if r["price"]]
prices = sorted(float(r["price"]) for r in rows)
q1, q2, q3 = quantiles(prices, n=4)
on_sale = [r for r in rows if r["originalPrice"]]
print(f"{len(prices)} listings, ${prices[0]:.2f} to ${prices[-1]:.2f}")
print(f"middle half: ${q1:.2f} to ${q3:.2f}, median ${q2:.2f}")
print(f"on sale: {len(on_sale)} of {len(rows)}")
print(f"median price before the sale: ${median(float(r['originalPrice']) for r in on_sale):.2f}")
The middle half is the range where most of your competitors sit. If your price is above it, you want a reason a shopper can see in the photos or the title.
What "custom pet portrait" looked like on 3 Nov 2026
I ran it on the first 40 etsy.com search results for "custom pet portrait", priced in USD, with ads left out. The script above printed this:
40 listings, $3.85 to $92.95
middle half: $10.99 to $38.20, median $16.50
on sale: 33 of 40
median price before the sale: $32.45
The 40 listings came from 40 different shops. 28 had the Star Seller badge, 24 Bestseller and 12 Etsy's Pick. 32 showed "In 20+ carts".
Trap 1. Most of the niche is "on sale"
33 of 40 listings had a struck-out price, and the median discount was 50%. So the struck-out price is an anchor, and the price shoppers pay is the sale price. Compare yourself with the $16.50 median, not the $32.45 one. If you list at $30 with no sale, you sit in the upper half of the niche, while a shop that lists at $32 with a 50% sale sits at the median.
Trap 2. One sample moves
I ran the same search an hour earlier and got a different 40. The median was $18.32, and 37 of 40 were on sale. Favorites by price band flipped between the two samples too. In the later one the $17.53 to $37 band had the most favorites, with a median of 3,036, and in the earlier one a similar band had the fewest. So don't read much into which price band "wins" from one look. Take two or three samples on different days before you change prices.
What a listing page won't tell you
A listing page doesn't show how many of that item sold. It shows favorites, the item's own reviews, "In 20+ carts" and badges. Any per-listing sales or revenue number in a tool is an estimate built from signals like these.
Watch the review count too. A listing with no reviews of its own says "Be the first to review this item", but the structured data in its page carries the shop's rating and review count instead. My own scraper copied that number until today, so one listing with no reviews showed 42,226, which was the shop's total. If you count reviews by hand, read the "Reviews for this item" section, not the stars near the title.
The paid route
I built an Etsy scraper on Apify that does the copying. It's paid per result, $1 per 1,000 listings, plus $3.40 per 1,000 when you turn on listing details for favorites, item reviews, carts and shipping. The 40-listing run above, with details, comes to about 18 cents at those prices. It also adds one free summary row per keyword with the quartiles, the share on sale and the median discount. This is that row from the run, trimmed:
{
"status": "summary",
"input": "custom pet portrait",
"productCount": 40,
"priceP25": 10.99,
"priceMedian": 16.5,
"priceP75": 37.4,
"onSalePercent": 82.5,
"medianDiscountPercent": 50,
"freeShippingPercent": 52.5,
"shopCount": 40,
"favoritesMedian": 1647.5
}
Its quartiles use a different method from Python's quantiles, which is why it says $37.40 where the script says $38.20. There's a ready-to-run competitor analysis example with this exact input. It returns no sales numbers, no search volume and no seller tags, so pair it with Marketplace Insights for the demand side.
This article was created with the help of AI. An AI agent (Claude) ran every test above on 3 Nov 2026 and drafted the text from those runs, and every output block is copied from them.
Top comments (0)