Profit fundamentals

How to Calculate Shopify Profit

To calculate Shopify profit, start from net sales rather than total sales, subtract cost of goods sold, then subtract the variable costs of each order: shipping labels, payment fees and packaging. Subtract ad spend and fixed costs last. Do it per order and add the orders up, rather than averaging costs across a month.

Atul Tirkey, Co-founder, NetNet

Written by Atul Tirkey · Co-founder, NetNet

Updated September 6, 2026 · 5 min read

Calculating Shopify profit is not difficult arithmetic. What makes it go wrong is that the inputs live in five different systems, arrive on five different schedules, and are each reported in a slightly misleading unit by default.

So the work is mostly assembly. Get the five inputs onto one row per order, in the right order, and the number falls out.

The five inputs, and where each one lives

Net sales comes from Shopify, but not from the headline figure. The order total in the admin includes tax and shipping charged. Both need stripping out: tax is money held for a government, and shipping charged is best netted against the label rather than counted as revenue.

Cost of goods comes from the cost per unit on each variant. The trap is averaging — using one blended COGS across the catalogue makes every product look identically profitable, which is the specific thing you are trying to disprove.

Shipping cost comes from the carrier or 3PL, not from Shopify. Shopify knows what you charged. Only the invoice knows what the parcel weighed, whether it went to a remote postcode, and whether it was re-weighed after collection.

Payment fees come from payout statements. They are deducted before the money reaches you, which is precisely why they get forgotten: nobody ever writes a cheque for them.

Ad spend comes from each platform, for the identical date range you used for orders. Mismatched date ranges are the most common reason two people calculating the same month get different answers.

Deciding what counts as a per-order cost

Before subtracting anything, settle one question: does this cost change when one more order ships?

If yes, it belongs above contribution margin. Shipping labels, payment fees, packaging, pick-and-pack, transaction taxes — all scale per order.

If no, it belongs below. Rent, salaries, app subscriptions, your Shopify plan, the designer’s retainer — these are the same whether you ship 400 orders or 900.

Ad spend sits awkwardly between the two and deserves its own decision. It is not strictly per order, but it is not fixed either. The usual treatment is to keep it below contribution margin, then compare contribution margin per order against acquisition cost per order as a separate check. That way one number tells you whether the unit economics work and another tells you whether the marketing does.

Getting this split right matters more than getting any single cost exactly right. A cost in the wrong layer makes both layers lie.

Choosing your period, and sticking to it

Use the same date boundaries for every input, and decide whether an order belongs to the period by its order date or its fulfilment date. Either convention works. Mixing them does not.

Order date is the more common choice and the easier one to defend: the sale happened, so the costs of that sale belong to it, even if the parcel left three days later and the carrier invoiced a fortnight after that.

The consequence of choosing order date is that a period stays open for a while. Costs keep arriving for orders that are already counted, which is the subject of a whole separate page — the costs that land late.

Doing it per order instead of per month

It is tempting to work in monthly totals: total net sales, total COGS, total shipping, one subtraction at the end. It is faster and it produces a defensible store-level number.

It also hides everything worth finding.

A monthly average cannot show you that free shipping is unprofitable above a certain weight, that one discount code sells only your lowest-margin SKU, or that a specific region costs twice as much to serve. Those findings only exist at order level, because they are differences between orders, and averaging is the operation that destroys differences.

The practical compromise: calculate at order level, report at monthly level. The totals reconcile either way, and the order-level detail is there when the total looks wrong.

Checking the answer before you trust it

A profit figure assembled from five systems needs one reconciliation, or a transposed column can survive for months.

The cheapest check is against cash. Take the payouts that actually landed in the bank for the period, add back refunds paid out separately, and compare against net sales minus payment fees. The two will not match exactly — payouts lag by days and straddle the period boundary — but they should land within a percent or two. A larger gap usually means tax or shipping charged is still sitting in the revenue line.

The second check is coverage. Count the orders with no COGS attached. Every one of them is being treated as pure margin, and a handful of uncosted variants can move a monthly figure by more than any of the refinements above.

Run both before showing anyone the number.

How long this takes, and when to stop doing it by hand

The first month takes an hour or two. Later months are quicker because the exports and formulas already exist.

The real cost is not the hours. It is latency. A number rebuilt monthly is, on average, two weeks stale, and it is only ever consulted after the decisions it should have informed. Most stores discover an unprofitable product or a bad shipping rule months after they could have.

The threshold where a manual calculation stops being reasonable is roughly where any of these becomes true: the catalogue is large enough that per-variant COGS is unmanageable by hand, orders ship from more than one place or carrier, refunds are frequent enough to keep reopening closed months, or more than one person needs to trust the same number. Below that, a careful spreadsheet is genuinely fine, and it is a better starting point than software you have not yet learned to check.

