Discover Intent & Signals SDR/BDRDemand GenRevOpsAE

De-Anonymize Website Visitors and Auto-Trigger Outreach

Reveal who is on your site, filter to ICP fits, and trigger a personalized touch the same day, while the intent is still warm.

StageDiscover
Time to buildHalf a day
DifficultyIntermediate
Best forSDR/BDR, Demand Gen, RevOps, AE
The stack

The stack

The problem

The problem

The overwhelming majority of your website traffic never fills out a form. Those people read your pricing page, scanned a case study in your vertical, and left without a trace. That silent audience is the highest-intent group you have all month, and the traditional marketing playbook only ever gets to follow up with the tiny fraction who convert on a form. You are letting your warmest prospects walk out the door because they did not raise their hand the one way you were watching for.

Visitor de-anonymization changed the math. Tools like RB2B and Warmly identify a meaningful slice of visitors at the person or company level using identity networks built from logged-in sessions across the web. But here is where most teams immediately go wrong: they treat the raw reveal as a buying signal and start blasting everyone who shows up. Most revealed visitors are not buyers. They are existing customers checking docs, job seekers reading your about page, competitors snooping, and vendors. Acting on the raw feed is how you turn a great signal into spam and torch your domain reputation.

The win is the full loop, not the reveal. You reveal the visitor, enrich and qualify them against your ICP, branch on behavior, and only then act. A high-intent ICP fit who spent three minutes on pricing gets a same-day personalized email and a real-time rep alert. Everyone else is logged and ignored. And speed is the whole game: intent from a pricing-page visit decays in hours, not days. A rep who reaches out the same afternoon is in a fundamentally different conversation than one who calls next Tuesday.

The opinion to internalize: reveal rate is not the metric, and vendors who lead with a big reveal-rate number are selling you noise. The metric is qualified, same-day, non-creepy touches that turn into conversations. Build the filtering and the speed first; the reveal is just the trigger.

How it works

How it works

  • Install RB2B or Warmly to reveal anonymous visitors at the person and/or company level
  • Pipe each revealed visitor with their page-view trail into Clay via webhook
  • Enrich and qualify in Clay: filter out existing customers, competitors, job seekers, and non-ICP
  • Branch on behavior: high-intent ICP fit triggers a personalized email AND a rep Slack alert; others are logged
  • Send the email via Smartlead from a warmed inbox and post a contextual Slack alert to the owner
  • Log every reveal so non-fits are never contacted and reps see the full trail
See it run

See it run

zsh
$# a revealed visitor lands on the Clay webhook; qualify before acting
$cat reveal.json
{"name":"Dana Ruiz","title":"VP Operations","company":"Meridian Freight","employees":620,"industry":"freight & logistics","pages":["/pricing 3m12s","/case-studies/logistics 2m40s"],"last_visit_min_ago":14,"crm_match":"none"}
$cat reveal.json | llm "Decide how to handle this revealed visitor. ignore if customer/competitor/job-seeker/non-ICP. contact_now only if ICP fit AND high-intent page AND visit within 24h. Return JSON: action, reason."
{"action": "contact_now", "reason": "ICP fit, decision-maker title, viewed pricing within the hour"}
$# branch fired contact_now -> post the rep alert to the Slack webhook
$curl -s -X POST $SLACK_WEBHOOK_URL -H 'content-type: application/json' -d '{"text":":fire: Hot Visitor - Dana Ruiz, VP Operations at Meridian Freight (620 emp, logistics). Viewed /pricing 3m12s, last view 14m ago. Owner @marcus. Email queued via Smartlead in 30m."}'
ok
$
The playbook

The playbook

Install the visitor reveal tool on your key pages

Add RB2B's or Warmly's tracking script to your site. The cleanest path is Google Tag Manager: create a new Custom HTML tag, paste the snippet from the tool's setup screen, and set the trigger to fire on All Pages. If you do not use GTM, paste the snippet directly before the closing body tag of your site template. RB2B focuses on person-level reveal for US visitors and posts results to Slack out of the box; Warmly adds company-level reveal, scoring, and a broader orchestration layer including a website chat widget. Choose RB2B if person-level US data into Slack is all you need; choose Warmly if you want one platform doing reveal plus orchestration.

Confirm reveals are flowing before you build anything downstream: open an incognito window, visit your own pricing page, and check that the tool fires a reveal within a few minutes. Pay special attention to tagging your highest-intent pages, because the page someone viewed is the entire basis for both qualification and personalization later.

Set expectations honestly with the team. Reveal rates are a fraction of total traffic, not anywhere near all of it, and person-level reveal skews US. Plan the play around capturing the highest-intent slice well, not around revealing everyone.

  • /pricing, the strongest single intent page
  • /demo or /book-a-demo
  • Your top one or two product/solution pages
  • Vertical case-study pages relevant to your ICP
  • /contact (often high intent, low form-fill)
