how-to · · 7 min read
how to work out profit per order in woocommerce (and the four costs your report is probably missing)
WooCommerce shows what an order took in, not what it made. Here is the per-order profit formula, a worked example, the four costs most reports leave out, and how to set your store up so the number is honest.
By Big Bad Agency
Open any WooCommerce order and you’ll see a total. Items, a coupon, shipping, maybe tax. It’s a clean number, and it tells you what the customer paid.
It doesn’t tell you what you made.
That gap is the reason so many stores feel busy and broke at the same time. Revenue goes up, the bank balance doesn’t follow, and nobody can point at which orders made money and which ones quietly cost money to fulfil.
Here’s how to work out profit per order properly, with a worked example, and the four costs that most reports leave out.
the formula
For one order:
profit = what you kept from the customer − what the goods cost you − what it cost to get them out the door
Spelled out:
- Revenue you keep: item totals after coupons and discounts, plus shipping you charged. Leave out sales tax. You collected it for someone else.
- minus cost of goods: what each unit that shipped cost you, for the size or variation that actually sold.
- minus the shipping label: what you paid the carrier, which is rarely what you charged.
- minus the payment fee: your processor’s percentage plus its fixed per-transaction charge.
- minus per-order packaging: the box, mailer, insert, sticker. Whatever every order gets regardless of size.
Refunds come off afterwards. If the goods came back, reverse the sale and the cost of goods. If it was a goodwill refund, only the revenue drops.
a worked example
These numbers are made up for illustration. Plug in your own.
A customer buys two 100 g bags of tea at $24 each and uses a 10% coupon. You charge $8 shipping. No sales tax applies to this order.
- Items after the coupon: $48 − $4.80 = $43.20
- Plus shipping charged: $8.00 → revenue you keep: $51.20
- Cost of goods: 2 × $10.25 = −$20.50
- Shipping label you actually paid: −$9.40
- Payment fee at an illustrative 2.9% + $0.30 on $51.20: −$1.78
- Mailer and insert: −$0.60
Profit on the order: $18.92. That’s a 37% margin on what the customer paid.
Now look at what a product-level report would have said about the same sale. $48 of tea at $20.50 cost is a 57% margin. Twenty points of difference, and none of it is a rounding error. It’s the coupon, the shipping you under-charged, the fee and the packaging. Those are real dollars, and they never show up on a product report.
Discounts are the easiest of these to give away without noticing. If you run buy-more-save-more pricing, we wrote up how to set up WooCommerce quantity discounts, including how to check a tier still makes money.
the four costs your report is probably missing
1. the cost of the size that sold, not the product
A variable product has a cost per variation. If the cost lives on the parent product and every size inherits it, your big sizes look far more profitable than they are. WooCommerce (since 10.3) has its own cost field, and on a variable product the parent’s value is just a default. Set a cost on every variation.
There’s a second trap here. A report that multiplies past sales by today’s cost restates history every time a supplier changes a price. If you need last quarter to stay last quarter, the cost has to be stored on the order line when the sale happens.
2. the shipping label
Shipping charged is revenue. The label is a cost. They’re two different numbers, and free-shipping-over-$X promotions live entirely in the gap between them. WooCommerce doesn’t know what you paid the carrier unless the label is bought through a plugin that records it on the order, so in most stores this cost is simply absent.
3. the payment fee
Your processor keeps a percentage plus a fixed fee per transaction, and that fixed part hurts small orders far more than big ones. On a $10 order, a $0.30 fixed fee is 3% before the percentage even starts. Some gateway extensions write the fee onto the order. Many don’t, and then the fee is just the difference between your sales and your payouts.
4. packaging and the bits in the box
The mailer, the tissue, the thank-you card. A dollar per order is invisible until you multiply it by every order you shipped last month.
setting your store up so the number is honest
You don’t need a data warehouse for this. You need four habits:
- Cost on every variation, with the parent cost only as a fallback.
- One definition of cost, written down: purchase price only, or landed cost with inbound freight. Pick one and keep it.
- Fees and packaging as rules, not guesses: a percentage plus a fixed fee per payment method, and a flat per-order amount for packaging.
- A standing check: anything showing a 100% margin is a missing cost, not a miracle product.
where our plugin fits (and where it stops)
We built BigBad Store Toolkit for the first three habits, because we needed them ourselves. It’s free on WordPress.org.
- A cost field on every product and every variation, plus category-level defaults and a global fallback, so a missing cost is a decision rather than a silent zero.
- Cost and margin columns on the Products list, sortable, with Quick Edit for fast entry.
- An Overhead & Fees tab: a percentage and a flat fee per payment gateway, a per-order overhead for packaging, and a daily overhead spread across orders. The margin figures subtract all of it.
Pro adds the reporting layer: margin over a date range, top products and categories, and a day-by-day revenue-against-cost chart.
What it doesn’t do, said plainly so you can plan around it:
- It doesn’t show a profit line on each individual order. It reports margins by product, category and day.
- It uses each product’s current cost. Change a cost today and past periods are recalculated at the new figure.
- It doesn’t know your shipping label cost.
If you need cost frozen onto every order line when the sale happens, labels or other one-off costs attached to a specific order, or several stores rolled into one set of books, that’s a different tool. Our sister product TeamBooks does that job for WooCommerce stores, and it reads the costs you set in Store Toolkit when it first imports your products.
Either way, start with the formula above and work out one real order from last week by hand. If the answer surprises you, that’s the number your reports have been missing.