Turn a PropertyGuru scrape into a client-ready comparative market analysis β for any HDB estate or condominium. Load the CSV, review, export to Excel.
The file from the PropertyGuru scraper (e.g. CMA_choa-chu-kang_2026-07-01.csv)
Need a CSV? Use the PropertyGuru scraper:
The CMA Builder is a self-contained browser tool that converts a PropertyGuru listing scrape into a polished, client-ready Comparative Market Analysis. No data is uploaded anywhere β everything runs locally in your browser.
Google Chrome or Microsoft Edge is required β both for running the console scraper and for the Claude in Chrome extension.
The Claude in Chrome extension is a Model Context Protocol (MCP) app that lets Claude interact with your browser β reading live page content, extracting structured listing data, and navigating paginated results. It is the recommended companion for complex or large-scale scraping.
How to install:
Why it matters: PropertyGuru renders listings via a Next.js data payload (__NEXT_DATA__). Claude in Chrome reads this payload directly using get_page_text, which is more reliable than DOM scraping for PropertyGuru's structure β this is the same method used to extract full Sol Acres listing sets (74 live listings).
.js scraper (downloaded from this tool) works independently without the extension. The extension is recommended for assisted extractions or when you want Claude to help clean and interpret the data.Go to propertyguru.com.sg, apply all your filters (property type, estate, bedroom count, price range), then optionally sort by Newest for a consistent snapshot.
In the CMA Builder drop zone, click β¬ Download Scraper (.js). This saves propertyguru-scraper.js to your Downloads folder.
F12 β click the Console tabCmd + Option + I β click Consolepropertyguru-scraper.js in any text editorCtrl+A / Cmd+A), copy, paste into the console, press EnterPropertyGuru CMA Scraper: startingβ¦ Listings/page: 20 | Estimated pages: 4 page 2 done β running total 40 page 3 done β running total 60 β Done. 74 listings -> CMA_choa-chu-kang_2026-07-01.csv
The CSV downloads automatically. The scraper only reads data your browser already received β it does not log in, click, or change anything.
Once you have a CSV, load it into the CMA Builder in any of these ways:
| Method | How |
|---|---|
| Drag & drop | Drag the CSV from your Downloads folder onto the drop zone |
| File picker | Click Choose file and select the CSV |
| Paste | Copy the raw CSV text, click anywhere on this page, press Ctrl+V / Cmd+V |
| Sample data | Click Load sample data to test the tool with 5 built-in listings |
Once loaded, the drop zone disappears and the toolbar, stat cards, and table appear automatically.
The toolbar appears after data is loaded. All changes update the table and stats live.
| Field | What it does |
|---|---|
| Title | The report label β appears in the table header and as the Excel heading. E.g. HDB 5-Room Β· Choa Chu Kang |
| Prepared by | Pre-filled as Daniel Lin, PropNex. Appears in the Excel subtitle row. |
| Type | Filter by HDB or Private (condo/apartment). The dropdown shows the listing count per type. |
| Search | Free-text search across street, block, project, agent, and agency names |
| De-duplicate | Remove exact repeats (default) merges rows with identical block, street, price, area, and built year. Switch to Keep all rows to see the raw count. |
| β¬ Export Excel | Builds and downloads the styled .xlsx file |
| Reset | Clears everything and returns to the drop zone |
Six summary cards update live as you change filters or search terms.
| Card | Description |
|---|---|
| Listings | Number of rows currently shown (after filters and deduplication) |
| Median Price | Middle value of all asking prices in the current view |
| Price Range | Lowest to highest asking price |
| Median PSF | Median price per square foot (listings with area β₯ 450 sqft only) |
| Avg PSF | Mean price per square foot |
| Avg Area | Mean floor area in square feet |
| Column | Notes |
|---|---|
| Type | HDB (blue badge) or Private (gold badge) |
| Project | Condo/EC project name. Hidden for pure HDB searches. |
| Block | HDB block number. Hidden when no block numbers are present. |
| Street Name | Full street address |
| Floor | Only shown where the agent stated it in the listing text; blanks are normal |
| Floor Band | Derived from Floor: Low (1β3), Mid (4β9), High (10+) |
| Beds | Number of bedrooms |
| Area (sqft) | Floor area in square feet |
| Asking (S$) | Asking price in Singapore dollars |
| PSF (S$) | Price per square foot = Asking Γ· Area |
| Built | Year completed / TOP year |
| Tenure | e.g. 99-year Leasehold, Freehold |
| Agent | Listing agent's name |
| Agency | Agency name (shortened to common abbreviations) |
| Listing | Clickable View β link to the live PropertyGuru listing |
| Remarks | Auto-generated note explaining why the row is flagged orange |
Click any column header to sort ascending. Click again for descending. A β² / βΌ arrow shows the active sort column.
Rows shaded orange have been automatically flagged. Check the Remarks column for the reason:
Click β¬ Export Excel in the toolbar. The file downloads as:
CMA_<title-slug>_<date>.xlsx e.g. CMA_hdb-5-room-choa-chu-kang_2026-07-01.xlsx
The filtered, deduplicated view as shown in the table. Includes:
Only present when your filters or deduplication have hidden some rows. Contains every record from the original scrape for audit purposes.
| Problem | What to do |
|---|---|
| Scraper says "Couldn't read listing data" | Make sure you are on a PropertyGuru search results page, not a single listing page or the homepage |
| Scraper finds 0 listings | Confirm your filters returned results before running the scraper |
| CSV loads but all rows are blank | The CSV may have been opened and re-saved by Excel, corrupting the format. Use the original downloaded file. |
| Export Excel does nothing | The ExcelJS library loads from a CDN β check your internet connection and try again |
| Orange rows on almost every listing | PropertyGuru may be masking addresses in this search area. Verify each via the View β link. |
| Floor column is mostly blank | Normal β PropertyGuru only exposes floor level when the agent explicitly wrote it in the listing text |