WooCommerce tells you what you sold. It does not tell you what you kept. The gap between the two is made of a handful of costs, and once you know which ones belong in the sum, net profit is arithmetic rather than guesswork. This guide sets out the sum, works through an example, and explains how to keep the result stable from one month to the next.
Revenue, gross profit and net profit
Three figures get used loosely, and it helps to pin them down before adding anything up.
- Revenue is what customers paid you for the goods, after discounts and excluding VAT. Delivery charges and VAT are kept separate, because neither is payment for the product.
- Gross profit is revenue less the cost of the goods you sold. It answers one question: does this product earn more than it costs to buy?
- Net profit goes further and takes off the costs each order brings with it: what the carrier charged you for the parcel and what the payment provider took. Whatever the customer paid you for delivery is added back, because it is income against that carrier cost.
Accountants also use “net profit” for the figure left after every overhead: rent, salaries, advertising, software. That is a valid figure, but it is a different one. In a shop’s day-to-day reporting it is more useful to stop at the costs that come with each order, because those are the ones that move with sales and the ones you can change by repricing, renegotiating a carrier rate or switching a gateway. Subtract fixed costs once a month, on top. Whichever definition you use, write it down and use the same one every month.
What to subtract from revenue
Cost of goods
The price you pay the supplier for each unit, multiplied by the units sold. Two details decide whether this figure is honest:
- Use the cost at the time of the sale. If a supplier raises a price in March, February’s orders still cost February’s price. A method that looks up today’s cost for last month’s orders rewrites last month.
- Do not treat a missing cost as zero. A product with no cost recorded shows a 100% margin. It will look like your best performer when in fact you know nothing about it. Count the revenue standing on missing costs separately, so you know how much of the result is unmeasured.
Shipping you pay the carrier
WooCommerce records what the customer paid for delivery. It does not record what the carrier invoiced you. Note what each delivery method costs you per parcel and apply it per order. Free-shipping orders matter most here: the customer paid nothing, but the parcel still cost you something.
Payment gateway fees
Card processors and wallets usually take a percentage, a fixed amount per transaction, or both, and they usually charge on the whole amount the customer paid, VAT and delivery included. Most gateways do not write their fee onto the WooCommerce order, so you have to apply your own rate per gateway. Cash on delivery and bank transfer may have their own costs; if one genuinely costs nothing, record it as zero on purpose rather than leaving it blank.
Refunds
A refund takes revenue back. If the goods come back too and can be sold again, their cost comes back as well, so a full refund of a returned item removes its profit rather than turning into a loss of the whole selling price. If you refund an amount as goodwill and nothing is returned, you lose the money and keep no stock.
Then decide which month a refund belongs to. Booking it in the month it was issued keeps closed months closed: March’s profit does not change in May because an order from March was refunded in May. Booking it against the original order’s month gives a different, also defensible, picture, but it means past months keep moving. Pick one and keep to it.
VAT
VAT you collect from customers is not your revenue; it belongs to the tax authority. Work on revenue excluding VAT. On the cost side, if your business is VAT-registered and reclaims input VAT, use costs excluding VAT too. If it cannot reclaim VAT on purchases, the VAT you pay is a real cost and belongs in the cost of goods. The mistake to avoid is mixing the two: revenue without VAT against costs with VAT understates every margin.
A worked example
The figures below are invented for illustration. They describe one month in a hypothetical shop, all excluding VAT.
| Line | Amount |
|---|---|
| Revenue from goods, after discounts | €12,000 |
| Refunds issued this month | −€400 |
| Cost of goods sold | −€6,300 |
| Cost of refunded goods returned to stock | +€160 |
| Gross profit | €5,460 |
| Delivery charged to customers | +€900 |
| What the carriers charged | −€1,500 |
| Payment gateway fees | −€390 |
| Net profit | €4,470 |
Net revenue after refunds is €11,600, so the gross margin is 47.1% and the net margin, on the same base, is 38.5%. Rent, salaries and advertising would come off after that.
Two things are worth noticing. Delivery cost the shop €600 more than customers paid for it, which is invisible in a sales report. And the €160 line is easy to forget: leave it out and the refunds look €160 more expensive than they were.
Why WooCommerce’s own reports show sales, not profit
WooCommerce Analytics is a sales tool. Its Revenue report shows gross sales, returns, coupons, net sales, taxes, shipping and total sales; its Products report shows items sold, net sales and orders per product. None of these figures involves what the goods cost you.
Recent WooCommerce versions do have a native Cost of Goods Sold feature: a cost field on each product and a cost column on each order. WooCommerce’s own documentation says it does not integrate with Analytics, so there is still no report that adds it up into profit. There is also no field for carrier costs or gateway fees. The guide on the native Cost of Goods Sold field covers what it does and does not do.
One more difference to know about: Analytics dates orders by the date they were paid by default, so orders with no paid date, typically bank transfer or cash on delivery, are left out until payment is recorded. Whatever you build, check it uses the date you think it does.
Doing it in a spreadsheet
A spreadsheet works, if it is built carefully.
- Export the month’s orders with their line items: product or SKU, quantity, line total excluding VAT, delivery charged, payment method and shipping method.
- Add a cost per unit to each line. Copy the value in as a number, not as a live lookup into your current price list, or the next price change will rewrite this month.
- Add a carrier cost per order from the shipping method, and a fee per order from the gateway’s rate.
- Export the month’s refunds separately, with what was returned.
- Sum it in the order shown in the table above.
The weak points are predictable. Lookups into a live cost list drift. Products without a cost silently become 100% margin. Refunds end up in whichever month the export happened to cover. And every month starts from a fresh export, so a figure you reported in March can come out differently when someone rebuilds March in June.
Doing it with a plugin
A plugin earns its place if it fixes those weak points, not just if it draws a chart. Look for one that records the cost against each order line when the sale happens, rather than multiplying today’s product cost by units sold. Check how it dates refunds, what it does with products that have no cost, and whether carrier and gateway costs are included or left out.
Caltru Ledger is a free plugin built that way. It keeps costs in WooCommerce’s own Cost of Goods Sold field, records each order line’s cost at the moment of sale and never rewrites it, books refunds on the refund date, and reports missing costs as their own number instead of counting them as profit. Once you enter what each delivery method and payment gateway costs you in its settings, the dashboard shows net profit beside gross. It does not include landed costs or overheads such as rent and salaries, so those still come off afterwards. The profit reporting page shows what the reports look like.
A short checklist
- Revenue excludes VAT and delivery; costs are on the same VAT basis.
- Each sale is costed at the price that applied when it was sold.
- Missing costs are counted, not treated as zero.
- Carrier costs and gateway fees come off per order, including on free-shipping orders.
- Refunds are booked by a rule you have written down, and returned stock gives its cost back.
- Overheads are subtracted separately, after the per-order figure.