Legal note â important for Germany
Sending physical (postal) marketing letters to businesses in Germany is generally permitted without prior consent under §7 UWG, unlike cold email or phone outreach. Data extracted from Impressum pages is publicly available and legally required to be published under §5 TMG. Processing it to contact the same company falls under berechtigtes Interesse (Art. 6(1)(f) DSGVO). Verify your specific use case with a lawyer before running campaigns.
Why B2B outreach in Germany is different
Cold email outreach to German businesses has two problems: low deliverability (spam filters, shared IPs) and legal risk (DSGVO restrictions on unsolicited electronic marketing to individuals). The inbox is crowded and legally complicated.
Physical mail, on the other hand, is underused, legally clear for B2B, and has near-zero algorithmic competition. A physical letter from a real company to a GeschäftsfĂźhrer gets opened. The problem is scale â you can't manually research 100 companies, find the right contact, and prepare personalized letters.
Germany solves this problem for you, accidentally. By law (§5 TMG), every business website must publish an Impressum containing: Geschäftsfßhrer full name, legal company name, registered address including PLZ and city, phone number, email, Steuernummer or USt-IdNr., and in many cases Handelsregisternummer.
This is a structured, legally required, publicly available database of German business contacts. The pipeline reads it automatically.
How it works step by step
â company list: name, address, phone, website, category
Tavily API â Impressum page discovery
â strategy 1: site.com/impressum
â strategy 2: site:domain impressum
â strategy 3: fallback to homepage
Exa API â semantic search fallback
â finds contact data by company name if Tavily misses
Gemini 2.5 Flash â structured JSON extraction
â GeschäftsfĂźhrer name, email, address, PLZ, city
Supabase â upsert + deduplication by apify_place_id
â
Pandas â CSV export â CRM import or mail merge
Step 1 â Google Maps via Apify
Apify's compass/crawler-google-places actor scrapes Google Maps by geolocation coordinates and radius. Input: city center coordinates, radius in km, business category. Output: company list with name, address, phone, website URL, Google Maps category. Cost: ~$7 per 1,000 results.
Why Apify and not direct scraping? Google Maps has no open API for bulk business search. Direct scraping with Selenium or Playwright gets blocked instantly. Apify handles proxy rotation, rate limiting, and deduplication â the $7/1k cost is worth not maintaining that infrastructure.
Step 2 â Impressum discovery (Tavily + Exa)
For each company website, the pipeline tries three strategies in order to find the Impressum page. Tavily is an AI-powered web extractor that returns clean text even from JS-rendered React/Angular sites â standard requests + BeautifulSoup fails on 40-60% of modern German business sites.
If Tavily doesn't find the Impressum, Exa performs a semantic search by company name to find contact data from a different source. The two-layer approach gets ~90% coverage vs. ~60% with either alone.
Step 3 â Gemini 2.5 Flash extraction
Raw Impressum text goes to Gemini 2.5 Flash with a prompt that extracts a structured JSON card: Geschäftsfßhrer full name, email, phone, street address, PLZ, city, company legal name, Steuernummer. Gemini Flash was chosen over GPT-4 for three reasons: strong German language performance, sub-second extraction speed, and cost of fractions of a cent per request.
Enrichment rate: ~70-80% of companies get a Geschäftsfßhrer name extracted successfully. The rest have malformed or missing Impressum pages.
Step 4 â Storage and export
Results upsert to Supabase (PostgreSQL) with deduplication by Apify's unique place_id. Status tracking: pending â done / no_impressum / error. Re-running the pipeline on the same city never creates duplicates. Pandas exports a filtered CSV (contacts with email only) ready for CRM import or print-partner mail merge.
The Impressum advantage
The Impressum law (§5 TMG) was designed for consumer protection â so that anyone can identify and contact a business. As a side effect, it creates the most structured B2B contact database in Europe.
Compare this to the UK or US: business contact data is scattered across LinkedIn, company websites, WHOIS records. In Germany, it's in a standardized legal page on every business domain.
The Impressum typically contains more reliable data than a LinkedIn profile: the legal company address (not a virtual office), the actual Geschäftsfßhrer (not a PR contact), and a direct email.
This is a structural advantage that only exists in DACH markets â Germany, Austria (§25 MedienG), and Switzerland have similar requirements.
What the pipeline produces
A typical run targeting kitchen studios in Munich (radius 20km):
- 107 companies from Google Maps
- 89 with website URLs found
- 76 with Impressum page discovered
- 61 with Geschäftsfßhrer name extracted
- 54 with email address found
- Total pipeline cost: $4.80
- Time: 22 minutes
The 54 contacts with email are exported to CSV with columns: company name, Geschäftsfßhrer name, email, street, PLZ, city, phone, Google Maps category, website URL.
A client using this for postal outreach sent 100 letters at âŹ1.20 each (print + delivery). Three warm responses in the first week from a total send cost of âŹ120.
Key implementation decisions
Why ~250 lines of Python and not a no-code tool
Make.com and n8n can handle simple API chains. This pipeline has conditional logic at every step: three Impressum discovery strategies with fallback, Gemini prompt calibration per company type, deduplication logic that requires SQL upsert with status tracking, and Pandas filtering with multiple output formats. No-code tools struggle with multi-step conditional branching and custom data transformations. Python handles it in 250 readable lines.
Why Gemini Flash over other models for German text
Impressum pages are dense legal text with German-specific formatting: "GeschäftsfĂźhrer: Max Mustermann" vs. "Verantwortlicher: M. Mustermann" vs. just a name in a paragraph. Gemini 2.5 Flash handles German legal text structure better than equivalent-cost alternatives, likely due to German web data in training. The extraction prompt is calibrated once per business category, not per company â this keeps cost minimal.
Idempotency by design
The pipeline can be re-run on the same city at any time without creating duplicate records. Supabase upsert by apify_place_id (Google Maps' unique ID per business) ensures that if a company already exists in the database, its record is updated rather than duplicated. Status tracking allows resuming a partially failed run without re-processing successful records.
Scaling the pipeline
The current implementation runs sequentially â one company at a time for Impressum discovery. For large runs (500+ companies), adding async processing with asyncio and rate-limited Tavily/Exa batching would reduce runtime from 25 minutes to ~5 minutes. The Supabase upsert layer already supports concurrent writes.
Who benefits from this pipeline
Any B2B business targeting local German companies can use this pipeline for systematic outreach. The most effective use cases:
- Service providers targeting local SMBs â marketing agencies, IT consultants, accounting firms, cleaning services targeting Handwerksbetriebe and Einzelhändler in a specific city or region.
- B2B product suppliers â companies selling equipment, materials, or software to specific industry verticals (e.g., restaurant equipment to Gaststätten, safety equipment to Bauunternehmen).
- Event and trade show outreach â building an invite list for industry events by targeting all companies in a specific category within 50km.
- Partnership and distributor recruitment â finding potential resellers or partners in specific German cities without paying for LinkedIn Sales Navigator.
The pipeline is parameterized: change the Google Maps search query, coordinates, and radius â get a completely different lead list. One codebase, unlimited market segments.
Tools used
I build B2B lead generation pipelines for German market outreach. Google Maps â Impressum â CRM, custom industry targeting, physical mail integration. Let's discuss your target segment.