Skip to main content

Lead Generation Implementation Guide

To track lead generation with Sealmetrics on a service, agency or B2B site, add the tracking script, then instrument three event types: pageviews (automatic, for service pages and case studies), microconversions via sealmetrics.micro() (form starts, scroll depth, CTA clicks, downloads) and conversions via sealmetrics.conv() (form submissions, demo requests, quote requests, bookings). This guide includes examples for Contact Form 7, Gravity Forms, HubSpot, Typeform, Calendly and Cal.com.

What will you track?

Event TypeExamplePurpose
PageviewsService pages, case studiesTraffic analysis
MicroconversionsForm interactions, content downloadsEngagement analysis
ConversionsForm submissions, demo requestsLead attribution

Step 1: Basic Installation

<script src="https://t.sealmetrics.com/t.js?id=YOUR_ACCOUNT_ID" defer></script>

Content Grouping

<!-- Homepage -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=home" defer></script>

<!-- Service pages -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=services" defer></script>

<!-- Case studies / Portfolio -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=portfolio" defer></script>

<!-- Blog -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=blog" defer></script>

<!-- Landing pages -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=landing" defer></script>

<!-- Contact / Quote request -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=contact" defer></script>

Step 2: Track Form Interactions

Contact Form

// Form field focus (intent signal)
document.querySelectorAll('#contact-form input, #contact-form textarea').forEach(function(field) {
field.addEventListener('focus', function() {
if (!this.dataset.tracked) {
sealmetrics.micro('form_start', {
form_name: 'contact',
first_field: this.name
});
this.dataset.tracked = 'true';
}
}, { once: true });
});

// Form submission (CONVERSION)
document.querySelector('#contact-form').addEventListener('submit', function(e) {
sealmetrics.conv('lead', 0, {
form_name: 'contact',
service_interest: document.querySelector('[name="service"]')?.value || 'general',
source: document.querySelector('[name="how_did_you_hear"]')?.value || 'not_specified'
});
});

Quote Request Form

document.querySelector('#quote-form').addEventListener('submit', function() {
var budget = document.querySelector('[name="budget"]').value;
var estimatedValue = getBudgetValue(budget); // Map budget range to number

sealmetrics.conv('quote_request', estimatedValue, {
service: document.querySelector('[name="service"]').value,
budget_range: budget,
timeline: document.querySelector('[name="timeline"]').value,
company_size: document.querySelector('[name="company_size"]').value
});
});

function getBudgetValue(budget) {
var values = {
'under_5k': 2500,
'5k_10k': 7500,
'10k_25k': 17500,
'25k_50k': 37500,
'over_50k': 75000
};
return values[budget] || 0;
}

Demo Request

document.querySelector('#demo-form').addEventListener('submit', function() {
sealmetrics.conv('demo_request', 0, {
product: document.querySelector('[name="product"]')?.value,
company_size: document.querySelector('[name="employees"]')?.value,
role: document.querySelector('[name="job_title"]')?.value
});
});

Step 3: Track Content Downloads

Lead Magnets (Ebooks, Whitepapers, Guides)

// Gated content - form submission
document.querySelector('#download-form').addEventListener('submit', function() {
var resourceName = document.querySelector('[name="resource"]').value;

sealmetrics.conv('content_download', 0, {
resource_name: resourceName,
resource_type: 'ebook', // 'whitepaper', 'guide', 'template'
topic: document.querySelector('[name="topic"]')?.value
});
});

// Direct download links (if not gated)
document.querySelectorAll('a[download]').forEach(function(link) {
link.addEventListener('click', function() {
sealmetrics.micro('file_download', {
file_name: this.getAttribute('download') || this.href.split('/').pop(),
file_type: this.href.split('.').pop()
});
});
});

Case Study Views

// Track case study engagement
document.querySelectorAll('.case-study-card').forEach(function(card) {
card.addEventListener('click', function() {
sealmetrics.micro('view_case_study', {
case_study: this.dataset.title,
industry: this.dataset.industry,
service: this.dataset.service
});
});
});

Step 4: Track Engagement Signals

Scroll Depth on Key Pages

// Only on service/landing pages
if (document.body.classList.contains('service-page') ||
document.body.classList.contains('landing-page')) {

var scrollMilestones = {};

window.addEventListener('scroll', function() {
var scrollPercent = Math.round(
(window.scrollY / (document.documentElement.scrollHeight - window.innerHeight)) * 100
);

[25, 50, 75, 100].forEach(function(milestone) {
if (scrollPercent >= milestone && !scrollMilestones[milestone]) {
scrollMilestones[milestone] = true;
sealmetrics.micro('scroll_' + milestone, {
page_type: document.body.dataset.pageType
});
}
});
});
}

