Product costs and profit data
How to get your cost data into Ordinary so reports show profit and margin, not just revenue — Shopify sync, per-order costs, editing a cost in the table, and the spreadsheet upload.
Product costs and profit data
Ordinary can show you revenue out of the box. To show profit — margin per order, contribution by channel, which campaigns actually make money rather than just sell — it needs to know what your products cost you.
There are four ways to get that in, and they stack. Most stores are already most of the way there without doing anything.
The settings below are at Settings → Product Costs, on every plan; correcting an individual cost happens on Financials.
1. Sync from Shopify (nothing to do)
If you use Shopify’s Cost per item field on your product variants, Ordinary reads it automatically and refreshes it once a day.
For most stores this alone covers the majority of revenue, because the products you’ve bothered to cost tend to be the ones that sell. You can turn the daily sync off if you’d rather manage costs entirely yourself.
2. Other costs per order
Product cost isn’t the whole picture. Four optional fields cover the rest:
- Fulfillment cost per order — pick, pack and handling, typically your 3PL’s per-order fee.
- Shipping cost per order — what the carrier charges you, not what the customer pays.
These are your typical figures. Where a product breaks the pattern — the heavy one, the fragile one, the one that ships in its own box — you can set fulfilment and shipping for that product individually in the spreadsheet, and it takes precedence.
- Payment fee (%) — the percentage your processor takes.
- Payment fee, fixed part — the flat amount per transaction on top.
Leave any of them blank if you’d rather not estimate. Ordinary will tell you what’s missing instead of quietly guessing a number.
3. Fixing one cost, on the spot
If a single number is wrong, you don’t need a spreadsheet for it.
On Financials, click any cost — Landed Cost, Fulfillment Fee or Carrier Cost — and type over it. Press Enter to save. That’s the whole thing.
- A dash is clickable too. Products Shopify has no cost for are exactly the ones worth filling in, so an empty cell opens the same editor as a filled one.
- Empty the box to go back. Clearing a product cost returns it to Shopify’s
figure; clearing fulfilment or shipping returns it to your store-wide one.
This is the same thing typing
autodoes in the spreadsheet. - Typing the number that’s already there does nothing, deliberately. It won’t create an override or detach the product from the daily sync.
- Products with several variants open a small editor listing each variant with its own box, plus a “set all to” if they should share one figure. A product row shows one number, and its variants can legitimately cost different amounts — so we ask rather than write one figure over all of them.
Costs entered this way are identical to uploaded ones: they beat the Shopify value, and the daily sync never overwrites them.
4. The spreadsheet, for everything else
For a lot of rows at once — or costs Shopify doesn’t have at all — download the spreadsheet from Settings → Product Costs. (For one number, editing it directly on Financials is faster; see above.)
It arrives already filled in with the costs Ordinary knows about, so you’re correcting a handful of rows rather than starting from an empty file.
Three columns are editable, covering every cost that goes into a product’s margin:
cost— what the product itself costs you.fulfillmentCost— pick, pack and handling for this product.shippingCost— what the carrier charges to move this product.
The two …Source columns beside them tell you where the current figure comes
from: override if you set it for that product, or store_default if it’s
using your per-order figure. Edit what you need, save as CSV, and upload it
back.
A few things worth knowing:
- A blank cost cell leaves that product unchanged. It does not set the cost to zero.
- You get a preview before anything is saved — how many costs will change, and which rows couldn’t be read.
- Products are matched on
variantId, so you can delete columns or reorder them. Don’t change that column. - Costs you upload always beat the Shopify value, and the daily sync will
never overwrite them. The
shopifyCostcolumn shows what Shopify has, so you can see where the two differ. - To go back to Shopify’s cost for a product, type
autoin its cost column and upload again. The same works in the fulfilment and shipping columns to return a product to your store-wide figures. - Each column is independent. Correcting shipping on your heavy items won’t touch their product costs.
How much is enough?
The Product Costs page shows one number: the share of your recent revenue that has cost data behind it.
It’s measured against revenue, not product count, because those are very different in practice — a store with costs on a third of its variants can easily have costs on nearly all of its actual sales. Chasing 100% of a product list is usually wasted effort.
Below 70%, Ordinary holds profit figures back rather than show you a margin calculated on part of the basket. A number that looks precise and is wrong is worse than an honest gap.
Tax and regional wording
If your prices include tax, add your rate under Settings → Product Costs. Ordinary uses it to show the pre-tax value of a sale, and leaves those figures out entirely if you haven’t given it a rate — it won’t guess.
US stores don’t need this: prices there are quoted before tax already, and sales tax is added at checkout based on where the customer is.
The Regional wording setting controls whether your reports say RRP or MSRP, Courier or Carrier Cost, VAT or GST or sales tax. It’s set from your store’s currency and you can change it any time.
Today’s cost vs. the cost when you sold it
Ordinary keeps two different cost figures, and it’s worth knowing which one you’re looking at.
Today’s cost is what you currently pay for a product. It’s what you see on the Products and Product Financials pages, and it’s what the Offer Calculator uses when you model a promotion — because when you’re deciding what to do next, what matters is what things cost now.
The cost when you sold it is recorded on every order as it arrives, and never changes afterwards. It’s what profit and margin reports use.
Keeping them separate means your history stays honest. If you switch suppliers or renegotiate a price, only your future orders reflect the new cost — last quarter’s profit stays exactly as it was reported at the time. A single cost figure applied to all of history would quietly restate every past number every time your costs moved.
Two consequences worth expecting:
- The same product can show different margins in different places, and neither is wrong. A product page saying 62% and a report saying 58% means your cost has changed since those sales.
- Orders from before you added cost data use your current cost, because there’s no earlier figure to use. These are close but approximate, and they become exact for every order from the point your costs are in place.
Ordinary doesn’t average costs across orders. Each order keeps its own.
Related
- Offer Calculator — uses product cost to model promotions and bundles.
- Reconciliation — how Ordinary’s revenue totals line up with Shopify’s.