Editorial standards

How every number
is calculated.

We show the inputs behind each estimate and identify where source evidence is incomplete. These are screening scenarios, not booked performance or a forecast of what you will earn.

Where the data comes from

Listings on Bali Villa Truth are sourced from Bali Home Immo (BHI), a public real estate listing source. We scrape their public listings to capture asking prices, locations, bedroom counts, land size, lease terms, and property details.

The current nightly-rate model uses Booking.com villa asking ratesby area and bedroom tier, not verified booking revenue. The active table comes from a 1 August 2026 sample for 3 November 2026 stays; it does not include an Airbnb blend. A 15% "reality discount" is applied to platform medians because asking rates may exceed realized rates. Booking.com review density is a separate proxy for area occupancy; neither input verifies the earnings of a particular villa.

Rate-sample limitation, identified 1 October 2026: Booking.com pagination repeated result cards in the active August sample. Its count of scraped prices therefore overstates distinct-property coverage, and some area-and-bedroom medians may be affected. A newer October scrape was held because it also repeated pages and used a different stay season. The published rate table and yields have not been replaced. Treat them as provisional screening inputs; request dated property-level booking and expense records before underwriting a purchase.

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

Eligible Bali villa listings get an estimated nightly rental rate based on area and bedroom count. Out-of-scope properties remain unmodeled. Here's how the supported estimate is built:

1

Area + bedroom rate lookup

An eligible listing starts with a rate based on its area and bedroom count. We maintain a Booking.com-based rate model for 12 Bali areas across 5 bedroom tiers. The base values are discounted platform asking-rate medians with unverified distinct-property sample coverage, not realized revenue or a property appraisal. Villas in the same supported area and bedroom tier share a base rate; discrete budget discounts can then lower it for cheaper properties.

2

Budget property discount

The model discounts the area-tier rate for lower-priced properties: 15% below the 35th percentile, 30% below the 25th percentile, and 50% for extreme outliers priced below half of the 25th-percentile benchmark. These are discrete tiers, not a continuous rate adjustment based on the asking price. The listing shows the applied rate and flags.

3

No other adjustments

Beyond the budget discount, the rate goes into the yield formula without continuous price-based scaling. A high modeled yield is a prompt to investigate the assumptions and source details, not evidence of achievable rental income.

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

The published net-yield badge uses a shared 65% occupancy scenario for every modeled villa. It is a comparison assumption, not measured occupancy or a forecast. Separately, the site stores area review-density percentages mapped to a chosen 40%–80% range. That proxy is not used in the badge. Its 7 March 2026 snapshot requires revalidation.

1

Review density as a demand proxy

We sampled Booking.com result cards across 12 Bali areas and used review counts as a rough demand signal. The model blends median and mean review counts to reduce outlier influence. Review counts also depend on listing age, channel mix, and how often guests leave feedback.

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 mapping differentiates areas, but it cannot establish actual occupied nights.

3

Sample coverage is not forecast confidence

Earlier confidence labels were based on raw result-card counts, not independently verified properties or booking outcomes. The March snapshot contains repeated cards from pagination and malformed review scores. Until a clean sample is validated and the model is republished, treat all displayed review-density occupancy assumptions as provisional.

What this is not

These are not actual occupancy data or evidence that one area outperforms another. The provisional 40%–80% mapping does not drive the published yield badge. The 65% comparison scenario can still materially overstate or understate a specific villa's results. Request property-level booking exports and test lower occupancy before underwriting.

In the compare panel, you can adjust occupancy from 20% to 95% to stress-test how different scenarios change the modeled result. Use property-level booking records where available; an area-level anecdote is not evidence that a particular villa will book at that rate.

Net yield (the badge number)

For an eligible listing, the estimated net-yield badge is a modeled annual result divided by the audit purchase-price basis. It uses a standard operating-cost allowance and, for leaseholds, a noncash lease-value allowance. It is not an earnings forecast and excludes tax, financing, and major works. Here's the formula:

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

For leaseholds, screening_years is the source-listed lease period or an illustrative 15 years if the period is missing. BVT has not verified how many years remain under the signed agreement. The allowance is not a cash expense or an observed change in resale value.

