Version 2026-10. This page defines the sales numbers of your own listings: listing stats (
GET /v1/workspace/listings/{id}/stats, or include: ["stats"] on get_my_listing), and the sales and period blocks of a listing in search results and detail. They count your real orders, not estimates.Where the numbers come from
Every number on this page comes from your shop’s orders, as Alura synced them from Etsy. After each sync, Alura adds up each listing’s sales per day. The API reads those daily totals and never calls Etsy.- Day. A sale counts on the UTC date the order was placed. A refund counts on the UTC date of the refund, not the order’s. A review counts on the UTC date it was written.
- Order states. Canceled orders don’t count, and neither do their refunds.
- Refunds stay separate.
revenueisn’t reduced by refunds. When Etsy records a refund for a whole order, Alura splits it across the order’s items by their revenue. - Not in revenue: shipping, sales tax, VAT, gift wrap and Etsy’s fees.
revenueis what the items sold for. - No profit or margin per listing. They aren’t reliable at listing level. For profit, see Shop stats.
null, never 0, for a day Alura doesn’t know. A covered day with no sales is a real 0. See Coverage.
Listing stats
Listing stats return a listing’s totals over a range, aseries of points, and a few lifetime figures.
- Range.
fromandtoare UTC days, both included. By default they span the shop’s whole coverage window.include: ["stats"]onget_my_listingalways uses that default. - Interval.
intervalisday,week,month(the default),quarteroryear, with at most 366 points. Over MCP,get_my_listingwithinclude: ["stats"]takes no interval: it returns at most 24 points, by month, or by quarter and then by year when the history is longer than 24 months (intervalsays which). Weeks start on Monday. The first and last points are cut to the range. - Totals add up the known days of the range.
lifetimeholdsviewsandfavorites, Etsy’s lifetime counters for the listing. Etsy keeps no history of them.metrics.age_daysis the number of whole UTC days since the listing was first created.metrics.review_rateis reviews per unit sold over the covered days of the range, to 4 decimals. It’snullwhen units are 0 or unknown, when the range has a gap day, or when the range runs past the last day Alura synced reviews for.metrics.ratingis the average rating, to 2 decimals, and the share of each star rating, over every stored review of the listing, not only those in the range.
null for its sales measures when none of its days is covered, or when it contains a gap day, with a partial_range notice. A point that is only partly covered, such as the month that holds the last complete day, is served for its covered days, and partial_range names the covered bounds. Refunds follow a stricter rule: a point whose period runs past refunds_through has refunds: null, with a refunds_partial notice. A month with refunds known through its 12th is null, not a short month. When no day of the range is covered, the sales totals are null, and so is series when the shop has no coverage at all. The notice is then sales_not_covered. reviews doesn’t depend on sales coverage: it’s null only for a point with days after Alura last synced the shop’s reviews, or while they were never synced.
A listing’s sales and period
Listing search results and a listing’s detail carry two blocks from the same daily totals:
salescovers the shop’s whole coverage window:units,revenue,since(the first covered day),last_order_at, and in the detailfirst_order_at,refund_countandrefunds_through.refund_countcounts the refunds that touch the listing throughrefunds_through.salesisnullwhen the shop isn’t covered, has a gap day, or Alura hasn’t finished adding up its totals since new orders arrived. It never uses Etsy’s own sold count for the listing, because Etsy has none per listing.periodcovers the request’speriod(7d,30d,90dor365d, each ending yesterday,30dby default; orall, which spans the shop’s coverage fromcoverage_fromthroughcomplete_through) orfrom/to:from,to,units,ordersandrevenue. It’s all or nothing:nullunless every day of the period is covered. Withsort=trendingit addsprevious_unitsandchange(see Trending listings).
Currency
- Listing stats report money as plain numbers in
currency: the listing’s own price currency, unless you ask for another withcurrency=. Money in another currency is converted through US dollars at today’s exchange rates. The response then hasconversion(from,to,rate_date,method: "current_rate") and acurrency_converted_at_current_ratenotice: past sales are converted at today’s rate, not each day’s. salesandperiodgiverevenueas{amount, currency, usd}: the amount in the orders’ currency, and its US dollar value at today’s rate. When a listing’s sales are in more than one currency,amountandcurrencyarenulland onlyusdis given. A search response’ssummary.fx_as_ofsays the date of the rates.
Why shop stats revenue won’t match
Adding up your listings’period revenue won’t give the revenue of Shop stats for the same days. The two come from different sources:
- Source. Listing numbers come from orders. Shop stats come from the Etsy payment account’s ledger, which Alura stores day by day.
- What revenue holds. Listing revenue is item price minus item discounts. Shop stats revenue is the payment account’s sales after refunds and the taxes Etsy collects.
- Refunds. Listing revenue doesn’t subtract refunds. Shop stats revenue does.
- Days. A sale counts on the day the order was placed. The ledger books money on its own dates.
- Currency. Listing revenue is in the orders’ currency. Shop stats use the payment account’s currency, which can differ from the currency of the shop’s listings.
- Coverage. Each source has its own coverage, so one can know a day the other doesn’t yet.