The problem with manual monitoring

Real estate portals have rudimentary alert systems. The email arrives late, often for irrelevant listings, and still requires opening the site, scrolling, reading descriptions just to figure out whether it's worth a closer look. The result is a frustrating cycle: either you check often and waste time, or you check rarely and risk missing the opportunity.

The real problem isn't speed — it's filtering. The price might be in the search parameters, but the actual area often isn't. A listing can claim to be "near the city center" and actually be 12 km away. The portal's filters don't read the descriptions: AI does.

The architecture in 5 components

PropertyFinder is an n8n workflow with five main components that run every 6 hours:

  1. Scheduler: n8n trigger every 6 hours, all day
  2. HTTP Request: calls Subito.it's APIs with preconfigured filters (area, min/max price, floor space)
  3. Gemini AI: reads the full description of each listing and replies "relevant / not relevant" with a reason
  4. Deduplication: Google Sheets as a log of listings already notified in the last 30 days
  5. Telegram: notification with a direct link, price, area and a summary generated by Gemini

Components 3 and 4 are what make the difference compared to any native portal alert.

The AI's role in filtering

This is the part that turns the system from a simple scraper into something actually useful. The prompt to Gemini is simple and direct:

You are a real estate agent. Evaluate this listing against my criteria: area [X], maximum [Y] €, at least [Z] sqm, not a basement, not ground floor if on a busy street. Reply only with "relevant" or "not relevant" plus one line of justification.

The model reads the entire listing description, not just the metadata. It distinguishes between "quiet residential neighborhood" and "next to the ring road." It understands when a garage is included in the price or sold separately. It filters out garages listed as apartments (yes, that happens).

Only listings classified as "relevant" reach Telegram. No false positives, no noise.

Deduplication on Google Sheets

Every listing on Subito has a unique ID in its URL. Before sending any notification, the workflow checks whether that ID is already in the Google Sheet. If it's there: skip. If not: notify + add it to the sheet with a timestamp.

The sheet works like a sliding-window queue: every month I clear out rows older than 30 days. This lets listings that have since been updated with a different price get renotified, without endlessly accumulating data.

Google Sheets is the most pragmatic choice here. It could be a SQLite database, but Sheets lets me check the list of listings I've already seen from my phone, without opening any other tool.

Results after 3 months

2,400
Listings monitored
47
Notifications received
11
Listings visited
2
Negotiations started
0
Hours/week

The filtering rate is about 98%: out of 2,400 listings processed, only 47 made it to Telegram. Of those, 11 were worth a visit. Time spent on the search each week: just the time it takes to read the notifications when they arrive.

How to replicate it

The workflow JSON is available in the public GitHub repository. The prerequisites are: self-hosted n8n (a Raspberry Pi works fine too), a Gemini API key (the free tier comfortably covers this request volume), and access to the Google Sheets API.

The initial setup takes about 2 hours, mostly to configure the Subito filters and the Google credentials. After that, the system runs on its own — the only recurring maintenance is clearing the Sheets tab once a month.

The advantage isn't speed — it's selective attention. I only get what matters, when it matters. The AI doesn't find the house for you: it saves you the time of looking for it in the wrong place.