The USD price used in this calculation is fixed at the audit exchange rate; a display-time currency conversion may differ. The crossed-out “Gross” percentage above the badge is modeled rental revenue divided by the audit price before operating costs and lease decay. The difference shows how much the standard allowances change this screening scenario, not an actual loss.

Operating costs (40%)

The model deducts 40% of gross rental revenue as one pooled operating-cost allowance. It does not calculate verified amounts for individual expense categories. Buyers should check:

Property management

Staff, cleaning, laundry and guest communication

Booking channels

Platform commissions, payment fees and direct-booking costs

Upkeep and utilities

Pool, garden, air conditioning, internet and routine repairs

The 40% load is a comparison assumption, not a measured market midpoint or a property budget. Use owner statements, contracts and maintenance records to replace it with a property-specific estimate. The compare panel lets you test operating-cost loads from 20% to 60%.

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.

For a modeled leasehold, we subtract an illustrative noncash annual lease-value allowance from operating income, calculated as:

annual_lease_cost = asking_price / screening_years

At a $300,000 asking price, a source-listed 20-year period produces a $15,000/year screening allowance; a listed 10-year period produces $30,000/year. These are model deductions, not payments or measured annual market-value losses. When the source lists no period, the model uses an illustrative 15 years and flags the missing term. The signed commencement date, remaining years, expiry and extension cost are not verified by BVT.

Freehold properties (rare for foreign buyers in Bali) don't have this deduction. Properties with a source-listed period under 15 years are additionally flagged with a Short Lease warning badge.

Red flags

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

Short Lease

Source-listed lease period is under 15 years; signed remaining years are unverified. A shorter model denominator increases the noncash allowance.

Budget Villa

Asking price is below the 25th percentile for its area and bedroom tier. The model applies a 30% rate discount as a caution, not as verified rental performance.

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 to modeled net yield shows the cost and lease allowances that a gross headline omits.

The compare panel (your sandbox)

The badge is a baseline screening scenario using the assumptions above. It is not a forecast and may not match a particular villa's booking history or costs.

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. The March review-card sample has repeated results and malformed scores, so its coverage cannot establish confidence in an area forecast. The published yield uses a separate shared 65% scenario.

  • True operating costs

    Our standard 40% allowance is a screening assumption, not a verified industry midpoint. 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. The active sample contains repeated result cards, so its distinct-property coverage is unverified. 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.

Investor FAQ

What is a good ROI for a Bali villa?

No single percentage establishes a good investment. Compare a modeled net yield with verified booking revenue, actual operating costs, total acquisition cost, remaining lease years, and a downside case. BVT publishes a screening estimate, not evidence of achieved return.

How does Bali Villa Truth calculate net yield?

The published badge uses a shared 65% occupancy screening scenario: nightly rate times 365 nights times 65%, less a 40% operating-cost load and annual lease depreciation where applicable. This is a comparison estimate, not a forecast of booked nights.

Why is leasehold depreciation included?

A finite lease can expire, so BVT subtracts an illustrative noncash allowance when comparing yields. It divides asking price by the source-listed lease period, or by 15 years if no period is stated. This is not an observed annual resale-value decline. The signed remaining term and extension cost need independent verification.

Are the occupancy rates actual booking data?

No. The yield badge uses an assumed 65% occupancy. Separate area percentages come from a provisional March 2026 Booking.com review-density proxy and are not used in the badge. Neither is property-level booking history.

Why do agent ROI numbers differ from BVT yields?

Agent numbers often quote gross yield and may omit management fees, OTA commissions, maintenance, utilities, vacancy, and lease decay. BVT publishes a standardized net-yield model so villas can be compared on the same assumptions.

How we keep it current

Our listing pipeline runs periodically to capture new listings and asking-price changes. The active Booking.com rate sample is dated 1 August 2026; the review-density occupancy sample is dated 7 March 2026. Neither is a live market feed. The 1 October rate refresh was held after duplicate-page and stay-season checks; no new rates or yields were published from it. New samples should be applied only after unique-property and comparable-stay validation. Asking prices update when the source changes; the price-history event threshold is 5% for a material change, not every smaller move.

This methodology page is a living document. When we change how we calculate something, we update it here. The published yield currently uses a shared 65% occupancy scenario. The separate area proxy needs a clean refresh before its sample-size labels can be treated as reliable.