Guides

Leadpipe + Slack: Real-Time Visitor Alerts

Get Slack notifications when high-intent visitors hit your website. Setup guide with filtering, formatting, and channel routing for sales teams.

Elene Marjanidze Elene Marjanidze · · 9 min read
Leadpipe + Slack: Real-Time Visitor Alerts

A VP of Marketing at your target account just spent 3 minutes on your pricing page. She compared two plans, scrolled through your case studies, and then left. Your sales team finds out about it 48 hours later when someone finally checks the analytics dashboard. By then, she’s already booked a demo with your competitor.

This is the gap that real-time Slack alerts close. Instead of waiting for someone to check a dashboard, your team gets an instant notification the moment a high-intent visitor is identified. Name, company, job title, pages viewed, LinkedIn profile - all delivered to the Slack channel where your team already works.

This guide covers the complete setup: connecting Leadpipe webhooks to Slack, formatting rich messages that actually get read, routing alerts to the right channels, filtering for signal over noise, and building a daily digest for leadership.


Two Ways to Connect Leadpipe to Slack

You have two integration paths. Both work. Choose based on your technical comfort level.

PathSetup TimeFilteringBest For
Zapier (Webhook → Slack)10 minutesZapier filter stepsMost teams, flexible rules
Slack Incoming Webhook (Direct)15 minutesCustom middlewareDev teams, high volume

The Zapier path is easier to set up and modify. The direct Slack webhook path gives you complete control over message formatting with Block Kit.


What You’ll Need

  • Leadpipe account - Start free with 500 leads
  • Slack workspace with permission to add apps/webhooks
  • Zapier account (if using the Zapier path)
  • 10-15 minutes for setup

Step 1: Create the Catch Hook

  1. In Zapier, create a new Zap
  2. Trigger: Webhooks by Zapier > Catch Hook
  3. Copy the webhook URL
  4. In Leadpipe, go to Settings > Integrations > Webhooks
  5. Add the Zapier URL
  6. Set trigger to First Match (one alert per visitor, no duplicates)
  7. Send a test event

Step 2: Add Filters

This is where you separate signal from noise. Without filters, your Slack channel becomes unusable within a day.

Basic filter (minimum recommended):

email - Exists
AND
visit_duration - Greater than - 15

ICP filter (recommended for sales teams):

email - Does not contain - gmail.com, yahoo.com, hotmail.com, outlook.com
AND
job_title - Exists
AND
visit_duration - Greater than - 30

