New · A dedicated AI SEO channel: see conversions from ChatGPT, Perplexity, Claude & Gemini →
← Blog
Part of: SEO Conversion Tracking: Measure Conversions and Value from Organic Search →

WooCommerce Analytics: Reports, Order Attribution, GA4 and Fixes

Portrait of Samy ThuillierBy ··14 min read
WooCommerce analytics dashboard with revenue, orders and order attribution by channel and landing page

WooCommerce analytics is the reporting built into WooCommerce, under Analytics in your WordPress admin, that shows revenue, orders, products, coupons, taxes, stock and customers for any date range. It tells you what sold and for how much, but not where buyers came from: for that you need WooCommerce’s order attribution data, a traffic tool such as GA4, or both.

This guide covers what the built-in reports contain and how their numbers are calculated, the settings that quietly change those numbers, how order attribution decides an order’s source, how to add GA4 without double counting, which extra tool answers which question, and how to fix reports that look wrong. It ends with two things the usual plugin lists skip: revenue by organic landing page from data your store already stores, and a worked example of reconciling WooCommerce with GA4.

What WooCommerce Analytics Includes

WooCommerce Analytics (officially “Analytics and Sales Reports”) reads your store’s order data, stores a processed copy in its own report tables, and shows it as summary numbers, a chart and a sortable table. Every report shares the same tools: a date range picker with comparison to the previous period or previous year, filters, column toggles and a CSV download. Larger CSV exports run in the background and are emailed to the admin who requested them.

ReportWhat it answers
Overview (dashboard)Performance tiles, charts and leaderboards: top customers, coupons, categories and products
RevenueGross sales, returns, coupons, net sales, taxes, shipping and total sales by day, week, month or quarter
OrdersOrder count, average order value and a list of orders with status, customer type and products
Products and VariationsItems sold, net sales and orders per product or per variation
CategoriesThe same sales metrics rolled up by product category
CouponsOrders using each coupon and the discount amount
CustomersEach customer’s orders, total spend, average order value and location
TaxesOrder tax and shipping tax by tax code
DownloadsDownloads of digital products
StockStock status and quantity per product

The dashboard at WooCommerce > Overview can be rearranged: rename sections, hide tiles, move sections up or down, or remove them. Since WooCommerce 10.5 there is also a data status indicator and an Update Now button that triggers an import on demand.

How the numbers are calculated

Most confusion about WooCommerce numbers comes from mixing up three sales figures. The definitions below are from the WooCommerce Analytics documentation:

Gross sales = price × quantity (no refunds, coupons, tax or shipping)
Net sales = gross sales − returns − coupons
Total sales = gross sales − returns − coupons + taxes + shipping
Average order value = net sales ÷ orders

Refunds behave differently from what many people expect. They appear as a negative value on the day the refund happened, not on the date of the original order. Refunded shipping and tax are subtracted from the shipping and tax figures, not from Returns. So a big refund in October on a September order lowers October’s net sales, which matters when you compare months.

Settings that change your numbers

Open Analytics > Settings before you trust any report. Four settings decide what is counted:

  • Excluded statuses. By default Pending payment, Cancelled and Failed orders are left out, while Processing, On hold and Completed are counted. Custom order statuses are counted unless you exclude them. Refunded cannot be excluded.
  • Date type. Revenue and order reports use Date paid by default. You can switch to Date created or Date completed, which moves orders between days and months.
  • Updates. Scheduled (the default) refreshes analytics data every 12 hours. Immediately updates as new data arrives and can slow busy stores.
  • Default date range. Month to date, unless you change it.

The same settings screen holds Import Historical Data. A store that had orders before Analytics was active needs this import, or older periods will look empty. Very large stores can import in slices (a year or a quarter at a time) with “skip previously imported customers and orders” turned on.

What the Built-In Reports Cannot Tell You

WooCommerce Analytics only sees orders. It has no sessions, visitors or page views, so it cannot calculate a conversion rate, a cart abandonment rate or a bounce rate. One of the plugin roundups in the search results says the built-in dashboard shows store visits; the official metric list contains no visits or sessions metric at all, so treat that claim as wrong.