Time on Page

// Track engaged visitors (30+ seconds on page)
setTimeout(function() {
sealmetrics.micro('engaged_visit', {
page: window.location.pathname,
page_type: document.body.dataset.pageType
});
}, 30000);

Video Testimonials

document.querySelectorAll('.testimonial-video').forEach(function(video) {
video.addEventListener('play', function() {
sealmetrics.micro('testimonial_play', {
client: this.dataset.client,
industry: this.dataset.industry
});
});

video.addEventListener('ended', function() {
sealmetrics.micro('testimonial_complete', {
client: this.dataset.client
});
});
});

Step 5: Track CTA Interactions

Primary CTAs

// "Get a Quote" buttons
document.querySelectorAll('.cta-quote').forEach(function(button) {
button.addEventListener('click', function() {
sealmetrics.micro('cta_click', {
cta_type: 'quote',
location: this.dataset.location, // 'header', 'hero', 'footer', 'sidebar'
page: window.location.pathname
});
});
});

// "Contact Us" buttons
document.querySelectorAll('.cta-contact').forEach(function(button) {
button.addEventListener('click', function() {
sealmetrics.micro('cta_click', {
cta_type: 'contact',
location: this.dataset.location
});
});
});

// "Schedule a Call" buttons
document.querySelectorAll('.cta-schedule').forEach(function(button) {
button.addEventListener('click', function() {
sealmetrics.micro('cta_click', {
cta_type: 'schedule_call',
location: this.dataset.location
});
});
});

Phone Number Clicks

document.querySelectorAll('a[href^="tel:"]').forEach(function(link) {
link.addEventListener('click', function() {
sealmetrics.conv('phone_call', 0, {
phone_number: this.href.replace('tel:', ''),
page: window.location.pathname,
location: this.dataset.location || 'unknown'
});
});
});

Live Chat

// If using Intercom, Drift, or similar
document.querySelector('.chat-launcher').addEventListener('click', function() {
sealmetrics.micro('chat_opened', {
page: window.location.pathname
});
});

// Track chat completion (if your chat tool supports callbacks)
window.Intercom('onConversationStarted', function() {
sealmetrics.conv('chat_lead', 0, {
page: window.location.pathname
});
});

Step 6: Track Calendar Bookings

Calendly / Cal.com / HubSpot Meetings

// Calendly
window.addEventListener('message', function(e) {
if (e.data.event === 'calendly.event_scheduled') {
sealmetrics.conv('meeting_booked', 0, {
meeting_type: e.data.payload.event_type.name,
invitee_email: e.data.payload.invitee.email
});
}
});

// Cal.com
if (typeof Cal !== 'undefined') {
Cal('on', 'bookingSuccessful', function(e) {
sealmetrics.conv('meeting_booked', 0, {
meeting_type: e.data.eventType,
duration: e.data.duration
});
});
}

Step 7: Multi-Step Forms

Wizard-style Quote Forms

var currentStep = 1;

function trackFormStep(stepNumber, stepName, data) {
sealmetrics.micro('form_step_' + stepNumber, {
step_name: stepName,
form_name: 'quote_wizard',
...data
});
}

// Step 1: Service selection
document.querySelector('#step1-next').addEventListener('click', function() {
trackFormStep(1, 'service_selected', {
service: document.querySelector('[name="service"]:checked').value
});
currentStep = 2;
});

// Step 2: Project details
document.querySelector('#step2-next').addEventListener('click', function() {
trackFormStep(2, 'details_provided', {
budget: document.querySelector('[name="budget"]').value,
timeline: document.querySelector('[name="timeline"]').value
});
currentStep = 3;
});

// Step 3: Contact info (final submission)
document.querySelector('#quote-wizard').addEventListener('submit', function() {
var budget = document.querySelector('[name="budget"]').value;

sealmetrics.conv('quote_request', getBudgetValue(budget), {
service: document.querySelector('[name="service"]:checked').value,
budget_range: budget,
timeline: document.querySelector('[name="timeline"]').value,
steps_completed: '3'
});
});

// Track abandonment
window.addEventListener('beforeunload', function() {
if (currentStep > 1 && currentStep < 3) {
sealmetrics.micro('form_abandoned', {
form_name: 'quote_wizard',
last_step: currentStep.toString()
});
}
});

