WooCommerce Analytics: Reports, Order Attribution, GA4 and Fixes

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.
| Report | What it answers |
|---|---|
| Overview (dashboard) | Performance tiles, charts and leaderboards: top customers, coupons, categories and products |
| Revenue | Gross sales, returns, coupons, net sales, taxes, shipping and total sales by day, week, month or quarter |
| Orders | Order count, average order value and a list of orders with status, customer type and products |
| Products and Variations | Items sold, net sales and orders per product or per variation |
| Categories | The same sales metrics rolled up by product category |
| Coupons | Orders using each coupon and the discount amount |
| Customers | Each customer’s orders, total spend, average order value and location |
| Taxes | Order tax and shipping tax by tax code |
| Downloads | Downloads of digital products |
| Stock | Stock 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:
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:
| Gap | Why it matters | What fills it |
|---|---|---|
| No traffic or sessions | No conversion rate, no funnel, no landing page performance | GA4, Matomo or another traffic tool |
| Sales without sources in the reports | You cannot see which channel produced revenue | Order attribution plus the WooCommerce Analytics extension, or GA4 |
| Last-click only | Channels that start journeys get no credit | A multi-touch view in GA4 or a warehouse |
| No ad spend | No cost per order or return on ad spend | Ad platform data joined in a spreadsheet or BI tool |
| No cohorts or lifetime value by channel | Hard to judge repeat buyers by acquisition source | Metorik 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.
- Install and activate Google Analytics for WooCommerce.
- Go to WooCommerce > Settings > Integration and paste your GA4 measurement ID (it starts with G-).
- 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.
- Open your store in a private window (the plugin does not track logged-in admins) and place a test order.
- Watch the events in GA4 DebugView: view_item, add_to_cart, begin_checkout and purchase, with the WooCommerce order number as the transaction ID.
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 question | Tool | Where the data lives | Cost model |
|---|---|---|---|
| What sold, refunds, coupons, tax | Built-in WooCommerce Analytics | Your database | Free |
| Which channel or campaign brought each order (last click) | Order Attribution + WooCommerce Analytics extension | Order meta + Woo-run sync | Free (beta) |
| Traffic, funnel, conversion rate | GA4 via Google Analytics for WooCommerce | Free | |
| GA4 ecommerce reports inside WordPress | MonsterInsights | Google, shown in WP | Paid tier for ecommerce |
| Own your data, track orders despite blockers | Matomo WooCommerce plugin | Matomo Cloud or your server | Paid plugin, free trial |
| Customer segments, cohorts, profit | Metorik | Metorik’s servers | Priced by monthly orders |
| Sales exports for accounting | Ninjalytics or built-in CSV | Your database | Free and paid versions |
| Ad spend joined to orders | Warehouse or ETL tool | Your warehouse | Varies |
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
| Metric | Formula | Source |
|---|---|---|
| Net sales | Gross sales − returns − coupons | WooCommerce Analytics |
| Average order value | Net sales ÷ orders | WooCommerce Analytics |
| Ecommerce conversion rate | Purchases ÷ sessions | GA4 or Matomo (needs sessions) |
| Cart abandonment rate | 1 − purchases ÷ sessions with add_to_cart | GA4 or Matomo |
| Refund rate | Returns ÷ gross sales | WooCommerce Analytics |
| Repeat customer share | Returning customers ÷ customers | Customers report or attribution extension |
| Revenue per landing page | Order revenue ÷ landing page, by channel | Order meta or GA4 |
| Revenue per organic click | Organic revenue ÷ Search Console clicks | Order 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 page | Organic orders | Revenue | Revenue per order | Organic clicks (GSC) | Revenue per click |
|---|---|---|---|---|---|
| /guides/espresso-grinder-buying-guide | 18 | $3,240 | $180 | 2,400 | $1.35 |
| /product/burr-grinder-x | 41 | $6,970 | $170 | 5,100 | $1.37 |
| /blog/descale-espresso-machine | 9 | $585 | $65 | 3,900 | $0.15 |
| /collections/espresso-beans | 63 | $2,835 | $45 | 9,000 | $0.32 |
| Total | 131 | $13,630 | $104 | 20,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 Analytics | GA4 | |
|---|---|---|
| Orders / purchases | 350 | 315 |
| Revenue figure | $42,000 net sales | $40,950 purchase revenue |
| Per order | $120.00 | $130.00 |
- Compare counts before money. 315 ÷ 350 = 90%, so GA4 is missing 35 orders, or 10%.
- 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.
- 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.
- 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.
- 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
| Symptom | Likely cause | Fix |
|---|---|---|
| No Analytics menu | Feature turned off | WooCommerce > Settings > Advanced > Features: enable WooCommerce Analytics |
| Today’s orders missing | Updates set to Scheduled (every 12 hours) | Click Update Now, or switch Updates to Immediately on low-traffic stores |
| Older months empty | Historical data never imported | Analytics > Settings > Import Historical Data |
| Figures differ from the orders list | Stale report cache or excluded statuses | WooCommerce > Status > Tools > Clear Analytics Cache, check excluded statuses, then re-import |
| “Orders failed to import” warning | Individual orders errored | View the log, fix the cause, then Retry failed imports |
| Import stuck | Background jobs not running | Check WooCommerce > Status > Scheduled Actions for pending or failed analytics jobs; confirm WordPress cron runs |
| Attribution says Unknown or blank | Order before 8.5 or before the feature was on, consent declined, firewall blocking cookies | Enable Order Attribution, review consent setup, try the base64 cookie filter |
| Extension reports empty or wrong | No WordPress.com connection, sync gap, multi-currency store | Reconnect, 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