The practical limits, and what fills each one:

GapWhy it mattersWhat fills it
No traffic or sessionsNo conversion rate, no funnel, no landing page performanceGA4, Matomo or another traffic tool
Sales without sources in the reportsYou cannot see which channel produced revenueOrder attribution plus the WooCommerce Analytics extension, or GA4
Last-click onlyChannels that start journeys get no creditA multi-touch view in GA4 or a warehouse
No ad spendNo cost per order or return on ad spendAd platform data joined in a spreadsheet or BI tool
No cohorts or lifetime value by channelHard to judge repeat buyers by acquisition sourceMetorik or a warehouse export

Order Attribution: Where WooCommerce Orders Come From

Since WooCommerce 8.5, core WooCommerce records the source of every new order. The feature is called Order Attribution, it is on by default, and you can check it under WooCommerce > Settings > Advanced > Features. For each order it saves the source type, referrer, UTM tags, device type, the entry page of the session and the number of pages viewed. You see it in an “Order attribution” box on the order screen, an Origin column in the orders list, and a “Customer history” box with the customer’s order count, refunds and total spend.

The free WooCommerce Analytics extension turns that raw data into five reports: orders by channel, by source, by device, by campaign, and by channel and source combined. You can compare gross sales, net sales, refunds, orders, coupons, new versus repeat customers and average order value across them. Know its limits before you install it:

  • It is in early access (beta).
  • It supports single-currency stores only; multi-currency stores get inaccurate totals.
  • It syncs order data to a WooCommerce-run service through a WordPress.com connection to keep your store fast.
  • It only reports orders placed after Order Attribution was enabled. Older orders have no source to report.
  • If a sync gap appears, run the manual sync under WooCommerce > Status > Tools.

How Order Attribution Classifies a Visit (and Why Orders Show “Direct”)

No ranking page explains how WooCommerce decides an order’s origin, yet that logic decides every number in the attribution reports. Here is what the Order Attribution documentation and the WooCommerce source code show.

  • Last click, 30-minute sessions. The order gets 100% of the credit assigned to the last source before the visit. A session ends after 30 minutes of inactivity, and the data lives in browser cookies (names starting with sbjs_) until checkout, when it is saved on the order.
  • Precedence rules. UTM-tagged and organic visits always replace the stored source. A direct visit never overwrites an earlier source. A referral only replaces it when no session is active.
  • The label you see. Source types map to labels: UTM visits show as “Source: x”, search engines as “Organic: x”, other sites as “Referral: x”, no referrer as “Direct”, orders created in the admin as “Web admin”, and missing data as “Unknown”.
  • Google versus other engines. The script is built on the open-source Sourcebuster library. It treats any visit from a Google domain as organic, but for Bing, Yahoo and others it also requires a search parameter (such as q=) in the referrer. Browsers usually send only the site origin to other domains (see how referrers work), so check whether your Bing orders appear as “Referral: bing.com” instead of organic before you read the channel report.
  • Consent and firewalls. The feature supports the WP Consent API, so a visitor who declines tracking may produce an order with no source. Some web application firewalls block the cookies; WooCommerce 9.0+ has a filter, wc_order_attribution_use_base64_cookies, that encodes them to avoid false positives.

Orders from ChatGPT, Perplexity and other AI assistants

AI assistants are not a channel in WooCommerce, so their orders hide inside the other labels. Links cited in ChatGPT often carry utm_source=chatgpt.com, which WooCommerce shows as “Source: chatgpt.com”. Assistants that pass a referrer show up as “Referral: perplexity.ai” or similar. Assistants that pass nothing land in Direct, and no tool can recover those. To see the total, filter the orders list by origin or group the source meta by value. The AI conversion tracking guide covers the full list of assistant referrers and UTM patterns.

Connect WooCommerce to Google Analytics 4

