ds@mcpanalytics.aiEmail your data and your question and get an answer about your own data, with the method shown.Email your data and question. Get an answer.

Etsy Listing Performance: Comparison & Analysis

By MCP Analytics Team | Published , updated

Compare your Etsy listings on revenue, conversion and margin, then decide which to promote, fix or retire. All example numbers are synthetic.

Introduction to Listing Performance Comparison

As an Etsy seller, you're constantly juggling dozens or even hundreds of listings, each competing for your limited time and marketing budget. The critical question every shop owner faces is: Which listings deserve your attention and which are holding you back?

Listing performance comparison is the systematic process of evaluating your Etsy products against each other to identify winners, optimize underperformers, and make informed decisions about where to invest your resources. Without this analysis, you're essentially flying blind, promoting listings based on gut feeling rather than hard data.

This tutorial will walk you through the complete process of analyzing your Etsy listing performance using data-driven methods. You'll learn how to identify which products generate the most revenue, which have the best conversion rates, and which should be promoted, optimized, or retired. By the end, you'll have a clear action plan for maximizing your shop's profitability.

Why Listing Performance Comparison Matters

Consider this hypothetical scenario: You have two listings with similar view counts. Listing A generates $500 per month while Listing B generates $2,000. If you're spending equal effort promoting both, you're leaving money on the table. Listing performance comparison helps you:

Statistical methods like A/B testing with statistical significance can help you check whether performance differences between listings are meaningful or just random variation.

Step 1: Prerequisites and Data Requirements

Before diving into listing performance analysis, you need to ensure you have the right data and tools in place. Here's what you'll need:

