Inspect one customer (profit drawer)
Quick Reference
Inputs
Shopify customers, orders and refunds for the selected business line. Your product costs: landed cost, shipping, pick and pack, payment fees. Paid marketing spend and the channel that acquired the customer, where it is connected. Returns data, for the returns-processing estimate and the refund rate. The low-margin rule in force on Customer Profit when the row was classified
Outputs
A three-cell header naming the customer value tier, lifecycle stage and identity. A recommended next move written for this one relationship. Four tiles: Lifetime gross profit, Net margin, Orders and tenure, and LTGP : CAC. A lifetime profit waterfall that ties to the cent, with cost to serve expandable into its five cost lines. Gross profit by quarter, with losing quarters in red. Per-order history with what was bought, net revenue, gross profit and margin. Timing signals: last order, typical gap, reorder due, GP at stake per cycle and churn risk
Outcomes
Decide whether to protect, grow or stop spending on one customer. See whether a big customer is genuinely profitable or just high-revenue. Tell an unmeasured figure from a measured zero before you act on it. Catch a valuable customer slipping past their own reorder rhythm. Understand why the same customer reads differently under another business-line lens.
Clicking any row on Customer Profit opens a drawer for that one customer. It carries three tabs — Economics, Order history and Timing & risk — and answers three questions in that order: how valuable is this customer, how was that profit actually built, and what should you do about them next. This page reads every tile, line and label on it.
What the customer profit drawer is
It is the per-customer view behind the Customer Profit table. The screen behind it ranks and filters a whole population; the drawer argues one case. Everything in it is scoped to the business-line lens you were on when you opened it, so the same customer opened under a different lens shows different economics — each lens counts only its own orders.
The drawer holds no contact details. There is no email address, phone number or postal address anywhere on it, by design. Knowing where somebody lives does not change whether you protect, grow or stop spending on them, and an analytics screen is the wrong place to keep that exposure. If you want to reach the customer, you do it from your email or SMS tool.
Every figure is read from a profile MarginOS builds ahead of time. The drawer formats and labels; it does no arithmetic of its own beyond turning a first-order date into a tenure phrase.
Before you start
- You need at least one completed Shopify sync, and the customer needs at least one order in the lens you are viewing.
- The drawer inherits the business-line lens from the screen behind it. Switching the lens and reopening the same customer reloads their economics for that line — see Business Lines.
- The Value tier and Lifecycle chips carry the same rule the row was classified with, so the drawer can never explain one rule while the badge that opened it came from another.
- Opening a customer adds them to the page address, so an open drawer can be bookmarked or sent to someone else. Closing it removes them again.
Read a customer in five steps
- Start with the header block. Under the customer’s name (or Unnamed customer) sit three numbered cells — 1 · Value tier, 2 · Lifecycle, 3 · Identity. They are the same three questions, in the same order, as the filter layers on the screen behind. Hover the tier or lifecycle chip and the tooltip states the rule in your own store’s numbers.
- Read the boxed line at the top of Economics. It is headed <Value tier> × <Lifecycle> — what to do and it is the conclusion; everything below it is the evidence. It is written for this one relationship, not for the cohort.
- Take the four tiles together. Lifetime gross profit says how big this customer is, Net margin says how efficient, Orders & tenure says how long and how often, and LTGP : CAC says whether acquiring them paid off. A large lifetime figure on a thin margin is a different problem from a small one on a healthy margin.
- Open the waterfall when the tiles surprise you. How the lifetime profit was built runs from revenue down to lifetime gross profit and ties to the cent. Click Total cost to serve to split it into its cost lines.
- Finish on the other two tabs. Order history shows what they actually bought and what each order earned. Timing & risk shows when they are due back and what a missed cycle costs you.
What the Economics tab shows
| On screen | What it shows | Worth knowing |
|---|---|---|
| The boxed “what to do” line | The recommended next move for this customer | Chosen from their value tier and lifecycle together. The same customer gets different advice as they move between stages. |
| Lifetime gross profit | Gross profit on everything they have bought in this lens, less what serving them actually cost | The sub-line ranks them: “More profitable than 84% of this line”. At the very top it reads “Highest in this business line” instead, because nobody can outrank themselves. |
| Net margin | Lifetime gross profit over lifetime product net revenue | Shipping revenue counts in the profit but not in the revenue base, so a shipping-heavy customer can read above 100%. |
| Orders & tenure | How many orders in this lens, and how long the relationship has run | Tenure is measured from the first order MarginOS holds, so your import history bounds it. Under a month it reads first month rather than zero. |
| LTGP : CAC | Lifetime gross profit per dollar of acquisition cost, plus the payback state and what it cost to acquire them | Greyed and N/A when there is no acquisition cost basis in this lens. See CAC Payback. |
| How the lifetime profit was built | Product revenue and shipping revenue, less refunds, unmatched refund cash and total cost to serve, ending on lifetime gross profit | It adds up. Any line showing — has not been measured for this customer yet; it is not a zero. |
| Total cost to serve | One collapsed line; click it for cost of goods, fulfilment, payment fees, refund fees and returns processing | Collapsed by default so the shape of the relationship reads first. The fee-by-fee split is one click away. |
| Gross profit by quarter | A bar per quarter — whether this relationship is compounding or decaying | Every bar grows from the same zero line, and a losing quarter is red rather than a shorter green bar. A quarter can go negative when refunds land after the order. |
Two footnotes sit under the waterfall and are worth reading once. Cost of goods is already net of returned stock that came back to the shelf; stock written off on a refund keeps its cost, because you paid for it either way. And unmatched refund cash is money refunded on an order without naming the products it came off — a goodwill credit, a manual adjustment, a shipping-only refund. It cannot be attributed to a product, so it never appears in per-product profit.
What the Order history tab shows
| Column | What it shows | Worth knowing |
|---|---|---|
| Date | When the order was placed | Most recent first. |
| What they bought | The two biggest products on the order, then “+N more”, with the basket shape underneath as “3 SKUs · 7 units” | Hover for the biggest products with their quantities, and a count of any others on the order. A — means the order has no product lines recorded at all, which is not the same as an empty order. |
| Net revenue | What the order brought in after refunds | — |
| Gross profit | What the order earned | Red when negative. See how gross profit is calculated. |
| Margin | That order’s margin percentage | N/A when there is no revenue base to divide by. |
The tab shows the most recent orders, not all of them. When there are more, a line under the table says so — “Showing the most recent 100 of 214 orders” — and the lifetime totals on Economics still cover every one.
What the Timing & risk tab shows
| On screen | What it shows | Worth knowing |
|---|---|---|
| Last order | Their most recent order in this lens | Switching lens can change it, because each lens counts only its own orders. |
| Typical gap between orders | The median number of days between this customer’s own orders | Reads Not measurable for a one-order customer — there is no personal rhythm yet, so the store-wide median stands in below and is labelled estimated. |
| Reorder due | When they are next expected to buy | The tooltip says whether it came from their own rhythm or is ESTIMATED from your store-wide median. |
| GP at stake per cycle | This customer’s own average gross profit per order — what you forgo if they skip a cycle | Their average, not the store’s. |
| Churn risk | Low, Medium or High — how far past their own rhythm they are | N/A when there is no rhythm to be overdue against. “Cannot measure” and “safe” are different statements. |
| Acquisition cost block | CAC basis, LTGP:CAC, payback state and refund rate, with a sentence saying where the acquisition cost came from | For a customer whose main line is not DTC, the ratio is labelled LTGP:CAC (DTC orders only) and the DTC slice of their lifetime profit is shown under it. |
How MarginOS calculates what you see here
The drawer reads a profile that is rebuilt on a daily snapshot, one per customer per business line. The drawer and the row behind it read that same profile, so they are the same numbers rather than two calculations that agree today and drift apart later.
Lifetime gross profit is revenue less what it actually cost to serve them: goods, fulfilment, payment fees, refund fees and returns processing, with refunds taken off the revenue side. It is built from the same per-order gross profit that rolls up everywhere else in MarginOS — see how gross profit is calculated and how LTGP works.
The percentile under Lifetime gross profit ranks them against the other customers in the same lens, not against your whole store. Acquisition cost is tracked per business line, and only DTC is modelled today; where it is modelled it is a current cost of acquiring a customer like this one, not what you actually paid at the time. Blended CAC explains how that basis is resolved.
Returns processing is a modelled estimate — your returns rate applied to this customer’s own returned units — not a per-return invoice. MarginOS labels it as an estimate rather than presenting it as a measured bill.
Where a figure has not been measured, the drawer says so instead of printing a zero: cost lines show —, tiles show N/A. A measured $0.00 is a true statement and is shown as $0.00. That distinction is the whole point of not inventing numbers.
Example
You open a customer sitting in Profit Champions × At Risk. The boxed line at the top reads:
Proven lifetime profit, and now slipping past their own reorder rhythm. This is the highest-return moment you get with a customer: reach out now, with a reminder rather than a discount. Discounting a Champion who was going to buy anyway just costs you margin.
The tiles say lifetime gross profit of $1,840 (more profitable than 97% of this line), a net margin of 40.4%, 11 orders over 3 years, and LTGP : CAC of 42.10x with CAC recovered. The waterfall shows $4,900 of product revenue, $210 of shipping revenue, $340 of refunds, and $2,930 of total cost to serve. Expanded, most of that cost is goods — fulfilment and fees are modest, so the relationship is genuinely profitable rather than flattered by a costing gap.
On Timing & risk, their typical gap is 74 days, the last order was 103 days ago, churn risk reads Medium, and GP at stake per cycle is $167. That is the size of the prize on one email. You send the reminder, not a discount code.
Common questions
Why is there no email address or phone number on this drawer?
Deliberately. The drawer exists to decide whether to protect, grow or stop spending on a customer, and a contact detail does not change that decision — it only adds exposure to a screen that does not need it. Contact happens in your email or SMS tool, where consent and unsubscribe state already live.
Why does a cost line show a dash instead of $0.00?
A dash means MarginOS has not measured that component for this customer yet. $0.00 means it measured it and the answer was zero. Showing an unmeasured value as zero would quietly understate what serving them costs, and the totals would stop adding up.
Why is LTGP : CAC showing N/A?
Because there is no acquisition cost basis for this customer in this lens. Either their acquiring channel had no paid spend covering the window, your store has no CAC configured, or you are looking at a non-DTC lens — acquisition cost is tracked per business line and only DTC is modelled today. MarginOS leaves it N/A rather than implying the customer was free to acquire.
The drawer says the breakdown has not been built yet. What now?
You will see their lifetime gross profit with a note that the detailed breakdown is not ready. That happens when the customer’s profile has not been through a snapshot yet. It resolves on the next daily build; nothing is wrong and there is nothing to fix.
Why does Net margin read above 100%?
Shipping revenue counts towards the profit but is not part of the product revenue base the percentage divides by. A customer who pays a lot of shipping relative to product value can therefore exceed 100%. It is arithmetically correct, and it is a signal that shipping is carrying that relationship.
Why did this customer’s numbers change when I switched business line?
Because every figure in the drawer counts only the orders belonging to the lens you are on. A customer who buys through both your own store and a marketplace has two different economic histories, and MarginOS keeps them separate rather than blending them into an average that describes neither.
Is there a tab showing which products this customer buys?
Not yet. Order history shows what was on each order, which answers most of the question. A per-product profit view for one customer needs profit at the customer-and-product grain, and MarginOS will not put a per-product profit figure on screen before it can stand behind it.
Related
- Explore customers by lifetime profit (Customer Profit) — the screen this drawer opens from
- How MarginOS calculates LTGP
- How MarginOS calculates Gross Profit (CM1)
- How MarginOS resolves blended CAC
- How MarginOS calculates CAC Payback
- Why MarginOS shows “N/A” instead of a made-up number
- Compare your Business Lines
About the author
Founder of MarginOS, a Profit & Inventory OS for Shopify DTC brands who live and die by margin. Previously 11 years at Google across Ads and Global Business Operations, building large-scale systems. Now focused on giving DTC operators true profit by product, channel, and customer after COGS, 3PL, shipping, returns, and fees, and on showing exactly how much to trust every number behind those decisions.
Read Aron's story