GA4 adds what WooCommerce lacks: sessions, landing pages, channels and the funnel from product view to purchase. The simplest route is the free Google Analytics for WooCommerce plugin, maintained by the WooCommerce team.

  1. Install and activate Google Analytics for WooCommerce.
  2. Go to WooCommerce > Settings > Integration and paste your GA4 measurement ID (it starts with G-).
  3. Remove every other GA4 tag: theme code, Site Kit, MonsterInsights or a GA4 tag in Google Tag Manager. The plugin adds the base GA4 tag itself, so a second tag doubles page views and purchases.
  4. Open your store in a private window (the plugin does not track logged-in admins) and place a test order.
  5. Watch the events in GA4 DebugView: view_item, add_to_cart, begin_checkout and purchase, with the WooCommerce order number as the transaction ID.
One setup step that does not exist

A guide in the top results tells you to switch on “E-commerce events” in GA4’s Enhanced Measurement. There is no such toggle. Google’s list of enhanced measurement events covers page views, scrolls, outbound clicks, site search, video, file downloads and form interactions. Purchase and cart events only reach GA4 when your plugin or dataLayer sends them.

MonsterInsights is the other common route: it connects to GA4 and shows ecommerce reports inside WordPress, but those ecommerce reports need its paid Pro tier. If you would rather not use Google at all, Matomo’s WooCommerce plugin sends orders from your server, so purchases are recorded even when a browser blocks the tracking script. Our WordPress analytics plugin guide compares the WordPress options in more depth.

Which WooCommerce Analytics Tool Answers Which Question

The plugin roundups in the search results rank tools; it is more useful to start from the question you need answered. Prices change often and the two roundups quote different starting prices for the same tools, so confirm on each vendor’s page.

Your questionToolWhere the data livesCost model
What sold, refunds, coupons, taxBuilt-in WooCommerce AnalyticsYour databaseFree
Which channel or campaign brought each order (last click)Order Attribution + WooCommerce Analytics extensionOrder meta + Woo-run syncFree (beta)
Traffic, funnel, conversion rateGA4 via Google Analytics for WooCommerceGoogleFree
GA4 ecommerce reports inside WordPressMonsterInsightsGoogle, shown in WPPaid tier for ecommerce
Own your data, track orders despite blockersMatomo WooCommerce pluginMatomo Cloud or your serverPaid plugin, free trial
Customer segments, cohorts, profitMetorikMetorik’s serversPriced by monthly orders
Sales exports for accountingNinjalytics or built-in CSVYour databaseFree and paid versions
Ad spend joined to ordersWarehouse or ETL toolYour warehouseVaries

For most stores the working stack is built-in Analytics for money, Order Attribution for the source of each order, and one traffic tool. Add a fourth tool only when a specific question is still unanswered.

Metrics Worth Tracking, and Which Tool Has Them

MetricFormulaSource
Net salesGross sales − returns − couponsWooCommerce Analytics
Average order valueNet sales ÷ ordersWooCommerce Analytics
Ecommerce conversion ratePurchases ÷ sessionsGA4 or Matomo (needs sessions)
Cart abandonment rate1 − purchases ÷ sessions with add_to_cartGA4 or Matomo
Refund rateReturns ÷ gross salesWooCommerce Analytics
Repeat customer shareReturning customers ÷ customersCustomers report or attribution extension
Revenue per landing pageOrder revenue ÷ landing page, by channelOrder meta or GA4
Revenue per organic clickOrganic revenue ÷ Search Console clicksOrder meta + Search Console

Revenue by Organic Landing Page, From Data You Already Have

Search engines do not pass keywords, so the closest you get to “which SEO work makes money” is revenue by the page where the buyer entered. WooCommerce already stores that page on every attributed order in the meta key _wc_order_attribution_session_entry, next to _wc_order_attribution_source_type. None of the reports show it, but you can query it. On a store using high-performance order storage (HPOS), run this read-only query on a staging copy or read replica:

-- Organic orders by landing page (HPOS order tables, default wp_ prefix)
SELECT
  m_entry.meta_value            AS landing_page,
  COUNT(*)                      AS orders,
  ROUND(SUM(o.total_amount), 2) AS revenue
