Watch the curve happen

illustrative example Pigfox Cantina — a fictional venue

Pigfox Cantina on a Friday night. Move the slider and watch the room fill, the queue build at the rail, and the bar start pouring less the more people you put in front of it.

The interactive room needs WebAssembly

Your browser did not load the simulation, so here is what it measured: drinks poured against headcount for the same room. It rises, it peaks, and then every extra body costs you money.

The peak is measured, not assumed

Nothing here evaluates a revenue formula. The room is a simulation of people: each one walks to the bar, waits their turn, is served, carries the drink to a table, stays with it, and goes back. The only physics in it is the congestion law — walking speed falls as the crowd around you thickens, v = v_max(1 − ρ/ρ_jam) — and it applies to walking, never to pouring. The curve you are looking at is the number of drinks that bar actually poured per minute, counted once the room had settled, at every headcount the slider reaches.

So why is there a top? Below it the bar idles: nobody is waiting, and the next patron through the door is worth money. Above it the rail is the problem — a served patron cannot push clear of the crowd and the next one cannot get on, so the service points stand blocked and the bar pours LESS with more people in the room. Nobody put that peak in the model. It is where those two effects cross.

People are not an ideal fluid. Bernoulli's equation does not govern your patrons — it describes an inviscid, incompressible flow along a streamline, and a crowd is none of those things: they have somewhere to be, they queue, they stop to talk. The speed-density relation survives the analogy because it is the one part pedestrian research actually measures. This is a model, and a presentation-grade one: the real diagnostic fits your curve to your transactions.

The room

Posted capacity
120
Revenue-optimal N
98
Peak revenue / hour
$705.00
Measured at the peak
1.31 drinks/min · 8 waiting · 99% of the rail held
Cost of packing to capacity
$52.13/hr · $313/night
Revenue lift at optimum
8.0%
Floor / walkable
2400 / 1957 sq ft
Spend per head / hour at the optimum
$7.19 at $9.00 a drink
Bar rail
3 service points · 132s a drink
Dwell / trading night
67 min · 6 hours

Why the curve is that shape

It climbs and falls for two different reasons, which is why the two sides do not match. Below the peak the room is demand-limited — another person is another buyer and the bar has slack. Above it the room is congestion-limited — the floor jams, reaching the rail takes longer, and each extra body slows everyone else more than they add. A curve that fell exactly as it rose would be a formula, not a room.

And it is bumpy because headcount is a whole number: the curve is a ladder of separate experiments, each counted over a finite stretch, each carrying the scatter that comes with counting. Nothing here is smoothed — every surface on this site quotes the measurement it was given. Which is also why the top is nearly flat, and why the winning rung wins by so little:

Best rung
N* = 98
Nearest rung to it
99
It falls short by
0.106%

the whole argument, on The science.

Show your working

The room above is the answer; this is the arithmetic behind it. Nothing on this page fits a shape to anything or assumes what a patron spends: drinks are counted in a simulated bar, a price turns the count into money, and the optimum is wherever the money stops going up. Every figure below is read out of the engine when the page is built, so a constant that moves takes the sentence with it.

What goes in

Price of a drink
$9.00
Occupancies swept
421 · 0 to 420
Rooms per occupancy
4 independent
Counted per room
2 h, after 1 h settling
Settled hours behind the curve
1448
Drinks counted
65512

What is done to it

Each patron is a small state machine: they head for the bar, wait their turn at the rail, are served, carry the drink away, and come back when it is finished. A room is run past its warm-up and left to settle before anything is counted, and then the bar's serves are counted — in several independent rooms, at every occupancy in the swept range. Averaging those counts is the pour rate at that occupancy. Scaling it to the hour and multiplying by the price of a drink is R(N), and that is the whole of the revenue model.

R(N) = drinks/hr measured at N × $9.00

The marginal figure, dR/dN, is then a difference between the two measured points either side of wherever the slider is standing. There is no closed form to differentiate, because nothing here was evaluated. N* is the occupancy whose measured pour rate is the highest in the table — which is the same place that difference changes sign.

dR/dN crosses zero at N* = 98  ·  R(N*) = $705.00/hr

Derive it yourself

These are the whole chain. The first two are the measurement itself rather than a description of it: drinks this sweep counted, written into the two formats a venue actually hands over, covering occupancies up to 180. The third is the table the curve on this page is plotted from — it runs further than the extract does — and it is served from the bytes compiled into the site rather than from a copy kept beside it. Join the transactions to the door counts, take the pour rate of every settled block, price it, and the curve that comes back out is this one across that range — N* included.

The dataset is the measurement itself, not a trading history. Occupancy is held still through each counted block, because holding it still is what measuring one occupancy means; the calendar in the files is an axis rather than a story; and the venue is invented. This is a model, and a presentation-grade one — the real diagnostic fits your curve to your transactions.