Advanced

The maths of how DCAL works

14 min

In lesson 33 we introduced DCAL: price is not one number but a day-class × category × length matrix. Now comes the next question: how do we calculate the value of each cell? Why is the concert Saturday’s 1-night cell 165 EUR — and not 145, like a normal Saturday’s? Where is the ceiling, and where is the floor?

This is a calculation lesson. We walk through Hotel Peaqplus City’s concert-Saturday grid step by step — first by hand, then the way the Peaqplus Pricing Map module does it. The goal is not to re-run the RMS in your head, but to understand the logic of the rate suggestions — and to know when to question a cell and when to simply accept it.

The basis of the cell: marginal-revenue logic

Behind every DCAL cell sits a simple economic question: what is one additional sold room worth to the hotel in a given configuration — arrival day × length of stay × category?

In lesson 2 (The room as a perishable good) we saw: an unsold night is lost forever, and the direct marginal cost of selling one more room (cleaning, energy, amenities) is only ~5–8 EUR. Almost everything above that is marginal revenue — the question is not “is it worth selling”, but at what price.

The cell’s price seeks the optimum between two bounds:

  • Upper ceiling — the segment’s willingness to pay: the price at which bookings still just keep coming.
  • Lower floor — the price below which the hotel is worse off in the long run than leaving the room empty: rate-position erosion, dragging down the surrounding days, displacement cost.

DCAL performs this optimum search at length and segment level, cell by cell.

Displacement cost: who am I pushing out?

Displacement cost is the key to calibrating DCAL cells. The classic question: “If I sell this room to this guest, who am I taking it from?” We met the idea in lesson 5 (The optimal mix) — now we calculate with it.

Hotel Peaqplus City, concert Saturday, three typical Saturday-arrival booking types:

Segment (Saturday arrival)Cell ADRLOSMarginal costMarginal revenue (full stay)
Transient business, 1 night165 EUR1 night~8 EUR157 EUR
Transient leisure, 2 nights (Sat–Sun)148 EUR/night2 nights~7 EUR/night141 × 2 = 282 EUR
Family, 4 nights (Sat–Tue)125 EUR/night4 nights~6 EUR/night119 × 4 = 476 EUR

(Marginal cost per night falls with length: the departure clean and the admin occur once per stay.)

Let’s pause for a moment: the 4-night guest brings 476 EUR of marginal revenue, the 1-night guest 157. Is the 4-night guest three times as valuable?

From the full-stay perspective, yes. But both fill the concert Saturday’s cell with exactly one night. So the displacement question goes: if I accept the family booking, and because of it I have to turn away a 165 EUR business guest on Saturday, what is the balance?

  • Loss on the Saturday night: instead of the business guest’s 157 EUR marginal revenue, the family’s 119 EUR comes in → −38 EUR.
  • Gain on the three surrounding nights (Sunday–Tuesday): 3 × 119 = +357 EUR — on nights that the grid marks as weak (92–108 EUR base) and that would most likely sit empty.
  • Net: +319 EUR in favour of the family booking.

One condition must be said out loud: the calculation holds if there is no displacement on the Sunday–Tuesday nights — rooms really would sit empty there. If the surrounding days were filling up too, the balance could flip.

This is the real argument behind the length-decreasing ladder: the longer stay brings more revenue even at a lower ADR, because besides the peak night it also fills the weak nights. Lesson 33’s “suspicious” cell — the Thursday-arrival 4-night guest sleeping through the concert Saturday at 95 EUR — computes the same way: 4 × (95 − 6) = 356 EUR of marginal revenue from a booking whose three other nights would have been empty rooms anyway.

The length-of-stay premium

Displacement looked at room revenue. But a longer stay also brings more beyond the room. Hotel Peaqplus City’s average guest spend by length (following lesson 30’s ancillary logic):

LOSF&B / nightSpa / nightOther / nightAncillary premium / night
1 night~18 EUR3 EUR2 EUR+23 EUR
2 nights~22 EUR5 EUR3 EUR+30 EUR
3 nights~26 EUR8 EUR4 EUR+38 EUR
4+ nights~32 EUR12 EUR6 EUR+50 EUR

The pattern is typical: the one-night guest “sleeps and leaves”; the longer-stay guest has breakfast, dinner and spa time in the hotel — spending more even per night.

In total guest value: the 1-night guest is 165 + 23 = 188 EUR; the 4-night guest 4 × 125 + 4 × 50 = 700 EUR. At the total-value level the 4-night guest is worth ~3.7× more — which is why the grid can afford to sell them the room more cheaply per night.

The cell formula

Let’s put all this into a formula. A DCAL cell’s starting ADR:

