EN · FR

Deanonymize your website visitors and reach out automatically

A good share of your site's visitors leave no trace. They read the docs, compare you to your competitors, look at the pricing page, then leave without a single interaction. That's a shame, because some of them fit your ICP perfectly.

· 6 min read

A 3D globe centred on the Atlantic, with the eastern United States and Europe facing the viewer and green signals pulsing over major cities as anonymous visitors are identified in real time.

In this article I share my method so that, the moment a visitor lands on your site, they are automatically deanonymized, enriched, scored, then contacted on LinkedIn. Once the workflow is in place it runs on its own in the background and opens LinkedIn conversations with your visitors, but only the ones who show real interest.

Deanonymize a web visitor with a US IP address

No single tool identifies everyone. In practice, on US B2B traffic, you can put a name to 10 to 30% of visitors. It depends on the deanonymization tool you use: I won't go into detail, but each one relies on different identity graphs. Hence a simple technique: stack several tools ( Vector, RB2B, and others) to deanonymize more people, then remove the duplicates. Each catches visitors the others miss; you merge their results and dedupe on a stable identity key (the person's LinkedIn URL, for example). The more you plug in, the more you identify (the main coverage lever), but with diminishing returns: most tools actually resell very similar identity graphs.

My advice: start with a single deanonymization tool to test the workflow end to end. If the results are there, optimize later by adding more tools to claw back the extra coverage.

Slack notification: a visit from a Product Marketing Manager at a software company (51-250 employees) in Westford, MA, with 18 visits since 14 June, the Kestra pages viewed, and LinkedIn Profile and full visit history buttons.

In Europe, you can only identify the company, not the person

Europe is another matter. You have to respect the GDPR: you can't identify a person who visits your site, but you can identify the company the employee is connecting from.

My advice: adapt your workflow. Based on the pages viewed, your ICP, and the traffic you already deanonymize, have the workflow dig into the company's employee base and suggest the three profiles most likely to be this visitor.

Zoomed map of Europe with the company-level region shaded, and signal badges over Germany, France and Sweden showing example companies whose traffic resolves to a known organization

What the orchestrator is for

The orchestrator lets you run every step above in sequence. Each identified visit fires a webhook from the deanonymization tool, handled by your workflow inside the orchestrator: it ingests the event, dedupes it, enriches it with data from the CRM and the data warehouse, applies the relevance gate, scores each deanonymized visit out of 100, and routes the lead, in order, end to end.

As the orchestrator I use Kestra (the company I work for): it's robust and has run this flow for me for several months. Other alternatives exist, like n8n. Feel free to message me if you'd like the YAML code I use in Kestra for this part.

webhookone orchestrated runingestenrichgate · llmscorerouteslacklemlist

Spot user patterns

It all starts with storage: keep every visit in your data warehouse. That base is what lets you work the data afterwards and spot patterns.

The most telling one is recurrence. A first visit is curiosity. The same visitor coming back several times, or three people from the same company on the pricing page in a week, is a very different signal: an account warming up, often a buying committee forming. Enough to reach out to several people at the account rather than chase just one.

Slack visit history: 20 visits since 9 June, 27 pages recorded, with the timestamped list of pages viewed (architecture, pricing, Kestra 2.0, cron, plugins, and so on).

Don't contact visitors you're already talking to

Every visit is cross-checked against the CRM (the contact, and the company by its domain, separately, because the person visiting is often not the one in the CRM) and against the data warehouse. Two questions decide what happens next: is this company already a customer or an active user? And is there an open deal, on the contact or on the company? If sales are mid-deal, we don't prospect the visitor; we hold off. That suppression is what makes the channel usable internally.

Slack notification flagged 'Enterprise customer': a visit from a Senior Distinguished Technologist at an IT services company with more than 10,000 employees, 2 visits since 29 June, with the enterprise-customer flag highlighted so the rep backs off.

Contact only visitors who might be interested

A small LLM reads the visitor's enriched profile (title, seniority, department, plus the company's industry and size) and the pages viewed, then decides: include or exclude, with a one-line reason. This is the noise filter: visitor-ID tools are notorious for flooding a channel with thousands of off-target accounts, so anything clearly outside the target never reaches a rep. It's a first, deliberately binary pass; the fine scoring comes right after.

Score every visitor from 0 to 100

Visitors who pass the filter are then scored from 0 to 100 in Clay, based on their journey on the site. Where the filter just said yes or no, the score ranks. Concretely, we store every visit in Clay, and a column driven by an LLM rates each visit on two axes. First, fit: does this visitor match one of our ICPs, and how likely are they to be interested? Then profile: are they more data, infra or AI, and which customer cluster do they resemble?

Clay table of scored visits: a score column (95, 93), a tier column (priority) and the LLM-generated reason; highlighted row reading 'Principal Architect at a 1,001 to 5,000 software company; strong technical ICP fit with enterprise'.

This score reads as tiers. Below the bar, we contact no one; from "medium" up, the visitor enters outbound, and the higher the tier, the faster the touch. So outbound reaches only a deliberate slice of the traffic, not everyone.

not contacted contacted low medium high priority 0 40 65 80 100

Above all, we don't stop at the tool's raw signal: we cross it with the CRM and with product usage stored in the data warehouse. That cross-referencing is where the value is, tying a visit to what the person already does inside the product and to where the account stands in the pipeline. A competitor can buy the same deanonymization tool; they'll never have your first-party data.

Reach out from the right LinkedIn account

The message goes out automatically, but from the right account: the engineer whose specialty matches the visitor's cluster (AI, data or infra), with copy personalized to the score and the cluster. One peer writing to another maximizes the reply rate, far more than a generic marketing account. The sequence runs in lemlist: a connection request, a short note on accept, one soft follow-up if there's no reply, all silent. On the sales side, nobody steps in until the prospect replies: their reply lands in a shared inbox (a unibox) where a rep picks up the conversation and takes it to a meeting.

score0 to 100routed in ClayinAI engineerai / mldata engineerpipelinesinfra engineerkubernetesthe prospect repliessaleslemlist uniboxmeeting

Results depend a lot on your product and your market. On my side, this technique runs at 25 to 35% acceptance on LinkedIn and around 20% replies. The key is to contact only the profiles with a very good score: by filtering hard on fit, you avoid spamming people who don't care, while still landing, passively, a few meetings with leads squarely in your ICP.

Want to build something like this, or just compare notes? Reach me on LinkedIn or by email.

Index