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

Google Maps (Apify actor)
  â†“ 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 that needs to acquire new customers (Kunden akquirieren) in the German market without cold calling or paid ads. If you sell to local German companies and want a systematic way to find new clients — this pipeline is for you. 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

Python 3.12 Apify Tavily API Exa API Gemini 2.5 Flash Supabase PostgreSQL Pandas VS Code Claude Code

What the pipeline delivered

Across six production runs in the Munich metro area targeting kitchen studios, home appliance retailers, and interior design firms, the pipeline produced consistent results that hold up to real outreach conditions.

By the numbers

A typical run starting from 100 seed companies on Google Maps:

  • 89 website URLs discovered (89% coverage)
  • 76 Impressum pages located (85% of those with a website)
  • 61 GeschäftsfĂźhrer names extracted from Impressum text
  • 54 email addresses found and validated (54% overall conversion)
  • Total API cost: $4.80–$6.20 per run
  • Total run time: 18–25 minutes

Postal campaign results

A client used the pipeline to build a list of 100 kitchen studio Geschäftsführer in Bavaria. They ran a physical direct mail campaign: personalized letters with the extracted name salutation, a one-page service overview, and a reply card. Total cost: €120 for print and delivery.

Within 14 days: 3 warm responses — 2 scheduled calls and one face-to-face meeting request. One became a paying client. Cost per warm lead: €40. Cost per converted client: €120.

Known bottlenecks

Email coverage is the main constraint: roughly 30–35% of German business websites use a contact form instead of a published email address. The pipeline marks these records as "contact form only" and exports the URL for manual follow-up. Phone numbers fill the gap in most cases — German Impressum requires at least one contact method, so phone coverage reaches 85–90%.

The pipeline handles lead discovery and enrichment. Outreach copy, sequencing, and conversion sit outside the tool and depend on the target segment and the specific offer. The main time saving is in research: finding and validating the right decision-maker contact used to take 4–6 minutes per company manually. The pipeline brings that to under 15 seconds per record.

Common questions about B2B lead generation in Germany

How does automated B2B lead generation work in Germany?
The pipeline works in four steps. First, Apify scrapes Google Maps for businesses matching your target category and location. Second, each result's Impressum page is fetched to extract the Geschäftsfßhrer name, direct email, and phone number. Third, Gemini 2.5 Flash normalizes and validates the extracted data. Fourth, everything is stored in Supabase and exported as a CRM-ready CSV. One pipeline run produces 80-120 qualified leads in 25 minutes for approximately $5 in API costs.
What is the best way to acquire new customers (Kunden akquirieren) in Germany without paid ads?
The most effective approach for B2B customer acquisition in Germany is systematic outreach using publicly available Impressum data. German law requires every business to publish contact details including the Geschäftsführer name — making this a legal and reliable source for new client prospecting. Unlike paid ads, the cost per lead is under 5 cents. Unlike LinkedIn Sales Navigator, it gives you the decision-maker's direct email from the company's own website.
Is using Google Maps and Impressum data for B2B lead generation legal in Germany?
Yes, with the right approach. Impressum data is publicly disclosed by legal obligation under §5 TMG — it is intended to be accessible. B2B cold email outreach is permitted under §7 UWG when there is a legitimate commercial interest. The pipeline targets only business email addresses (not personal), operates under GDPR Art. 6(1)(f) legitimate interest basis, and includes opt-out handling. It does not scrape personal data beyond what the business itself has made public.
Automatische Leadgenerierung fßr Ihr B2B-Geschäft in Deutschland?

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.

← Back to articles