FROM wp_wc_orders o
JOIN wp_wc_orders_meta m_type
  ON m_type.order_id = o.id
 AND m_type.meta_key = '_wc_order_attribution_source_type'
JOIN wp_wc_orders_meta m_entry
  ON m_entry.order_id = o.id
 AND m_entry.meta_key = '_wc_order_attribution_session_entry'
WHERE o.type = 'shop_order'
  AND o.status IN ('wc-processing', 'wc-completed')
  AND m_type.meta_value = 'organic'
  AND o.date_created_gmt >= '2026-07-01'
GROUP BY landing_page
ORDER BY revenue DESC;

Change the wp_ prefix to yours. On stores still using the legacy posts table, the same keys sit in wp_postmeta and the total is _order_total. The entry page is a full URL, so strip query strings before grouping. Revenue here is the order total, including tax and shipping.

Worked example (illustrative numbers)

A coffee equipment store runs the query for one quarter and gets four pages:

Landing pageOrganic ordersRevenueRevenue per orderOrganic clicks (GSC)Revenue per click
/guides/espresso-grinder-buying-guide18$3,240$1802,400$1.35
/product/burr-grinder-x41$6,970$1705,100$1.37
/blog/descale-espresso-machine9$585$653,900$0.15
/collections/espresso-beans63$2,835$459,000$0.32
Total131$13,630$10420,400$0.67

The checks: 3,240 ÷ 18 = 180; 3,240 ÷ 2,400 = 1.35; 13,630 ÷ 131 = 104.05; 13,630 ÷ 20,400 = 0.67. The beans category has the most orders, but each click there is worth about $0.32. The buying guide earns $1.35 per click, roughly as much as the product page itself. That is the case for writing more buying guides, and a case you cannot make from the Revenue report or from traffic alone. The method behind it is covered in SEO conversion tracking.

Two cautions. Only orders with attribution data appear, so the totals undercount organic revenue by however many orders landed in Direct or Unknown. And this is last-click: a buyer who read the guide, left, and came back through an email is credited to email. If you do not want to maintain SQL, SEOConversion reads WooCommerce’s dataLayer purchase events and reports revenue from organic search and AI assistants by landing page, with one script and no cookies.

Why WooCommerce Revenue Does Not Match GA4: A Worked Example

Every store that runs both sees different totals. The useful question is whether the gap is normal or a broken setup. Work through it in a fixed order. Here is an illustrative month:

WooCommerce AnalyticsGA4
Orders / purchases350315
Revenue figure$42,000 net sales$40,950 purchase revenue
Per order$120.00$130.00
  1. Compare counts before money. 315 ÷ 350 = 90%, so GA4 is missing 35 orders, or 10%.
  2. Compare value per order. GA4 shows $130 per purchase against WooCommerce’s $120 net per order. A gap of $10 per order that matches your average tax plus shipping means the plugin sends the order total, so compare GA4 with Total sales, not Net sales. Never compare across definitions.
  3. Remove orders GA4 can never see. Say the orders list shows 6 orders with origin “Web admin” (phone orders entered by staff) and 4 paid through an off-site gateway where the buyer never returned to the thank-you page. That explains 10 of 35.
  4. Align dates and statuses. WooCommerce counts by Date paid in your store’s time zone and includes On hold orders; GA4 counts when the purchase event fired, in the property’s time zone. Orders paid near midnight on the last day of the month can move between months.
  5. What is left is browser loss. The remaining 25 orders, about 7% of 350, are buyers whose browser blocked or declined the GA4 tag. A steady gap of this kind is normal. A sudden jump, or GA4 showing more purchases than WooCommerce, points to a broken or duplicated tag.

Decision rule: use WooCommerce for revenue totals, refunds and anything you report to finance. Use GA4 or order attribution for shares (which channel, which page, what percentage). Shares survive a 10% loss much better than totals do.

Why WooCommerce Analytics Is Not Working: Fixes in Order

