DEV Community

Zackrag
Zackrag

Posted on

phantombuster german company registry pre-filter workflow for Clay credit savings

I pulled 1,450 DACH company names through the public Handelsregister via Phantombuster and n8n over two weeks, filtered them down to 312 high-fit targets, and routed only those into Clay. That cut my Clay credit usage by 1,138 credits compared with sending everything straight in.

Building the n8n trigger and Handelsregister query loop

I started the workflow with an n8n Schedule node set to run every 90 minutes. It fed a list of raw company names from a Google Sheet into an HTTP Request node pointed at the Handelsregister search endpoint. The request used a POST body with the company name and federal state filter to keep results inside DACH borders.

From there an n8n Function node parsed the JSON response and extracted the registry ID plus basic status fields. Only entries marked as “active” and with at least one managing director listed moved forward. Inactive or dissolved companies dropped out immediately.

Phantombuster phantom setup and exact selectors

I created a custom Phantombuster phantom that opened each Handelsregister detail page and scraped the structured data. The phantom used these selectors:

  • Company name: h1.register-header
  • Legal form and registry number: td[data-label="Registerart"]
  • Managing directors: div.person-entry span.name
  • Capital amount: td[data-label="Stammkapital"]
  • Last filing date: td[data-label="Letzte Eintragung"]

I set the phantom to run in batches of 40 URLs with a 45-second delay between launches. Phantombuster’s built-in retry logic handled 429 responses by backing off 120 seconds before the next attempt. Over the test period the phantom processed 1,450 URLs with 17 failed launches that were automatically retried and completed.

Rate-limit handling and error paths

Phantombuster enforces 200 requests per hour on the free tier I used for testing. I added an n8n Wait node after every 35 records and a simple counter that paused the entire workflow for 70 minutes once the hourly limit was reached. Failed pages were logged to a separate error sheet with the exact URL and HTTP status so I could inspect them manually later.

The workflow also checked for CAPTCHA pages by looking for the selector div.captcha-container. When detected, the record was skipped and flagged for later review instead of burning further credits.

Credit impact measured over the two-week run

I compared two parallel lists of the same 1,450 companies. One list went straight into Clay; the other passed through the Handelsregister pre-filter first.

Approach Companies sent to Clay Clay credits used Companies with registry match
Direct to Clay 1,450 1,450 n/a
Handelsregister pre-filter 312 312 1,138 filtered out

The pre-filter removed companies with no active registry entry, mismatched legal forms, or capital below €25k. That left 312 records that actually matched my ICP. The 1,138 companies never touched Clay, saving the full credit cost on those rows.

What I actually use

I keep the n8n + Phantombuster combination for the initial registry pass because it stays within public data limits and costs nothing beyond Phantombuster runtime minutes. Once the filtered list lands in Clay I enrich further with Clearbit and Snov.io only on the surviving records. Ziwa sits as one optional final step when I need quick domain verification on the remaining set. The whole chain runs on a single n8n instance and has stayed stable at the current volume.

Top comments (0)