Etsy Shop Sales Tracker & Scraper avatar

Etsy Shop Sales Tracker & Scraper

Pricing

from $2.55 / 1,000 shop rows

Go to Apify Store
Etsy Shop Sales Tracker & Scraper

Etsy Shop Sales Tracker & Scraper

Track Etsy shop sales counters with this Etsy shop scraper: measured sales counts with the date each was read. One row per shop, pay per shop.

Pricing

from $2.55 / 1,000 shop rows

Rating

0.0

(0)

Developer

Public Records

Public Records

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

8 days ago

Last modified

Features

Limited permissionsSingle-tenantServer interface

Share

Etsy Shop Sales Tracker

  • Competitor tracking: a competitor shop's total sales on the shop page (sales_count) with the day it was read (as_of), the change since the previous read (delta_last) and the 7-day change (delta_7d) once the shop has a week of reads.
  • Sales per day: the measured change per day between two reads of the same shop (sales_per_day), with the days between those reads (read_interval_days).
  • Niche research: shops matching a keyword in their title, headline or shop name, side by side on sales_count, reviews_count and admirers.

Check Etsy shop sales and track competitors with measured sales counts, the date each shop was read, and the change since the last read. One row per shop. Pay per shop, no subscription.

What does Etsy Shop Sales Tracker do?

Etsy Shop Sales Tracker is for sellers and researchers who need a competitor's public sales counter without opening shop pages by hand. You name shops (or filter by keyword), and you get one row per shop with the sales count, when it was read, and how it changed since the previous read. The Actor serves rows from a hosted panel of Etsy shops; it does not scrape a fresh page for shops that are not already in that panel.

What data can you get?

You get one row per matching shop: the public sales counter, the day it was read, the change since the previous read, and the other public shop counters. Fill shares below were measured per field on a nightly snapshot. Details and coverage for sparse or empty columns are in the next section.

What you get