DCAL cell = willingness to pay − calibration margin, where calibration margin = ancillary premium × LOS weight

The willingness to pay is a segment-specific estimate (lesson 8’s price-sensitivity logic): what the demand of a given length will still just pay for the given day. On an event day, the one-night occasion demand’s ceiling is exceptionally high; along the length axis the ceiling falls — the long-stay guest is sensitive to the total price.

The calibration margin is the concession the hotel deliberately gives back to the longer stay so the surrounding cells fill up too. It has two factors: the ancillary premium funds it (we give back from the room rate roughly as much extra as the guest brings outside the room), and the LOS weight expresses intent — how strongly we want to encourage that length (1 night barely: 0.5×; 4+ nights at full weight: 1.0×).

Concert Saturday, Standard category:

LOSWillingness to payAncillary premiumLOS weightCalibration marginFormula cell
1 night175 EUR23 EUR0.5×−12 EUR163 EUR
2 nights165 EUR30 EUR0.6×−18 EUR147 EUR
3 nights155 EUR38 EUR0.8×−30 EUR125 EUR
4+ nights145 EUR50 EUR1.0×−50 EUR95 EUR

(Margins rounded to whole numbers: 23 × 0.5 = 11.5 ≈ 12; 38 × 0.8 = 30.4 ≈ 30.)

Two corrections — and the final grid

The raw formula output is a starting point, not the end result. The Pricing Map runs two rules on it:

1. Weak-day rule — the 3-night cell. The formula’s −30 EUR margin assumes the extension has to be “bought” with a discount. But the extension nights of a Saturday-arrival 3-night stay (Sunday, Monday) are structurally weak: the guest’s decision is driven by the concert, the extra nights need no big incentive — and they carry no displacement cost either, because they would sit empty anyway. The margin can be cut back: the cell is not 125 but 135 EUR.

2. Floor rule — the 4+ night cell. The formula’s 95 EUR would break through the floor: on an event day no cell may slide near or below the hotel’s annual average ADR (~105 EUR). A 95 EUR event cell would, moreover, drag down the surrounding days’ pricing too — that is the race to the bottom. The floor and the weak-day rule together: 125 EUR.

LOSFormulaCorrectionFinal cell
1 night163 EURpace adjustment upward (+12% pace advantage)165 EUR
2 nights147 EURrounding to the hotel’s price ladder148 EUR
3 nights125 EURweak-day rule135 EUR
4+ nights95 EURfloor rule125 EUR

The right-hand column is exactly the concert-Saturday row we saw in lesson 33: 165 / 148 / 135 / 125. The grid is not a matter of taste — every cell can be derived.

Day-class switch: the same Saturday without the concert

What would happen if there were no concert on Nov 25? The Saturday would run in the normal peak day-class:

LOSNormal Saturday (peak)Concert Saturday (event-peak)Event premium
1 night145 EUR165 EUR+20 EUR (+14%)
2 nights130 EUR148 EUR+18 EUR (+14%)
3 nights118 EUR135 EUR+17 EUR (+14%)
4+ nights105 EUR125 EUR+20 EUR (+19%)

An event is not an ad-hoc cell-by-cell increase: the whole row switches day-class, and the event premium is roughly uniform (~14%) — except for the 4+ cell, which the floor rule holds higher (+19%). The ladder’s structure stays stable — exactly what lesson 33’s consistency trap demanded.

The Sunday paradox in numbers

In lesson 33 we saw: the Sunday-arrival ladder is flat or inverted (92 / 92 / 95 / 95). Now we can justify it:

  • The Sunday arrival’s willingness to pay is low (~92 EUR), but the length decision is not price-driven: the guest comes for Monday work or another practical reason, and stays as many nights as their business requires.
  • The extension nights (Monday, Tuesday) are themselves weak — there is nothing to protect, but nothing to “buy” either: a discount would create no new demand.
  • If the hotel cut the 92 EUR cell to 88, the vast majority of guests would book just the same — the hotel would give away 4 EUR per night in exchange for nothing.
  • The 3–4 night Sunday cell is slightly higher (95 EUR): whoever arrives on Sunday and stays half the week is almost certainly there for work — the least price-sensitive demand there is.

The general principle that resolves the paradox: give length discounts where the guest’s length decision is elastic (occasion demand on event and peak days), and not where the length is a given (need-driven demand on weak days). The steepness of the ladder is not a matter of custom — it is a matter of elasticity.

The mathematical layers of the Pricing Map

The Peaqplus Pricing Map module automates the calculation above in four layers:

