Our Methodology

How every number on Bali Villa Truth is calculated

Our commitmentWe show you every assumption behind every number. No hidden floors, no inflated rates, no false precision. If we don't have real data, we tell you — and we give you the tools to plug in your own.

Where the data comes from

Every listing on Bali Villa Truth is sourced from Bali Home Immo (BHI), one of the largest real estate aggregators in Bali. We scrape their public listings to capture asking prices, locations, bedroom counts, land size, lease terms, and property details.

Nightly rental rates are derived from a 50/50 blend of Booking.com and Airbnb market data. We scrape actual villa listings across 12 areas and 5 bedroom tiers on both platforms to build our rate model — Booking.com gave us 2,499 data points and Airbnb added 415 more. Blending both platforms gives us a more honest market rate: Booking.com skews toward established properties, Airbnb toward newer and boutique stays. Neither alone tells the full story. A 15% "reality discount" is applied to the platform medians to account for the fact that asking rates are not the same as realized rates. We also use Booking.com review density data to estimate area-specific occupancy — more details in the occupancy section below.

Exchange rates are fetched from ExchangeRate-API at the start of each pipeline run and used consistently throughout processing. The frontend also fetches live rates for display-time currency conversion.

Nightly rate

Every listing gets an estimated nightly rental rate based on its area and bedroom count. Here's how we arrive at it:

1

Area + bedroom rate lookup

Every listing gets a nightly rate based purely on its area and bedroom count. We maintain a rate model blending real Booking.com and Airbnb data for 12 Bali areas across 5 bedroom tiers. For example, a 2-bedroom villa in Canggu is estimated at $143/night, while a 2-bedroom in Ungasan is $96/night. These are medians from actual listings on both platforms, not assumptions. Every villa in the same area and bedroom tier gets the same base rate — the rental market sets prices by location and size, not by what sellers are asking.

2

Budget property discount

If a villa's asking price falls below the 25th percentile for its area and bedroom tier, we apply a flat 30% discount to the nightly rate. A $107K villa in Nusa Dua almost certainly can't command the same $170/night as a $500K property with an infinity pool and ocean view — even though they're in the same area with the same bedroom count. The discount acknowledges this reality without reintroducing circular math: it's a binary trigger (below threshold → yes/no), not a continuous function of price. You'll see "Budget Villa" flagged on these listings with the discounted rate shown transparently — e.g. "$119/nt (discounted from $170 area median)".

3

No other adjustments

Beyond the budget discount, the rate goes straight into the yield formula. We don't cap it, inflate it, or apply continuous price-based scaling. If a mid-range villa shows a high yield, that's real information — the rental market rate for that area is high relative to the purchase price. We flag unusually high yields so you can investigate, but we never hide the number.

What we deliberately removed: Earlier versions of BVT applied two manipulations that undermined trust. First, a price-based rate adjustment that scaled nightly rates up or down based on the villa's sale price — this created circular math where yields converged to the same number regardless of price. Second, a yield cap and floor that artificially compressed all results into a narrow band. Both defeated the purpose of comparison. The budget discount (step 2) is the honest middle ground: it acknowledges that cheap properties can't command median rates, without letting price flow continuously into yield math.

Occupancy rate

We estimate area-specific occupancy rates ranging from 40% to 80% based on Booking.com review density. Areas with more reviews per property indicate higher demand, which we use as a proxy for occupancy. This replaced our earlier flat 65% assumption.

1

Review density as a demand proxy

We sample villa listings on Booking.com across 12 Bali areas, collecting review counts and scores per property. More reviews generally means more bookings — a property with 400 reviews has almost certainly hosted more guests than one with 15. We use a blended median/mean of review counts per area to reduce the skew from outlier mega-resorts.

2

Relative ranking, not absolute conversion

We don't try to convert review counts directly into occupancy numbers — that would require knowing average stay length, review-to-booking ratios, and listing ages, which we don't have. Instead, we rank areas by review density and map them onto a 40%–80% range. The busiest area gets the highest occupancy, the quietest gets the lowest, and everything else is interpolated. This relative approach avoids brittle assumptions while still differentiating between areas.

3

Confidence levels

Not all estimates are equally reliable. We show you how confident we are based on how many properties we sampled per area:

High confidencen ≥ 15

Large sample size. Reliable estimate for the area.

Medium confidencen = 8–14

Moderate sample. Reasonable estimate, but more data would help.

Low confidencen < 8

Small sample. Treat as a rough estimate — the area may not be well-represented.

What this is not

This is not actual occupancy data. It's an estimate derived from a proxy (review density) for a proxy (demand). It's better than a flat guess — it captures the real difference between a bustling Seminyak and a quiet Tabanan — but it's still an approximation. For areas where we couldn't gather enough data, we fall back to a flat 65% and label it clearly as “assumed.”