Required Data

  1. Order History: At least 30 days of sales data. A longer window gives more orders per listing and so less noisy comparisons, but no number of days guarantees that a difference is statistically significant: that depends on the counts and how much they vary.
  2. Listing Information: Product titles, SKUs, categories, and pricing
  3. Traffic Metrics: Views per listing (see Etsy's help for where to find them). An order export does not contain views, so this is a second file that you join to your orders by listing ID (Step 2).
  4. Cost Data: Material costs, shipping costs, and fees per order for profit margin analysis. These come from your own records, not from Etsy's order file.
  5. Inventory Levels: Current stock quantities (optional but helpful)

Accessing Your Etsy Data

Etsy's help article on downloading sold orders (linked under Sources, read on 2026-11-02) gives these steps. Menus change, so follow Etsy's page if yours differs:

1. Sign in to Etsy and open Shop Manager
2. Go to Settings, then Options
3. Open the Download Data tab and go to Orders
4. Pick the CSV Type, the Month and the Year
   (leave Month empty to get a whole year)
5. Select Download CSV

Etsy's article says the file lists your orders and can include the payment method, item price, item title and SKU numbers if you added them. It does not list the column names, so we do not list them here either. Open your own file and check which columns it has, and whether the price is per item or per order. The article does not cover listing views, so check Etsy's help for where to find those.

Data Quality Checklist

Before proceeding, verify your data meets these criteria:

Step 2: Join Orders, Views and Costs

A listing comparison needs three things per listing: orders and revenue (from the order export), views (a separate source), and your cost per order. They live in different files, so join them on the listing ID and check that nothing fell out of the join. The figures on this page come from a synthetic five-listing shop generated for this tutorial, not from a real shop, so your numbers will differ.

import pandas as pd

# Synthetic shop with five listings, generated for this tutorial. Replace each frame with your own data:
#   orders: your order export (one row per order line, with the listing id and the price paid)
#   views : listing views, which you get separately
#   costs : your own cost per order for each listing
listings = pd.DataFrame({
    'listing_id': [101, 102, 103, 104, 105],
    'title': ['Custom Pet Portrait Canvas', 'Personalized Wedding Sign', 'Vintage-Style Recipe Cards',
              'Hand-Painted Ornament Set', 'Digital Birth Announcement'],
    'price': [50.0, 100.0, 10.0, 30.0, 10.0],
    'order_count': [97, 32, 268, 65, 142],
})
orders = listings.loc[listings.index.repeat(listings['order_count']),
                      ['listing_id', 'title', 'price']].reset_index(drop=True)   # one row per order
views = pd.DataFrame({'listing_id': [101, 102, 103, 104, 105], 'views': [3250, 1400, 9000, 2600, 4100]})
costs = pd.DataFrame({'listing_id': [101, 102, 103, 104, 105], 'cost_per_order': [30.0, 111.75, 6.5, 21.0, 3.2]})

table = (orders.groupby(['listing_id', 'title'], as_index=False)
         .agg(orders=('price', 'size'), revenue=('price', 'sum'))
         .merge(views, on='listing_id', how='left')
         .merge(costs, on='listing_id', how='left'))
print('order rows:', len(orders), '| listings:', len(table))
print('listings with no views row:', int(table['views'].isna().sum()))
print('listings with no cost row:', int(table['cost_per_order'].isna().sum()))
print('total revenue:', table['revenue'].sum())

Expected output:

order rows: 604 | listings: 5
listings with no views row: 0
listings with no cost row: 0
total revenue: 14100.0

If the two "no ... row" counts are not zero, those listings drop out of the views or cost columns: fix the IDs before going on.

A Tiny Example You Can Check by Hand

The three tables below are invented for this page: 7 order lines, 3 listings, 1 refunded line. The column names are ours, not Etsy's, so rename them to match your own file. The views and costs are made up. Run the code block below, then compare its output with the "Expected output" block that follows it.

import pandas as pd, io

lines = pd.read_csv(io.StringIO("""order_id,listing,quantity,item_price,status
1001,Mug Print,2,20.00,Paid
1002,Card Pack,5,6.00,Paid
1003,Mug Print,1,20.00,Paid
1004,Poster,1,35.00,Refunded
1005,Card Pack,3,6.00,Paid
1006,Poster,2,35.00,Paid
1007,Mug Print,1,20.00,Paid
"""))
views = pd.read_csv(io.StringIO("""listing,views
Mug Print,120
Card Pack,200
Poster,50
"""))
costs = pd.read_csv(io.StringIO("""listing,unit_cost
Mug Print,8.00
Card Pack,2.00
Poster,22.00
"""))

paid = lines[lines["status"] == "Paid"].copy()
paid["revenue"] = paid["quantity"] * paid["item_price"]
t = (paid.groupby("listing")
     .agg(orders=("order_id", "nunique"), units=("quantity", "sum"), revenue=("revenue", "sum"))
     .reset_index()
     .merge(views, on="listing", how="left")
     .merge(costs, on="listing", how="left"))
t["conversion_pct"] = t["orders"] / t["views"] * 100
t["profit"] = t["revenue"] - t["units"] * t["unit_cost"]
t["margin_pct"] = t["profit"] / t["revenue"] * 100
print(t[["listing", "orders", "units", "revenue", "views", "conversion_pct", "profit", "margin_pct"]].round(1).to_string(index=False))
print("shop margin:", round(t["profit"].sum() / t["revenue"].sum() * 100, 1))

Expected output (from the code block above):

  listing  orders  units  revenue  views  conversion_pct  profit  margin_pct
Card Pack       2      8     48.0    200             1.0    32.0        66.7
Mug Print       3      4     80.0    120             2.5    48.0        60.0
   Poster       1      2     70.0     50             2.0    26.0        37.1
shop margin: 53.5

Check the Mug Print by hand. Three paid orders (1001, 1003, 1007) hold 2 + 1 + 1 = 4 units at $20.00, so revenue is $80.00. Costs are 4 x $8.00 = $32.00, so profit is $48.00, which is 60.0% of $80.00. Conversion is 3 orders / 120 views = 2.5%. The refunded Poster line (1004) is left out, so the Poster has 1 order and 2 units: $70.00 revenue, $44.00 cost, $26.00 profit (37.1%). Across the shop, revenue is 48 + 80 + 70 = $198.00 and profit is 32 + 48 + 26 = $106.00, a 53.5% margin. These seven rows are far too few to trust a real comparison. They are here so you can check the arithmetic.

Step 3: Configure Your Comparison Parameters

To get the most actionable insights, you need to customize the analysis parameters based on your specific business goals.

Selecting Key Metrics

Choose which metrics matter most for your business strategy:

Primary Metrics (always include):
- Total Revenue: Sum of all sales for each listing
- Order Count: Number of times the listing was purchased
- Average Order Value: Revenue ÷ Order Count

Secondary Metrics (choose 2-3):
- Conversion Rate: Orders ÷ Views × 100
- Revenue per View: Total Revenue ÷ Total Views
- Profit Margin: (Revenue - Costs) ÷ Revenue × 100
- Days Since Last Sale: Identify stagnant inventory
- Growth Rate: Compare current period to previous period

Setting Time Periods for Comparison

The time period you choose dramatically affects your results:

Applying Filters

Narrow your analysis to specific segments:

Filter Options:
- Category: Compare only within product categories
- Price Range: Group by similar price points ($10-$25, $25-$50, etc.)
- Listing Age: New listings (0-90 days) vs established (90+ days)
- Promotion Status: Compare promoted vs organic performance
- Seasonal Tags: Holiday items, summer products, etc.

For example, comparing a $15 printable download to a $150 handmade item isn't particularly useful: filter by category or price range for more relevant insights.

Step 4: Analyze Revenue Performance

Revenue analysis reveals which listings are generating the most income for your shop. However, highest revenue doesn't always mean best performance, context matters.

Interpreting Revenue Rankings

Sort the joined table by total revenue. The block below adds average order value (AOV) and each listing's share of the shop's revenue; the shares add up to 100% because the example shop has only these five listings.

rank = table.sort_values('revenue', ascending=False).reset_index(drop=True)
rank.index += 1
rank['aov'] = (rank['revenue'] / rank['orders']).round(2)
rank['pct_of_total'] = (100 * rank['revenue'] / rank['revenue'].sum()).round(1)
print(rank[['title', 'revenue', 'orders', 'aov', 'pct_of_total']].to_string())
print('sum of pct_of_total:', round(rank['pct_of_total'].sum(), 1))

Expected output:

                        title  revenue  orders    aov  pct_of_total
1  Custom Pet Portrait Canvas   4850.0      97   50.0          34.4
2   Personalized Wedding Sign   3200.0      32  100.0          22.7
3  Vintage-Style Recipe Cards   2680.0     268   10.0          19.0
4   Hand-Painted Ornament Set   1950.0      65   30.0          13.8
5  Digital Birth Announcement   1420.0     142   10.0          10.1
sum of pct_of_total: 100.0

Key Insights to Extract

Look beyond the raw revenue numbers:

Revenue Trend Analysis

To see trends, group the order rows by week or month (with pd.Grouper on the sale date) and compare listings over the same weeks. Daily totals are noisy for listings with few orders; weekly or monthly totals smooth that out.

A declining listing has many possible causes (season, competition, listing changes); the trend tells you where to look, not which cause it is.

Step 5: Evaluate Conversion Rates

Conversion rate, the percentage of viewers who actually purchase, is often more important than raw views. A listing with 1,000 views and 10 sales (1% conversion) converts less often than one with 100 views and 5 sales (5% conversion), although 5 sales is too few to be sure the difference is more than chance.

Calculating Conversion Rates

Conversion rate is orders divided by views, times 100. Revenue per view combines conversion and price.

rank['conversion_pct'] = (100 * rank['orders'] / rank['views']).round(2)
rank['revenue_per_view'] = (rank['revenue'] / rank['views']).round(2)
print(rank[['title', 'views', 'orders', 'conversion_pct', 'revenue_per_view']].to_string())

Expected output:

                        title  views  orders  conversion_pct  revenue_per_view
1  Custom Pet Portrait Canvas   3250      97            2.98              1.49
2   Personalized Wedding Sign   1400      32            2.29              2.29
3  Vintage-Style Recipe Cards   9000     268            2.98              0.30
4   Hand-Painted Ornament Set   2600      65            2.50              0.75
5  Digital Birth Announcement   4100     142            3.46              0.35

For the Pet Portrait Canvas, 97 / 3,250 x 100 = 2.98%. The Wedding Sign converts less often (2.29%) but earns the most per view (2.29 against 1.49), because its price is twice as high, which more than offsets its lower conversion (revenue per view is conversion times price). Which of these matters depends on what you are optimizing, and with 32 orders the 2.29% is itself imprecise.

Benchmarks

Etsy conversion rates vary by category, price and traffic source, and we have no sourced benchmark to give you, so this tutorial does not offer ranges such as "good" or "poor". Compare listings against each other within your shop, as described under "Benchmark Against Your Shop" in Step 8.

Diagnosing Low Conversion Rates

If a listing has high views but low conversions, investigate these common issues:

Low Conversion Checklist:
□ Photos: Are they professional quality? Show scale? Include lifestyle shots?
□ Pricing: Are you competitive with similar listings?
□ Shipping: Are costs reasonable and clearly stated?
□ Description: Does it answer common questions? Include dimensions/materials?
□ Reviews: Do you have any, and what do they say?
□ SEO: Are you attracting the wrong audience with mismatched keywords?

Step 6: Assess Profit Margins

Revenue is vanity; profit is sanity. A listing that generates $5,000 in revenue but only $500 in profit (10% margin) is less valuable than one generating $2,000 in revenue with $1,000 in profit (50% margin).

Calculating True Profit

To accurately assess profitability, account for all costs:

Total Costs Per Order:
+ Material Costs (supplies, packaging)
+ Labor Costs (your time × hourly rate)
+ Etsy Transaction Fee (rate varies, check your fee statement)
+ Payment Processing Fee (rate varies by country, check your statement)
+ Shipping Costs (if you offer free shipping)
+ Advertising Costs (Etsy Ads, Google, etc.)
+ Overhead Allocation (portion of shop expenses)
+ Listing fees (charged per listing, not per sale: spread them over the units sold)
= Total Cost

Profit Margin = ((Revenue - Total Costs) ÷ Revenue) × 100

Example Profit Calculation

The fee rates below (6.5% and 3% + $0.25) are assumptions for the illustration. Take your real rates from Etsy's fee pages and your payment account statements. This example leaves out listing fees and overhead; add them if you track them.

Listing: Personalized Wedding Sign
Selling Price: $100.00

Costs:
- Materials (wood, paint, hardware): $25.00
- Labor (3 hours × $20/hr): $60.00
- Etsy Transaction Fee (assumed 6.5%): $6.50
- Payment Processing (assumed 3% + $0.25): $3.25
- Packaging & Shipping: $12.00
- Allocated Advertising: $5.00
Total Costs: $111.75

Profit per Sale: $100.00 - $111.75 = -$11.75
Profit Margin: -11.75%

The same figures feed the table below: the Wedding Sign has a cost per order of 111.75 (Step 2), 32 orders, and so a total profit of 32 x -11.75 = -376.00.

rank['profit'] = (rank['revenue'] - rank['orders'] * rank['cost_per_order']).round(2)
rank['margin_pct'] = (100 * rank['profit'] / rank['revenue']).round(1)
print(rank[['title', 'revenue', 'profit', 'margin_pct']].to_string())
shop_margin = 100 * rank['profit'].sum() / rank['revenue'].sum()
print('shop margin:', round(shop_margin, 1), '| total profit:', round(rank['profit'].sum(), 2))

Expected output:

                        title  revenue  profit  margin_pct
1  Custom Pet Portrait Canvas   4850.0  1940.0        40.0
2   Personalized Wedding Sign   3200.0  -376.0       -11.8
3  Vintage-Style Recipe Cards   2680.0   938.0        35.0
4   Hand-Painted Ornament Set   1950.0   585.0        30.0
5  Digital Birth Announcement   1420.0   965.6        68.0
shop margin: 28.7 | total profit: 4052.6

With these assumed costs, the Wedding Sign loses 11.75 on each sale even though it has the second-highest revenue, so it is a candidate for a price or cost review. The table shows a shop margin of 28.7%: total profit of 4,052.60 on revenue of 14,100.00.

Profit Optimization Strategies

For low-margin listings, consider these approaches:

Step 7: Make Data-Driven Decisions

Now comes the most crucial step: translating your analysis into action. Based on your listing performance data, you'll categorize each listing into one of four strategic buckets.

The Four-Quadrant Framework

Place each listing on two axes: revenue (at or above the shop median, or below) and profit margin (at or above the shop-wide margin, or below). The cut-offs are a convention for sorting, not a statistical test.

median_revenue = rank['revenue'].median()
rank['revenue_side'] = rank['revenue'].ge(median_revenue).map({True: 'High Rev', False: 'Low Rev'})
rank['margin_side'] = rank['margin_pct'].ge(shop_margin).map({True: 'High Margin', False: 'Low Margin'})
print('median revenue:', median_revenue, '| shop margin:', round(shop_margin, 1))
print(rank[['title', 'revenue_side', 'margin_side']].to_string())

Expected output:

median revenue: 2680.0 | shop margin: 28.7
                        title revenue_side  margin_side
1  Custom Pet Portrait Canvas     High Rev  High Margin
2   Personalized Wedding Sign     High Rev   Low Margin
3  Vintage-Style Recipe Cards     High Rev  High Margin
4   Hand-Painted Ornament Set      Low Rev  High Margin
5  Digital Birth Announcement      Low Rev  High Margin

In this example, two listings are Stars (Pet Portrait, Recipe Cards), one is a Cash Cow (Wedding Sign), two are Rising Stars (Ornament Set, Birth Announcement) and none is a Dog. The Ornament Set is a Rising Star only narrowly: its 30.0% margin is just above the 28.7% shop margin. The diagram shows what each quadrant usually suggests:

                    HIGH PROFIT MARGIN
                            |
        Stars               |        Rising Stars
    (High Rev, High Profit)|    (Low Rev, High Profit)
    → Promote heavily      |    → Scale up
    → Maintain quality     |    → Increase visibility
                            |
---------------------------|---------------------------
                            |
        Cash Cows          |        Dogs
    (High Rev, Low Profit) |    (Low Rev, Low Profit)
    → Optimize costs       |    → Retire
    → Increase prices      |    → Replace
                            |
                    LOW PROFIT MARGIN

Strategic Actions by Category

Stars (High Revenue, High Profit):

Rising Stars (Low Revenue, High Profit):

Cash Cows (High Revenue, Low Profit):

Dogs (Low Revenue, Low Profit):

Creating Your Action Plan

Document specific actions for each listing:

Example Action Plan:

LISTING: Custom Pet Portrait Canvas (STAR, margin 40.0%)
Actions:
- Raise the Etsy Ads budget for this listing
- Add size and frame variations
- Ask suppliers for bulk quotes
- Check after 60 days: revenue and margin against the previous 60 days

LISTING: Personalized Wedding Sign (CASH COW, margin -11.8%)
Actions:
- Review the cost per order (111.75): labor is 60.00 of it
- Test a higher price on this listing and compare orders before and after
- Decide in advance what margin you need before you keep it

Step 8: Interpreting Your Results

Understanding what your data really means requires looking beyond surface-level numbers to uncover the story behind your listings' performance.

Context Is Everything

Before making decisions based on your analysis, consider these contextual factors:

Statistical Significance Matters

A listing with 3 sales and 10 views (30% conversion) isn't necessarily better than one with 30 sales and 150 views (20% conversion). The sample size is too small to draw conclusions.

Small counts give unstable rates, and 3 sales on 10 views cannot be compared with 30 sales on 150 views. As working minimums for this tutorial, which are rules of thumb and not tested thresholds:

Working minimums (rules of thumb, not tested thresholds):
- At least 10 orders per listing
- At least 100 views per listing
- At least 30 days of data
- Comparison between periods of equal length

Correlation vs. Causation

Just because two metrics move together doesn't mean one causes the other. For example:

Benchmark Against Your Shop, Not Others

Your goal isn't to match industry averages. It's to optimize your shop's performance:

Internal Benchmarking Strategy:
1. Identify your top 20% performers (your personal "best")
2. Compare other listings against this group
3. Set goals to bring mid-performers up to top-tier levels
4. Track improvement over time, not just absolute numbers

If your top listings convert at 5% and another listing converts at 2% with a comparable price and traffic, that gap is worth investigating, once you have checked that both have enough views for the rates to be stable.

Step 9: Common Issues and Solutions

Even with proper setup, you may encounter challenges during listing performance analysis. Here are the most common issues and their solutions.

Issue 1: Insufficient Data

Problem: Most listings have too few orders to compare.

Causes:

Solutions:

✓ Extend analysis period to 90+ days
✓ Lower your minimum-orders cutoff, and note that the comparison is weaker
✓ Remove category or price range filters
✓ If shop is genuinely new, focus on top 3-5 listings only
✓ Wait until you have at least 50 total orders before deep analysis

Issue 2: Inconsistent Product Names

Problem: The same product appears as multiple separate listings in your analysis.

Causes:

Solutions:

✓ Use "Listing ID" instead of "Listing Name" for grouping
✓ Manually consolidate renamed listings in your CSV before upload
✓ Create a "Product Family" column to group variations

Issue 3: Revenue Doesn't Match Etsy Dashboard

Problem: Total revenue in your analysis differs from the Etsy dashboard.

Causes:

Solutions:

✓ Check that your refund handling matches the Etsy view you compare against
✓ Ensure date ranges are identical (including time zones)
✓ Verify whether shipping is included in revenue totals
✓ If a gap remains, find its cause (refunds, time zone, shipping, fees) rather than assuming it is noise

Issue 4: All Listings Show Low Conversion Rates

Problem: Even your best-selling listings show conversion rates below 1%.

Causes:

Solutions:

✓ Verify you are using views for each listing, not views for the whole shop
✓ Cross-check view counts with Etsy's native analytics
✓ Consider using "Favorites" as an alternative engagement metric
✓ Focus on relative conversion rates between listings, not absolute numbers

Issue 5: Can't Determine Accurate Profit Margins

Problem: You don't have detailed cost data for each listing.

Solutions:

✓ Estimate material costs based on recent supplier invoices
✓ Use average labor time × your hourly rate
✓ Start with rough estimates (±20% accuracy) and refine over time
✓ Track costs for new orders going forward
✓ Focus on relative profitability rankings even with estimates

Perfect data isn't required, directionally correct insights are better than no analysis at all.

Sources

By MCP Analytics Team |

Run It on Your Own Etsy Export

Export your orders from Etsy as a CSV and upload it at MCP Analytics, then ask the question in plain language; the report names the method. Nothing connects to your Etsy account. Views and costs are not in an order export, so add them to your file first if you want conversion and margin.

Try it on your data

Next Steps with Etsy Analytics

You now know the basics of listing performance comparison, but this is just the beginning of data-driven Etsy shop management. Here's how to build on these skills:

1. Implement Your Action Plan

Don't let analysis become "analysis paralysis." Within 48 hours of completing your comparison:

2. Track Changes Over Time

Create a performance tracking spreadsheet:

Month | Top Listing | Revenue | Conversion % | Actions Taken
------|-------------|---------|--------------|---------------
Jan   | Pet Portrait| $4,850  | 2.98%        | Increased ads
Feb   | [Update]    | [Track] | [Monitor]    | [Document]

3. Expand Your Analysis

Once you are comfortable with listing comparison, explore these advanced topics:

4. Optimize Beyond Listings

Apply similar analytical thinking to other aspects of your Etsy business:

Continuous Improvement Cycle

Make listing performance analysis a regular habit:

Monthly: Quick review of top/bottom performers
Quarterly: Deep dive with profit margin analysis
Annually: Strategic planning for next year's product mix
Ad-hoc: After major changes (new product launch, price change, etc.)

The most successful Etsy sellers don't rely on intuition. They check their decisions against data. Comparing your listings regularly gives you evidence to work from.

Conclusion

Listing performance comparison transforms you from a reactive shop owner to a proactive business strategist. Instead of wondering why sales are slow or which products to invest in, you now have concrete data showing exactly where to focus your energy and resources.

Remember these key takeaways:

By following this tutorial, you've learned not just how to analyze listing performance, but why it matters and what to do with the insights you uncover. This systematic approach to product evaluation will serve you throughout your Etsy selling journey, helping you build a more profitable, sustainable business.

Now it's time to put this knowledge into action. Try the comparison on your own export and see which products deserve your attention.

Explore more: Etsy Shop Analytics: all tools, tutorials, and guides →

Not sure which plan? Compare plans →

Your turn

Bring your own data and the question you actually need answered.

MCP AnalyticsData science by email Send us your data and your question, and we will reply. ds@mcpanalytics.ai