Doing it without a spreadsheet

The Shopify profit calculator runs this exact ladder for a single order in the browser — no signup, no email — and shows each deduction rather than only the total.

For every order rather than one, and from costs that update themselves, see best Shopify profit analytics apps.

The procedure

Run this once at month end, in this order. Skipping ahead to ad spend before the per-order costs are in produces a number that cannot be checked.

About 90 minutes the first time

  1. 01

    Export orders at net sales, not total sales

    Pull the period's orders and strip tax and shipping charged out of the order total. What remains, after discounts and refunds, is net sales — the only defensible top line.

  2. 02

    Attach cost of goods to every line item

    Use the cost per unit for each variant sold, not an average across the catalogue. If a supplier price changed mid-period, split the period at the date it changed.

  3. 03

    Subtract the shipping label you actually paid

    Take the carrier or 3PL invoice, not the shipping you charged the customer. Match each label back to its order number so a split shipment counts twice.

  4. 04

    Subtract payment and gateway fees per order

    Apply your real rate — percentage plus fixed fee, and the tax charged on that fee where it applies — against each order rather than as a monthly lump sum.

  5. 05

    Subtract packaging and per-order fulfilment

    Add the per-parcel cost of the box, filler, insert and any pick-and-pack charge. It is usually small per order and material across a month.

  6. 06

    Stop and read the contribution margin

    What you now have is contribution margin: what one more order adds. Read it before adding marketing, because it is the ceiling on what you can pay for a customer.

  7. 07

    Subtract ad spend and fixed costs last

    Pull spend from each ad platform for the same date range, then subtract apps, software, salaries and rent to reach net profit for the period.

One order, all the way down

A single order of $128.00 with a ten percent discount code and free shipping, in a store paying 2.9% plus 30 cents on card payments.

Product revenue
$128.00
Profit after acquisition
$19.76
Share kept
15.4%
One order, all the way down
Line Amount
Product revenue $128.00
Discount code 10% off, shipping given free above $100 $12.80
Net order value $115.20
Cost of goods sold $41.50
Gross profit 64% gross margin — healthy $73.70
Shipping label Charged the customer nothing for it $11.20
Payment fee 2.9% of $115.20, plus $0.30 $3.64
Packaging and insert $1.10
Contribution margin 50% of net order value $57.76
Acquisition cost Blended CAC for the period $38.00
Profit after acquisition $19.76

The order looked like a 64% gross margin sale and finished at $19.76, about 17% of what the customer paid. Nothing unusual happened here — no refund, no failed delivery, no oversized parcel. This is what a good order looks like all the way down.

Where the numbers come from

Every figure above traces to a specific field in a specific system. These are the ones that matter, and where each one goes wrong.

Data sources and their caveats
Figure Source Where it breaks
Net order value The Shopify order object, minus tax and shipping charged The order total shown in the admin includes both, so it overstates revenue if used directly.
Shipping label cost Carrier account or 3PL invoice, matched by order number Labels bill per parcel, so an order that ships in two boxes carries two label costs.
Ad spend Meta, Google and any other ad account, for the identical date range Platform-reported spend excludes agency fees and any tax charged on the ad invoice.
Payment fees Payout statements from Shopify Payments or your gateway Blended monthly fee rates hide the fixed per-transaction component, which distorts small orders.

What this does not tell you

  • Allocating blended acquisition cost evenly across orders is a simplification. It flatters orders that came from organic search and penalises paid ones, so use it for a period average rather than to judge an individual sale.
  • This procedure produces a cash view by order date. It does not handle stock bought but not yet sold, which an accountant will treat as inventory on the balance sheet rather than as a cost this month.
  • Doing this by hand means the number is only as fresh as the last time someone rebuilt the file, which in most stores is once a month at best.

Frequently asked questions

What is the formula for Shopify profit?

Net sales minus cost of goods sold gives gross profit. Gross profit minus shipping labels, payment fees and packaging gives contribution margin. Contribution margin minus ad spend and fixed costs gives net profit. The order matters because each layer answers a different question.

Should I calculate profit per order or per month?

Per order, then add them up. Monthly averages hide the orders that lose money — a heavy item shipped free to a distant address can be negative while the store's average stays comfortably positive.

Do I include shipping I charged the customer as revenue?

Only if you also subtract the label you paid for. The cleaner approach is to net them: treat shipping charged and shipping paid as one line, because what matters is whether delivery made or lost money.

How long does this take by hand?

Expect an hour or two the first time for a month of orders, less once the export and formulas exist. The cost is not the hours, it is that the answer arrives weeks after the decisions it should have informed.

Keep reading — Profit fundamentals

All profit guides

Scale profitably.

Know what every order made you.

Install Free on Shopify