In the compare panel, you can adjust occupancy from 20% to 95% to stress-test how different scenarios affect your returns. If you have on-the-ground knowledge that Canggu villas book at 80%, plug that in — your local insight will always beat our model.

Net yield (the badge number)

The green, amber, or red badge on every listing shows the estimated net yield — what percentage of the purchase price you'd earn annually after all operating costs. Here's the formula:

// The full calculation
gross_revenue = nightly_rate × 365 × occupancy
expenses = gross_revenue × 40%
net_revenue = gross_revenue − expenses
// For leaseholds only:
lease_cost = asking_price / remaining_years
adjusted_revenue = net_revenue − lease_cost
net_yield = (adjusted_revenue / asking_price) × 100

The crossed-out “Gross” percentage you see above the badge is the number many agents quote — it ignores all operating costs and lease depreciation. We show it struck through so you can see exactly how much those costs eat into your returns.

Operating costs (40%)

We deduct 40% of gross rental revenue for operating expenses. This breaks down as:

Property Management15%

On-ground manager, cleaning, laundry, guest communication

OTA / Booking Fees15%

Airbnb, Booking.com, and other platform commissions

Maintenance10%

Pool care, garden, AC servicing, wifi, repairs

Is 40% exact? No — some well-managed villas run at 35%, others at 50%. It's a reasonable industry midpoint. In the compare panel, you can adjust this between 20% and 60% to match your own operating model.

Lease depreciation

Most Bali properties available to foreign buyers are leaseholds — you're buying the right to use the land for a fixed number of years. When that lease expires, the asset reverts to the landowner.

We deduct an annual lease cost from net revenue for all leasehold properties, calculated as:

annual_lease_cost = asking_price / remaining_lease_years

This means a $300,000 villa with 20 years left on the lease has $15,000/year deducted from net revenue before calculating the yield. A villa with 10 years has $30,000/year deducted. Shorter leases take a larger hit — as they should.

Freehold properties (rare for foreign buyers in Bali) don't have this deduction. Properties with fewer than 15 years remaining are additionally flagged with aSHORT LEASEwarning badge.

Red flags

We automatically flag listings that warrant extra scrutiny. These aren't deal-breakers — they're signals to investigate further.

SHORT LEASE

Less than 15 years remaining on the lease. Lease depreciation significantly impacts returns.

BUDGET VILLA

Asking price is below the 25th percentile for its area and bedroom tier. Nightly rate is discounted 30% from the area median to reflect that budget properties typically can't command median rates. Tooltip shows the exact discount.

HIGH YIELD

Gross yield exceeds 20%. This could mean it's genuinely underpriced, or that the asking price doesn't reflect reality. Investigate the property directly.

OPTIMISTIC CLAIM

Gross yield is 15-20%. The gap between gross and net yield (after expenses and depreciation) is where investors lose money.

The compare panel (your sandbox)

The badge shows our best estimate using the assumptions above. But those are our assumptions — they might not match your reality.

The compare panel lets you select up to 5 villas and adjust three variables with sliders:

0.5× to 2.0×

Nightly rate multiplier

Think rates are higher or lower? Adjust here.

20% to 95%

Occupancy

Plug in your own occupancy estimate for the area.

20% to 60%

Operating costs

Self-managed villa? Lower the costs. Full-service management? Raise them.

The yields in the compare panel update in real-time as you move the sliders. This is explicitly a different number from the badge — the badge is our pipeline estimate, the compare panel is your personal stress-test.

What we don't know

We believe in being upfront about the limits of our analysis:

  • Actual occupancy rates

    Our occupancy estimates are derived from Booking.com review density — a proxy for demand, not a direct measure of bookings. Review counts don't account for seasonality, direct bookings (which skip OTAs entirely), or how long a property has been listed. We show confidence levels so you can judge how much weight to give each estimate.

  • True operating costs

    Our 40% estimate is a reasonable industry midpoint, but your actual costs depend on management style, property age, staff arrangements, and platform mix.

  • Booking.com vs. actual rental performance

    Our rate model is based on listed rates on Booking.com, not actual bookings. Actual rates may be lower (discounts, last-minute deals) or higher (direct bookings, premium guests).

  • Property condition and build quality

    A listing's price doesn't tell us if the roof leaks or if the pool pump needs replacing. On-the-ground due diligence is irreplaceable.

  • Regulatory changes

    Indonesian property law, tax rules, and visa regulations change. Our analysis reflects current conditions.

How we keep it current

Our pipeline runs periodically to capture new listings and price changes. Booking.com rate data is refreshed approximately monthly. Occupancy estimates are refreshed quarterly — review counts change slowly, so more frequent updates would add noise without signal. When prices change by more than 1%, we log the event and snapshot the ROI at that point.

This methodology page is a living document. When we change how we calculate something, we update it here. The most recent updates: area-specific occupancy estimation with confidence indicators (replacing the flat 65% assumption), graduated budget discounts for cheap properties, and transparent rate sourcing showing where every nightly rate comes from.