Bornholm Real-Estate Web Monitoring System

Job ID: 39825079

Budget: $30 – $250 USD

Scope
Set up an Apify actor named bornholm-broker-radar with my start URLs, and a Make scenario named Bornholm Radar that writes to my Google Sheet and sends me a daily WhatsApp or email summary.

Deliverables
Apify actor running on a daily schedule, outputs dataset with address, city, postcode, status, price, size, url, broker, source domain.

Make scenario that pulls the dataset at 07:30 Europe Copenhagen, de-dups by address plus postcode, updates a Google Sheet, computes Score, and sends a summary with top 3 actions.
Short handover note with where to edit start URLs and how to add a new broker.

Acceptance test
Run once and show at least 5 valid Bornholm entries in the sheet. Change one listing’s status to simulate “Solgt” and confirm the row updates, not duplicated. Receive the summary message.
Here is a clear, copy-ready brief you can send to a freelancer. It spells out the scope, constraints, data model, and success criteria so they can build without guesswork.

Title
Bornholm Real-Estate Radar, daily lead finder for “til salg” and “solgt”

Project goal
Automatically monitor Danish real-estate broker websites for new or sold listings on Bornholm, extract key facts, de-duplicate by address, store rows in a Google Sheet, and send Jonas a short summary every morning.

Context
This is for DanCenter Bornholm lead generation to identify potential new owners and newly sold properties. Only public pages are used. First contact with owners will be by addressed letter, not email or SMS.

Scope of work

1. Build a crawler on Apify that visits selected broker search pages and detail pages, then outputs structured items.
2. Build a Make.com scenario that runs daily, pulls the Apify dataset, filters for Bornholm, de-dups, scores each listing, writes to Google Sheets, and sends a daily summary by WhatsApp via Twilio or by email.
3. Provide a short handover so non-technical staff can add or replace broker URLs.

Key constraints and compliance

1. Data sources must be public pages only and rate limits must be respected.
2. No scraping of gated or private content. Do not bypass technical access measures.
3. Store only public facts, do not store personal names.
4. First outreach to potential owners will be by letter with QR and booking link, not by email or SMS without consent.
5. Timezone is Europe Copenhagen. Daily run at 07:30 and summary by 08:05.

Deliverables

1. Apify actor named bornholm-broker-radar
Output fields per item: scrapedAt, url, sourceDomain, broker, title, address, city, postcode, status, priceDkk, sizeM2.
Status values: Til salg or Solgt.
2. Make.com scenario named Bornholm Radar
a. Triggers the Apify actor daily at 07:30 Copenhagen time.
b. Fetches dataset items once the run is complete.
c. Filters to Bornholm by postcode or place names.
d. De-duplicates by address plus postcode, fallback link.
e. Writes or updates rows in Google Sheets.
f. Computes a Score per row.
g. Sends a short morning summary to Jonas by WhatsApp via Twilio or else email.
3. Google Sheet named DanCenter Bornholm Leadboard with a tab Data and optional tab Logs.
4. Handover note with how to edit broker URLs, adjust the score rules, and add a new site.

Bornholm filters the freelancer must implement
Postcodes: 3700, 3720, 3730, 3740, 3751, 3760, 3770, 3782, 3790, 3761
Place words: Bornholm, Rønne, Nexø, Svaneke, Gudhjem, Allinge, Hasle, Aakirkeby, Klemensker, Østermarie, Dueodde, Sandvig, Balka
Property words: sommerhus, fritidshus, ferielejlighed

Data model in Google Sheets, tab Data
Found date
Address
City
Postcode
Status
Price DKK
Size m2
Link
Broker
First seen
Last seen
Source domain
Lead type
Next step
Owner
Internal status
Score
HiddenKey

HiddenKey is the de-dup key, address plus postcode lowercased. If address is missing use Link.

Lead type logic
If Status is Solgt then Ny ejer kandidat
Else Rådgiv kandidat

Status lifecycle in our sheet
Ny, Brev sendt, Ringet, Møde booket, Tabt, Vundet

