How to Use Product Performance Analysis in WooCommerce: Step-by-Step Tutorial
Updated October 2026
Introduction to Product Performance Analysis
Understanding which products drive revenue and which ones underperform is critical for any WooCommerce store owner. Product performance analysis transforms raw sales data into actionable insights that help you make informed decisions about inventory management, marketing spend, pricing strategies, and product development.
In this comprehensive tutorial, you'll learn how to conduct thorough product performance analysis for your WooCommerce store. Whether you're managing a catalog of 50 products or 5,000, these techniques will help you identify your star performers, understand why certain products underperform, and develop data-driven strategies to optimize your entire product portfolio.
Unlike simple sales reports that show basic order counts, true product performance analysis examines multiple dimensions: revenue contribution, profit margins, conversion rates, customer retention patterns, and trend analysis over time. This multi-faceted approach reveals insights that single-metric reports miss entirely.
Prerequisites and Data Requirements
What You Need Before Starting
Before diving into product performance analysis, ensure you have the following in place:
- Active WooCommerce Store: You need a functioning WooCommerce installation with enough order history that your main products have a reasonable number of orders
- Admin Access: Full administrative access to your WordPress/WooCommerce dashboard to export your order data
- Clean Product Data: Products should have consistent naming, proper categorization, and accurate pricing information
- Order History: Enough orders per product that revenue and trend comparisons are not driven by a handful of purchases
- Cost Data (Optional but Recommended): Product cost information enables profit margin analysis, not just revenue tracking
Understanding Your Data Structure
The code below reads a CSV with one row per order line item. Rename your export's columns to these names:
Order IDandOrder DateOrder Status(so cancelled and failed orders can be dropped)Product SKUandProduct NameQuantityandLine Total(the line's revenue; decide once whether it includes tax and shipping, and use the same definition throughout)
The figures in the outputs below come from a synthetic data set generated for this tutorial (20 products, about 4,000 orders from July to December 2024); your numbers will differ.
Data Quality Checklist
Before running your analysis, verify data quality with this checklist:
- No Duplicate Products: Check for products with identical names but different SKUs
- Consistent Pricing: Ensure price changes are documented if you're analyzing historical performance
- Complete Orders: Filter out test orders, cancelled orders, or incomplete transactions
- Accurate Timestamps: Verify that order dates reflect actual purchase times, not processing delays
- Product Variations Handled Properly: Decide whether to analyze variations separately or aggregate them under parent products
Step-by-Step Guide to Product Performance Analysis
Step 1: Export Your Order Items
Export order line items from WooCommerce as a CSV (from the orders list, an export plugin, or a database query; the menus and options differ by version and plugin). Include the columns listed above and save the file as woocommerce_order_items.csv.
Expected Outcome: A CSV with one row per product on each order, with quantities, line totals and dates.
Step 2: Choose the Period and Filters
Defining the right period and filters ensures your analysis answers a specific business question. Load the file, keep paid orders, and set the date range:
import pandas as pd
items = pd.read_csv('woocommerce_order_items.csv', parse_dates=['Order Date'])
# Keep paid orders only: drop cancelled and failed
items = items[~items['Order Status'].isin(['cancelled', 'failed'])]
# Optional filters: period and product subset
items = items[(items['Order Date'] >= '2024-07-01') & (items['Order Date'] <= '2024-12-31')]
print(f"Line items: {len(items)}, orders: {items['Order ID'].nunique()}, products: {items['Product SKU'].nunique()}")
print(f"Date range: {items['Order Date'].min().date()} to {items['Order Date'].max().date()}")
Expected Output:
Line items: 7017, orders: 3969, products: 20
Date range: 2024-07-01 to 2024-12-31
Choose a period that reflects your business cycle: a recent month or quarter for fast-moving inventory, a full year to capture seasonality, or custom periods to compare campaigns and holiday seasons. You can narrow to a category, price range or tag with another filter line, such as items[items['Product Name'].isin([...])].
Performance Metrics
Decide which metrics matter for your objective:
- Total Revenue: Sum of line totals per product
- Units Sold: Total quantity ordered
- Average Selling Price: Revenue divided by units
- Conversion Rate: Views to purchases (needs page-view data from outside WooCommerce's order tables)
- Profit Margin: (revenue - costs) / revenue x 100 (needs cost data)
- Customer Retention: Percentage of repeat purchasers for each product
Expected Outcome: Your data is scoped to answer a specific question such as "Which products generated the most revenue last quarter?"
Step 3: Compute Revenue, Units and Share per Product
Group the line items by product:
perf = items.groupby('Product Name').agg(revenue=('Line Total', 'sum'), units=('Quantity', 'sum'))
perf['avg_price'] = (perf['revenue'] / perf['units']).round(2) # revenue per unit
perf['pct_of_total'] = (100 * perf['revenue'] / perf['revenue'].sum()).round(1)
perf = perf.sort_values('revenue', ascending=False)
print(perf.head(5).to_string())
print(f"Total store revenue: ${perf['revenue'].sum():,.2f}, units: {perf['units'].sum()}")
Expected Output:
revenue units avg_price pct_of_total
Product Name
Premium Headphones 153004.00 1061 144.21 37.1
Wireless Mouse 50937.92 1605 31.74 12.4
Mechanical Keyboard 27420.90 310 88.45 6.6
USB-C Cable (3pk) 24609.42 2498 9.85 6.0
Bluetooth Speaker 17682.50 323 54.74 4.3
Total store revenue: $412,416.29, units: 10513
The average price is revenue divided by units, so it can sit slightly below list price when some orders were discounted (the headphones' list price in this file is $145.00). In this file one product, Premium Headphones, earns 37.1% of revenue, which is critical information for inventory and marketing decisions.
Expected Outcome: You can see which products contribute most to revenue and where the store depends on a single item.
Step 4: Interpret Performance Metrics in Context
Raw numbers tell only part of the story. Here is how to read the key metrics:
Revenue vs. Volume Analysis
Compare revenue with units. Premium Headphones earned $153,004 from 1,061 units (about $144 per unit), while USB-C Cable (3pk) earned $24,609 from 2,498 units (about $10 per unit). The first is a high-priced item and the second sells in volume; a high average price alone does not show pricing success, which needs costs, demand and a comparison with alternatives.
Performance Distribution
Measure how concentrated your revenue is instead of assuming an 80/20 split:
share = perf['revenue'].cumsum() / perf['revenue'].sum()
n = len(perf)
top20 = max(1, round(0.2 * n))
print(f"Products: {n}")
print(f"Top 20% of products ({top20}) earn {100 * share.iloc[top20 - 1]:.1f}% of revenue")
print(f"Products needed for 80% of revenue: {int((share < 0.8).sum() + 1)}")
Expected Output:
Products: 20
Top 20% of products (4) earn 62.1% of revenue
Products needed for 80% of revenue: 9
Here the top 20% of products earn 62.1% of revenue and it takes 9 of 20 products to reach 80%. Your catalog will have its own concentration, which is the number to use for planning inventory and marketing.
Trend Analysis
Snapshots are valuable, but trends reveal trajectory. Compare the current period with the previous one:
items['quarter'] = items['Order Date'].dt.to_period('Q')
q = items.pivot_table(index='Product Name', columns='quarter', values='Line Total', aggfunc='sum', fill_value=0)
q.columns = [str(c) for c in q.columns]
q['growth_%'] = (100 * (q['2024Q4'] - q['2024Q3']) / q['2024Q3']).round(1)
print(q.loc[perf.head(5).index].round({'2024Q3': 0, '2024Q4': 0, 'growth_%': 1}).to_string())
Expected Output:
2024Q3 2024Q4 growth_%
Product Name
Premium Headphones 71572.0 81432.0 13.8
Wireless Mouse 27721.0 23217.0 -16.2
Mechanical Keyboard 14756.0 12665.0 -14.2
USB-C Cable (3pk) 12373.0 12236.0 -1.1
Bluetooth Speaker 8954.0 8728.0 -2.5
Premium Headphones grew 13.8% quarter over quarter while Wireless Mouse fell 16.2% and Mechanical Keyboard 14.2%. A decline of that size is a prompt to investigate (stock, price, competition, seasonality), but a one-quarter change can also be ordinary variation, so look at more periods before acting.
For background on telling real changes from random variation, see A/B Testing and Statistical Significance.
Expected Outcome: You can identify not just top performers, but products on the rise, products in decline, and patterns that inform inventory planning.
Step 5: Identify Top Performers and Underperformers
With your data analyzed and contextualized, group products into performance tiers. The tier boundaries are your choice; a simple start is revenue rank combined with the quarter-over-quarter trend:
Star Performers (Top Revenue Contributors)
These products show:
- High revenue contribution
- Strong or growing sales trends
- Healthy profit margins (if cost data is available)
- Low return rates
Action Items: Check that stock keeps pace with demand, consider product bundles, and consider targeted advertising or product line extensions
Rising Stars (High Growth Potential)
These products show:
- Fast growth from a modest revenue base
- Strong conversion or engagement metrics, if you have them
Action Items: Increase visibility through homepage features, email campaigns, and social media promotion
Steady Contributors (Middle Performers)
These products provide:
- Consistent but unremarkable performance
- Stable demand without significant growth or decline
- Catalog completeness and variety
Action Items: Maintain current inventory and marketing levels, test price changes, explore cross-sell opportunities
Underperformers (Low Revenue Contributors)
These products show:
- Low revenue despite adequate inventory and visibility
- Declining or stagnant trends
- Poor conversion or high return rates, if you have them
- Low or negative profit margins, if you have cost data
Action Items: Investigate causes (pricing, product-market fit, descriptions, images), test discount promotions, consider discontinuation or clearance
Expected Outcome: You have a categorization of your product portfolio with candidate actions for each tier.
Step 6: Deep Dive into Underperformer Causes
Identifying underperformers is just the beginning. Understanding why they underperform enables targeted fixes:
Common Underperformance Causes
- Visibility Issues: Product isn't featured in navigation, search results, or recommendations
Test: Compare product page views with category averages (needs page-view data) - Pricing Misalignment: Price is too high relative to perceived value or competitor offerings
Test: Compare price points to similar products and review cart abandonment (needs checkout data) - Poor Product Presentation: Low-quality images, inadequate descriptions, missing specifications
Test: Review bounce rates and time-on-page for product listings (needs page analytics) - Product-Market Fit: Product doesn't match customer needs or expectations
Test: Analyze customer reviews, return reasons, and support tickets - Inventory or Fulfillment Issues: Frequent stockouts or slow shipping
Test: Review stock history and delivery times
Several of these tests need data that is not in the order export, such as page views, checkout steps, ratings and returns. Combine the sources you have, compare a weak product with products in the same category, and treat each test as a hypothesis about the cause rather than a diagnosis.
Expected Outcome: You have a short list of hypotheses for each underperformer and know which data would test them.
Step 7: Take Action and Measure Results
Product performance analysis is only useful if it changes something. Implement changes one product at a time where you can, and measure their impact:
Optimization Playbook
For Top Performers:
- Stock: base reorder quantities on demand variability and supplier lead time, so top sellers do not run out
- Bundles: "Frequently Bought Together" featuring your stars
- Variants: new colors, sizes, or configurations
- Retargeting: visitors who viewed but did not buy
- Placement: homepage features, category headers, email spotlights
For Underperformers:
- Price test: try a lower price on a subset of traffic and compare units and margin
- Listings: professional photography, detailed descriptions, videos
- Limited-time promotion: boost visibility and gather data
- Bundle with stars: pair with top performers to increase exposure
- Clearance decision: if there is no improvement after a period you set in advance, move to clearance
Measurement Framework
After implementing a change, recompute the same metrics from Step 3 for the same product over a comparable period and compare them with the period before the change. Revenue before and after a change also reflects seasonality, promotions and stock, so compare against similar products you did not change, and watch margin as well as revenue: a clearance can raise revenue while lowering margin.
Expected Outcome: You have a repeatable process of changing one thing, measuring it, and keeping what works.
Advanced Interpretation Techniques
Cohort Analysis for Product Performance
Don't just analyze products in isolation: analyze how different customer cohorts interact with your products:
- New vs. Returning Customers: Do certain products attract new customers while others drive repeat purchases?
- Geographic Performance: Do products perform differently in various regions or countries?
- Seasonal Cohorts: How does performance vary across holiday, back-to-school, or summer seasons?
- Acquisition Channel: Do organic search visitors buy different products than email subscribers?
To do this, add a customer identifier to your export and compute each product's share of revenue from first-time and returning customers. The result informs targeting and customer journey decisions.
Predictive Performance Modeling
Historical analysis tells you what happened; forecasting estimates what may happen. A time-series forecasting method can address questions such as:
- When current star performers will decline
- Which rising stars will become top performers
- Optimal reorder points based on predicted demand
- Revenue projections under different pricing scenarios
Forecasts are only as good as the history behind them, so check them against periods you held back.
Run It on Your Own WooCommerce Export
Export your order items from WooCommerce as a CSV and upload it at MCP Analytics. The analysis runs a product performance analysis (revenue, units and share by product) on your file and shows the result with the method used. You choose the columns; nothing connects to your WooCommerce account.
Troubleshooting Common Issues
Issue 1: Data Shows Zero Revenue for Active Products
Symptoms: Products you know have sold show $0 revenue or 0 units in analysis
Causes and Solutions:
- Date Range Mismatch: Your analysis period doesn't include recent orders
Solution: Expand date range or verify order timestamps - Order Status Filtering: Analysis excludes certain order statuses (pending, processing)
Solution: Decide which statuses count as sales (for example processing and completed) and exclude cancelled and failed, then apply that consistently - Product Variations: Sales are attributed to variations rather than parent product
Solution: Configure analysis to roll up variations to parent product or analyze variations separately - Stale Export: The CSV was exported before the latest orders
Solution: Export again with an end date after the most recent order
Issue 2: Inconsistent Product Names Cause Fragmentation
Symptoms: Same product appears multiple times with slight name variations ("USB-C Cable", "USB C Cable", "USB-C Cable - Black")
Causes and Solutions:
- Manual Entry Errors: Products created with inconsistent naming
Solution: Standardize product names in WooCommerce admin, use SKU for unique identification - Variation Naming: Color/size variations treated as separate products
Solution: Use WooCommerce product variations feature properly with parent-child relationships - Historical Changes: Product renamed but historical orders retain old name
Solution: Use product ID or SKU for analysis instead of product name, or create mapping table
Issue 3: Performance Metrics Don't Match WooCommerce Reports
Symptoms: Total revenue or order counts differ between your calculation and WooCommerce's own reports
Causes and Solutions:
- Tax and Shipping Inclusion: One report includes tax/shipping, another excludes it
Solution: Verify whether reports use gross or net revenue; standardize on line item totals excluding tax/shipping for product performance - Refund Handling: Different treatment of refunded orders
Solution: Decide whether to subtract refunds from revenue or exclude refunded orders entirely; apply consistently - Timezone Differences: Reports use different timezone settings
Solution: Verify timezone settings in WordPress, WooCommerce, and your analysis match - Rounding Differences: Minor discrepancies due to currency rounding
Solution: Small differences of a few cents per order can come from rounding; investigate larger gaps
Issue 4: Not Enough Data for a Reliable Comparison
Symptoms: The numbers compute but change a lot from period to period
Causes and Solutions:
- Low Order Volume: Few orders per product in the analysis period
Solution: Extend date range, analyze category level instead of individual products, or wait until sufficient data accumulates - High Variability: Product has sporadic, unpredictable sales patterns
Solution: Use medians instead of means, aggregate to longer periods, or categorize as "insufficient data" - New Product Launch: Product recently introduced with limited history
Solution: Tag as "new" and track separately; compare to historical new product performance rather than mature catalog
Issue 5: Analysis Is Too Slow with Large Catalogs
Symptoms: Performance analysis takes minutes to run or times out with large product catalogs
Causes and Solutions:
- Unoptimized Queries: Database queries lack proper indexes
Solution: Export only the columns and date range you need, or add indexes on the fields you filter and join on - Full Catalog Analysis: Attempting to analyze all products simultaneously
Solution: Filter to specific categories, price ranges, or date ranges; analyze top 80% by revenue separately from long tail - Heavy Queries on the Live Database: Analysis runs against your production database
Solution: Work from a CSV export, a database replica or a pre-aggregated table
Conclusion
Product performance analysis transforms your WooCommerce store from reactive to strategic. By systematically identifying top performers, understanding underperformers, and implementing data-driven optimizations, you maximize revenue from your existing catalog without necessarily adding new products.
Make product performance analysis a regular practice, at a rhythm that matches how fast your inventory moves. This keeps you aligned with shifting customer preferences and market dynamics.
Start with the framework outlined in this tutorial, then customize your approach based on your specific business model, product catalog, and customer base. The insights you uncover will guide smarter inventory decisions, more effective marketing, and ultimately, stronger profitability.
Ready to begin? Export your order items and run the code above to see which products deserve more attention and which need optimization or retirement.
Explore more: WooCommerce Analytics: all tools, tutorials, and guides →
Not sure which plan? Compare plans →