Skip to main content

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

50–70%
Fraction of grocery purchase decisions made at the shelf. Facings drive both discovery and conversion.
Source: POPAI / Shopper Engagement Study (updated annually).
5–15%
Category-margin lift documented from OR-driven shelf-space allocation vs. rule-of-thumb “equal facings” or “facings proportional to share”.
Source: Hübner & Kuhn (2012) review, Omega 40(2).
~\(\beta \in [0.1, 0.5]\)
Typical range for SKU-level space elasticity \(\beta\) estimated from store-level tests — diminishing returns set in quickly.
Curhan (1972); Drèze, Hoch & Purk (1994).
#facings · #SKUs
Size of the integer decision space. For a 60-SKU aisle with up to 6 facings per SKU, brute force is \(6^{60}\) — unreachable without structure.
Hübner & Kuhn (2012).

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.

Assortmentwhich SKUs
Shelf planfacings \(x_i\)
Replenish(s,S) per SKU
Executeplanogram reset

Problem & formulation

Corstjens-Doyle space-elastic NLP

OR family
Nonlinear Programming
Complexity
Concave NLP (continuous); NP-hard (integer)
Solver realism
★★ Greedy marginal + KKT continuous
Reference
Corstjens & Doyle (1981)

Sets and parameters

SymbolMeaningUnit
\(i \in \mathcal{I}\)SKU in the categoryfinite
\(S\)Total shelf facings availablefacings
\(\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

SymbolMeaningDomain
\(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:

$$\max_{x} \; \sum_{i \in \mathcal{I}} m_i \, \alpha_i \, x_i^{\,\beta_i}$$

Constraints

$$\sum_{i \in \mathcal{I}} x_i \;\leq\; S \qquad \text{(total shelf capacity)}$$ $$\ell_i \;\leq\; x_i \;\leq\; u_i \qquad \forall\, i \in \mathcal{I} \qquad \text{(per-SKU bounds)}$$

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:

$$x_i^{\ast} \;=\; \left(\frac{m_i \, \alpha_i \, \beta_i}{\lambda}\right)^{\!1/(1-\beta_i)}$$

\(\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

Shelf allocation solver
Space-elastic demand · greedy integer allocation
★★★ Exact (greedy optimal on concave)
Shelf capacity in facings
Diminishing-returns exponent
Visibility floor
Practical cap

Per-SKU parameters (edit to experiment)

Total margin ($)
Facings used / \(S\)
SKUs with \(x_i > \ell_i\)
Shadow price \(\lambda\) ($/facing)
Lift vs equal-facings ($)
Lift %
Facings \(x_i\) Per-SKU margin contribution

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

Corstjens, M. & Doyle, P. (1981).
A model for optimizing retail space allocations.
Management Science 27(7): 822–833. doi:10.1287/mnsc.27.7.822
Corstjens, M. & Doyle, P. (1983).
A dynamic model for strategically allocating retail space.
Journal of the Operational Research Society 34(10): 943–951.
Curhan, R. C. (1972).
The relationship between shelf space and unit sales in supermarkets.
Journal of Marketing Research 9(4): 406–412.
Drèze, X., Hoch, S. J. & Purk, M. E. (1994).
Shelf management and space elasticity.
Journal of Retailing 70(4): 301–326. (The classical empirical estimation of \(\beta\).)
Urban, T. L. (1998).
An inventory-theoretic approach to product assortment and shelf-space allocation.
Journal of Retailing 74(1): 15–35.
Yang, M. H. (2001).
An efficient algorithm to allocate shelf space.
European Journal of Operational Research 131(1): 107–118. doi:10.1016/S0377-2217(99)00448-8
Hübner, A. H. & Kuhn, H. (2012).
Retail category management: State-of-the-art review of quantitative research and software applications in assortment and shelf space management.
Omega 40(2): 199–209. doi:10.1016/j.omega.2011.05.008
Bianchi-Aguiar, T., Silva, E., Guimarães, L., Carravilla, M. A. & Oliveira, J. F. (2018).
Using analytics to enhance a food retailer’s shelf-space management.
Interfaces 48(1): 66–78. doi:10.1287/inte.2017.0916

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
Educational solver · shared-elasticity space-elastic demand · estimate \(\alpha, \beta\) from store-level data before applying to live planograms.