Scoring rules to implement in Make
Start at 0
If Status is Solgt add 15
If title or content contains sommerhus or fritidshus or ferielejlighed add 10
If City matches Dueodde or Sandvig or Gudhjem or Svaneke or Allinge add 10
If Price DKK present add 5

Daily summary format
Subject, Bornholm radar, listings and changes today
New today, [countNew]
Sold since yesterday, [countSold]
Top actions

1. [Address], [Status], [Link]
2. [Address], [Status], [Link]
3. [Address], [Status], [Link]

Suggested broker start URLs
Insert 4 to 8 real search URLs already filtered to Bornholm or fritidshus. Examples are placeholders, freelancer must replace with live URLs from each chain’s Bornholm search page.
[https://broker-example.dk/til-salg?type=fritidshus&region=Bornholm](https://broker-example.dk/til-salg?type=fritidshus&region=Bornholm)
[https://another-broker.dk/boliger?fritidshus=1&postnumre=3700,3720,3730,3740,3751,3760,3770,3782,3790,3761](https://another-broker.dk/boliger?fritidshus=1&postnumre=3700,3720,3730,3740,3751,3760,3770,3782,3790,3761)

Technical setup details
Apify actor
Use Cheerio Crawler or Playwright if needed. Prefer JSON-LD parsing for address, price, size, status. Fallback to visible text. Determine status by badges containing Solgt or Reserveret else Til salg. Push each valid Bornholm item to the dataset with the required fields. Respect robots.txt and reduce concurrency on fragile sites.

Make.com scenario

1. Scheduler, every day at 07:30 Europe Copenhagen.
2. Apify, Run actor, wait for finish.
3. Apify, Get dataset items, limit 500, paginate.
4. Iterator over items.
5. Set variables, compute status, score, and HiddenKey.
6. Google Sheets, Search rows by HiddenKey.
7. If not found, Add a row and set First seen equals now and Last seen equals now.
8. If found, Update the row with Last seen equals now, update Status, Price DKK, Size m2, Score if changed.
9. Aggregation to pick rows with First seen equals today or Last seen equals today, sort by Score, select top 5.
10. Notification via Twilio WhatsApp, else Email.
11. Error route writes errors to Logs tab with timestamp, module, message, and URL if applicable.

Quality checks the freelancer must pass

1. De-duplication works, same address plus postcode never creates a second row.
2. Bornholm filtering is correct and excludes off-island results.
3. Status updates correctly when a listing changes to Solgt.
4. Timezone respected, messages arrive between 08:00 and 08:10 Copenhagen time.
5. Sheet columns exactly match the Data model above.

Acceptance criteria

1. On a test run the sheet shows at least 5 valid Bornholm entries with correct fields populated.
2. Manually change one listing on a source site to simulate status change or provide a mock item. The scenario must update the existing row’s Status and Last seen, not create a duplicate.
3. Morning summary received with counts and three top actions that link to live listings.
4. Handover note delivered with steps to add a new broker URL and how to tune score rules.

Access to be provided by client

1. Google account with access to the target Sheet.
2. Make.com workspace access with permission to create and run scenarios.
3. Apify account access.
4. Twilio WhatsApp or an email sender for the summary.

Out of scope

1. Contacting owners directly by email or SMS.
2. Any scraping that violates a site’s terms or technical measures.
3. Building a full CRM. This project only writes to Google Sheets.

Timeline and milestones
Day 1, configure Apify actor with two broker sites, test dataset items
Day 2, build Make scenario, connect to Sheet, verify dedup and updates
Day 3, add three more broker sites, refine selectors and Bornholm filter
Day 4, add WhatsApp or email summary, finalize Logs and error handling
Day 5, live run and handover

Handover items

1. A one-page runbook with where to edit broker URLs in Apify input and Make.
2. How to add a new column in Sheets and map it in Make.
3. How to change the run time and recipients for the summary.

Point of contact
Primary, Jonas Glud, DanCenter Bornholm
Preferred notification, WhatsApp or email, both accepted

If anything in this brief is unclear, the freelancer should return with the specific question plus a proposed solution.
Related categories: Web Scraping Google Sheets Automation Make.com