You checked Slack, you checked your CRM, you checked your phone. The one place you actually read everything in a day is Gmail. So why are the hottest signals on your site, namely identified visitors on your pricing and product pages, going anywhere except your inbox?
I am Elene, and this is the integration guide I give founders and solo operators more than any other. Slack is great for teams, but a founder running sales alone would rather have a clean email hit their inbox the moment a qualified visitor is identified. This guide shows you exactly how to do that, with templates, filters, and a Gmail-side workflow so your inbox does not become a firehose.
What you will build
A real-time Gmail alert for every identified US B2B visitor who matches your intent rules, with a subject line that tells you everything at a glance and a body that gives you one-click actions (LinkedIn profile, Leadpipe record, company domain).
Prerequisites
| Requirement | Notes |
|---|---|
| Leadpipe account | Start with 500 free leads |
| Gmail / Google Workspace | Any account, Workspace preferred for filters |
| Zapier or Make account | For the no-code path |
| Optional: Gmail API credentials | For the direct API path |
| Time | 15-20 minutes |
If you want alerts in a team channel instead, the Leadpipe Slack alerts recipe is the companion. Most teams actually run both: Slack for the team, Gmail for the founder or CMO.
How it works
Visitor identified on your site
│
▼
Leadpipe webhook (First Match)
│
▼
Zapier filter: only high-intent
│
▼
Zapier action: Send Email via Gmail
│
▼
Your inbox, with subject + body + links
Step 1: Leadpipe webhook
Same starting point as most of our integration recipes (see the Zapier automation recipes post for the broader pattern).
- In Leadpipe: Settings, Integrations, Webhooks, Add Webhook.
- Destination URL: you will generate it in Step 2.
- Trigger: First Match for new visitors. If you want return visits to trigger alerts too (recommended, they convert better), add a second webhook for Every Update and filter it down at the Zapier level.
- Fields: include everything. You will use most of it in the email body.
Here is the payload your Gmail alert will be built from. This is the standard shape from our webhook payload reference.
{
"email": "james.park@northwind.io",
"first_name": "James",
"last_name": "Park",
"phone": "+1-212-555-0184",
"company_name": "Northwind Labs",
"company_domain": "northwind.io",
"company_industry": "Logistics SaaS",
"company_employee_count": 320,
"job_title": "Director of Demand Generation",
"seniority": "Director",
"department": "Marketing",
"linkedin_url": "linkedin.com/in/jamespark",
"city": "New York",
"state": "New York",
"country": "US",
"page_url": "/pricing",
"pages_viewed": ["/", "/features/identification", "/pricing"],
"visit_duration": 198,
"intent_score": 74,
"matched_topics": ["visitor identification", "intent data"],
"return_visit": true
}
Note for EU and UK visitors: Leadpipe defaults to company-level identification unless the visitor has given affirmative consent. Your Gmail alerts from those regions will usually show company fields and no personal fields, which is correct under GDPR, not a bug. Our GDPR post covers the detail.
Step 2: Zapier path (recommended)
Zapier’s Gmail action is the cleanest way. You can swap in Make.com or n8n if you prefer (see Leadpipe n8n automation for the same pattern in n8n).
- New Zap. Trigger: Webhooks by Zapier, Catch Hook. Copy the URL. Paste into Leadpipe.
- Fire a test event. Zapier captures the fields.
- Filter step. Suggested rule:
emaildoes not containgmail.com, yahoo.com, outlook.com, hotmail.com- AND
visit_durationis greater than 30 - AND (
page_urlcontains/pricingORpage_urlcontains/enterpriseORintent_scoreis greater than 60)
This is the setting that decides whether your inbox stays usable. If you let every identified visitor through, you will disable the Zap in a week. Start strict and loosen if the volume is too light.
- Action: Gmail, Send Email. Authenticate your Gmail account. Build the subject and body from the template below.
Subject line template
[Leadpipe] {{first_name}} {{last_name}} ({{job_title}}) @ {{company_name}} → {{page_url}}
Real examples:
[Leadpipe] James Park (Director of Demand Gen) @ Northwind Labs → /pricing
[Leadpipe] Maria Lopez (Head of Growth) @ Acme.io → /enterprise
[Leadpipe] Return visitor: Raj Mehta (VP Marketing) @ Orbit.dev → /pricing
Subjects this dense let you scan the inbox and decide in half a second whether to act.
Email body template
Paste this into the Gmail Body field in Zapier, replacing the merge tags with Zapier’s field pickers:
{{first_name}} {{last_name}} just visited {{page_url}}
Company: {{company_name}} ({{company_domain}})
Industry: {{company_industry}}, {{company_employee_count}} employees
Title: {{job_title}} ({{department}}, {{seniority}})
Location: {{city}}, {{state}}, {{country}}
Session:
Pages viewed: {{pages_viewed}}
Duration: {{visit_duration}} seconds
Intent score: {{intent_score}}/100
Matched topics: {{matched_topics}}
Return visitor: {{return_visit}}
Contact:
Email: {{email}}
Phone: {{phone}}
LinkedIn: {{linkedin_url}}
Quick actions:
LinkedIn → {{linkedin_url}}
Company site → https://{{company_domain}}
Leadpipe record → https://dashboard.leadpipe.com/visitors (search by email)
Set From to an address you actually read. If you send to yourself from yourself, Gmail sometimes sorts it oddly; send from a dedicated alias like alerts@yourdomain.com if you can.
Turn the Zap on. Trigger a test visit on your own site from a different browser and see the email land.
Step 3: Direct Gmail API path
If you do not want to pay Zapier or you are hitting thousands of identifications per month, run a tiny serverless function and use the Gmail API.
// POST /leadpipe-webhook → Gmail via OAuth
// Env: GMAIL_REFRESH_TOKEN, GMAIL_CLIENT_ID, GMAIL_CLIENT_SECRET, ALERT_TO
import { google } from 'googleapis';
async function sendMail({ to, subject, text }) {
const oAuth2 = new google.auth.OAuth2(
process.env.GMAIL_CLIENT_ID,
process.env.GMAIL_CLIENT_SECRET
);
oAuth2.setCredentials({ refresh_token: process.env.GMAIL_REFRESH_TOKEN });
const gmail = google.gmail({ version: 'v1', auth: oAuth2 });
const raw = Buffer.from(
`To: ${to}\r\nSubject: ${subject}\r\n\r\n${text}`
)
.toString('base64')
.replace(/\+/g, '-')
.replace(/\//g, '_')
.replace(/=+$/, '');
await gmail.users.messages.send({ userId: 'me', requestBody: { raw } });
}
export async function handler(req) {
const v = req.body;
const hot =
(v.page_url || '').includes('/pricing') ||
(v.page_url || '').includes('/enterprise') ||
v.intent_score > 60;
if (!hot) return { statusCode: 200, body: 'skipped' };
const subject = `[Leadpipe] ${v.first_name || ''} ${v.last_name || ''} (${v.job_title || ''}) @ ${v.company_name || v.company_domain} → ${v.page_url}`;
const text = [
`${v.first_name || ''} ${v.last_name || ''} just visited ${v.page_url}`,
``,
`Company: ${v.company_name} (${v.company_domain})`,
`Industry: ${v.company_industry}, ${v.company_employee_count} employees`,
`Title: ${v.job_title} (${v.department}, ${v.seniority})`,
`Location: ${v.city}, ${v.state}, ${v.country}`,
``,
`Session:`,
` Pages viewed: ${(v.pages_viewed || []).join(' > ')}`,
` Duration: ${v.visit_duration}s`,
` Intent score: ${v.intent_score}/100`,
` Matched topics: ${(v.matched_topics || []).join(', ')}`,
` Return visitor: ${v.return_visit}`,
``,
`Contact:`,
` Email: ${v.email}`,
` Phone: ${v.phone}`,
` LinkedIn: ${v.linkedin_url}`,
].join('\n');
await sendMail({ to: process.env.ALERT_TO, subject, text });
return { statusCode: 200, body: 'ok' };
}
Deploy on Vercel, Cloudflare Workers, or any serverless host. The function stays under 50 lines and costs nothing at this volume.
Step 4: Gmail-side filters
Without filters, your alerts will pile up in Primary and drown out real email. Set these up inside Gmail once.
Filter 1: Label all alerts
From: alerts@yourdomain.com
Subject: [Leadpipe]
→ Apply label: Leadpipe
→ Never mark as spam
→ Mark as important
Filter 2: High-intent auto-star
Subject: /pricing OR /enterprise OR "Return visitor"
→ Star
→ Skip Inbox if from Leadpipe label AND older than 7 days (via a second filter)
Filter 3: Grouped label view
In the Gmail sidebar, pin the Leadpipe label. Your inbox keeps its normal rhythm, and the high-intent alerts live in their own queue you can sweep daily.
What this looks like in practice
It is 10:47 am on a Tuesday. You are on a call. Your phone vibrates.
Subject: [Leadpipe] Maria Lopez (Head of Growth) @ Acme.io → /pricing
You tap it, scan for 10 seconds. Acme.io, 180 employees, B2B SaaS, Head of Growth, viewed pricing for 4 minutes, intent score 78, return visitor. LinkedIn link right there. You tap it, confirm Maria is real, and save the tab for after the call.
Eleven minutes later you send her a Loom that references exactly what her pricing page session implied (two-product interest, team of 20+, probably comparing to the more expensive tool). She replies the next morning. Meeting booked.
That is the whole point. The alert put an actual human in front of you while the intent was still warm. No CRM check needed, no Slack scrollback, no Monday morning list review.
Troubleshooting and edge cases
Inbox floods. The most common failure mode. If you get more than 5 alerts per hour, tighten the Zapier filter. Raise visit_duration to 60 seconds, require intent_score over 70, or limit to specific page URLs.
Alerts going to spam. Send from a domain you control (alerts@yourdomain.com), not a random Gmail. Or add your own address to Contacts and mark past alerts as “Not spam” a few times. If you use the Gmail API path, the sender is yourself, which never hits spam.
Missing fields in the email body. Zapier will render {{phone}} as an empty string if the field is not in the payload. That is fine for email. For nicer formatting, wrap each line in a “Truthy Formatter” step, but honestly most teams do not bother.
EU visitors missing name. Expected. Leadpipe defaults EU and UK traffic to company-level. Your email body should tolerate blank name fields and still send the company-level alert, which is often still useful. “[Leadpipe] Anonymous visitor @ Acme.io → /pricing” is still actionable.
Duplicate alerts on Every Update. If you also enable Every Update webhooks, every page view fires an alert. Add a 30-minute dedup in middleware, or only enable Every Update for specific pages like /pricing and route them through a Slack channel instead.
Founder on vacation. Pair this with a shared inbox or a delegate address. You can set Gmail to forward the Leadpipe label to a teammate while you are out.
Extending the recipe
- Run the exact same pipeline into Slack using the Slack visitor alerts guide so the team sees hits at the same time you do.
- Chain it with the Salesforce integration so every alert is also a Lead record with a Task.
- Use Leadpipe’s MCP server to let Claude draft a first-touch email the moment the alert lands. Paste it into Gmail, tweak, send.
- Pipe the same data into Clay to waterfall-enrich phone numbers before the alert, so your email body includes a mobile as well as a direct line.
Why alerts-to-email still wins for founders
The best founders I know check Gmail more often than they check Slack or Salesforce. Getting the signal to where the human actually reads things is a higher-leverage move than building another dashboard nobody opens.
The intent is only useful if the human reads it in time. Put it where the human is.
Leadpipe identifies 30-40%+ of your US B2B visitors with full contact data on the Pro plan at $147/mo. No credit card to start the 500-lead trial. Start identifying visitors →