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

How the tools connect
What a run costs
Reveal tool
RB2B subscription, flat monthly
Clay credits
~3-5 per revealed visitor enriched
AI qualify + draft
pennies per visitor on a mid-tier model
Your time
about half a day to build, then hands-off
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 identify a meaningful slice of visitors at the person or company level using identity networks built from logged-in sessions across the web. Most teams go wrong immediately: 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.

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

The workflow, end to end
  1. 01 Reveal the visitor RB2Bperson and company from the session
  2. 02 Webhook to Clay Clayone row per reveal, with page trail
  3. 03 Enrich and dedup Clayfirmographics, role, CRM match
  4. 04 Qualify the action Clay + Claudecontact_now, nurture, or ignore
  5. 05 Alert the owner Slackpages, dwell, links, in real time
  6. 06 Queue the email Smartleadtopic-based, never the tracking event
  • Install RB2B 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
The playbook

The playbook

Install the visitor reveal tool on your key pages

Add RB2B'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.

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, add that URL as a webhook/integration destination so every reveal posts there. A reveal tool's native workflow 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 drives 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 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.

Inside the prompt

Inside the prompt

The scoring prompt is short, but every line is there for a reason. Here is what each one is doing and why.

Why each line is in the qualification prompt
Use ONLY this data"Use ONLY the data given"
Stops the model inventing intent or firmographics. A reveal with thin data should not be talked into a contact_now.
Exclusions fire first"ignore if: existing customer or open deal, a competitor, a likely job seeker, or non-ICP"
The exclusions are the product. This is what stops you cold-pitching a customer reading docs or a competitor snooping.
Job-seeker tell"a likely job seeker (only viewed /careers)"
A visit only to /careers is reading job listings, not buying. Catching it here keeps recruiters out of the outbound queue.
contact_now is hard"contact_now ONLY if: ICP fit AND a high-intent page AND within the last 24 hours"
All three, not any. Loosen this and the hot-visitor channel becomes spam reps mute. The AND is what keeps the signal trustworthy.
Recency window"the visit was within the last {{HOURS}} hours"
Pricing intent decays in hours. A visit from last week is a nurture, not a same-day fire drill. Recency lives inside the rule, not as an afterthought.
JSON enum out{action, reason}
The action is for the machine to branch on; the reason is for the human. A paragraph would be unbranchable downstream.
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
Anatomy of one hot-visitor alert
Dana Ruiz · VP Operations, Meridian Freight · revealed 14 min ago
who + whereDana Ruiz, VP Operations, Meridian Freight (620 emp, freight & logistics)
Decision-maker title at an ICP-size company. This is what makes the alert worth interrupting a rep for.
pages + dwell/pricing (3m12s), /case-studies/logistics (2m40s), last view 14 min ago
Dwell time is the tell. 3 minutes on pricing is a sprint; 4 seconds is not. Reps learn which alerts to drop everything for.
"action""contact_now"
The enum the branch fires on. Only contact_now triggers the Slack alert and the queued email; everything else is logged and ignored.
"reason"ICP fit, decision-maker title, viewed pricing within the hour
The one line that justifies the interrupt. A hot-visitor alert with no reason gets muted the first time it cries wolf.
owner + links@marcus | CRM record | LinkedIn
Routes to the named owner with one-click context. The rep should act without opening four tabs.
queued emailsent via Smartlead in 30 min unless the rep acts first
Gives Marcus a window to call or send a personal note before the automation does. Human judgment beats the robot on owned accounts.
A week of revealed visitors, funnelled // 180 revealed in a week
Revealed 180 raw reveals, mostly noise
ICP fit 68 after firmographic filter
High-intent 26 viewed pricing or demo
Not customers 17 after CRM-match exclusion
Contacted now 11 same-day, qualified touch
180 reveals collapse to 11 same-day touches. The reveal rate is not the metric; the 11 qualified, non-creepy touches at the bottom are. The funnel is the product.
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.

FAQ

Questions people ask

What reveal rate should I actually expect?
A fraction of total traffic, not anywhere near all of it, and person-level reveal skews heavily US. Ignore vendors who lead with a big reveal-rate number; that is noise they are selling you. Plan the play around capturing the highest-intent slice well, because the metric that matters is qualified same-day touches, not reveals.
Won't this come across as creepy?
It does the instant you mention the page someone viewed. 'I saw you on our pricing page' reads as surveillance and ends the conversation. Reference the topic they clearly care about instead, never the tracking event. If your email could only have been written by someone watching their browser, rewrite it.
Is person-level visitor reveal even legal?
It has real legal nuance, especially outside the US where it runs into GDPR and ePrivacy obligations. Confirm your approach with legal, honor opt-outs and Do Not Track, and respect regional rules before you flip it on. This is not optional, and it is the one part of the build you should not improvise.

Want playbooks like this in your inbox?

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

Subscribe →