Shelf-Space Allocation
Space-elastic demand · Nonlinear programming
Allocate facings \(x_i\) per SKU on a fixed shelf of capacity \(S\) to maximise expected category margin when demand responds to facings via a space-elastic law \(d_i(x_i) = \alpha_i \, x_i^{\,\beta_i}\). The canonical formulation is Corstjens & Doyle (1981); the comprehensive review is Hübner & Kuhn (2012). Greedy marginal-profit allocation gives a near-optimal integer solution; continuous relaxation admits closed-form via KKT when the elasticity is equal across SKUs.
Why it matters
Shelf as a binding constraint · visibility drives impulse demand
Where the decision sits
Category planning · planogram reset · grocery-centric but general
Shelf-space allocation sits downstream of assortment planning (which SKUs are in the mix) and upstream of replenishment (how often each SKU is restocked). It is a category-manager decision typically revisited on a planogram-reset cadence (quarterly in grocery, semi-annually in general merchandise). The decision is most binding in grocery (physically constrained shelves, thousands of SKUs) and general merchandise (end-cap and eye-level premium locations); in pure e-commerce the analogous decision is page-rank allocation, structurally similar but with different “space” semantics.
Problem & formulation
Corstjens-Doyle space-elastic NLP
Sets and parameters
| Symbol | Meaning | Unit |
|---|---|---|
| \(i \in \mathcal{I}\) | SKU in the category | finite |
| \(S\) | Total shelf facings available | facings |
| \(\ell_i\) | Minimum facings for SKU \(i\) (visibility floor) | facings |
| \(u_i\) | Maximum facings for SKU \(i\) (practical / assortment cap) | facings |
| \(m_i\) | Per-unit gross margin of SKU \(i\) | $ / unit |
| \(\alpha_i, \beta_i\) | Space-elastic demand scale and elasticity for SKU \(i\) | \(\alpha > 0,\ 0 < \beta < 1\) |
Decision variable
| Symbol | Meaning | Domain |
|---|---|---|
| \(x_i\) | Facings assigned to SKU \(i\) | \(\mathbb{Z}_{\geq 0}\) (integer) or \(\mathbb{R}_{\geq 0}\) (relaxation) |
Objective
Maximise total category margin. With space-elastic demand \(d_i(x_i) = \alpha_i \, x_i^{\,\beta_i}\), per-SKU margin is \(m_i \, \alpha_i \, x_i^{\,\beta_i}\); sum over SKUs:
Constraints
Continuous relaxation and KKT
Ignoring integrality and the \(\ell_i, u_i\) bounds, Lagrangian \(\mathcal{L} = \sum_i m_i \alpha_i x_i^{\beta_i} - \lambda (\sum_i x_i - S)\). KKT gives \(m_i \alpha_i \beta_i x_i^{\beta_i - 1} = \lambda\), so at optimum every SKU has the same marginal margin \(\lambda\) per unit facing:
\(\lambda\) is found by solving \(\sum_i x_i^{\ast}(\lambda) = S\) (scalar root-find). When \(\beta_i = \beta\) is common across SKUs, \(x_i^{\ast} \propto (m_i \alpha_i)^{1/(1-\beta)}\) — facings scale as a power of margin-weighted demand scale, not linearly.
Greedy marginal-profit integer allocation
Start from \(x_i = \ell_i\) for all SKUs. Compute the marginal gain from adding one more facing to SKU \(i\): \(\Delta_i(x_i) = m_i \alpha_i \big[(x_i+1)^{\beta_i} - x_i^{\beta_i}\big]\). At each step, add a facing to the SKU with the largest \(\Delta_i\) (subject to \(x_i < u_i\)) until the shelf is full. Complexity \(\mathcal{O}(S \log |\mathcal{I}|)\) with a priority queue. Because \(d_i\) is concave in \(x_i\), greedy is optimal for the integer problem (exchange argument).
Interactive solver
6-SKU category with space-elastic demand; greedy facings allocation
Per-SKU parameters (edit to experiment)
Under the hood
The solver runs a greedy priority-queue allocation. Initialise \(x_i = \ell_i\); the residual capacity is \(S - \sum_i \ell_i\). At each step, compute \(\Delta_i = m_i \alpha_i \bigl[(x_i+1)^{\beta} - x_i^{\beta}\bigr]\) for every eligible SKU (where \(x_i < u_i\)) and add one facing to the SKU with the largest \(\Delta_i\). Repeat until capacity is exhausted. Because each \(d_i\) is concave, this greedy procedure is optimal for the integer problem. The shadow price \(\lambda\) is estimated as the last accepted \(\Delta_i\). Equal-facings baseline sets \(x_i = \lfloor S / |\mathcal{I}| \rfloor\) uniformly and reports the margin gap — typically 8-15% for the default parameter ranges.
Reading the solution
What a category manager actually does with the output
Three patterns to watch for
- Hero SKUs get disproportionate space. Because the objective scales as \(x^{\beta}\) with \(\beta < 1\), allocation is sub-linear in \(m \cdot \alpha\) but still concentrates. SKUs with the highest \(m_i \cdot \alpha_i\) product win the most facings.
- Long-tail gets the floor \(\ell_i\). Low-margin or low-demand SKUs keep their visibility floor but rarely rise above it unless \(\beta\) is high (more space-elastic demand).
- Shadow price \(\lambda\) is actionable. It is the marginal margin you give up per facing lost — useful for negotiating shelf space with new SKU requests (“is your marginal margin above \(\lambda\)?”).
Sensitivity questions the model answers
- What if I remove an end-cap (lower \(S\))? — rerun; typically hero SKUs lose one facing each before tail SKUs are touched.
- What if I double the margin on SKU D? — the solver re-sorts by \(\Delta_i\) and D gains facings at the expense of whoever had the lowest-margin marginal unit.
- What if elasticity is higher (0.6 instead of 0.35)? — tail SKUs get more facings because marginal returns decay slowly.
Model extensions
Where the classical problem gets retail-realistic
Cross-product substitution
When SKU \(i\) stocks out, some demand shifts to substitute \(j\). Demand function becomes \(d_i(x, \text{stock}_{-i})\). The problem couples SKUs and becomes non-concave in general.
Multi-location / eye-level premium
Shelf is stratified: bottom, middle, eye-level. Eye-level has a multiplier on demand; decision becomes facings at each level. Becomes a generalised assignment problem.
Category-level planogram
Full planogram includes SKU placement (positions), adjacencies, and aisle configuration. MILP with spatial constraints; hybrid with column generation in practice.
Joint assortment + facings
Decide which SKUs to carry AND how many facings each gets, under shelf and budget constraints. Extension of assortment planning.
Shelf life / perishability
For perishables, facings affect not only demand but also freshness turnover. Joint facings + order-quantity with shrinkage links to grocery ordering.
Promotion-aware facings
During promotions, effective \(\beta\) and \(\alpha\) change. Dynamic facings schedule across a promotion calendar.
Promotional planning →Retail visibility vs. e-com ranking
Page-rank allocation in e-commerce is the structural analogue: position has diminishing-returns “space”. Same math; different units.
Data-driven \(\alpha, \beta\) estimation
Estimate parameters from store-level A/B tests or cross-store facings variation. Drèze-Hoch-Purk 1994 is a classical empirical reference.
Key references
Classical and modern shelf-space literature
Back to the retail domain
Shelf-space allocation sits in the Product × Tactical cell of the 4P decision matrix — the grocery-centric counterpart to assortment planning.
Open Retail Landing