Methodology
Everything on this site is computed from public property listings. This page says exactly how, and where the method is weak. If a figure here cannot be derived from what follows, it does not get published.
Last reviewed: 2026-08-26.
1. What the numbers are, and are not
These are asking prices, not transaction prices. Every rent and every sale figure is what someone advertised, not what was signed. Malaysian transactions typically close 5 to 15% below asking. We do not have access to transaction data, and we do not pretend otherwise.
Nothing below ten samples is shown. Where a figure would rest on fewer than ten listings, the site prints "insufficient sample" and the sample count instead of a number. A precise-looking figure built on three listings is worse than no figure at all.
Every number carries its sample size and its collection date. If you see
a figure without n= and a date beside it, that is a bug. Please report it.
2. Where the listings come from
Two portals, because one is not enough.
| Portal | What it is | What it skews to |
|---|---|---|
| Mudah.my | Mass-market classifieds | Older, smaller, cheaper stock |
| PropertyGuru.com.my | Agent-driven portal | Newer, larger, dearer stock |
Measured on Bukit Mertajam in August 2026, the same zone read RM1,525 for a median 3-bedroom rent on Mudah and RM1,900 on PropertyGuru, with a median unit 45% larger on PropertyGuru. Neither portal describes the market on its own. The gap between them is a real fact about a zone, so it is published per zone rather than averaged away.
Sampling
Mudah is queried per subarea and paginated. Pages are sampled evenly across the whole reachable result set, not taken from the front.
That detail matters more than it sounds. Mudah sorts newest first. Taking the first N pages made "days on market" measure our own sampling depth instead of the market: Johor Bahru, with 17,000 listings, reported a 4-day median because the newest 600 listings spanned four days, while KLCC, with 1,058 listings we fetched in full, reported 36 days. The difference was our page budget, not the two markets. Spreading the sample fixed it, and de-biased the rent and price medians at the same time.
Mudah stops serving results past roughly 8,000 per query no matter what its own result count claims. PropertyGuru stops past about page 18. Both ceilings are respected, and where a zone's advertised inventory exceeds what can be reached, the zone page says so.
Merging
Listings from the two portals are pooled, but not pooled evenly. If we fetched 600 from each, the merged median would sit halfway between two segments regardless of how much of the real market each portal holds, so the figure would track our page budget rather than the market.
Instead each listing is weighted by how much of its own portal's advertised inventory it stands for:
weight(listing) = portal inventory for this zone / listings sampled from that portal
A Mudah listing drawn from 5,635 advertised units by a sample of 179 speaks for 31 units. A PropertyGuru listing drawn from 1,240 by a sample of 148 speaks for 8. The published figure is the weighted median.
Rent and sale are weighted separately, because the portals hold different shares of each market. One blended weight would under-weight a portal on rent and over-weight it on sale at the same time.
Sample size is still reported as the number of real listings seen, never the sum of the weights. The ten-sample rule is about how much we actually looked at, and no amount of weighting turns three listings into evidence.
3. What gets thrown away
Property type
Only strata residential is kept: condominium, apartment, flat, service residence, studio, duplex, penthouse, SoHo, SoFo, SoVo, townhouse.
Rooms, shop lots, warehouses, office space, semi-detached houses, terraced houses, bungalows and land are removed before any figure is computed.
This is not a small filter. In Bukit Mertajam, 1,277 unique rental listings reduced to 294 strata residential: 21% were warehouses or factories, 16% shop lots, 18% terraced houses, 8% single rooms. The mainland Penang market on Mudah is mostly not apartments. Every zone page publishes how many listings its filter removed.
The allow-list is deliberately an allow-list. A property category we have not seen before is excluded until a human looks at it, because admitting an unknown category silently corrupts every median on the page.
Obviously wrong prices
Rents outside RM200 to RM50,000 a month and sale prices outside RM50,000 to RM20,000,000 are treated as data entry errors, not as deals.
Reposts
Within one portal, the same building plus the same bedroom count plus the same asking price plus the same floor area, all within 3%, is treated as one unit advertised repeatedly.
This rule is a judgement call, not a fact, and the site says so on every zone page. Several agents commonly market one unit on an open listing, and several genuinely different units in one block commonly share a round asking price. On a listing page those two situations look identical. Collapsing them moved the headline median by between -9% and +6% across the Penang zones, direction unpredictable, so each zone publishes what the median would have been without the rule. Treat that gap as the uncertainty band.
Listings with no building identity are never merged this way. Roughly half of Mudah listings carry no building id, and without one there is no evidence two rows are the same unit. A wrong merge deletes real data; a missed merge only leaves a duplicate.
Across portals
The same unit advertised on both portals is counted once. Matching requires the same normalised project name, the same bedroom count, and price and size both within 3%. The Mudah copy survives, because it carries a building id and PropertyGuru does not. The number of cross-portal duplicates found is published per zone.
Block outliers
Within a block of five or more listings, anything above three times or below one third of that block's median price is dropped. Blocks with fewer than five listings are left alone: there is no statistical basis to reject anything.
4. Cash flow
Every formula below is applied exactly as written. Defaults are shown; all of them are adjustable.
Loan
Standard amortising payment:
monthly installment = P * r / (1 - (1 + r)^-n)
P = price * loan margin default margin 90%
r = annual rate / 12 default 4.3%
n = tenure in months default 35 years
Annual operating costs
maintenance = maintenance fee psf * size * 12 default RM0.33 psf
assessment (cukai pintu) default RM600
quit rent (cukai tanah, strata share) default RM120
insurance default RM200
agent fee = monthly rent * 1 one month per year
vacancy = monthly rent * 1 one month per year
repairs reserve = annual rent * 5%
Yields and cash flow
gross yield = annual rent / price
net yield = (annual rent - operating costs) / price
monthly net cash flow = (annual rent - operating costs) / 12 - monthly installment
Cash needed upfront
downpayment = price * (1 - loan margin)
SPA legal = price * 1%
MOT stamp duty = 1% first RM100k, 2% next RM400k, 3% next RM500k, 4% above RM1m
loan stamp duty = loan * 0.5%
loan legal = loan * 0.5%
renovation and furnishing default RM20,000
cash on cash = annual net cash flow / cash needed upfront. It is negative
whenever the deal is, and the site shows that.
The complete ledger: true monthly cost
Cash flow alone is half the story, and publishing only that half made the entire asset class look irrational. Part of every installment is principal: equity the tenant's rent is repaying for the owner.
year-1 monthly principal = average principal portion of the first
twelve installments
true monthly cost = monthly net cash flow + year-1 monthly principal
installment coverage = monthly rent / monthly installment
Both halves are shown together everywhere. The equity half is real but locked: it is realised only on sale or refinance, and it assumes the value holds. The cash half is what leaves the bank account now. Neither is the whole truth alone, and the site says so beside every calculator.
The model is before income tax. Malaysian rental income is taxable at your marginal rate, so any positive figure shown is better than reality.
Break-even vacancy
How many months a year the unit can sit empty before annual cash flow reaches zero. When a deal loses money even at zero vacancy, the site says "never breaks even" rather than printing a number. Printing 0.0 months would read as "breaks even at full occupancy", which is the opposite of the truth.
A finding worth stating plainly
At the default 90% margin, 4.3% over 35 years, a Malaysian strata unit needs a gross yield of roughly 9% before monthly cash flow turns positive. Very little clears that bar. The realistic lever is a larger deposit, not a better area. Most zones on this site show negative monthly cash flow, and that is the honest answer rather than a fault in the data.
5. Tenant Demand Score
Measured from what the rental market does, not from counting nearby buildings. Two components.
Absorption, weight 0.55
Median days on market for active rental listings. Faster letting means stronger demand.
10 days or fewer -> 100
60 days or more -> 0
linear in between
Known limitation. Days on market is measured from the original posting date, and Mudah expires listings at about 60 days. Across 1,680 real listings the observed maximum was 61 days in six of seven zones measured. A very slow market and a moderately slow one therefore look the same here. Treat this component as a floor on how quickly tenants are found, not as an exact figure.
Rent strength, weight 0.45
Gross rental yield: median rent psf * 12 / median sale psf * 100. A high
figure means tenants pay well relative to what the asset costs.
3% or below -> 0
7% or above -> 100
linear in between
Computed only when both the rent psf and the sale psf clear the ten-sample threshold. A ratio built on a thin sample is not a rate, it is noise dressed up as a percentage.
When the two disagree
If the components differ by 30 points or more, the site says so instead of letting the average hide it. A zone can have excellent rent and slow letting, or fast letting and poor rent. Those are different problems and the average conceals both.
Why it is not built from points of interest
An earlier version scored zones by counting nearby industry, offices, campuses, hospitals, shops and stations. It was abandoned because it did not work, and the failure is worth recording:
- Employment scored 100 in six of seven zones. Mont Kiara, a residential enclave with no industry, scored 100 because the map data held 234 office nodes within 5km. The component was measuring urban density.
- Mont Kiara and Bukit Mertajam both scored 80. One rents 3-bedroom units at RM3,000 and RM3.47 psf, the other at RM1,525 and RM1.29 psf. A score that cannot separate those is not a score.
Points of interest are still collected and published on each zone page as area context. They explain a zone. They do not score it.
6. Tenant persona
A label for who actually rents in a zone, assigned in this fixed order, first match wins:
- Rent psf at or above RM3.00 → expat / high income
- More industrial sites than offices nearby, and rent psf at or below RM1.60 → factory worker
- At least two campuses or international schools nearby, rent psf at or below RM2.20, and median unit at or below 950 sqft → student
- Otherwise → mixed
The order matters. The factory test runs before the student test because university and college tags appear within 5km of almost anywhere in Malaysia, which is exactly what broke the earlier version: it labelled five of seven zones "student", including the KL expat enclave.
"Mixed" is a real answer, not a failure. Where the evidence does not support a single dominant tenant type, the site says mixed rather than guessing.
7. Points of interest
Collected from OpenStreetMap via the Overpass API. Free, no key.
- Employment, education and healthcare are counted within 5km of the zone's named measurement point.
- Malls and food and beverage are counted within 2km.
- Transit is walking time to the nearest station of any kind, at any distance, using straight-line distance times 1.3 for detours at 80 metres per minute.
Three limitations, all visible on the zone pages:
- One point, not an average. A zone spanning several towns is measured from a single named location, which is printed on the page. Move that point a kilometre and the transit figure can change materially.
- Transit is not always rail. Mainland Penang is on the KTM Komuter line, so a high figure there is genuine rail access. Penang island has no rail at all, so the same figure would mean a bus or ferry terminal.
- OpenStreetMap coverage is uneven. Malaysian malls are frequently not tagged as malls: several zones show zero malls within 2km despite having large ones. Raw counts are printed beside every figure so this is visible rather than hidden.
When the Overpass query fails, the zone still publishes its full listing metrics and its demand score, and says the area context was not measured. The demand score does not depend on points of interest.
8. The map
Block positions come from OpenStreetMap: one bulk query per zone pulls every named residential building nearby, and our block names are matched against them locally. Matching is conservative on purpose. A name matches only when its normalised form is identical, or when one name's words are wholly contained in the other's with at least one distinctive word; anything ambiguous is dropped, because a dot on the wrong rooftop is worse than no dot. Roughly seven in ten qualifying blocks locate this way; the rest simply do not appear yet.
On the map, a block-level figure (asking psf, rent psf) is coloured only when it clears the ten-sample rule, and grey dots say so. Yield and tenant demand are zone measures painted onto a zone's dots for geography's sake, and the legend says "measured per zone" whenever they are shown.
9. Supply pressure
A block is flagged as oversupplied when 5% or more of its units are on the rental market at once.
This requires a verified total unit count for the block, which we do not yet have for most blocks. Where it is missing, the block is marked "supply not assessed" rather than left blank, because a blank flags column reads as a clean bill of health.
10. Coverage
Zones cover the areas where projects are actively marketed. That is a coverage decision, not an editorial one. Every zone's numbers are computed identically regardless of what is being sold there, and a zone is allowed to look bad. Several currently do.
11. What would change these numbers
Honest list of what we would fix given better data:
- Transaction data. Asking prices are a proxy. Real transaction records would replace most of section 1's caveat.
- Unit counts per block. Would turn supply pressure from unassessed into a real metric.
- True time to let. Requires tracking when a listing disappears rather than when it was posted, which needs a longer history than we have. Weekly snapshots started 2026-08-25 and will make this possible.
- A third portal. Two portals disagree by 20 to 30% in some zones. A third would tell us which is closer to the middle.
Independent data site. Not a developer, not an agency listing page, not investment advice. Figures are asking prices from public listings and may be wrong. Verify anything you are about to act on.