High-intent filter (for #hot-leads channels):

page_url - Contains - /pricing, /demo, /case-studies, /contact
AND
visit_duration - Greater than - 60
AND
email - Does not contain - gmail.com, yahoo.com

You can use Zapier Paths to send different alert types to different channels. More on channel routing below.

Step 3: Format the Slack Message

Action: Slack > Send Channel Message

  • Channel: #sales-leads (or your preferred channel)
  • Bot Name: Leadpipe Alerts
  • Message:
:zap: *New Visitor Identified*

*{{first_name}} {{last_name}}* | {{job_title}}
:office: *{{company_name}}* ({{company_domain}})
:email: {{email}}
:link: <{{linkedin_url}}|LinkedIn Profile>

:page_facing_up: *Page:* {{page_url}}
:stopwatch: *Duration:* {{visit_duration}} seconds
:world_map: *Location:* {{city}}, {{state}}, {{country}}

:footprints: *Full journey:* {{pages_viewed}}

This format is scannable. Your reps can glance at the notification and immediately know: who visited, what company they’re from, what they looked at, and how long they spent.


Path 2: Direct Slack Incoming Webhook

For teams with developer resources, you can skip Zapier entirely and send Leadpipe webhook data directly to Slack.

Step 1: Create a Slack Incoming Webhook

  1. Go to api.slack.com/apps
  2. Create a new app (or select existing)
  3. Go to Incoming Webhooks > Enable
  4. Click Add New Webhook to Workspace
  5. Select the target channel
  6. Copy the webhook URL

Step 2: Build Middleware

You need a small service that receives Leadpipe webhooks, formats the data, and forwards it to Slack. Here’s a Node.js example:

const express = require('express');
const axios = require('axios');

const app = express();
app.use(express.json());

const SLACK_WEBHOOK_URL = process.env.SLACK_WEBHOOK_URL;

// Channel routing based on intent
const CHANNELS = {
  hot: process.env.SLACK_HOT_LEADS,      // #sales-hot-leads
  warm: process.env.SLACK_WARM_LEADS,     // #sales-leads
  marketing: process.env.SLACK_MARKETING, // #marketing-leads
};

function classifyIntent(visitor) {
  const highIntentPages = ['/pricing', '/demo', '/case-studies', '/contact'];
  const isHighIntent = highIntentPages.some(p => visitor.page_url?.includes(p));
  const isLongVisit = visitor.visit_duration > 120;

  if (isHighIntent || isLongVisit) return 'hot';
  if (visitor.visit_duration > 30) return 'warm';
  return 'marketing';
}

function isBusinessEmail(email) {
  const personal = ['gmail.com', 'yahoo.com', 'hotmail.com',
    'outlook.com', 'aol.com', 'icloud.com'];
  const domain = email?.split('@')[1];
  return domain && !personal.includes(domain.toLowerCase());
}

app.post('/leadpipe-webhook', async (req, res) => {
  const visitor = req.body;

  // Skip personal emails
  if (!isBusinessEmail(visitor.email)) {
    return res.status(200).json({ skipped: true });
  }

  const intent = classifyIntent(visitor);
  const webhookUrl = CHANNELS[intent] || CHANNELS.warm;

  const intentEmoji = {
    hot: ':fire:',
    warm: ':sunny:',
    marketing: ':seedling:'
  };

  const message = {
    blocks: [
      {
        type: 'header',
        text: {
          type: 'plain_text',
          text: `${intentEmoji[intent]} ${intent.toUpperCase()} LEAD - ${visitor.first_name} ${visitor.last_name}`
        }
      },
      {
        type: 'section',
        fields: [
          { type: 'mrkdwn', text: `*Name:*\n${visitor.first_name} ${visitor.last_name}` },
          { type: 'mrkdwn', text: `*Title:*\n${visitor.job_title || 'Unknown'}` },
          { type: 'mrkdwn', text: `*Company:*\n${visitor.company_name}` },
          { type: 'mrkdwn', text: `*Email:*\n${visitor.email}` },
        ]
      },
      {
        type: 'section',
        fields: [
          { type: 'mrkdwn', text: `*Page:*\n${visitor.page_url}` },
          { type: 'mrkdwn', text: `*Duration:*\n${visitor.visit_duration}s` },
        ]
      },
      {
        type: 'actions',
        elements: [
          {
            type: 'button',
            text: { type: 'plain_text', text: 'View LinkedIn' },
            url: visitor.linkedin_url,
          },
          {
            type: 'button',
            text: { type: 'plain_text', text: 'Send Email' },
            url: `mailto:${visitor.email}`,
          }
        ]
      }
    ]
  };

  try {
    await axios.post(webhookUrl, message);
    res.status(200).json({ success: true, intent });
  } catch (err) {
    console.error('Slack error:', err.message);
    res.status(500).json({ error: err.message });
  }
});

app.listen(3000);

The Block Kit format creates rich, interactive Slack messages with clickable buttons for LinkedIn and email. Much more polished than plain text.


Channel Routing Strategy

Don’t send everything to one channel. Route alerts based on intent level, account type, or team ownership.

ChannelWhat Goes HereWho Monitors
#sales-hot-leadsPricing/demo page visitors, long sessionsSDRs, AEs
#sales-leadsAll business visitors with ICP matchSDRs
#target-accountsVisitors from named accountsABM team, named AEs
#marketing-leadsBlog readers, low-intent visitorsMarketing team
#visitor-digestDaily summary (see below)Leadership, ops

Routing Logic in Zapier (Using Paths)

In a single Zap, use Paths to route to different channels:

Path A: Hot Leads

Conditions:
  page_url - Contains - /pricing, /demo, /contact
  OR visit_duration - Greater than - 120
Channel: #sales-hot-leads

Path B: Target Accounts

Conditions:
  company_domain - Contains - [your target account domains]
Channel: #target-accounts

Path C: ICP Match

Conditions:
  email - Does not contain - gmail.com, yahoo.com
  AND job_title - Exists
Channel: #sales-leads

Path D: Everything Else

Conditions: Default (catch-all)
Channel: #marketing-leads

Paths are evaluated in order. A pricing page visitor from a target account will hit Path A first (hot leads) - which is correct. If you want them in both channels, use separate Zaps instead of Paths.


Filtering for Signal Over Noise

The #1 reason Slack alert systems fail is too many alerts. If your channel pings 200 times a day, reps mute it within a week. Here’s how to keep the signal-to-noise ratio high.

Must-Filter: Personal Emails

Personal email visitors (Gmail, Yahoo, Hotmail) are rarely worth alerting on. They might be competitors, students, or individuals who can’t make buying decisions. Filter them out for sales channels. You can optionally log them in a Google Sheet (Recipe 3) for later analysis.

Must-Filter: Bot and Short Visits

Visitors with less than 10 seconds on site are likely bots or accidental clicks. Set a minimum visit_duration threshold:

  • 10 seconds - minimum to exclude bots
  • 30 seconds - reasonable for sales alerts
  • 60 seconds - high-confidence engagement

Should-Filter: Job Title Matching

If your product is for VPs and Directors, don’t alert on every intern who visits your site. Filter for titles that match your buyer persona:

job_title - Contains - VP, Director, Head, Manager, Chief,
  Founder, CEO, CTO, CMO, COO, Owner, President

Consider-Filter: Geography

If you only sell in the US and Europe, filter out visitors from regions you don’t serve. This prevents false excitement about leads you can’t close.

The Filter Balancing Act

Too aggressive: You miss good leads. A marketing coordinator at a Fortune 500 company might be the person evaluating tools for their VP.

Too loose: Your channel becomes noise. Reps mute it.

The sweet spot: Start with moderate filters (business email + 30 seconds + ICP pages), then adjust based on results. Track how many alerts per day your team receives and how many lead to conversations. Aim for 5-15 high-quality alerts per day for a sales team.


Daily Digest for Leadership

Not everyone needs real-time alerts. Your CEO, VP of Sales, or board members want a summary, not a firehose. Build a daily digest that lands at 8 AM.

Option 1: Zapier Digest

Zapier has a built-in Digest feature:

  1. Create a Zap with the same Leadpipe webhook trigger
  2. Add Digest by Zapier action
  3. Configure:
    • Append to Digest: {{first_name}} {{last_name}} - {{company_name}} - {{page_url}} ({{visit_duration}}s)
    • Release Frequency: Every day at 8:00 AM
  4. Action: Slack > Send Message to #visitor-digest

The digest compiles all identified visitors from the past 24 hours into a single Slack message.

Option 2: Google Sheets + Scheduled Slack Message

  1. Use Recipe 3 to log all visitors to a Google Sheet
  2. Create a separate Zap with a Schedule trigger (daily at 8 AM)
  3. Use Google Sheets - Get Many Rows (filter by today’s date)
  4. Use Zapier Formatter to compile into a summary
  5. Send to Slack

What to Include in the Digest

:bar_chart: *Daily Visitor Report - April 5, 2026*

*Total identified:* 47
*High-intent (pricing/demo):* 12
*Target account visits:* 3
*New companies:* 31

*Top visitors by engagement:*
1. Sarah Chen - VP Marketing, Acme Corp - 4 min on /pricing
2. Mike Johnson - Director Sales, BigCo - 3 min on /case-studies
3. Lisa Park - CEO, StartupXYZ - 2 min on /demo

*Top companies:*
- Acme Corp (3 visitors)
- BigCo (2 visitors)
- TechFirm (2 visitors)

This gives leadership a pulse check without burying them in individual alerts.


Response Workflows: What to Do When an Alert Fires

An alert is only as good as the action it triggers. Here’s how teams structure their response:

The 15-Minute SLA

For #hot-leads alerts, set a team SLA: respond within 15 minutes during business hours. Use Slack’s threading to coordinate:

  1. Alert fires - Leadpipe identifies a pricing page visitor
  2. Rep claims - First rep replies with “:raised_hand: I got this”
  3. Research - Click the LinkedIn link, check CRM for history
  4. Outreach - Send a personalized email referencing the page they visited
  5. Log - Update CRM and reply in thread with outcome

Thread-Based Coordination

Encourage reps to reply in the alert’s thread, not the channel. This keeps the channel scannable and creates a record of who followed up on each lead.

Escalation for Target Accounts

When a target account alert fires in #target-accounts:

  1. AE with account ownership claims immediately
  2. SDR drafts outreach in the thread for AE review
  3. Marketing prepares relevant content/case study
  4. AE sends within 1 hour

This coordinated response is only possible because everyone sees the same alert at the same time. Dashboards can’t do this.


Measuring Alert Effectiveness

Track these metrics monthly to ensure your Slack alerts are driving results, not just noise:

MetricHow to MeasureHealthy Range
Alerts per dayCount messages in channel5-15 for sales channels
Claim rate% of alerts with a thread reply>80%
Response timeTime from alert to first outreach<30 minutes (business hours)
Conversation rate% of alerts that become email/call15-30%
Meeting rate% of alerts that become meetings3-8%
Channel mute rateAsk your team0% (if >0%, reduce alert volume)

If your claim rate drops below 50%, you’re sending too many alerts. Tighten your filters. If your conversation rate is above 30%, you might be filtering too aggressively and should loosen up.


Combining Alerts with CRM Actions

The best setups don’t just alert - they act. Run your Slack alerts in parallel with CRM record creation:

One webhook, three actions. The rep gets the alert, the CRM gets the record, and Clay starts enriching - all simultaneously. By the time the rep opens the Slack notification, the CRM record is already there and enrichment is running.

Try Leadpipe free with 500 leads -> and start getting real-time alerts for your highest-intent visitors.