Heidi Systems · Sales

How it works

From public listings to a ranked call list with proof for every fact.

Berlin lead list

How the lead list is built

Public sources → company websites → facts with proof → the right person → a ranked list for sales.

Two scores

Good customer, and can we reach them?

A great customer we can't reach is not a first call. So fit and reachability are scored apart.

Fit score 0–100

What makes a good customer for Heidi.

Manages apartments+25
Meters still read by hand+25
Provider change announced+25
Size (1,000+ = key account)≤15
Current billing known+10

Meters read by hand must be remote-readable from 1 Jan 2027, so these firms must act soon.

Access score 0–100

How directly we reach the person who decides.

Property manager, direct line100
Property manager, name only80
Owner or director, direct line60
Owner or director, name only40
Other staff20–30
Office line or info@ only10

A LinkedIn profile for the contact adds +10.

Step by step

What each step does

Each step adds something a salesperson can use, and the costly steps run only on companies that are still in the list.

1Find companies

Search maps and industry directories for every property manager and housing company with a Berlin office.

Google MapsOpenStreetMapVDIV member directoryBBUBVIHousing cooperatives (WBGD)State-owned housing companies
For sales: address, office phone and map position. A VDIV listing means a warm intro, as VDIV is Heidi's partner association.
Cost free tier

2Clean the list

The same website, phone, or name and postcode means one company. Metering competitors and pure brokers are set aside before any paid step, and a Berlin address (or Berlin on their pages) is required.

For sales: one row per company, and no calls to competitors or brokers.
Cost free

3Research agent

An AI agent reads the company's own pages (legal notice, team, contact and services), and searches the web for firms without a website to find their directory or listing pages.

Own websiteLegal notice (Impressum)Team and contact pagesGelbe Seiten11880Property portals
For sales: the raw material for every fact and contact on the list.
Cost about $0.04 per firm without a website (search)

4Pull out facts with proof

An AI model (Claude Haiku) reads the pages and notes what the company manages, how many apartments, how heating costs are billed today, metering company, software, meters still read by hand, contract end or provider change, and contacts. A second pass looks for anything missing.

  • A fact is kept only if its quote is really on the page.
  • Own pages are trusted; ranges are ignored.
  • A Germany-wide total is never counted as Berlin.
For sales: a reason to call, and a quote to point to.
Cost of this step about $0.02 per company

5Find the right person

Look for named staff and property-manager job titles on LinkedIn, personal e-mails and direct lines on team pages, and named contacts in public job ads. A likely e-mail built from the company's own address pattern is labelled as such. Nothing is kept unless it appeared in the search results.

LinkedIn searchTeam pagesPublic job adsCompany e-mail pattern

Before → after this step, across all leads:

516 → 731
named decision-maker+215 leads where sales can ask for a person by name
44 → 79
property manager named35 more leads reach the person who runs the buildings
0 → 301
best contact on LinkedIna personal channel beyond the phone for 301 leads
583 → 361
info@ only222 fewer leads stuck at the switchboard
For sales: a name to ask for, and often a direct line. Job ads also show who is hiring.
Cost of this step about $0.05 per lead

6Score and deliver

Two separate scores: Fit says how good a customer the company would be, and Access says how directly we reach the person who decides. Together they set the tier (A call first, B good, C weaker).

This dashboardMapFiltersCall cardEvidenceSuggested openerExcel / CSV
For sales: who to call first, why, and what to say.
Cost free (rules, no AI)
Sources

Where the information comes from

Only public sources: maps and directories find the companies, their own pages give the facts, searches find the people. Bubble size = how many each source gave.

Find companiesFactsPeopleHover or tap a bubble

Lead map district outlines: Berliner Morgenpost Berlin-Geodaten (Amt für Statistik Berlin-Brandenburg), CC-BY.

Tools and automations

One command, end to end

A small Python pipeline runs every step and can be re-run any time.

Python pipeline

One command runs find → clean → read → facts → score → contacts → export.

Website crawler

Scrapy fetches each company's own pages.

Claude Agent SDK

Claude Agent SDK with Haiku reads pages and runs web searches.

Google Places API

Finds property offices across Berlin.

One database

SQLite keeps every company, fact and a snapshot of every page read.

Resumable runs

Runs pick up where they stopped after any interruption.

150+ automated tests

Guard the rules, scoring and export on every change.

Validation

How the data was checked

Three layers: text matching, strict data rules and AI checks. Every value traces back to the page it came from.

1 · Text matching

  • A fact's quote must be on the saved page (exact, or at least 80% of its words).
  • Every number, phone and e-mail must appear in that quote.
  • A LinkedIn person is kept only if the link and name were in the search results; a job-ad contact only if they are in the ad.
  • Facts are rechecked at every export; the dashboard shows the quote and source for every value.

2 · Data types and rules

  • Every fact must fit a strict schema: field, category, number, scope and date.
  • Values must be one of fixed categories (e.g. WEG, rental or own stock; meters read by hand or remote).
  • Rules: ranges ignored, approximate figures labelled, company-wide totals never counted as Berlin, old facts never read as current, Berlin required.
  • Duplicates merged; brokers, metering competitors and service firms set aside, with hand checks of samples.

3 · AI checks

  • The reading model must quote its source and pick a category for every fact.
  • When the code rejects a fact, the model gets the reason and one repair attempt.
  • A second AI pass looks for facts that are still missing.
  • In the contact search, the model keeps only people whose result shows a current job at the company.
  • A separate AI reviewer double-checked facts in the pilots; it was dropped for the full run for speed and cost, and the code checks stayed.
Design decisions

Built to be trusted and cheap to run

Five choices that shape the list.

Proof for every fact

Each fact links to the quote and page it came from.

Fit and reachability kept separate

Sales sees both why a firm matters and how to get through.

AI reads, rules score

The model only collects facts; plain rules rank them, so every score is explainable and cheap.

Company sources and exact numbers first

Facts come from the company's own pages first; an exact published number beats an approximate one, and approximate figures are labelled.

No logins, contacts stay private

Only public pages are read, and the contact list stays inside the sales team.

Cost

Under ten cents per lead

Average cost per company at each step. Paid steps run only on companies still in the list.

Average cost at each step
Finding the right personper lead searched$0.050
Website searchper firm without a website$0.043
Reading pages and factsper company read$0.018
Job adsper ad read$0.003
≈ $0.09
per lead overall (1,115 leads)
Limits and next steps

What's still hard, and what comes next

Honest gaps today, then the natural next steps to add value and to scale.

Limits today

  • Personal e-mails are rarely public.
  • LinkedIn results often lack job titles.
  • Metering provider and contract dates are rarely published (1–2% of companies).