SKU Profitability
Generated skill (example). This is the kind of bespoke skill fpa-learn-business
proposes when the business profile says "product company with a discrete SKU set."
It lives in skills/generated/ - in a real engagement it would be written into the
client's repo after human approval, citing the profile facts that justify it (here:
a limited-SKU D2C brand where per-product economics drive the mix decision).
Overview
The channel-level forecast tells you the business is healthy; it doesn't tell you which products carry it. This skill computes per-SKU economics and the Pareto curve so you can see the 80/20, find margin-dilutive SKUs, and make cut/reprice/push calls.
Core principle: Revenue flatters; margin and contribution decide. Rank by gross profit, not by sales.
When to use
- "Which products actually make money?" / "what should we cut?"
- Product-mix, pricing, or assortment-rationalization decisions
- Any product business with a discrete SKU set (especially limited-SKU brands)
Workflow
Load the SKUs (annual units, price, unit cost):
import pyfpa
skus = pyfpa.load_skus("examples/ridgeline/skus.yaml") # or build [Sku(...)] inline
df = pyfpa.sku_profitability(skus)
df is sorted by gross profit (desc), indexed by SKU, with columns: units, revenue, cogs, gross_profit, gross_margin, revenue_share, cumulative_revenue_pct.
Find the 80/20:
n = pyfpa.pareto_breakpoint(df, threshold=0.8) # SKUs that make 80% of revenue
Read the signals:
- Top of the list (high gross profit) - protect and push these.
- High revenue, low
gross_margin - reprice or renegotiate cost; they're buying share with your margin.
- Low
revenue_share AND low margin - candidates to cut (carrying cost without contribution).
- The Pareto tail - if the bottom SKUs add complexity (SKUs to manage, inventory to hold) without margin, rationalize them.
Recommend in business terms: which SKUs to push, reprice, or discontinue, and the margin impact of each move.
Judgment checks (see fpa-cfo-judgment)
gross_margin here is per-unit price minus unit cost - it excludes channel fees, returns, and fulfillment. A D2C SKU and a wholesale SKU at the same listed margin are not equally profitable once channel economics hit.
- A "high-margin" SKU with tiny volume may not be worth the operational complexity it adds. Weigh contribution dollars, not just the percentage.
1---2name: sku-profitability3description: Use when analyzing which products make or lose money, ranking SKUs by margin or contribution, running a Pareto/80-20 on a product line, or deciding which SKUs to cut, reprice, or push in a product business.4---56# SKU Profitability78> **Generated skill (example).** This is the kind of bespoke skill `fpa-learn-business`9> proposes when the business profile says *"product company with a discrete SKU set."*10> It lives in `skills/generated/` - in a real engagement it would be written into the11> client's repo after human approval, citing the profile facts that justify it (here:12> a limited-SKU D2C brand where per-product economics drive the mix decision).1314## Overview1516The channel-level forecast tells you the business is healthy; it doesn't tell you *which products* carry it. This skill computes per-SKU economics and the Pareto curve so you can see the 80/20, find margin-dilutive SKUs, and make cut/reprice/push calls.1718**Core principle:** Revenue flatters; margin and contribution decide. Rank by gross profit, not by sales.1920## When to use2122- "Which products actually make money?" / "what should we cut?"23- Product-mix, pricing, or assortment-rationalization decisions24- Any product business with a discrete SKU set (especially limited-SKU brands)2526## Workflow27281. **Load the SKUs** (annual units, price, unit cost):29 ```python30 import pyfpa31 skus = pyfpa.load_skus("examples/ridgeline/skus.yaml") # or build [Sku(...)] inline32 df = pyfpa.sku_profitability(skus)33 ```34 `df` is sorted by gross profit (desc), indexed by SKU, with columns: `units, revenue,35 cogs, gross_profit, gross_margin, revenue_share, cumulative_revenue_pct`.36372. **Find the 80/20**:38 ```python39 n = pyfpa.pareto_breakpoint(df, threshold=0.8) # SKUs that make 80% of revenue40 ```41423. **Read the signals**:43 - **Top of the list** (high gross profit) - protect and push these.44 - **High revenue, low `gross_margin`** - reprice or renegotiate cost; they're buying share with your margin.45 - **Low `revenue_share` AND low margin** - candidates to cut (carrying cost without contribution).46 - **The Pareto tail** - if the bottom SKUs add complexity (SKUs to manage, inventory to hold) without margin, rationalize them.47484. **Recommend** in business terms: which SKUs to push, reprice, or discontinue, and the margin impact of each move.4950## Judgment checks (see fpa-cfo-judgment)5152- `gross_margin` here is **per-unit price minus unit cost** - it excludes channel fees, returns, and fulfillment. A D2C SKU and a wholesale SKU at the same listed margin are not equally profitable once channel economics hit.53- A "high-margin" SKU with tiny volume may not be worth the operational complexity it adds. Weigh contribution dollars, not just the percentage.