WooCommerce Ad Profitability: Track Real Margin
Priya Raghunathan
E-commerce Performance Manager
WooCommerce profit tracking for ads means answering one question that no single screen answers: after product costs, refunds, shipping, payment fees and ad spend, did this month's advertising make money? WooCommerce holds the orders, Meta, Google and TikTok hold the spend, and your margin sits somewhere in between. This guide shows where each number lives in a WooCommerce store, how to tie orders back to ads, and how to turn the result into WooCommerce ROAS you can trust and rules you can act on.
If you run a Shopify store too, our Shopify profit tracking guide covers the same method with Shopify's fields. Here we stay on WooCommerce specifics and keep the theory short.
Quick answer
To track profit from ads on WooCommerce, turn on the core Cost of Goods Sold feature and add a cost to every product and variation, take net sales from WooCommerce Analytics, subtract COGS, the shipping you paid, payment fees and other variable costs, then divide that contribution margin by total ad spend across every platform. That ratio is POAS, and 1.0 is break-even.
Put this guide to work
Launch, test and scale campaigns on six ad platforms from one place, with Wavo, the AI copilot, at your side. Free for 14 days.
ROAS vs POAS in brief
ROAS divides revenue by ad spend. It ignores coupons, product cost, shipping, payment fees, refunds and tax, so it nearly always looks better than the bank account. POAS, profit on ad spend, replaces revenue with contribution margin:
- Contribution margin = net sales minus COGS, shipping costs, payment fees and other variable costs
- POAS = contribution margin ÷ total ad spend (break-even at 1.0)
- Break-even ROAS = 1 ÷ contribution margin %
That is all the theory you need here. For the long version, read why your ROAS doesn't match your profit and the reported vs true ROAS framework, which rebuilds ROAS from order data step by step.
Where costs live in WooCommerce
WooCommerce spreads the inputs for profit across product settings, order screens, Analytics reports and third-party statements. Knowing which is which saves hours of reconciling.
Product costs: the core COGS feature
For years WooCommerce had no cost field in core, and stores relied on extensions or spreadsheets. That has changed. WooCommerce now ships a Cost of Goods Sold feature in core: per its COGS documentation, you enable it under WooCommerce, Settings, Advanced, Features, then enter a cost on the General tab of each product. Variable products take a default cost that variations inherit, and you can override it per variation. The default is zero, so an empty field quietly reads as a free product.
Two details matter for ad profitability. First, the cost is saved on each order line, and the order screen shows a cost column and a cost total, so a later price change does not rewrite past orders. Second, the same page states plainly: "Currently, the COGS feature does not integrate with WooCommerce Analytics." You will not find a profit report in Analytics; you sum costs from orders or an export.
If your store already uses a cost-of-goods extension or plugin, it may store costs in its own fields. Pick one source, migrate if you need to, and do not run two.
Net sales, coupons and refunds in Analytics
WooCommerce Analytics includes reports for Revenue, Orders, Products, Variations, Categories, Coupons, Taxes, Stock, Customers, Downloads and Order attribution, according to the WooCommerce Analytics documentation. The Revenue report gives you the lines you need, and the definitions matter:
- Gross sales: product price times quantity, not including refunds, coupons, taxes or shipping.
- Net sales: gross sales minus returns and coupons. This is the revenue figure to build profit on.
- Total sales: net sales plus taxes and shipping. Do not use it for ROAS or POAS; tax is not yours and shipping income is offset by your carrier bill.
Refunds appear as a negative number on the date the refund happened, not on the date of the original order. A month with a wave of returns from a previous promotion will look worse than the month that caused them, so review on a rolling window.
Shipping, payment fees and taxes
The shipping figure in Analytics is what you charged customers, not what you paid carriers. Take the cost side from carrier invoices or your label service. Payment fees depend on your gateway, so pull them from the gateway's statements or payouts; if you cannot get them per order, a tested average percentage is better than nothing. Keep taxes out of revenue entirely. Packaging, fulfilment fees and any per-order app charges belong in contribution margin too.
Tracking ads on a WooCommerce store
Ad platforms need purchase events to optimise, and you need orders tied to campaigns to split POAS by channel. These are two separate jobs.
Platform extensions for Meta, Google and TikTok
The main platforms each publish an official WooCommerce integration:
- Meta for WooCommerce (published by Facebook, slug facebook-for-woocommerce) connects the store to Facebook, Instagram and WhatsApp, uploads your catalogue for dynamic ads and installs the pixel, per its WordPress.org listing.
- Google for WooCommerce syncs your product feed to Google, helps launch Performance Max campaigns and adds "automatic Google tagging and conversion tracking", per its WordPress.org listing.
- TikTok for WooCommerce installs the TikTok Pixel, enables the Events API and offers catalogue sync, per its WooCommerce marketplace page.
These make woocommerce facebook ads tracking and its Google and TikTok equivalents much easier, but they feed each platform its own view of conversions. They do not tell you profit, and platform-reported revenue still overlaps. Our guide to why ad platforms double count conversions explains how to measure that gap against your orders.
Order attribution and UTMs
WooCommerce 8.5 introduced Order Attribution, which the 8.5 release post says is "enabled by default for new and existing stores". The order attribution documentation explains that each order stores the referring source, UTM source, medium, campaign, content and term, the device type and the session page views.
Know its limits before you build on it:
- It uses a last-click model and works within one session, so it cannot follow a visitor across sessions.
- It only covers orders placed after the feature was enabled; there is no back-fill.
- It reads UTMs, so consistent tagging on every ad is what makes channel splits possible. Our UTM tracking system guide shows how to set naming that holds up.
Joining ad spend from several platforms
WooCommerce has no field for ad spend. To get POAS you export spend from Meta, Google, TikTok, Taboola, Snapchat and Outbrain for the same dates, in the store currency and the same time zone, and put it next to WooCommerce net sales and costs.
Work in this order. Calculate blended POAS first, total contribution margin over total spend, because it does not depend on attribution. Then split by channel using order attribution and UTM data, leaving untagged orders in an "unattributed" bucket rather than spreading them by guesswork. Finally split by product, since blended margin hides the SKUs that lose money. If you juggle many platforms, our framework for managing ads across multiple platforms covers the wider routine.
A worked example
The numbers below are hypothetical, in plain units of store currency, chosen only to show the method. One month, three platforms, figures excluding tax.
What the ad platforms report
| Platform | Spend | Reported revenue | Reported ROAS |
|---|---|---|---|
| Meta | 5,000 | 15,000 | 3.0 |
| 4,000 | 12,000 | 3.0 | |
| TikTok | 1,000 | 3,000 | 3.0 |
| Total | 10,000 | 30,000 | 3.0 |
What WooCommerce and your invoices say
| Line | Amount |
|---|---|
| Gross sales (Analytics) | 24,000 |
| Coupons | minus 1,600 |
| Returns | minus 1,400 |
| Net sales | 21,000 |
| COGS (order cost totals) | minus 8,800 |
| Shipping paid to carriers | minus 1,700 |
| Payment fees | minus 600 |
| Packaging and other variable costs | minus 400 |
| Contribution margin | 9,500 |
The maths:
- Blended ROAS on net sales: 21,000 ÷ 10,000 = 2.1, not 3.0.
- Contribution margin %: 9,500 ÷ 21,000 = about 45 percent.
- Break-even ROAS: 1 ÷ 0.45 = about 2.2.
- POAS: 9,500 ÷ 10,000 = 0.95.
The dashboards say 3.0. The store is losing a little on every unit of ad spend before fixed costs.
Now split with order attribution. Say Meta-tagged orders brought 10,500 of net sales, Google 7,000, TikTok 1,500, and 2,000 had no campaign source. At a 45 percent margin, Meta returns about 4,725 on 5,000 of spend (POAS 0.95), Google about 3,150 on 4,000 (POAS 0.79) and TikTok about 675 on 1,000 (POAS 0.68). Every platform reported the same ROAS; the profit picture differs sharply. In a real store you would also use each channel's own product mix, since COGS differs by SKU.
Decision rules for scaling
Numbers only help when they become rules your team applies every week, the same way, whoever is on shift.
- Know your break-even ROAS, per store and ideally per product line. Below it, each sale loses money.
- Set a target POAS that covers fixed costs. If fixed costs are 2,000 a month and planned spend is 10,000, you need 12,000 of contribution: a target of 1.2.
- Scale above target, hold between break-even and target, cut below break-even, judged on blended POAS first, then channel and product.
- Give prospecting a longer window. Last-click, single-session attribution undercounts channels that start journeys, so review them on a 30-day blended view.
- Fix products before campaigns. A campaign selling a loss-making SKU will never reach target, however well it is tuned.
Common mistakes
These are the errors that most often turn WooCommerce ROAS into a misleading number:
- Leaving the cost field at zero. The core COGS feature defaults to zero, which flatters margin.
- Using total sales instead of net sales. It adds tax and shipping income back in.
- Reading refunds by order date. Analytics books them on the refund date; compare like with like.
- Treating shipping charged as shipping paid. They are different numbers.
- Summing platform-reported revenue. Overlapping attribution double counts orders.
- Expecting attribution history. Order attribution only covers orders after it was enabled.
- Mixing POAS conventions. Decide whether ad spend is already deducted and write it down.
Where Wevion fits
Wevion's Profitability Analytics, in beta, connects your WooCommerce or Shopify store, reads the cost you enter in the WooCommerce cost of goods field (or Shopify's cost per item) and lets you set shipping and fees once in Settings. It takes COGS, shipping, payment fees, extra costs and ad spend off net sales to show profit, margin and POAS, works out your break-even POAS and breaks margin down for every SKU.
Spend comes from Meta, Google, TikTok, Taboola, Snapchat and Outbrain, synced into one view about every 15 minutes, so the join between orders and spend is already done. Wavo, the AI copilot, can propose budget changes based on that view, and nothing changes until you approve it. If you are comparing tools, our roundup of DTC ecommerce ad analytics tools and the wider ads management platform guide set out the options.
Key takeaways
- WooCommerce now has a core Cost of Goods Sold feature, but it does not feed WooCommerce Analytics, so costs come from orders.
- Build profit on WooCommerce net sales, which excludes coupons, returns, taxes and shipping, never on total sales.
- Order attribution, on by default since 8.5, gives last-click, single-session UTM data per order; tag every ad consistently.
- POAS is contribution margin over total ad spend; 1.0 is break-even, and your target should cover fixed costs.
- Decide on blended POAS, then rank channels and SKUs with attributed POAS.
Want profit and POAS for your WooCommerce store next to spend from every platform? Start a 14-day free trial of Wevion on the Pro plan, no card needed.
Explore more in
Ads Management Platform
Read the curated pillar page with every guide in this topic, ordered from foundations to advanced.