SymptomLikely causeFix
No Analytics menuFeature turned offWooCommerce > Settings > Advanced > Features: enable WooCommerce Analytics
Today’s orders missingUpdates set to Scheduled (every 12 hours)Click Update Now, or switch Updates to Immediately on low-traffic stores
Older months emptyHistorical data never importedAnalytics > Settings > Import Historical Data
Figures differ from the orders listStale report cache or excluded statusesWooCommerce > Status > Tools > Clear Analytics Cache, check excluded statuses, then re-import
“Orders failed to import” warningIndividual orders erroredView the log, fix the cause, then Retry failed imports
Import stuckBackground jobs not runningCheck WooCommerce > Status > Scheduled Actions for pending or failed analytics jobs; confirm WordPress cron runs
Attribution says Unknown or blankOrder before 8.5 or before the feature was on, consent declined, firewall blocking cookiesEnable Order Attribution, review consent setup, try the base64 cookie filter
Extension reports empty or wrongNo WordPress.com connection, sync gap, multi-currency storeReconnect, run the sync tool, or rely on core attribution data instead

WooCommerce Analytics API and Raw Data

The Analytics screens are a React app that reads WooCommerce’s own REST endpoints under the wc-analytics namespace, for example /wp-json/wc-analytics/reports/orders/stats. The same endpoints are available to authenticated scripts, which is the cleanest way to pull revenue into a spreadsheet or warehouse without screen exports. Developers can extend the reports with filters and extra columns, and both WooCommerce and the WooCommerce Analytics extension are open source, with WooCommerce’s code on GitHub. Order attribution values are plain order meta, readable through the orders data or the query above.

When you export, carry the definitions with the data: say whether a column is net or total sales, which statuses are excluded and which date type was used. Most disagreements between reports are disagreements between definitions. If you are moving this data into a broader model, the revenue attribution guide and the note on last click attribution explain what a last-click source can and cannot support.

FAQ

Why isn’t WooCommerce Analytics working?

Most cases come down to four things: the Analytics feature is switched off under WooCommerce > Settings > Advanced > Features, updates are on the 12-hour schedule, historical orders were never imported, or the report cache is stale. Click Update Now, run Clear Analytics Cache under WooCommerce > Status > Tools, then re-import historical data if the figures still look wrong. Check WooCommerce > Status > Scheduled Actions for failed analytics jobs.

How do I connect WooCommerce to Google Analytics?

Install the free Google Analytics for WooCommerce plugin, then paste your GA4 measurement ID under WooCommerce > Settings > Integration. The plugin adds the base GA4 tag and sends ecommerce events such as add_to_cart and purchase. Remove any other GA4 tag from your theme or Tag Manager so purchases are not counted twice, then place a test order and watch it arrive in DebugView.

Is WooCommerce Analytics free?

Yes. The built-in Analytics reports ship with WooCommerce at no cost, and the separate WooCommerce Analytics extension for order attribution is also free to install. The extension’s plugin page says future premium options or a quota-based model may come for larger stores, so check the listing before you depend on it.

What is the best analytics tool for WordPress and WooCommerce?

It depends on the question you need answered. Built-in WooCommerce Analytics is best for sales, products and refunds; GA4 (through Google Analytics for WooCommerce or MonsterInsights) is best for traffic and funnels; Matomo suits stores that want to own their data; Metorik suits stores that need customer segments and cohorts. Most stores run built-in Analytics plus one traffic tool.

What is replacing Google Analytics?

Google replaced Universal Analytics with Google Analytics 4, so any WooCommerce setup still sending Universal Analytics hits needs to move to GA4. Stores that want to leave Google altogether usually pick Matomo, a privacy-focused analytics tool or a dedicated store reporting platform. None of these replace WooCommerce’s own order records, which stay the source of truth for revenue.

Which big companies use WooCommerce?

WooCommerce does not publish a verified list of its largest stores, and third-party lists are built from technology detection that can be out of date. For analytics it matters less than it seems: what changes your setup is order volume, number of currencies and how many channels you sell through, not who else runs the same platform.

See which pages turn WooCommerce visits into revenue.

SEOConversion reads WooCommerce purchase events from the dataLayer and attributes revenue to organic search and AI assistants like ChatGPT and Perplexity, by landing page, with one cookieless script.

Start free