Dynamic pricing for small properties: build your seasons from your own booking history
Owners of a B&B, a few holiday lets or a small guesthouse usually price in one of two ways: one rate all year, or whatever the neighbours charge on Booking.com. Both ignore the most reliable data you have: what actually happened at your own property in previous years. This guide shows, step by step, how to turn past occupancy and average rate into rate seasons, with floor and ceiling prices, minimum stays and last-minute rules.
- Read the last 2-3 years week by week: occupancy, average rate per sold night (ADR) and how far ahead bookings came in.
- Group the weeks into 4-6 seasons by what they earned, not by the calendar.
- Give each season a base rate, a hard floor and ceiling, and a minimum stay.
- Bank holidays and events go into a high season; they do not become seasons of their own.
- Discount late and lightly: a date months away that is still empty is normal.
1. Why start from your own history, not your neighbours' rates
Competitors' rates tell you what others ask, not what they sell, or to whom. The cottage down the road may have bigger rooms, parking, better reviews or simply the wrong prices. Your own history holds the market's answer to your offer: which weeks filled up, at what rate, and how far ahead guests booked.
Checking the local market is still useful, but as a sanity check: it tells you whether you are out of line, not what your rate should be.
2. Step 1: pull out the right numbers
For each week of the last two or three years (or at least the last one) you need only a few figures:
- Available nights and sold nights, which give you occupancy (sold ÷ available).
- ADR (average daily rate): room revenue ÷ sold nights, excluding any tourist levy and extras.
- RevPAR (revenue per available room): ADR × occupancy. It combines rate and occupancy in one number, and it is what you compare weeks on.
- Booking lead time: how many days before arrival the bookings came in. It will tell you later whether last-minute discounts make sense.
Two cautions. Leave out nights when you were closed or had rooms out of service, otherwise they look unsold. And flag unusual years (building work, an exceptional event, a channel you had just connected): read them with care rather than throwing them away.
Work by week, not by month: a month like May can hold two busy bank-holiday weekends and two quiet weeks, and the monthly average hides all of them.
3. Step 2: group the weeks into 4-6 seasons
Sort the weeks from lowest to highest RevPAR and look for the jumps: where earnings change level, that is where one season ends and the next begins. Then put them back on the calendar and fix isolated weeks by hand: one low week between two mid weeks is almost always an accident, not a season.
- Fewer than 4 seasons lump very different periods together: you either leave money on the table in the strong weeks or price yourself out of the weak ones.
- More than 6 seasons become hard to maintain, and the boundaries between them turn arbitrary.
A useful rule for reading each season: if historical occupancy was very high (say above 85-90%), demand outstripped your rooms and your rate was probably too low; if it was very low, the problem is demand, and cutting the rate hard rarely creates it.
4. Step 3: events, bank holidays and school holidays
Dates that move every year are the main trap for anyone who copies last year's rates: Easter shifts, half-terms differ between areas, and local festivals, races, concerts or graduations run on their own calendars. In Ireland, St Patrick's Day and the June and August bank holidays need the same treatment.
- Think in events, not dates: "Easter weekend", not "5 April".
- Put each event into one of the high seasons you already have, rather than creating an extra season.
- Keep a list of local events and add next year's dates as soon as they are announced.
5. Step 4: minimum stay by season
Minimum stay is as much a pricing lever as the rate itself. In peak season it protects your best weeks from one-night bookings that leave gaps you cannot resell; in low season a long minimum simply loses bookings.
- Low season: usually 1 night.
- Shoulder seasons: 2 nights, especially at weekends.
- Peak season, bank holidays and events: 3 nights or more, based on how long your guests actually stayed in that period.
As arrival gets closer, the minimum stay should get shorter, not longer: three days out, a single night stranded between two bookings will only sell on its own.
6. Step 5: base rate, floor and ceiling
Each season needs three numbers, not one:
- Base rate: the starting point, taken from the season's historical ADR and adjusted for occupancy (see the rule in section 3).
- Floor: the price you never go below. Work it out from the cost of one sold night (cleaning, linen, utilities, breakfast if included, channel commission) plus the minimum margin you will accept.
- Ceiling: the price above which, in your own history, bookings stop. It stops an automatic rule or a hasty change from pushing the rate out of touch with reality.
7. Last-minute and early-booking discounts: when they really help
They are opposite tools, and the choice should come from your lead-time history, not from a hunch.
Last minute
It only makes sense if your data shows that few bookings still arrive in the last days before arrival compared with the rooms left. If your area lives on late bookings (city breaks, work trips, people passing through), the rooms sell anyway and the discount just gives margin away. When you use it: a short window (a few days), a moderate discount, never below the season's floor.
Early booking
It works in the shoulder seasons, to lock in a base of bookings months ahead, often combined with a non-refundable rate. In peak season, if your history says you fill up anyway, an early discount cuts revenue without adding nights.
8. When NOT to drop your rate
- Dates far ahead that are still empty: two or three months out, that is normal. Discounting now teaches guests to wait.
- Straight after a booking: demand is there; if anything, consider an increase.
- Dates filling faster than in previous years at the same lead time.
- Events and bank holidays: demand comes late, but it comes.
- Below your floor: a night sold at a loss is still a loss, even if occupancy looks better.
- On a single channel without thinking: a discount published on a portal is visible to everyone and stacks with any promotions already running.
9. A worked example (illustrative)
| Season | Period (example) | Historical occupancy | Historical ADR | Historical RevPAR | Proposed base rate | Floor – ceiling | Minimum stay | Last minute (final 3 days) |
|---|---|---|---|---|---|---|---|---|
| Low | November – February, excluding Christmas | 22% | £68 | £15 | £70 | £60 – £85 | 1 night | 10% |
| Medium-Low | March, October | 41% | £76 | £31 | £78 | £65 – £95 | 1 night | 10% |
| Medium | April – May, late September | 58% | £88 | £51 | £92 | £78 – £110 | 2 nights | 5% |
| Medium-High | June, early September, bank holidays | 74% | £104 | £77 | £110 | £95 – £135 | 2 nights | 5% |
| High | July – August, Easter, New Year | 91% | £128 | £116 | £138 | £120 – £170 | 3 nights | none |
How to read it: in High, 91% occupancy says demand exceeded your rooms, so the base rate goes above the historical ADR (from £128 to £138) and a last-minute discount is pointless. In Low, 22% occupancy says demand is missing: the base rate stays close to the historical ADR, because cutting it hard would not bring in enough extra guests. RevPAR (ADR × occupancy) shows how different the seasons are: in this example a peak night earns roughly eight times a low-season night per available room.
10. The most common mistakes
- Copying last year's dates without moving Easter, bank holidays and events.
- Looking only at occupancy: high occupancy at a low ADR can earn less than average occupancy at a good rate. Look at RevPAR.
- Too many seasons, tweaked by hand every week until nobody remembers why a rate is what it is.
- No floor: a discount rule without one will sooner or later sell below cost.
- The same minimum stay all year, which leaves gaps in peak season and loses bookings in low season.
- Early discounts on strong dates, which cut revenue without adding nights.
- Never reviewing the seasons: this year's history is the starting point for next year.
11. How Vezpa does it
In Vezpa the method in this guide lives in Revenue Management (RMS), the module included in the Pro plan. In practice:
- Seasons proposed from your own history. From the RMS calendar, "Suggest seasons" assigns each day one of five seasons (Low, Medium-Low, Medium, Medium-High, High) based on how much you sold, and at what rate, on the same days in previous years. It only fills days that have no season yet: those you have already assigned stay as they are. With no history it invents nothing: it reuses last year's season or leaves the day empty.
- Base rate, floor, ceiling and minimum stay per season and per room type, as in the example above.
- Last minute per season: a discount and a shorter minimum stay in the final 3 days before arrival, with a booking curve built from your past dates to show whether there is still anything to sell in those last days.
- An optional automatic engine. It starts switched off. If you turn it on, it starts from the rate already in that day's calendar cell, not from the season's base rate, and moves only within the limits you set season by season, never below the floor or above the ceiling. It does not discount far-off dates just because they are empty, and after a booking it can raise the rate but not lower it.
- Revocable vetoes. Every automatic decision is logged in "RMS actions" with its reason. Undoing it restores the previous value and places a veto: the engine leaves that date alone until you revoke the veto.
- Channel differences and promotions. You can set a percentage mark-up for each connected channel and publish promotions (last minute, early booking, general discounts) channel by channel.
Rates and seasons apply even with the engine off: you can use the RMS purely as a season calendar and make every decision yourself.
Your seasons, from your own history
Seasons proposed from previous years' sales, floor and ceiling prices, minimum stay and last minute per season, rates synced with 60+ OTA channels. Try it on the live demo, nothing to install.
Try the live demo →Frequently asked questions
- How many rate seasons does a B&B or holiday let need?
- Four to six seasons are enough for a small property. Fewer than four lump very different periods together; more than six become hard to maintain and the boundaries between them turn arbitrary. Bank holidays and events go into one of the higher seasons rather than becoming seasons of their own.
- How many years of booking history do I need to build seasons?
- Ideally two or three years, read week by week. One year works as a starting point but needs common sense: a year with renovation work, closures or an exceptional event distorts the averages. With no history at all, start from reasoned seasons and review them after the first full season.
- Should I always discount empty dates at the last minute?
- No. A last-minute discount only makes sense if your history shows that few bookings still arrive in the final days compared with the rooms left. If your last days fill up anyway, the discount just gives margin away. A date months away that is still empty is normal and should not be discounted.
- How do I set the floor and ceiling price for a season?
- The floor starts from the cost of one sold night (cleaning, linen, utilities, breakfast, channel commission) plus the minimum margin you will accept. The ceiling is the price above which, in your own history, bookings stop. Set both season by season.
- What minimum stay should I set for each season?
- The busier the season, the longer the minimum stay can be: typically 1 night in low season, 2 in the shoulder seasons, 3 or more in peak season and over bank holidays. As the date gets closer, shorten it so that single nights stranded between two bookings can still be sold.
Belgique
България
Česko
Danmark
Deutschland
Ελλάδα
España
France
Hrvatska
Ireland
Ísland
Italia
Luxembourg
Magyarország
Nederland
Norge
Österreich
Polska
Portugal
România
Россия
Schweiz
Slovenija
Slovensko
Suomi
Sverige
United Kingdom