# 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.

Source: https://help.tryordinary.com/features/product-costs

---

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 `auto` does 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 `shopifyCost` column shows what Shopify has, so
  you can see where the two differ.
- **To go back to Shopify's cost for a product**, type `auto` in 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](https://help.tryordinary.com/features/offer-calculator) — uses product cost to model
  promotions and bundles.
- [Reconciliation](https://help.tryordinary.com/features/reconciliation) — how Ordinary's revenue totals line up
  with Shopify's.
