Workflow

How to find the products losing you money

You can do this in a spreadsheet, and for one store with thirty products it is an afternoon well spent. Here is the method, in the order that stops you having to redo it.

1. Get your true cost per unit

Start with what you pay your supplier per unit, per variant — not per product. A size or a colour that is more expensive to buy is a different number, and averaging it is how a losing variant hides inside a winning product.

Add the cost of getting it to the customer that you actually bear: inbound freight per unit, packaging, and outbound shipping where you do not charge it through. If you charge shipping separately and it covers itself, leave it out of both sides rather than adding it to one.

In Shopify this is the cost-per-item field on the variant. Filling it is the single highest-value hour of this whole exercise, because every later step multiplies it.

2. Take off transaction fees

Payment processing is usually a percentage of the order plus a fixed amount — commonly somewhere around 2–3% plus a small per-transaction fee, though yours is on your processor’s statement and you should use that rather than a rule of thumb.

Apply it to the selling price excluding VAT. If your prices include VAT, strip it first: a 20% VAT rate on a €49.95 price leaves €41.63 of revenue, and treating the gross figure as revenue overstates every margin on the sheet by a fifth.

3. Account for returns

A return usually costs you the revenue, the return shipping and — depending on the category — some or all of the unit cost. Take your return rate per product, not a store-wide average: apparel and electronics rarely resemble each other.

The simple treatment is to multiply the contribution per order by one minus the return rate. That assumes a returned order is fully refunded and the unit is not resold, which is pessimistic for some categories and exactly right for others. State the assumption on the sheet so the next person reading it knows which one you made.

4. Pull ad spend per product

In Google Ads, the shopping-performance report gives cost by item id for Shopping and Performance Max campaigns. Export it for the same period as your orders — and use the same period on both sides, ending yesterday, so a partial day does not distort either.

Spend that is not tied to an item id is real money and needs a line of its own. Do not distribute it across your products to make the total reconcile; you will end up condemning a product for someone else’s spend.

If your ad account bills in a different currency from your store, convert each day at that day’s rate rather than the period’s average. A single blended rate quietly moves profit between days, which matters the moment you compare two weeks.

5. Compare against break-even

For each product: contribution per order is the price, minus the unit cost, minus shipping you bear, minus the fee percentage of the price. Multiply by one minus the return rate and divide by the price, and you have the returns-adjusted margin.

Break-even ROAS is one divided by that margin. A product with a 40% adjusted margin needs 2.50× before it pays for its own advertising; at 25% it needs 4.00×.

Now put each product’s actual ROAS beside its break-even ROAS. Anything below the line is being funded by the rest of your catalogue.

The shortcut, if you prefer one number

Divide what is left after cost of goods by the ad spend. That is POAS, and its break-even is always 1.00× for every product in the catalogue — so there is no per-product target to look up. Below 1.00×, the product is losing money on every sale.

What you will find

Usually: two or three products carrying the account, a long tail that is roughly break-even and harmless, and a handful that have been losing money continuously for longer than anyone realised — often the ones with the best-looking ROAS, because thin margins sell easily.

You will also find variants that disagree with their product, and markets that disagree with their store. Both are ordinary, and both are invisible in any view that reports at the account level.

Or stop rebuilding the spreadsheet

The method above is correct. The problem is that it is correct on the day you do it, and your catalogue, your costs and your campaigns have all moved by the following Monday.

Opteno runs exactly this join continuously: Shopify orders, refunds and cost-per-item against Google Ads daily spend, converted at each day’s own rate, over rolling 7, 14 and 30-day windows, per product, variant, country and market. Where an input is missing it names it rather than guessing, and from the same screen you can draft a product in Shopify or take its offers out of a Performance Max asset group — both waiting for your approval.

See which products are losing you money

Connect Shopify and Google Ads in under five minutes. From $14.99 a month, cancel whenever you want, and no change to your store or your campaigns without your approval.

[email protected]

How to find the products losing you money — Opteno