Occupancy has averaged 87% since March and the reviews are excellent — the hard part is done. What a demand-following pricing engine reads as "priced correctly," though, a full calendar at this cost structure suggests is "priced too low." This is a proposal for where to take the rate, and the evidence behind it.
Where we are · Mar–Jul 2026
Where this could go · if the plan is followed
Fewer nights sold, at nearly double the rate. The conservative case — occupancy landing eight points below target in every season — still returns 6.6%. Figures are set out in full further down.
Summary
Desa took over a badly run property and turned it around. Occupancy went from unstable to consistently high, the listing now holds 4.86 stars across 14 reviews and Guest Favourite status, and gross ADR climbed from €70 in March to €85 in July. None of what follows is a criticism of the operation.
The issue is on the revenue-management side. At 87% occupancy with a €6/night marginal cost, the villa is leaving money on the table in a way that a demand-following pricing algorithm will never surface on its own — because from the algorithm's point of view, a full calendar is a success.
Annualised on the March–July run rate, and after the monthly common-area invoice, the owner nets roughly €11,240 per year on a €300,000 investment. That is a 3.7% yield. The rest of this document shows where the gap is and what it would take to close it.
RevPAR · the metric that matters
Occupancy alone doesn't tell you whether a month went well. RevPAR — net revenue divided by every night in the calendar, sold or not — does, because it prices the empty nights in.
| Month | Nights | Occ. | Gross ADR | Net ADR | RevPAR | Owner, net |
|---|---|---|---|---|---|---|
| March | 25 / 31 | 81% | €70 | €57 | €46 | €797 |
| April | 26 / 30 | 87% | €69 | €53 | €46 | €745 |
| May | 29 / 31 | 94% | €76 | €63 | €59 | €1,106 |
| June | 27 / 30 | 90% | €77 | €70 | €63 | €1,044 |
| July | 26 / 31 | 84% | €85 | €68 | €57 | €632 |
| Average | 26.6 | 87% | €76 | €64 | €54 | €865 |
Owner figures are the 80% distribution less the €55 monthly common-area invoice. July is shown as reported; the Rp 10.3m bedding replacement is treated separately below.
The night ledger
This is the whole period at the resolution the decisions are actually made at — one square per night, coloured by the channel that sold it.
Short gaps are not blocked here. Four two-night stays were sold through Airbnb over these five months, and two of them slotted exactly between existing bookings — Ronny Sutanto on 4–6 March and Yassine Outgharmine on 22–24 June, each with a guest checking out the morning they arrived and another checking in the morning they left. Whatever the nominal minimum stay is, the calendar is letting these through.
So these nights were sellable. They simply didn't sell:
| Short gap | Length | Outcome |
|---|---|---|
| 4–6 March | 2 nights | Sold — Airbnb, exact fill |
| 22–24 June | 2 nights | Sold — Airbnb, exact fill |
| 23 April | 1 night | Unsold |
| 10 May | 2 nights | Unsold |
| 9 June | 2 nights | Unsold |
| 26 June | 1 night | Unsold |
| 1 July | 2 nights | Unsold |
| 8 July | 2 nights | Unsold |
| 26 July | 1 night | Unsold |
| Unsold | 11 nights | ≈ €1,215 / year in owner profit |
Selling all of them would move occupancy from 87% to 94%, with no extra guest turnover beyond what is already happening on either side of each gap. Two out of nine sold; the question is what to do about the other seven.
€6.01 per night
This is the number the whole strategy rests on, and it is much lower than it intuitively feels.
| Cost | Per month | Behaviour |
|---|---|---|
| Housekeeping salaries | €121 | Fixed |
| Electricity | €121 | Fixed |
| Common area invoice | €55 | Fixed |
| Pool service | €29 | Fixed |
| Dues, internet, insurance | €29 | Fixed |
| Laundry, cleaning & guest supplies | €67 | Variable — €2.47/night |
| Repairs & linen replacement (reserved) | €96 | Wear — €3.54/night |
| Fixed €356/mo · Variable + wear | €6.01/night |
Staff, pool, power, internet and the complex invoice all run whether a guest is in the villa or not. Only laundry, consumables and wear scale with occupancy — about six euros a night.
The practical consequence: occupancy is worth defending, and price increases are cheap to test. Every euro added to the nightly rate flows almost entirely to the bottom line, and it takes a large occupancy loss to cancel out even a modest increase.
The Rp 10.3m linen replacement is legitimate wear, but landing it in a single month made July's result look like an operational failure when it wasn't. Throughout this analysis it is spread across twelve months so that the underlying trend stays readable — the €3.54 per night in the table above is that figure, together with average repairs and maintenance.
Channel mix
Across 131 nights from March to July, Marriott returned €78 net per night against Airbnb's €62. That is not a fee advantage; the take rates are within 0.2 points of each other. Marriott's guests simply pay more — €94 gross versus €75 — and they book longer stays (6 and 7 nights).
One caveat before reading too much into this. Smart Pricing governs Airbnb only; Marriott's rates run on a separate plan and were never discounted the same way. On adjacent dates in May, Marriott sold at €89 gross while Airbnb sold at €72 — which may say more about where the discounting was applied than about the guests. The honest conclusion is that Airbnb looks underpriced relative to what this villa can achieve, and Marriott is the evidence for it. Whether Marriott also deserves a larger share of nights is a question to settle once both channels carry the same rates.
Four guests booked through Airbnb and then extended directly. Direct nights carry no channel fee, which is worth 17.2% — but the direct rate has been set so far below the Airbnb rate that most of that saving is handed straight back to the guest:
| Guest | Airbnb rate | Net to villa | Direct rate | Result |
|---|---|---|---|---|
| Aren Fox (March) | €67 | €55 | €49 | −€6 / night |
| Ronny Sutanto (March) | €67 | €56 | €63 | +€7 / night |
| Üstün Dilek (June) | €73 | €61 | €71 | +€10 / night |
| Yusuf Mohamed (June) | — | — | €71 | Full rate, no fee |
Blended, direct nights returned €67 net against Airbnb's €62 — a 7% gain when the fee saving alone was worth 17%. The rule should be: a direct rebooking is priced at the Airbnb rate less 5%, not less 25%. The guest still saves, and the villa keeps the difference.
Booking.com is the weakest channel on both dimensions — 19.0% take and the lowest gross ADR. It is worth keeping for reach, but it should never receive the best rate.
The core argument
Because the marginal cost of a night is €6, a higher rate is protected by a very wide margin of error. This chart shows, for each list price, the occupancy at which the villa would earn exactly what it earns today.
| List price / night | Net after 17.2% fee | Break-even occupancy | Margin vs. today |
|---|---|---|---|
| €76 (today) | €63 | 87% | — |
| €90 | €75 | 74% | 13 points |
| €105 | €87 | 62% | 25 points |
| €120 | €99 | 54% | 33 points |
| €140 | €116 | 46% | 41 points |
| €185 | €153 | 34% | 53 points |
This is why the recommendation is to raise rates decisively rather than in 5% increments. The downside is bounded and the current occupancy provides an unusually large buffer to test into.
Proposal
Bali demand is strongly seasonal and the current pricing does not reflect that. July was sold at €85 gross — the same order as March, which is shoulder season. The proposal is four rate bands, set as floors, with the algorithm permitted to move up from them but not down.
| Band | Months | List price | Target occupancy | Break-even occ. |
|---|---|---|---|---|
| Peak | Jul, Aug, Dec | €185 | 85% | 34% |
| High | Jun, Sep, Jan | €135 | 82% | 47% |
| Shoulder | Mar, Apr, May | €110 | 78% | 59% |
| Low | Feb, Oct, Nov | €90 | 72% | 74% |
| Full year | avg €132 | 289 nights · 79% |
Even the conservative case — 71% occupancy across the year, well below anything the villa has achieved since March — nearly doubles the owner's return, from 3.7% to 6.6%. The plan does not depend on the villa staying full. It depends on it not being sold cheaply when it is.
Actions
Ordered by date. Each item names the system, the exact setting to change, and how to tell it is done. The two euro figures are additional owner profit per month after the 20% management share, taken from the pricing model rather than added on top of it.
Customize > Seasonal Minimum, Base and Max Price Settings. Create four date ranges and enter, in IDR:
Peak (Jul, Aug, Dec): Base 3,810,000 / Min 3,090,000 / Max 6,100,000
High (Jun, Sep, Jan): Base 2,780,000 / Min 2,270,000 / Max 4,450,000
Shoulder (Mar, Apr, May): Base 2,270,000 / Min 1,960,000 / Max 3,630,000
Low (Feb, Oct, Nov): Base 1,850,000 / Min 1,750,000 / Max 2,960,000
Replaces the single flat Base 2,090,000 / Min 1,790,000 in use today. Set the ranges to repeat annually so they cover every date to March 2027.
Done when: The calendar shows July 2027 priced above Rp 3,500,000 and February 2027 below Rp 2,200,000.
Customize > Orphan Days.
Define an orphan gap as 2 nights or fewer.
Min-stay override: set minimum stay equal to the gap length (1-night gap accepts 1 night).
Discount: 12% on a 1-night gap, 8% on a 2-night gap.
This is the only discount we are adding. It applies solely to gaps between two existing bookings.
Done when: A 1-night gap in the calendar shows a min stay of 1 and a price about 12% below the surrounding nights.
Customize > Minimum Stay, by days to arrival.
More than 14 days out: 3 nights.
14 days or less: 2 nights.
Applies to all channels. Protects peak weekends while opening the shorter-stay demand Booking.com carries.
Done when: A date 30 days out shows a 3-night minimum; a date 7 days out shows 2 nights.
Customize > Occupancy Based Adjustments and > Last Minute Discounts.
Leave as they are. Occupancy adjustments are currently running premiums (+10% inside 15 days, +3% at 16-30 days), which is correct.
Do NOT enable a last-minute discount. Agreed with Desa: a falling price invites guests to cancel and rebook cheaper.
Done when: Screenshot confirming no last-minute discount rule is enabled.
Channel settings > Booking.com > rate markup: +2% on the gross rate.
Booking.com deducts 19.0% against 17.2% on Airbnb, so it needs a slightly higher list price to net the same.
Done when: The same date shows a price about 2% higher on Booking.com than on Airbnb.
Direct booking site / returning-guest rate: OTA price minus 5%.
Not minus 25%, which is roughly what has been given away. Direct carries no channel fee at all, so a 5% guest discount keeps 12 points of margin.
Offer it to every departing guest for their next stay.
Done when: A returning guest quoted directly receives a rate 5% below the live Airbnb price.
60 days after the new rates go live, compare net revenue per night by channel again.
Marriott has been returning €78 per night against Airbnb's €62 at almost the same take rate. Once both carry the same rates we will know whether that gap is real.
If Marriott still leads, we increase its share. If not, Airbnb was simply underpriced.
Done when: A table of net ADR per channel for the 60 days after the change.
Add three figures to the existing monthly pack: RevPAR (net revenue divided by all calendar nights), ADR, and net ADR broken down by channel.
Occupancy on its own rewards underpricing, which is how the villa reached 87% occupancy at €76 a night.
Done when: The next monthly report contains all three.
Appendix
These settings were reviewed from the live PriceLabs account in August 2026, so the figures below are against what is actually configured rather than assumed.
Where: Dynamic Pricing → Calendar → Configure Prices, and Customize → Seasonal Minimum, Base and Max Price Settings
| Setting | Today | In euros |
|---|---|---|
| Minimum | Rp 1,790,000 | €87 |
| Base | Rp 2,090,000 | €101 |
| Maximum | Not set | — |
One base, one minimum, applied to every date in the year. Because every other rule in PriceLabs is a percentage of the base, this single number sets the ceiling for the whole strategy:
| Step | Effect | Running total |
|---|---|---|
| Base Price | — | €101 |
| Far-out premium | +20% at day 136 and beyond | €122 |
| Occupancy adjustment | +10% inside 15 days | €134 |
Seasonal bases, entered as date ranges:
| Season | Months | Base | Minimum |
|---|---|---|---|
| Peak | Jul, Aug, Dec | Rp 3,810,000 €185 | Rp 3,090,000 €150 |
| High | Jun, Sep, Jan | Rp 2,780,000 €135 | Rp 2,270,000 €110 |
| Shoulder | Mar, Apr, May | Rp 2,270,000 €110 | Rp 1,960,000 €95 |
| Low | Feb, Oct, Nov | Rp 1,850,000 €90 | Rp 1,750,000 €85 |
Where: Customize → Occupancy Based Adjustments
Currently auto-applied, and currently running premiums rather than discounts: +10% inside 15 days, +3% at 16–30 days, and −1% at 31–60. Occupancy is above market, so PriceLabs is charging more for late bookings, not less.
Desa's position is that last-minute discounting should stay off, because guests who see a price fall after booking will cancel and rebook at the lower rate. That is a real and well-documented behaviour, the reasoning is sound, and we agree — there is nothing here we would change.
The durable defence against cancel-and-rebook is the cancellation policy rather than the pricing rule. Marriott takes 50% at booking and refunds nothing inside 14 days, and it is the channel earning the most per night. Whether Airbnb should tighten in the same direction is in the open questions above.
Where: Customize → Orphan Days
Where: Customize → Far Out Prices
Set to Market Driven (Balanced): 0% at 60 days, ramping to +20% by day 136 and holding beyond. This is the rule that captures planners booking six months out, and it is doing its job. No change needed — but note that it multiplies the base, so raising the base is what makes it worth more.
The account shows occupancy at 100% for the next 7 days, 57% for the next 30 and 38% for the next 60. Against a historical 84–94%, the far figures look thin — but a booking window that fills late will always look like this, and March through July would have shown the same shape at 60 days out. The number worth tracking is the 30-day figure as it converges: if it lands near 85% at the new prices, the strategy is working; if it stalls in the sixties, the base has gone too far and should come back a step.
Open questions
The pattern in the data suggests demand-following pricing working from a low base, but we're inferring from outcomes rather than settings. The current configuration would tell us quickly whether the appendix is aimed at the right numbers.
Four two-night Airbnb stays sold over these five months, two of them exact fills between bookings — which suggests short stays are being let through somewhere. If the orphan rules are already active, the seven unsold gaps are a pricing question rather than a configuration one.
Rp 1.68m in March and Rp 1.47m in July, roughly 4% of revenue. Cancellations, refunds, or something else?
Two bedrooms, 2.5 bathrooms, private pool. A comp set with current rates by season would let us set the bands against the market instead of against the cost base.
If those channels sit outside the algorithm, that would explain much of the €16/night gap with Airbnb — and it would mean Airbnb is the channel being underpriced, not Marriott the one outperforming.
Marriott's 14-day no-refund policy is far tighter than Airbnb's, and it is the channel earning the most per night. Tightening Airbnb somewhat may support a higher rate — though it will also cost some bookings, so it is a trade to weigh rather than an obvious win.
Worth knowing the answer before the 60-day measurement, so we can act on it straight away. And is there anything on our side — photography, description, amenity list — that would help it convert better?
If Smart Pricing is capped, a listing at 87% occupancy is probably hitting that cap during peak weeks.