Explore customers by lifetime profit (Customer Profit)
Quick Reference
Inputs
A connected store with order history synced; cost data for the SKUs you sell, since profit and margin inherit the quality of those costs; customers with an identity attached to their orders (guest and placeholder records are excluded).
Outputs
A filtered list of customers ranked by lifetime gross profit, a six-tile summary describing that exact selection (customers, Lifetime GP, average GP per customer, profit concentration, LTGP:CAC and GP at risk), and a CSV export of the whole selection carrying the email and name columns an ad or email platform needs to match on.
Outcomes
Find the customers who genuinely fund the business rather than the ones who merely spend the most; seed a Meta or Google lookalike audience from your Profit Champions instead of your top spenders, and suppress the customers who lose you money; spot profitable customers who are overdue and worth winning back; and extend your history window up to five years so lifetime profit means an actual lifetime.
Customer Profit ranks every customer by the gross profit they have actually earned you across their whole history with your store — not what they spent, and not a fixed window. You narrow the list with three stacked filter layers, read a six-tile summary that describes whatever slice you built, and export it. It is the one screen in MarginOS that answers “who is actually worth keeping?” with profit rather than revenue.
And the selection you build is not just a list to read. Every filtered set is a cohort defined by profit, and the export carries the identity columns an ad platform needs — so you can take “my most profitable customers” straight into Meta or Google, seed a lookalike audience from it, and go and buy more people like them. That is the difference between scaling your best spenders and scaling your best earners, and it is covered in Turn a profit cohort into an ad audience below.
What is Customer Profit?
Most customer tools rank people by what they spend, or by whether they opened an email. Customer Profit ranks them by Gross Profit (CM1) — revenue and shipping revenue, minus product cost, fulfilment, payment fees, refunds and returns processing — summed across every order that customer has placed.
That distinction changes who ends up at the top. A customer who orders often but returns half of it, or always buys the heavy discounted item, can spend a great deal and earn you very little. This screen is where those customers stop hiding inside a revenue average.
It is also the only place in MarginOS that reports profit across a customer’s entire relationship. The LTGP figure on Growth is deliberately a fixed 90-day window so that cohorts stay comparable — how MarginOS calculates LTGP explains why. Customer Profit answers the other question: not “how do my channels compare?” but “what has this person actually earned me, all in?”
Before you start
- A connected store with order history synced, since every figure here is built from real orders.
- Cost data for the SKUs you sell. Profit and margin are only as good as the costs behind them, and the screen tells you where they are thin — see your cost structure settings.
- Customers with an identity attached to their orders. Guest and placeholder records are excluded, because a placeholder is not a customer.
Build a selection with the three filter layers
The filters are stacked and numbered, and they combine. Each one narrows what the ones below it describe.
- Layer 1 · Value — how profitable the customer has been: Profit Champions, Solid Profit Core, Low-Margin Buyers, Unprofitable, or Any tier. Hover a chip before you click it: each one states the rule that put customers in it.
- Layer 2 · Lifecycle — where they are in their journey: New, Active Repeat, At Risk, Churned, Lapsed First-Timers, or Any stage. Timing is judged against each customer’s own rhythm of buying, not one blanket number for the store.
- Layer 3 · Identity — Business line (DTC Engine, Marketplaces, Wholesale, Retail, or All Lines), a Marketplace or Source where the line has one, and Acquired via. The page opens on DTC Engine, because your own storefront is usually the question you came to ask.
- Read the “Current selection” box. It sits above the numbers on purpose — it says in words who is on the list and what the figures count, and the figures mean different things depending on the slice.
- Search, sort and export. The search box filters by customer or email. Sortable columns are marked in the header. Export CSV downloads the selection you are looking at — the same filters, and all of it rather than just the page on screen. That file is also what you upload to Meta or Google; see Turn a profit cohort into an ad audience.
- Reset all layers appears once you have narrowed something, and clears every layer back to the default view.
Every filter lives in the page’s web address. That means any view you build can be bookmarked or pasted to someone else and it will open exactly as you left it, and the browser back button steps back through your filtering rather than leaving the page.
What the six tiles tell you
The tile band always describes the current selection, not the whole store. Pick Profit Champions and every tile re-reads for those customers alone.
| Tile | What it answers |
|---|---|
| Customers in this selection | How many customers your filters produced. |
| Lifetime GP | The total gross profit those customers have earned you. |
| Avg GP / customer | That total divided across them — the number to hold against acquisition cost. |
| Profit concentration | The share of this selection’s profit earned by its most profitable fifth. High concentration means your business rests on fewer people than you think. |
| LTGP:CAC | Lifetime profit against what it cost to acquire them, over the customers that have an acquisition cost behind them. See how the ratio works. |
| GP at risk | Profit belonging to customers who are At Risk or Churned — what is still on the table if you win them back. |
Two of these carry a deliberate refusal to guess. Profit concentration reads N/A when a selection’s total profit is zero or negative, because a share of a loss means nothing. LTGP:CAC is measured only over customers who actually have an acquisition cost behind them — a customer who arrived through a marketplace has no advertising spend attached to them, so they are left out rather than counted as free. The tile says how many of the selection that covers.
On the All Lines lens, LTGP:CAC shows a dash rather than a number. Acquisition cost is tracked per business line and only DTC is modelled today, so there is no blended figure to divide by. That is a different statement from N/A, and the tile makes the distinction on purpose: switch to the DTC Engine lens to see the ratio.
Reading the customer table
Each row is one customer: their name, Value tier, Lifecycle, Lifetime GP, Margin, Orders, LTGP:CAC, Last order, Reorder due and Acquired via. Clicking a row opens that customer’s profit drawer.
Two markers are worth knowing. A repeat icon beside a name means that customer has at least one subscription order. A shield icon beside their value tier is a warning that only a small share of their units have a cost on file — the rest are being treated as if the goods were free, so their profit and margin read high and their tier may be better than they have earned. That is a cost-coverage problem to fix, not a customer to celebrate; Data Trust levels covers how MarginOS grades that reliability.
Turn a profit cohort into an ad audience
This is what the screen is really for. Most customer analytics stops at a chart. Here, the selection you just built is the audience — and because the tiers are built from gross profit rather than spend, you are handing your ad platform a seed list of people who actually made you money.
Why that matters. A lookalike audience copies whatever you feed it. Seed it with your top spenders and you will faithfully scale the customer who orders four times a month, returns half of it, and only ever buys the discounted bundle. Seed it with your Profit Champions and you scale the ones who pay for the business. Same ad budget, different people.
How to do it
- Build the cohort. Set the lens to the business line you advertise into, then narrow with the Value and Lifecycle layers until the Current selection box describes the group you want.
- Export CSV. You get the whole selection, not just the page in front of you — filter to Unprofitable and you get every one of them.
- Upload it as a customer list in your ad platform: a Custom Audience in Meta, or Customer Match in Google Ads. The file already carries Email, First name and Last name as separate columns — the fields those platforms match on, and the ones an email tool merges into a greeting. A Customer ID column rides alongside so you can tie the list back to your own records later.
- Build the lookalike from that uploaded list, or use the list directly as an exclusion.
Four cohorts worth building
| Selection | Use it as | What you are buying |
|---|---|---|
| Profit Champions | Lookalike seed | More of the customers who actually fund the business, instead of more of the ones who merely transact. |
| Profit Champions + At Risk or Churned | Retargeting list | A win-back campaign aimed only at valuable customers going quiet — the GP at risk tile tells you what that campaign is worth before you spend a penny on it. |
| Unprofitable | Exclusion list | Stop paying to reacquire people who cost you money on every order, and keep them out of your lookalike seeds. |
| Low-Margin Buyers | Suppression list for discounting | Margin you keep, by not sending another promotion to the people whose orders are already too thin. |
The same file works for an email or SMS platform, which is why the identity columns are there at all. Two things to know about it: there is no postal address or phone number in the export, deliberately — neither changes a decision this page supports, and each would widen what a single loose file exposes. And every export is written to the customer-data audit trail, because a file of customer emails leaving the product is exactly the event that should be on the record.
One column is easy to overlook and worth keeping: Rulebook records the thresholds that produced the tiers in that file. Tiers are derived from your own store’s distribution and move as your business does, so without it a list you exported last quarter cannot be interpreted against this quarter’s definitions.
What “lifetime” means here
It means every order MarginOS holds for that customer — and it is worth being precise about where that starts.
Your first sync reaches back twelve months. From there nothing is ever thrown away: every order that arrives afterwards is kept, so your window widens by a day, every day you stay connected. A store six months in is already reading eighteen months of customer history. The Orders since readout at the top of the page states your store’s actual starting line, so you never have to guess where it is.
You can have more, and it is worth asking for. Twelve months is only the default depth of that first import — we can reach back further, up to five years, so that “lifetime” means an actual lifetime. It is not a switch in your settings yet: while this part of the product is still being polished, we widen the window by hand — so just ask us, and tell us how far back you want to go.
This matters more here than anywhere else in MarginOS. A deeper horizon does not just make the numbers bigger — it changes who your Profit Champions are. The loyal customer whose best year was three years ago is invisible at twelve months and obvious at five years, and if you are seeding ad audiences from these cohorts, the seed changes with the window.
Until you widen it, the boundary is stated rather than papered over: a customer who has bought from you for five years shows the profit earned since your data horizon, not since their genuine first purchase. MarginOS will not extrapolate across that line — the same principle as never showing an invented number.
How MarginOS calculates it
Profit is summed per order, not estimated. Each of a customer’s orders gets its own real Gross Profit — its own revenue, its own product costs, its own fulfilment and fees — and those are added up. Returns are part of it: refunded revenue comes back out, product cost is credited only where the unit was actually restocked, and the cost of processing the return applies either way.
The tiers are set against your own store. The line between a Solid Profit Core customer and a Low-Margin Buyer is derived from your own margin distribution, not from an industry constant — “thin” means thin for your business. The rules in force are shown on the page itself: hover any chip to see the rule that built it, and the Rulebook readout at the top states the thresholds being applied. One of them, the low-margin line, is editable by an admin.
The business line scopes the money, not just the list. Choosing Marketplaces does not simply filter the same numbers down — it recomputes them from that line’s orders alone. A customer who buys from you both direct and through a marketplace therefore appears under both, with different profit, a different margin and possibly a different tier. Counts and totals across lines are not meant to be added together.
The page computes nothing itself. Every figure is calculated in the backend and rendered here as-is, from a snapshot that rebuilds once a day. A change you make today — a corrected cost, a new order — shows up on the next snapshot rather than instantly.
Example
You open Customer Profit, leave the lens on DTC Engine, and click Profit Champions. The tile band re-reads for that group: a few dozen customers, their combined Lifetime GP, and the average each has earned you. You glance at Profit concentration and see that a fifth of them account for most of it.
Now you add At Risk from the Lifecycle row. The list collapses to your best customers who are overdue against their own buying rhythm, and GP at risk tells you what that group has historically been worth. That is a winback list built on profit, and you export it.
Then you try the opposite: Low-Margin Buyers crossed with New. If that list is long, you are acquiring customers who buy without really paying you — a discounting, shipping or basket-mix problem showing up at the front door, and a reason to look hard before spending more to find people like them.
FAQ
Is this the same LTGP as the one on Growth?
No, and the difference is deliberate. Growth reports profit per customer over a fixed 90-day window so that channels and cohorts stay comparable to each other. Customer Profit reports profit across the customer’s whole history in your data. The 90-day figure is for judging acquisition; this one is for judging customers.
How far back does “lifetime” go, and can I extend it?
Twelve months at your first sync, then it grows: every order after that is kept, so the window widens on its own for as long as you stay connected. If you want it deeper straight away we can reach back up to five years — just ask us. It is a manual change on our side today rather than a setting you toggle. It is worth doing before you build ad audiences from these cohorts, because a longer window changes who qualifies as a Profit Champion.
Why do the customer counts not add up across business lines?
Because the line scopes the money, not just the list. Someone who buys both direct and through a marketplace is a real customer on both, with different economics on each, so they are counted on both. Adding the lines together would double-count them.
Why does a customer show N/A for LTGP:CAC?
Because there is no acquisition cost attached to them — usually because they arrived through a marketplace, where no advertising spend of yours maps to that customer. MarginOS leaves them out of the ratio rather than treating them as free, which would flatter it.
Why is my customer count lower than the number of customers in my store?
This screen counts customers who have placed at least one order. Records that have never bought — email captures, abandoned carts, imports — are not in it.
A customer’s profit looks too good. Why?
Check for the shield icon next to their value tier. It means most of their units have no cost on file, so those goods are being treated as free and their profit and margin read high. Fixing the missing costs will move them, sometimes several tiers.
I fixed a cost. Why has nothing changed?
The customer snapshot rebuilds once a day, so corrections appear on the next build rather than immediately.
Can I save a selection I have built?
Not yet — the Segment library tab is visible but locked, and arrives in a later release. In the meantime the page’s web address holds your whole selection, so bookmarking it keeps the view.
Does the CSV export the whole table or just what I filtered?
What you filtered — and all of it. The export carries exactly the same filters as the table, but it is not limited to the page you can see: filter to Unprofitable and you get every Unprofitable customer, not the first fifty. The rows, the count and the file always describe the same set of people.
Can I build a Meta or Google audience from a selection?
Yes, and it is one of the main reasons the export exists. The file carries Email, First name and Last name as separate columns — the fields those platforms match on — plus a Customer ID so you can tie the list back to your own records. Build the cohort here, export it, upload it as a Custom Audience in Meta or a Customer Match list in Google Ads, then seed a lookalike from it or use it as an exclusion. Because the cohort is defined by gross profit rather than spend, the audience you scale is your most profitable customers, not just your busiest ones.
Related
- How MarginOS calculates LTGP
- How MarginOS calculates Gross Profit (CM1)
- How MarginOS calculates channel LTGP:CAC
- How MarginOS calculates CAC payback
- Data Trust levels: how MarginOS grades margin reliability
- Read the Growth Engine — where the spend behind these customers is measured.
- How MarginOS assigns each order to a channel — what sits behind the Acquired via column in your export.
- Features
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