Glossary
Gross margin per product: definition, and how it differs from ad profit
Gross margin per product is the selling price minus the cost per item. It says what a unit leaves before advertising, fees and returns. In Opteno it is a catalogue figure — the lowest margin among the product’s variants that have a cost — so it does not move with the reporting window, and whether advertising the product paid is answered by POAS and net profit instead.
Last checked · More glossary
The definition, as an amount and as a percentage
Gross margin per product is price minus cost per item, for one unit. As an amount it is price − cost per item; as a percentage it is (price − cost per item) ÷ price × 100. Both say how much of each sale is left once the goods themselves are paid for — before advertising, payment fees and returns, and regardless of how many units sold.
Example (illustrative figures): a product sells for €50 excluding VAT and costs €20 per unit. Its gross margin is €30 per unit, or 60% of the price.
Two inputs decide whether the figure is honest. The price should exclude VAT: if your prices include it, strip it first, because it was never yours to keep. The cost per item should be the variant’s real unit cost — what you pay the supplier, plus inbound freight and packaging, plus outbound shipping where you bear it rather than charging it through. In Shopify, enter it in the cost-per-item field on each variant. Shopify’s own definition is narrower (the supplier price), so including freight and packaging is a choice; apply it the same way to every product.
How Opteno calculates gross margin
Opteno reports one gross margin per product, as an amount in the store’s currency: the lowest price − cost-per-item among the product’s variants that have a cost above zero. It is calculated from the catalogue — each variant’s price and cost-per-item as last synced from Shopify, not from orders — so it is the same in the 7, 14, 30 and 60-day windows. Opteno uses the price as stored and does not strip VAT, so if your prices include VAT, so does this figure.
- Gross margin = the lowest (variant price − variant cost-per-item) across the product’s variants whose cost-per-item is above zero.
- A cost-per-item of zero is treated as no cost: that variant is skipped, not counted as a unit that costs nothing. This applies to gross margin only: in cost of goods a zero counts as a unit that cost nothing, so leave an unknown cost blank rather than typing 0.
- It uses each variant’s catalogue price, so a discount on a particular order does not change it.
- If no variant has a cost above zero, gross margin is unavailable and the reason is shown instead of a number.
- When the store’s Cost of Goods setting is on and no default COG percentage is set, and some variants have a cost while others have none, gross margin is unavailable with the reason attached, rather than calculated from the variants that happen to be filled in.
- A store-wide cost percentage feeds cost of goods, POAS and net profit, but not gross margin, which always reads each variant’s own cost-per-item.
Example: why a zero cost is skipped
Example (illustrative figures): a product has a €50 variant costing €20 and a €5 sample variant whose cost-per-item was left at 0. Counting the zero would make the sample’s €5 the product’s lowest margin. Skipping it leaves €30, from the variant with a real cost. If the store’s Cost of Goods setting is on and no default COG percentage is set, and the sample’s cost is blank rather than zero, gross margin is unavailable until that cost is filled in.
In the dashboard you can set minimum and maximum bounds on gross margin in filters, use it as a threshold in an automation rule, and filter on it through the public API — in each case as an amount in the store’s currency, not a percentage: a bound of 30 in a euro store means €30 of margin per unit, not 30%. Every price change made from Opteno also stores gross margin with the 30 days of figures before it.
Gross margin vs POAS vs net profit
Gross margin is the most one unit could spend on being sold before shipping, fees and returns are counted; POAS and net profit tell you what was actually spent and what was left. Only POAS and net profit set ad spend against what the sales left after cost of goods, so only they answer whether advertising a product paid.
Gross margin
Price − cost per item, for one unit. A catalogue figure: it does not depend on sales, ad spend or the period.
POAS
(Revenue − cost of goods) ÷ ad spend, over a period. With POAS calculated the default (Contributed) way, break-even is 1.00×: below it, what the sales left after cost of goods did not cover the advertising.
Net profit
Revenue − cost of goods − ad spend, over a period, as an amount. Revenue here is gross sales minus refunds (Opteno’s default; a store setting can leave refunds out).
ROAS
Revenue ÷ ad spend. It measures the advert rather than the product, because no unit cost enters it.
Example (illustrative figures): the €50 product with a €30 gross margin sells 40 units in 30 days, with no refunds, and Google Ads spends €900 on it.
Step 1: Revenue
40 units × €50 = €2,000. With no refunds in this example, revenue is €2,000.
Step 2: Cost of goods
40 units × €20 cost-per-item = €800.
Step 3: ROAS
€2,000 ÷ €900 = 2.22×.
Step 4: POAS
(€2,000 − €800) ÷ €900 = €1,200 ÷ €900 = 1.33×, above the 1.00× break-even.
Step 5: Net profit
€2,000 − €800 − €900 = €300, or €7.50 per unit sold. The €30 gross margin per unit became €7.50 once the advertising was paid for.
In Opteno, cost of goods comes from each sold variant’s cost-per-item once the store’s Cost of Goods setting is on, or from a store-wide percentage if you set one. With neither, it is zero and POAS equals ROAS, even though gross margin still shows.
Now suppose, in the same example, spend rises to €1,400 for the same 40 sales. Gross margin is still €30, because nothing about the product changed. POAS falls to €1,200 ÷ €1,400 = 0.86× and net profit to −€200: each sale is now partly paid for by the rest of the catalogue. Gross margin alone would never have shown it.
The three are linked. For a single-variant product sold at its catalogue price, with no refunds and with cost of goods taken from its cost-per-item, POAS equals ROAS multiplied by the gross margin percentage: 2.22× × 60% ≈ 1.33×. Turned round, the ROAS at which POAS reaches 1.00× is 1 ÷ 60% = 1.67×. Treat that as a floor rather than a target: shipping you bear, payment fees and returns also come off, so a break-even ROAS worked out from gross margin alone is too low.
Why the lowest-margin variant, not an average
Taking the lowest variant gives a floor: at catalogue prices, no variant with a cost above zero leaves less. An average sits above the variant that earns least, and hides exactly the variant most likely to be losing money.
Example (illustrative figures): a backpack comes in a standard version at €50 costing €20 and a leather-trim version at €80 costing €58. The standard version leaves €30 (60%); the leather trim leaves €22 (27.5%). A simple average is €26. Opteno reports €22.
In the same example, at a 2.50× ROAS, the standard version’s POAS is 2.50 × 60% = 1.50× and the leather trim’s is 2.50 × 27.5% ≈ 0.69×. The leather trim looks like the premium product and is the thin one — one variant earning, the other losing, inside a product whose average margin looks comfortable.
An average also needs a weighting. A simple one gives a variant nobody buys the same say as the best seller; one weighted by units sold depends on the period, so gross margin would move between windows for reasons unrelated to price or cost. The lowest variant needs no weighting and stays put.
The trade-off, stated plainly: if the thin variant rarely sells, the product-level gross margin is pessimistic. That is what the period figures are for. POAS and net profit use what actually sold, and the variant breakdown repeats the same arithmetic one level down, so you can see which variant is earning and which is not.
Questions about gross margin
Is gross margin the same as net profit?
No. Gross margin is price minus cost per item for one unit, before advertising, fees and returns. Net profit, as Opteno computes it, is revenue minus cost of goods minus ad spend over a period. A product can have a healthy gross margin and a negative net profit when its advertising costs more than its margin brings in.
What is the gross margin formula for an online store?
Per unit, gross margin = price − cost per item; as a percentage, (price − cost per item) ÷ price × 100. Use the price excluding VAT and a cost that includes getting the unit to you. For example, €50 − €20 = €30, which is 60% of the price.
Why does Opteno show gross margin as unavailable for a product?
Either no variant of the product has a cost-per-item above zero, or the store’s Cost of Goods setting is on with no default COG percentage set and some variants have a cost while others have none. Opteno shows the reason rather than a number built from whichever variants happen to be filled in. Enter a cost-per-item above zero in Shopify (for every variant that lacks one, if the Cost of Goods setting is on) and the figure appears after Opteno’s next sync.
Why does gross margin stay the same when I switch from 7 to 30 days?
Because it is a catalogue figure, calculated from each variant’s price and cost-per-item rather than from the orders in a period. Revenue, cost of goods, POAS and net profit change with the window; gross margin changes only when the catalogue changes — a variant’s price or cost-per-item, or a variant added or removed — and Opteno has synced it.
Does a store-wide cost percentage fill in gross margin?
No. In Opteno a store-wide percentage is used for cost of goods, and so for POAS and net profit, but gross margin reads each variant’s own cost-per-item. A product with no variant cost stays unavailable for gross margin until a cost-per-item above zero is filled in.
What gross margin do I need to advertise a product profitably on Google Ads?
There is no universal number; what matters is whether the margin covers the ad spend. The ROAS at which POAS reaches 1.00× is 1 ÷ the gross margin percentage — for example, 1.67× at a 60% margin and 3.33× at 30% — and the real break-even is higher once shipping, fees and returns are counted.
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.