SKU-level margin analysis across channels

One product has a different margin in every channel it sells through, and most of the difference is in costs nobody has attached to it yet.

Kartik Deshpande··5 min read

Ask five people at a consumer brand what a given SKU makes and you get five numbers, all defensible. The commercial team quotes gross margin off the price list. Finance quotes something lower that includes trade spend. Ops has a landed cost that the others have not seen since the last freight increase (which never made it into the price list), and nobody has the marketplace fee schedule in front of them.

SKU-level margin analysis is worth doing because the spread between those numbers decides real things: which products get promoted, which get delisted, which channel gets inventory when there is not enough. The reason the analysis is hard has almost nothing to do with the arithmetic and everything to do with which costs are attached to the product and where each one lands.

The same SKU, four margins

Take one product selling through a grocery account, a club account, a marketplace and your own store. The unit cost is identical in all four. Almost nothing else is.

ChannelWhat comes off the priceWhere the number hides
GroceryOff-invoice allowances, billbacks, freight terms, chargebacksDeductions on remittances, weeks after the sale
ClubPack-specific cost, low unit price, high volume freightPack conversions and a cost applied at the wrong grain
MarketplaceReferral and fulfilment fees, returns, advertising against the SKUSettlement reports that never reach the margin model
DirectDiscount codes, payment processing, shipping subsidy, ad spendEcommerce and ad platforms, joined by nobody

The pattern is consistent. Each channel has a cost that is invisible from inside the systems the others live in, and each cost arrives on a different schedule from the sale that caused it. A margin figure that ignores the timing is not wrong so much as unfalsifiable: you cannot tell whether the SKU improved or whether a deduction has not landed yet.

The two definitions SKU-level margin analysis rests on

Before building anything, two definitions need an owner and a written answer.

Net revenue. Gross sales less what, exactly? Trade spend, off-invoice allowances, returns, marketplace fees and freight out are each defensible as a deduction from revenue or as a cost below it. The choice changes the margin percentage on every SKU, and the requirement is not a particular answer but one answer, written down, used by the commercial deck and the management accounts alike.

Landed cost. Standard cost from the ERP is the starting point, and the parts that matter are the ones added on: inbound freight, duty, co-packing, pallet configuration effects, and the storage a slow SKU consumes. Applying one standard cost across pack sizes is the most common shortcut, and it systematically flatters large packs.

Both are business rules. Neither is a feature you can buy, and a dashboard built before they are settled becomes an argument with a chart in it.

From list price to SKU margin
Gross sales
Invoiced, by channel
Net revenue
One stated rule, all channels
Landed cost
At pack grain, dated
Margin by SKU and channel
Traceable to source rows
Each step is a defined rule rather than a calculation choice made per report.

How to track profitability by SKU without a data team

The in-house version of this is expensive. A data function capable of maintaining these joins and definitions costs a mid-market company more than $2M a year, and outside help benchmarks at $300 an hour and up, which is why the work usually lands on a commercial analyst with a workbook and a quarter of goodwill.

Permute exists to make that a configuration problem rather than a hiring one. We connect NetSuite or whichever ERP holds standard cost, the marketplace settlement reports, Shopify, the ad platforms, QuickBooks, the freight invoices, and the rest of the systems we connect. Net revenue and landed cost are then written once as explicit rules in the Ontology layer, with effective dates, so a freight increase in April changes April onward and leaves the first quarter intact. Ask which SKUs lost money at a named account last quarter and the answer comes back with the deduction lines, settlement rows and cost components behind each figure, which is the difference between a delisting proposal that survives the meeting and one that gets deferred for better data. Because the same definitions serve the dashboard, the scheduled report and a plain-language question, the commercial team and finance stop reconciling two versions of the same margin.

The boundaries are worth stating. We are a transformation layer rather than an accounting system: we do not perform statutory consolidation with intercompany eliminations, and we do not replace the general ledger or the close. We read from the systems we connect and do not write back, so a cost correction still happens in the ERP. What we own is the definition and the trail back to source.

See margin by SKU and channel

Connect your ERP, one marketplace and your direct channel, then ask which SKUs lose money where.

What changes when the number is trusted

The first thing that changes is the delisting conversation. A SKU that loses money in one channel and earns well in another is a channel decision rather than a product decision, and teams working from a blended margin cannot see the difference.

The second is promotional discipline. Once trade spend and fees sit against the SKU that carried them, a promotion that moved volume at negative margin stops being a success story. The third is smaller and more useful day to day: nobody spends the first part of the meeting reconciling two spreadsheets, because there is one definition and both spreadsheets came from it.

For the adjacent decisions, Price pack architecture software: what to look for covers the pack and price side of the same data, Trade spend management software: what to look for covers the deductions that move net revenue, and CPG analytics software: what to look for before you buy places the tooling categories against each other. Questions about who inside a business should see account-level margin are covered in how the data is handled, and the wider vertical picture sits on our consumer brands page.

Bring one SKU and two channels

We will trace its real margin across your systems and show which costs are missing from the number you use today.

Questions teams ask about SKU profitability

Which costs belong in a SKU margin?

Everything that changes with the unit and can be attributed without a modelling exercise: product cost, inbound freight, duty, co-packing, channel fees, trade spend and returns. Overhead allocations belong in a contribution view rather than in the number you use to compare SKUs.

The test is whether two people would allocate the cost the same way. Where they would not, keep it out of the SKU line and hold it at channel or account level instead.

How should returns be handled?

Against the period of the original sale where you can match them, and as a channel-level cost where you cannot. Marketplace returns are usually matchable through the settlement report, and grocery returns often are not.

What matters more than the choice is applying it consistently, since switching treatment between quarters produces a margin trend that reflects the accounting rather than the business.

How often should SKU margin be refreshed?

Monthly is enough for decisions and weekly is useful during a promotion, with the caveat that a recent month is incomplete until deductions have landed. Showing the number alongside how much of the expected deduction has arrived prevents a false improvement being read as performance.

Daily margin at SKU level tends to create noise that nobody acts on.

Can this be done in a spreadsheet?

For one channel and a short list of SKUs, yes, and doing it once by hand is a good way to discover which definitions you are missing. It stops working at the third channel, when the fee schedules and deduction formats multiply and the workbook becomes the only place the logic exists.

The signal to move is when someone asks a question about last quarter and the honest answer is that the file has been overwritten.