Revenue is the number that gets celebrated. Margin is the number that decides whether you are still in business next year. The trap is that PrestaShop, like most carts, is built to show you revenue everywhere and margin almost nowhere — your dashboard shouts the daily sales total, while the figure that actually pays your rent sits unfilled in a tab most merchants never open. This guide is about closing that gap: the three margin numbers every shop owner should know cold, and exactly where each one lives (or fails to live) in your PrestaShop back office.
This is the "know your real numbers" post. It deliberately does not re-itemise every hidden cost that erodes profit — that full cost stack (payment fees, returns, packaging, time) is its own subject, covered in costs beyond product cost and the wider running-cost picture in e-commerce costs nobody talks about. Here we assume you know the costs exist and care about one thing: turning them into margin numbers you can actually read off your own store.
The three margins — and what each one is for
"Margin" is not one number. It is three, stacked, and confusing them is how a store grows its way into trouble. Each answers a different question and drives a different decision.
| Margin | What you subtract | The question it answers | Use it to decide… |
|---|---|---|---|
| Gross margin | Cost of goods only (your wholesale/cost price) | Is this product worth selling at all? | Pricing, which products to stock, supplier negotiation |
| Contribution margin | Gross, minus per-order variable costs (payment fees, shipping you absorb, packaging, returns provision, acquisition cost) | Does this order leave money on the table after fulfilling it? | Free-shipping thresholds, discount limits, which products to promote |
| Net margin | Contribution, minus fixed overhead (hosting, modules, salaries, your own time) | Does the business make money? | Whether to hire, scale, raise prices, or change course |
So what? Most owners track only the first one — gross — and assume it flows through to the bank. A product can show a healthy 60% gross margin, a respectable 35% contribution margin, and a net margin near zero once overhead is shared across too few orders. Each margin can look fine while the one below it quietly fails. You need all three, and you need them from your real data, not a back-of-envelope guess.
Gross margin: the one number PrestaShop will calculate for you — if you let it
Here is the part most merchants miss. PrestaShop already has a place to record what a product costs you, and it will compute gross margin from it automatically. It is the cost price field (historically labelled wholesale price) under Catalog → Products → open a product → Pricing tab. Enter what you pay your supplier per unit there, and PrestaShop shows you the margin live on the Pricing tab, right beside the retail price, as you set it.
Customers never see this field — it exists purely so the store can do margin maths on your behalf. And almost nobody fills it in. A catalogue imported via CSV, or migrated from an old shop, typically arrives with wholesale_price at zero across the board, which means every margin figure PrestaShop later shows you is fiction. So what does that mean for you? Until that column is populated, your back office is reporting 100% margins on everything, your gross-margin KPI is meaningless, and every report built on top of it inherits the error.
Fixing it is the single highest-leverage hour you can spend on your numbers:
- One product at a time: Pricing tab, enter the cost price, save. Fine for a small catalogue.
- In bulk: export your catalogue, fill the cost-price column, and re-import via Advanced Parameters → Import mapping it to the wholesale/cost-price field — far faster for hundreds of SKUs.
- Keep it current: when a supplier raises prices, the cost field has to move too, or your margins drift out of date without warning.
Once it is filled, the product Pricing tab shows the live gross margin beside the price, and the Best-selling categories report under Stats gains a real Total margin column — so you can rank by profit, not just by units sold, which is where many owners discover their "best seller" is actually one of their worst earners. (Be aware the native product list and the Catalog evaluation screen do not show margin — the former is a quality checkup of descriptions and images, and the product list has no margin column out of the box.)
Where contribution and net margin live: nowhere, natively
This is the honest part. PrestaShop's native reporting stops at gross margin. The per-order variable costs that turn gross into contribution — the payment processor's cut, the shipping you eat above your free-shipping threshold, packaging, your returns provision, acquisition cost — are simply not modelled in the core. The Stats module shows you sales, best-selling products, and carrier breakdowns, but it has no concept of "this €80 order actually netted me €31 after everything."
That is not a flaw to complain about so much as a boundary to plan around. You have three realistic ways across it:
| Approach | Effort | Accuracy | Best when… |
|---|---|---|---|
| Spreadsheet, monthly | Low, recurring manual work | Good if you are disciplined | Small order volume; you just need the true picture once a month |
| SQL on your own database | One-off setup, technical | High, exact to the order | You (or a developer) are comfortable in the DB and want repeatable reports |
| A margin/financial reporting module | Install and configure | High, automated, ongoing | You want contribution and net margin in the back office without rebuilding it monthly |
Pulling real gross margin straight from the database
If you are comfortable with SQL (Advanced Parameters → SQL Manager runs read-only queries safely against your live shop), PrestaShop already stores everything you need at the line-item level. The key is that ps_order_detail snapshots both the sale price and the cost price at the moment of sale — so historical margins stay accurate even after you later change a product's price or cost:
SELECT SUM(od.total_price_tax_excl - (od.purchase_supplier_price * od.product_quantity)) AS gross_margin, SUM(od.total_price_tax_excl) AS net_revenue FROM ps_order_detail od JOIN ps_orders o ON o.id_order = od.id_order WHERE o.valid = 1;
This is a starting point, not the final word. Using total_price_tax_excl for the line total (rather than product_price, which can miss line reductions) gets you closer to what was actually paid, and you can group by product, category, or month. But treat the result as an approximation: it does not account for order-level discounts (cart rules applied across the whole order), refunds and credit slips, or tax and shipping, and o.valid = 1 is a coarse filter that may still include order states you would want to exclude. For figures you can defend, you will need to layer in those adjustments. The other catch: the per-order purchase price column is only captured if your cost prices were populated when each order was placed — another reason to fill that field before you start trusting the reports, not after. And it still stops at gross; payment fees, shipping subsidy and acquisition cost are not in the order tables, so contribution margin remains a calculation you layer on top.
Letting the back office do it for you
The reason a whole category of margin modules exists is precisely that the core stops at gross. If running a monthly spreadsheet or maintaining SQL queries is not how you want to spend your time, a reporting layer like our Financial Revolution module brings contribution and net margin into the back office and keeps them current as orders flow in — so the number that decides your business is on screen next to the revenue number that does not. So what? You stop discovering at year-end that a profitable-looking quarter was a thin one, and you get the per-product and per-category margin breakdowns that the next sections actually depend on.
Reading margin by product and category — and acting on it
Once cost prices are in and you can see real margins, the most valuable thing they reveal is variation. Average margin is a comforting lie; the average is made of high earners subsidising losers you cannot name. Two patterns to look for in your Best-selling categories report or margin module:
- High-volume, thin-margin products that dominate your "best seller" list but contribute little profit — and worse, soak up the shipping and acquisition costs that push their contribution margin toward zero. These are the products to stop promoting, not to discount further.
- Low-volume, fat-margin products buried below the fold that earn more per order than your headline lines. These are your real promotion and cross-sell candidates.
Margin structure also varies sharply by category — fashion runs high gross margins but bleeds them back through 20–40% return rates, while electronics live on thin gross margins with low returns and brutal price competition. The exact ranges depend entirely on your suppliers and niche, so treat any quoted figure as a prompt to measure your own rather than a benchmark to hit. The discipline that pays off is sorting your products by real margin — in a margin module, an SQL export, or a spreadsheet, since the native product list will not do it for you — and asking, product by product, "is this worth the shelf space?"
Using margin numbers to make decisions
Numbers you do not act on are just decoration. Three decisions improve immediately once your margins are real:
- Discounts. A discount comes entirely out of margin, and the maths is unforgiving: on a product with a 30% contribution margin, a 20% price cut can wipe out the majority of the profit on that order because most costs do not fall with the price. Set discount ceilings against contribution margin, not gross — and never run a blanket sale across products whose real margins you have not checked.
- Free-shipping thresholds. Your threshold should sit where the average order's contribution margin comfortably exceeds the shipping you absorb. Read your real per-order margin first; setting the threshold by feel is how owners end up paying customers to take products away.
- Price increases. If your net margin is under 20%, a single supplier or carrier price bump can tip you into loss — you are running with no buffer. A 5% price rise on a 30%-margin product lifts profit by roughly 17%; if you lose less than 17% of volume, you are ahead, and small increases usually move demand far less than owners fear. Test on a few products, watch the units, and let the margin data tell you whether it held.
Track the trend, not the snapshot
A single month's margin tells you little; the direction tells you everything. Once your reporting is in place, watch four numbers month over month, not day to day where noise drowns the signal:
- Gross margin by product and category — is your mix shifting toward thinner earners?
- Marketing cost as a share of revenue — should fall over time as repeat and organic orders grow; if it is rising, you are buying revenue you cannot keep.
- Return rate by product — a spike isolates a product whose description or sizing is quietly costing you margin.
- Net margin trend — the one that matters: improving or eroding?
The reason the trend beats the snapshot is the scenario that fools the most owners: a store grows revenue 20% while net margin slides from 25% to 15%. That is not growth — it is dilution, and it only shows up if you are tracking the margin line beside the revenue line. Repeat orders are what break the cycle in your favour, because an existing customer carries no fresh acquisition cost; that is why customer lifetime value belongs in the same conversation as margin.
The stores that last are not the ones with the biggest revenue figure on the dashboard. They are the ones that filled in the cost field, know all three of their margins, watch the net line trend over time, and price and promote from those numbers instead of from hope. PrestaShop will hand you gross margin the moment you let it — the rest is a reporting layer and the discipline to read it.
Comments
No comments yet. Be the first!
Be the first to ask a question or share useful feedback.
Leave a comment
Share a question, an installation detail, or feedback that could help another reader.