💡

TipTag your pages into intent tiers in the tool's settings or in Clay later. A pricing visit is not the same signal as a careers-page visit, and you want the workflow to be able to tell them apart.

Route revealed visitors into a Clay table

Send each revealed visitor into a Clay table via webhook. In Clay, create a table and add a 'Webhook' source; Clay gives you a unique URL. In RB2B or Warmly, add that URL as a webhook/integration destination so every reveal posts there. If you would rather stay inside Warmly, its native workflows can do basic filtering, but Clay gives you far more control over enrichment, branching, and the AI qualification step, so most serious builds route to Clay.

Make sure each incoming row carries the fields you will need: person full name, title, LinkedIn URL, company name, company domain, the specific pages they viewed, and timestamps for those views. If the reveal tool sends a page-view array, map it into a single column you can read; the pages-viewed trail is load-bearing for both qualification and the email.

Deduplicate. The same person may trigger multiple reveals in a session or across days. Add a dedup key on the person's email or LinkedIn so you are not firing three alerts and three emails for one visitor, which is both annoying and a deliverability risk.

💡

TipCapture the timestamp of the most recent view in its own column. Your branching logic should weight a visit from twenty minutes ago far more heavily than one from last week, and you cannot do that if you only store 'visited: true.'

Enrich and qualify each visitor against your ICP

In Clay, add enrichment columns for company firmographics (size, industry) and the person's role and seniority, the same way you would for an account list. Then add the decision step: an AI column that outputs a clean action of Contact now, Nurture, or Ignore, plus a one-line reason the rep can read. If you already built an ICP rubric for your account-scoring workflow, reuse it here so a visitor and a sourced account are judged by the same standard.

The most important filters are the exclusions. Match the visitor's company domain against a CRM export of existing customers and open opportunities so you never cold-pitch a current customer or step on an AE's open deal. Filter out obvious competitors, personal-email-only individuals who read your blog, and job seekers (a visit only to /careers is a strong tell). Everything that survives those filters is a candidate.

Keep the output a simple enum, not a paragraph, because the next step branches on it programmatically. The reason field is for the human; the action field is for the machine.

Clay AI qualification column
Decide how to handle this revealed website visitor. Use ONLY the data given.

Visitor: /Full Name, /Title at /Company
Company size: /Employees, Industry: /Industry
Pages viewed (with timestamps): /Pages Viewed
Most recent visit: /Last Visit Timestamp
Existing CRM match (customer or open deal): /CRM Match

Return JSON only:
{"action": "contact_now|nurture|ignore", "reason": "<one sentence>"}

Rules:
- ignore if: existing customer or open deal (CRM match), a competitor, a likely job seeker (only viewed /careers), or clearly non-ICP (industry not in {{ICP_INDUSTRIES}} OR fewer than {{MIN_HEADCOUNT}} employees).
- contact_now ONLY if: ICP fit AND viewed a high-intent page (pricing, demo, {{KEY_PAGE}}) AND the visit was within the last {{HOURS, e.g. 24}} hours.
- otherwise: nurture.
💡

TipPut the recency window (the last 24 hours) inside the contact_now rule. A pricing visit from last week is a nurture, not a same-day fire drill; treating it as hot makes your 'hot visitor' alerts cry wolf and reps stop trusting them.

Branch the action by intent and fit

Set up the branching so each action routes to a different destination. In Clay you can use a conditional / 'Run only if' setting on downstream columns and actions, so the email-drafting column and the Slack-alert action only run when action equals contact_now. Nurture visitors get written to a list or added to a slower marketing sequence. Ignore visitors are logged in the table and nothing else happens.

The discipline here is what protects the whole play. The entire value is that high-intent ICP fits get human-quality, same-day attention and nothing else does. The moment you start 'just also emailing the warm ones,' you are back to spraying off a noisy signal and you lose both the deliverability and the credibility.

If you prefer to orchestrate outside Clay, the reveal tool's native workflow rules or an n8n branch can do the same routing. The architecture is identical; only the tool drawing the branches changes.

Generate and send the personalized email

For contact_now visitors, add a Clay AI column that drafts a short email referencing the topic of the page they viewed, never the fact that you tracked them. This is the single most important rule of the whole play: 'I saw you on our pricing page' reads as surveillance and kills trust instantly. 'Most ops teams comparing tools at your stage care most about X' references the implied interest without being creepy. Keep the email under ninety words, one specific idea, one soft CTA.