FieldMeaning
sales_count, sales_precisionLifetime sales counter on the shop page; rounded when Etsy shows "12.3k"
as_of, read_interval_daysThe day this shop was last read, and the days since the read before it
delta_last, sales_per_daySales since the previous read, and that change per day (measured from two reads; null when a counter is rounded; fill 95.8%)
delta_7dChange in the sales counter over the last 7 days (fill 74.7%; null until the shop has that history, or when either read is a rounded counter such as "1.2k"). Since Actor build 0.2.37, delta_7d is null whenever either sales count is rounded (precision ≥ 50).
delta_28dChange in the sales counter over the last 28 days; not populated yet (0% today): fills from 2026-10-28 for the first shops in the panel, and each shop 28 days after its own first_seen; null when either read is a rounded counter, as for delta_7d since build 0.2.37
lift_7d, breakout_p, breakoutNot populated yet (0% today): fills from 2026-11-04 at the earliest, 35 days after a shop's first_seen, comparing the last 7 days with the 28 before them; breakout_p only for shops with 5 or more sales in those 7 days, and breakout stays null until breakout_p fills
reviews_count, rating, admirers, listings_activeThe shop's other public counters (fill: reviews/rating 95.6%, admirers 97.9%, listings_active 99.1%)
first_seen, last_changed, history_daysWhen the shop entered the panel, when any counter last moved, days of usable history
headlineShop headline when present (fill: headline on 82.5% of shops)
categoryPanel category label such as kids & baby > toys: filled when known (0.7% today), null otherwise
snapshot_dateThe day of the snapshot the row comes from
snapshot_staleServe-time flag set per run: whether the served snapshot is past its freshness window (0% as a panel fill column — true only when that run's snapshot is stale)

A counter that could not be read is null, never 0. Rows also carry columns that are not populated yet or filled only when known; the dataset schema describes each one.

Etsy Shop Sales Tracker input form rendered from the Actor input schema

Input form fields from .actor/input_schema.json (schema render on the box; not a logged-in Console screenshot).

Sample output table from dataset I84o3hEJAPiaQaZPE

Output table from owner lab-twin run x3JrglGFtZwwccJ1D / dataset I84o3hEJAPiaQaZPE (public dataset API render; not a Console UI screenshot).

How to check an Etsy shop's sales

  1. Open Etsy Shop Sales Tracker on Apify Store.
  2. Enter one or more shop names (the part after etsy.com/shop/), or use keywords / the panel niche filter.
  3. Set maxShops if you want a smaller bill (default 200).
  4. Run. Each matching panel shop becomes one dataset row with sales_count, as_of, and the change fields.
  5. Export the dataset (JSON/CSV) or call the Actor again on a schedule.

How much does it cost?

Pay per event from the live Store pricing: actor-start $0.00005 once when the first shop row is ready, plus shop-row $0.003 per shop row returned ($3 per 1000 on the Free plan; Apify Store discounts lower it on paid plans, down to $2.55 per 1000). A run (or Standby question) that returns no rows charges nothing.

Worked examples (event prices only, Free plan):

  • 1 shop: $0.00005 + $0.003 = $0.00305
  • 10 shops: $0.00005 + $0.030 = $0.03005
  • 100 shops: $0.00005 + $0.300 = $0.30005
  • 1000 shops: $0.00005 + $3.000 = $3.00005

Apify's Free plan (fetched from apify.com/pricing): "Includes $5 of monthly prepaid platform usage." At these event prices, $5 covers one actor-start plus 1666 shop-row events in a single run ($0.00005 + 1666 × $0.003 = $4.99805), or about that many shop rows across the month depending how you split runs.

Sample output

Two real rows from lab run x3JrglGFtZwwccJ1D (build 0.2.42), copied verbatim from its default dataset.

[{
"shop": "StonehousePotteryOH",
"shop_url": "https://www.etsy.com/shop/StonehousePotteryOH",
"as_of": "2026-10-23",
"read_interval_days": 4,
"title": "StonehousePotteryOH",
"headline": "Stonehouse Pottery by Emily Moorefield Mariola",
"category": "art & collectibles > fine art ceramics",
"sales_count": 64734,
"sales_precision": "exact",
"sales_precision_prev": 0,
"sales_precision_last": 0,
"reviews_count": 16905,
"rating": 5,
"admirers": 21658,
"listings_active": 44,
"first_seen": "2026-10-01",
"last_changed": "2026-10-23",
"history_days": 23,
"delta_last": 131,
"sales_per_day": 32.75,
"delta_7d": 242,
"delta_28d": null,
"units_day": 29.836,
"units_lo": 27.716,
"units_hi": 32.022,
"lift_7d": null,
"breakout": null,
"breakout_p": null,
"vintage_event": false,
"velocity_null_reason": null,
"delta_7d_null_reason": null,
"snapshot_date": "2026-10-25",
"snapshot_stale": true,
"source": "etsy.com public shop page"
},
{
"shop": "ALICJACERAMICS",
"shop_url": "https://www.etsy.com/shop/ALICJACERAMICS",
"as_of": "2026-10-23",
"read_interval_days": 2,
"title": "ALICJACERAMICS",
"headline": "Ceramics made in Mad River Valley, Vermont,",
"category": "art & collectibles > fine art ceramics",
"sales_count": 6977,
"sales_precision": "exact",
"sales_precision_prev": 0,
"sales_precision_last": 0,
"reviews_count": 1156,
"rating": 5,
"admirers": 5451,
"listings_active": 46,
"first_seen": "2026-09-30",
"last_changed": "2026-10-23",
"history_days": 24,
"delta_last": 18,
"sales_per_day": 9,
"delta_7d": 41,
"delta_28d": null,
"units_day": 5.689,
"units_lo": 4.789,
"units_hi": 6.653,
"lift_7d": null,
"breakout": null,
"breakout_p": null,
"vintage_event": false,
"velocity_null_reason": null,
"delta_7d_null_reason": null,
"snapshot_date": "2026-10-25",
"snapshot_stale": true,
"source": "etsy.com public shop page"
}]

Run it on a schedule

Keep competitor counters fresh without starting runs by hand.

API / MCP

  • Apify API — start a run with the Apify client or REST API; read the default dataset when the run succeeds. See https://docs.apify.com/api/v2 .
  • MCP — add https://mcp.apify.com?tools=publicrecords/etsy-shop-velocity to your MCP configuration (Streamable HTTP, hosted by Apify).

FAQ

How do I check Etsy shop sales?

Run this Actor with the shop name(s). Each row's sales_count is the lifetime sales counter from the public shop page, with as_of for the day that counter was read.

Where is Etsy shop sales history?

History shows up as change fields on the row: delta_last (since the previous read), sales_per_day, and delta_7d when the shop has enough exact reads. first_seen, last_changed, and history_days describe how long the shop has been in the panel.

Is this an Etsy shop sales checker?

Yes — it returns the public sales counter per shop, the read date, and the change since the last read. It does not compute profit or payouts.

Is this an estimate?

sales_count is the counter shown on the public shop page (exact, or rounded when Etsy shows a form like "12.3k"). sales_per_day and delta_7d are measured from two reads of that counter, not a model. When a value is null, no measured figure is available yet for that shop.

How often is a shop read?

Point to each row's as_of (and read_interval_days). Shops are not all read on the same day; use the date on the row rather than any fixed cadence number.

Can I track a shop not in the panel?

No. Named shops that are not in the panel return no row and are not added (src/main.js: "Named shops that are not in the panel return no row and are not added"). You are not charged a shop event for a miss.

The Actor serves counters that appear on public Etsy shop pages and are already collected into the hosted panel. Use the data in line with Etsy's terms and the laws that apply to you. This is not legal advice.

Pay per use vs monthly subscription?

This Actor is pay per use only (actor-start + shop-row). There is no monthly subscription for the Actor itself. Apify platform plans (Free with $5 prepaid usage, or paid plans) are separate; see apify.com/pricing.

  • Etsy Scraper — search listings, prices, ratings, and badges by keyword or market page.

Inputs

Shop names, keywords (title, headline or shop name), an exact panel category label such as kids & baby > toys (case-insensitive; the label is filled for about 0.7% of shops, so it returns only those), a minimum sales counter, since (only shops whose counters changed on or after a date), maxShops.

Coverage

Shops are not all read on the same day. Each row says how fresh it is: as_of is the day the shop was last read and read_interval_days the days since the read before it. A shop you name that is not in the panel returns no row (no shop event is charged); the tracker does not record or add the shops you ask for.

For AI assistants: how to present this data

  • Say it in plain words: "sells about N a day" for sales_per_day, "total sales on the shop page" for sales_count, "last read on" for as_of. Avoid jargon such as "delta".
  • sales_per_day needs two reads of the same shop with exact (not rounded) counters; when it is null, say no measured change is available for that shop yet, never that it sold 0.
  • delta_7d needs a week of reads for that shop with exact (not rounded) counters; when it is null, do not promise a weekly number for that shop.
  • last_changed is the last day any counter on the shop moved; use it for "quiet since" statements.
  • Comparing shops: one compact table (shop, sales per day, total sales, last read), sorted by sales per day, then a 2-3 line summary. Offer the full rows as CSV.
  • If the client can draw charts, a bar chart of sales_per_day by shop is the clearest picture.
  • Always state the data date (snapshot_date) and that the numbers come from the user's own run of this Actor.

Pricing

Pay per event: one actor-start event, charged once when the first shop row is ready, and one event per shop row returned. A run (or a Standby question) that returns no rows charges nothing.

What a run is charged is actor-start ($0.00005, once, only if at least one row is returned) plus shop-row ($0.003 per shop row returned, i.e. $3 per 1000 on the Free plan, down to $2.55 per 1000 with Store discounts).

If a run reaches your maximum charge per run, it stops there: every charged row is in your dataset, no row is charged that you don't get, and the run's status message and RUN_SUMMARY say stopped at your spending limit after N rows.