Platform-Specific Implementations

WordPress (Contact Form 7)

// In functions.php
add_action('wp_footer', function() {
?>
<script>
document.addEventListener('wpcf7mailsent', function(event) {
var formId = event.detail.contactFormId;
var formName = event.detail.containerElement.dataset.formName || 'contact';

sealmetrics.conv('lead', 0, {
form_name: formName,
form_id: formId.toString()
});
});
</script>
<?php
});

WordPress (Gravity Forms)

add_action('gform_after_submission', function($entry, $form) {
?>
<script>
sealmetrics.conv('lead', 0, {
form_name: '<?php echo esc_js($form['title']); ?>',
form_id: '<?php echo $form['id']; ?>'
});
</script>
<?php
}, 10, 2);

HubSpot Forms

window.addEventListener('message', function(e) {
if (e.data.type === 'hsFormCallback' && e.data.eventName === 'onFormSubmit') {
sealmetrics.conv('lead', 0, {
form_name: e.data.formId,
source: 'hubspot'
});
}
});

Typeform

// Typeform embed callbacks
window.tf.createWidget('<typeform-id>', {
container: document.querySelector('#typeform'),
onSubmit: function(payload) {
sealmetrics.conv('lead', 0, {
form_name: 'typeform_intake',
response_id: payload.responseId
});
}
});

Complete Lead Gen Funnel

┌─────────────────────────────────────────────────────────────────┐
│ LEAD GENERATION FUNNEL │
├─────────────────────────────────────────────────────────────────┤
│ │
│ AWARENESS │
│ ───────── │
│ Blog Post ──► Service Page ──► Case Study │
│ (pageview) (pageview) (micro: view_case_study) │
│ │
│ INTEREST │
│ ──────── │
│ Scroll 50% ──► Video Watch ──► Resource Download │
│ (micro) (micro) (CONV: content_download) │
│ │
│ CONSIDERATION │
│ ───────────── │
│ CTA Click ──► Form Start ──► Form Steps │
│ (micro) (micro) (micro x N) │
│ │
│ CONVERSION │
│ ────────── │
│ Form Submit ──► Demo/Call Booked │
│ (CONV: lead) (CONV: meeting_booked) │
│ │
└─────────────────────────────────────────────────────────────────┘

Lead Scoring with Properties

Use properties to enable lead scoring in your CRM:

sealmetrics.conv('lead', 0, {
// Lead source
source: getUtmSource(),
medium: getUtmMedium(),
campaign: getUtmCampaign(),

// Qualification signals
company_size: formData.employees, // 'small', 'medium', 'enterprise'
budget_range: formData.budget, // 'under_5k', '5k_10k', etc.
timeline: formData.timeline, // 'immediate', '1_month', '3_months'
decision_maker: formData.role, // 'ceo', 'director', 'manager'

// Engagement signals
pages_viewed: sessionStorage.getItem('pages_viewed'),
time_on_site: Math.round((Date.now() - sessionStart) / 1000).toString(),
content_downloaded: sessionStorage.getItem('downloads') || '0'
});

Which lead generation metrics should you track?

MetricFormulaEvents
Visitor → Leadleads / visitorspageview, lead
Form Start Rateform_start / page visitorspageview, form_start
Form Completionlead / form_startform_start, lead
Content Download Ratedownloads / visitorspageview, content_download
Lead by Sourceleads by utm_sourcelead (with properties)
Lead Qualityweighted by budget/company sizelead (with properties)

Dashboard Analysis

After implementing:

Traffic Analysis

  • Which channels bring the most leads
  • Best performing landing pages
  • Content that drives conversions

Funnel Optimization

  • Form abandonment points
  • CTA click-through rates
  • Time from first visit to lead

Lead Quality

  • Leads by company size
  • Budget distribution
  • Timeline urgency

Content Performance

  • Case studies that influence leads
  • Blog posts in conversion paths
  • Download-to-lead correlation
In short
  • Lead conversions (lead, quote_request, demo_request, content_download, meeting_booked, phone_call) are fired with sealmetrics.conv(); intent signals such as form_start, scroll milestones and CTA clicks are microconversions.
  • Attach qualification properties (company_size, budget_range, timeline, role) to the lead event so leads can be analyzed by source and quality.
  • Key ratios: Visitor → Lead, Form Start Rate, Form Completion (lead / form_start) and Content Download Rate.
Written and maintained by the Sealmetrics Team