Push the approved draft to Smartlead to send from a warmed inbox, or, for higher-value owned accounts, hand the draft to the rep to send personally. For named accounts a rep relationship usually beats an automated send, so route those to the human; reserve the automated send for the unowned long tail of qualified fits.

Sample a handful of generated emails before any of this goes live and read them as the recipient. An email that references the wrong topic because the page-view mapping was off is worse than no email.

Triggered email draft prompt
Write a cold email to /Full Name, /Title at /Company.

Context: they recently engaged with content about {{TOPIC_OF_PAGE_VIEWED}} on our site. Do NOT mention that we tracked them or name the specific page; reference the TOPIC naturally as something teams like theirs care about.

Our product: {{ONE_LINE_VALUE_PROP}}

Rules:
- Under 90 words.
- One specific idea tied to {{TOPIC_OF_PAGE_VIEWED}}.
- Conversational, like one operator to another. No buzzwords. Banned words: unlock, leverage, supercharge, seamless, game-changer.
- One soft CTA: a question or a low-friction ask, not 'book a 30-minute demo.'
- Subject line under 6 words, lowercase, no clickbait.

Output only the subject and the body.
💡

TipNever write 'I saw you visited our pricing page.' Reference the topic, not the tracking event. If your email could only have been written by someone watching the prospect's browser, rewrite it.

Alert the owning rep in Slack with full context

The moment a contact_now visitor is qualified, post a Slack message to the owning rep or a shared #hot-visitors channel. RB2B does this natively; with Clay or Warmly you can format a richer alert via Clay's Slack action or a Slack incoming webhook. Include who they are, where they work, the exact pages and dwell time, the ICP tier, the assigned owner, and direct links to the CRM record and their LinkedIn. The rep should be able to act without opening four tabs.

For owned accounts, the alert is often more valuable than the automated email, because the rep may want to call or send a personal note instead. Make the alert the trigger for human judgment, not just a notification that a robot already emailed someone.

Speed is the entire point of doing this in real time. A rep who reaches out within the hour of a pricing-page visit is talking to someone who still remembers what they were evaluating; a touch next week is just another cold email with extra infrastructure behind it.

💡

TipInclude the dwell time per page in the alert. 'Viewed /pricing for 3 minutes' tells a rep this is worth dropping what they are doing; 'viewed /pricing for 4 seconds' does not, and reps learn fast which alerts deserve a sprint.

What you get

What you get

A real-time Slack alert plus a queued, non-creepy personalized email for a single qualified high-intent visitor.

Example output
SLACK ALERT to #hot-visitors:
:fire: Hot Visitor, Dana Ruiz, VP Operations at Meridian Freight
Company: 620 employees, freight & logistics (ICP tier A)
Viewed: /pricing (3m12s), /case-studies/logistics (2m40s), most recent view 14 min ago
Reason: ICP fit, decision-maker title, viewed pricing within the hour
Owner: @marcus  |  CRM: [record link]  |  LinkedIn: linkedin.com/in/danaruiz
Action: automated email is queued, call her first if you want it.

QUEUED EMAIL (sent via Smartlead if no rep action in 30 min):
Subject: pricing for ops teams

Hi Dana, teams running freight ops at your scale usually care less about seat count and more about how much planning time actually drops once a tool is in. Happy to walk through what that looked like for a similarly sized logistics team, they cut new-region ramp from about 11 weeks to 4. Worth a quick chat this week, or is this not a priority right now?

- Marcus
Pitfalls to avoid

Pitfalls to avoid

⚠️

Contacting everyone revealedMost revealed visitors are not buyers; they are customers, job seekers, and competitors. Skipping the ICP and CRM-match filters turns a great signal into spam and burns your sending domain. The filter is the product, not the reveal.

⚠️

Being creepy about trackingMentioning the specific page someone viewed reads as surveillance and ends the conversation. Reference the topic of interest, never the tracking event, and never say 'I saw you visited.'

⚠️

Ignoring data-privacy and consent rulesPerson-level reveal has real legal nuance, especially outside the US where it can run into GDPR and ePrivacy obligations. Confirm your approach with legal, honor opt-outs and Do Not Track, and respect regional rules before you flip this on.

⚠️

Slow follow-upPricing-page intent decays in hours. A same-day touch works; a next-week touch is just a cold email with extra steps. If your pipeline adds delay, you have lost the only advantage the reveal gave you.

⚠️

Cold-pitching existing customersWithout a CRM-match exclusion, a current customer reading your docs gets a cold sales pitch, which is embarrassing and erodes the account. Always check the domain against customers and open opportunities and route those to the owner or CS, never to outbound.

Want playbooks like this in your inbox?

A new AI use case, prompt, or teardown every couple of weeks.

Subscribe →