Track Zillow Price Cuts in Google Sheets with Apify and n8n
A listing page shows one home's price and its last cut. A spreadsheet can show a whole ZIP, and remember what each price was yesterday. Here is how to build that log without copying anything by hand.
Anyone watching a local market ends up opening listing after listing: price, days on Zillow, the little arrow that says the price went down. It is easy to miss a cut, and impossible to compare today's price with last week's unless you wrote it down. A scheduled workflow writes it down for you.
What a ZIP sample looks like
The Zillow Scraper returns prices as numbers, home details, Zestimate and rent estimate where Zillow shows them, days on Zillow, and Zillow's own last price change with its date. A real run on 12 October 2026 read 40 sale listings from ZIP 78704 in Austin, Texas, out of 336 available for that search:
| Listing | Price | Zillow price change | Change date |
|---|---|---|---|
| 3005 S 4th St #1 | $2,249,000 | −$241,000 | 2026-09-15 |
| 3007 Locke Ln | $1,490,000 | −$209,000 | 2026-10-01 |
| 706 Barton Blvd | $3,200,000 | −$200,000 | 2026-09-24 |
| 1709 Valeria St | $3,450,000 | −$50,000 | 2026-09-29 |
Of those 40 listings, 20 carried a price change reported by Zillow, a combined drop of $1,522,470 across the 20. Only 8 of the 40 showed a Zestimate, which is why it is a field to check rather than one to rely on. These numbers describe a 40-listing sample, not the Austin market.
Zillow's price change versus the one your workflow sees
These are two different things, and the starter keeps them apart. zillowPriceChange is what Zillow itself reports about a listing's last price change at the moment you read it. The workflow copies it to sourcePriceChange and does not treat it as a change between your own scans. The columns previousPrice, priceChange and priceChangePct are filled only when the same listing ID is observed again at a different price. The first sighting is a BASELINE; a lower price on a later run becomes PRICE_DROP, a higher one PRICE_INCREASE.
If a price is missing on a later run, the last known price is kept and the row is marked observed-price-missing. Nothing is sent as a notification; the execution summary lists the changes found in that run.
Set it up
- Create a
Listingstab and paste the header row from the starter. - Import the inactive workflow and add your own Apify and Google credentials.
- Enter your spreadsheet ID and a ZIP code, keep the 20-listing limit and run manually.
- Run again and check that no duplicate rows appear and prices are unchanged.
- Enable the daily 09:30 UTC schedule only after both runs look right.
What has been tested
On 11 October 2026 two real manual snapshots and a real timed-trigger run each observed 20 listings, and a read-back of the sheet confirmed 20 unique keys and no duplicates (tested on self-hosted n8n 2.26.4). Eleven synthetic scenarios cover price drops, increases, unchanged repeats, missing prices and failure checks. The synthetic drop proves the logic, not a real market change: no real price drop has been observed by the workflow yet. The Actor charges a small start fee plus a per-listing price, and the starter caps each run at $0.10; check the Store page for current prices.
Try it
Start with one ZIP and 20 listings, check the two runs, then schedule it.