Layer 1 — willingness-to-pay estimation. From historical event days, the pace curve and the pickup trend, at segment level. For the concert Saturday’s 1-night cell: on similar event Saturdays, one-night demand booked between 155–180 EUR; the current +12% pace advantage pushes toward the top of the band: ~175 EUR.

Layer 2 — ancillary premium. From the hotel’s own F&B / spa / other revenue patterns, per LOS. The table values above are starting points — the model updates from the hotel’s actual data.

Layer 3 — calibration margin and constraints. LOS weights, the weak-day rule, the floor — anchored to the hotel’s average ADR and rate position.

Layer 4 — daily recalculation. Every cell of the grid refreshes daily with pace and pickup. Fourteen days before the concert, a morning run looks like this:

  • 1 night: pace +12% above reference → cell 165 → 175 EUR
  • 2 nights: pace on track → stays at 148 EUR
  • 3 nights: pace −5% behind → cell 135 → 130 EUR (calibrating downward)
  • 4+ nights: stable → stays at 125 EUR (sitting on the floor)

Daniel approves with a few clicks, and the modified cells go live on every channel within minutes via the channel manager. And if the Saturday’s one-night demand alone would fill the house (compression), the module raises the long-stay cells of the surrounding days too — the length-projected discount narrows, because even the weak nights now have takers.

In lessons 35 and 36 (Dynamic pricing) we cover this daily calibration at the system level; in lesson 56 of the expert level (Pricing Engine — ML-based rate recommendations) we look at how an ML model learns the same thing instead of rules.

Key takeaways

  • A DCAL cell is calculated from three components: willingness to pay − (ancillary premium × LOS weight) — the ceiling is demand, the funding is ancillary, the intent is the weight.
  • The displacement test decides: on the concert Saturday the 4-night guest at 125 EUR brings +319 EUR more than the 165 EUR one-nighter they displace — because they also fill the weak surrounding nights.
  • The length-of-stay premium (ancillary contribution) runs from 23 EUR/night (1 night) to 50 EUR/night (4+ nights); in total guest value the 4-night guest is ~3.7×.
  • The formula is closed out by two corrections: the weak-day rule (don’t buy a night the guest asks for anyway) and the floor rule (an event cell must not slide near the average ADR).
  • Length discounts belong where the length decision is elastic — the Sunday paradox is not an exception but the other half of the same rule.
  • The Pricing Map automates it in four layers: estimation → ancillary → constraints → daily recalculation. The RM understands and supervises the logic of the suggestions — they don’t type cells.
Check your understanding

Click an answer — you see immediately whether it is right.

Answer all of them and the lesson counts as complete — and toward your progress.

The concert Saturday's 2-night cell: willingness to pay 165 EUR, ancillary premium 30 EUR/night, LOS weight 0.6×. What is the formula cell ADR?
A Saturday-arrival 4-night family booking (marginal revenue 119 EUR/night) would displace a 1-night business guest (marginal revenue 157 EUR) on the concert Saturday. The surrounding nights are expected to sit empty. Do you accept the family booking?
The formula gives 95 EUR for the 4+ night event cell (145 − 50). Yet the final grid shows 125 EUR. Why?
Go deeper
DCAL cell calculator

Cell ADR = 1-night base × (1 − LOS discount) × category multiplier (Superior 1.15 / Junior Suite 1.55) × rate-plan multiplier (member 0.90 / non-refundable 0.82). The cell formula from lesson 34.

Cell ADR / night
€135.3
Total stay price
€405.9
Discount vs. the 1-night rate
€89.1
Related terms

See the full definitions in the glossary.

Apply it to your own hotel

In a hotel's New Year's Eve grid, the NYE-night cell for a 4-night arrival (December 30 – January 2) is 150 EUR. The marketing director protests: "we don't go below 200 EUR on New Year's Eve." Defend (or overturn) the 150 EUR cell with a marginal-revenue and displacement calculation — assume the 1-night willingness to pay is 220 EUR and the surrounding nights are running at 40–50% occupancy. And: Hotel Peaqplus City receives a summer MICE enquiry: 30 rooms × 4 nights × 88 EUR/night; transient OTB for the affected dates is 60%, and the DCAL 4+ night cell is 95 EUR. Do you accept the group? Walk through the displacement analysis.

How Peaqplus helps with this
Further reading
  • Robert G. Cross: Revenue Management — Hard-Core Tactics for Market Domination (1997). The early, still-valid grounding of marginal-revenue and displacement thinking; the cell calculations of modern RMS tools are essentially built on these principles.
Signal → Decision → Action → Outcome

See Peaqplus on your own data.

In our 45–60 minute walkthrough we run Peaqplus on our live demo environment — a simulated property with data that moves day to day.

No setup fee. No PMS access needed.