Skip to main content

SaaS Implementation Guide

Complete guide to implement Sealmetrics tracking for your SaaS product. Track the full user journey from landing to paid subscription.

What You'll Track

Event TypeExamplePurpose
PageviewsPricing, features, blogTraffic analysis
MicroconversionsPlan selection, form stepsFunnel optimization
ConversionsTrial signup, subscriptionRevenue attribution

Step 1: Basic Installation

Add the tracking script to your marketing site and app:

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

Content Grouping for SaaS

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

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

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

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

<!-- App (logged in) -->
<script src="https://t.sealmetrics.com/t.js?id=YOUR_ID&group=app" defer></script>

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

Step 2: Track Pricing Page Interactions

Plan Selection

// Track when user clicks on a plan
document.querySelectorAll('.plan-card').forEach(function(card) {
card.addEventListener('click', function() {
sealmetrics.micro('select_plan', {
plan: this.dataset.plan, // 'starter', 'pro', 'enterprise'
billing: document.querySelector('.billing-toggle.active').dataset.billing // 'monthly', 'yearly'
});
});
});

Billing Toggle

// Track monthly/yearly toggle
document.querySelectorAll('.billing-toggle').forEach(function(toggle) {
toggle.addEventListener('click', function() {
sealmetrics.micro('toggle_billing', {
selected: this.dataset.billing // 'monthly' or 'yearly'
});
});
});

CTA Clicks

// Track "Start Trial" or "Get Started" clicks
document.querySelectorAll('.cta-start-trial').forEach(function(button) {
button.addEventListener('click', function() {
sealmetrics.micro('click_start_trial', {
plan: this.dataset.plan,
location: this.dataset.location // 'hero', 'pricing', 'footer'
});
});
});

Feature Comparison

// Track when user opens feature comparison
document.querySelector('.compare-plans').addEventListener('click', function() {
sealmetrics.micro('view_comparison');
});

Step 3: Track Signup Funnel

Multi-step Signup Form

// Step 1: Email entered
document.querySelector('#signup-email').addEventListener('blur', function() {
if (this.value && this.checkValidity()) {
sealmetrics.micro('signup_step_1', {
step: 'email_entered'
});
}
});

// Step 2: Password created
document.querySelector('#signup-password').addEventListener('blur', function() {
if (this.value) {
sealmetrics.micro('signup_step_2', {
step: 'password_created'
});
}
});

// Step 3: Company info
document.querySelector('#company-form').addEventListener('submit', function() {
sealmetrics.micro('signup_step_3', {
step: 'company_info',
company_size: document.querySelector('[name="company_size"]').value
});
});

// Final: Account created (CONVERSION)
// Track on the post-signup/welcome page
sealmetrics.conv('signup', 0, {
plan: 'trial',
source: document.referrer.includes('pricing') ? 'pricing' : 'direct'
});

Single-page Signup

document.querySelector('#signup-form').addEventListener('submit', function(e) {
// Track before form submits
sealmetrics.micro('signup_submitted', {
plan: document.querySelector('[name="plan"]').value
});
});

// On success callback or success page
function onSignupSuccess(user) {
sealmetrics.conv('signup', 0, {
plan: user.plan,
trial_days: '14'
});
}

Step 4: Track Onboarding

Track how users progress through onboarding to identify drop-off points.

Onboarding Checklist

// Generic onboarding step tracker
function trackOnboardingStep(stepName, stepNumber, data) {
sealmetrics.micro('onboarding_' + stepName, {
step_number: stepNumber.toString(),
...data
});
}

// Step 1: Profile completed
trackOnboardingStep('profile_completed', 1, {
has_avatar: document.querySelector('#avatar').src ? 'yes' : 'no'
});

// Step 2: First project created
trackOnboardingStep('project_created', 2, {
project_type: projectType
});

// Step 3: Team member invited
trackOnboardingStep('team_invited', 3, {
invites_sent: inviteCount.toString()
});

// Step 4: Integration connected
trackOnboardingStep('integration_connected', 4, {
integration: integrationName // 'slack', 'github', 'jira'
});

// Step 5: First action completed
trackOnboardingStep('first_action', 5, {
action_type: actionType
});

Onboarding Completed

// When user completes all onboarding steps
sealmetrics.micro('onboarding_completed', {
time_to_complete: calculateDays(signupDate, new Date()),
steps_completed: '5'
});

Skip Onboarding

document.querySelector('.skip-onboarding').addEventListener('click', function() {
sealmetrics.micro('onboarding_skipped', {
last_step: currentStep.toString()
});
});

Step 5: Track Feature Usage

Track which features users engage with to understand product-market fit.

Feature Activation

// First time using a feature
function trackFeatureActivation(featureName) {
if (!localStorage.getItem('activated_' + featureName)) {
sealmetrics.micro('feature_activated', {
feature: featureName
});
localStorage.setItem('activated_' + featureName, 'true');
}
}

// Examples
trackFeatureActivation('dashboard');
trackFeatureActivation('reports');
trackFeatureActivation('exports');
trackFeatureActivation('api');
trackFeatureActivation('integrations');

Key Actions

// Track important user actions
sealmetrics.micro('create_report', {
report_type: reportType
});

sealmetrics.micro('export_data', {
format: 'csv',
rows: rowCount.toString()
});

sealmetrics.micro('invite_team_member', {
role: memberRole
});

sealmetrics.micro('connect_integration', {
integration: integrationName
});

Step 6: Track Subscription Conversions

Trial to Paid

// When user enters payment info and subscribes
sealmetrics.conv('subscription', monthlyPrice, {
plan: 'pro',
billing_cycle: 'monthly',
currency: 'USD',
trial_days_used: trialDaysUsed.toString()
});

Plan Upgrade

// When user upgrades to a higher plan
sealmetrics.conv('upgrade', priceDifference, {
from_plan: 'starter',
to_plan: 'pro',
billing_cycle: 'monthly',
currency: 'USD'
});

Plan Downgrade

// Track downgrades for churn analysis
sealmetrics.micro('downgrade', {
from_plan: 'pro',
to_plan: 'starter',
reason: selectedReason // from exit survey
});

Annual Upgrade

// When user switches from monthly to annual
sealmetrics.conv('annual_upgrade', annualPrice, {
plan: 'pro',
previous_billing: 'monthly',
savings: savingsAmount.toString(),
currency: 'USD'
});

Step 7: Track Churn Signals

Cancel Flow

// User clicks cancel
sealmetrics.micro('cancel_initiated');

// User selects reason
sealmetrics.micro('cancel_reason', {
reason: selectedReason // 'too_expensive', 'not_using', 'missing_feature', etc.
});

// Offer accepted (save)
sealmetrics.micro('cancel_saved', {
offer: acceptedOffer // 'discount', 'pause', 'downgrade'
});

// Final cancellation
sealmetrics.micro('cancel_confirmed', {
reason: finalReason,
days_as_customer: customerDays.toString(),
plan: currentPlan
});

Reactivation

// When a churned user returns and subscribes again
sealmetrics.conv('reactivation', monthlyPrice, {
plan: 'pro',
days_churned: daysSinceCancellation.toString(),
previous_plan: previousPlan
});

Complete SaaS Funnel

┌─────────────────────────────────────────────────────────────────┐
│ SaaS FUNNEL │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ACQUISITION │
│ ─────────── │
│ Landing ──► Pricing ──► Select Plan ──► Start Trial │
│ (pv) (pv) (micro) (micro) │
│ │
│ ACTIVATION │
│ ────────── │
│ Signup ──► Onboarding Steps ──► Feature Activation │
│ (CONV) (micro x N) (micro) │
│ │
│ REVENUE │
│ ─────── │
│ Trial End ──► Enter Payment ──► Subscribe │
│ (micro) (CONV) │
│ │
│ EXPANSION │
│ ───────── │
│ Feature Usage ──► Upgrade ──► Annual │
│ (micro) (CONV) (CONV) │
│ │
└─────────────────────────────────────────────────────────────────┘

Example: Complete Implementation

Marketing Site (Next.js)

// components/PricingCard.tsx
export function PricingCard({ plan, price, billing }) {
const handleSelect = () => {
if (typeof sealmetrics !== 'undefined') {
sealmetrics.micro('select_plan', {
plan: plan,
billing: billing,
price: price.toString()
});
}
router.push(`/signup?plan=${plan}&billing=${billing}`);
};

return (
<div className="plan-card" onClick={handleSelect}>
{/* Plan details */}
</div>
);
}

Signup Page

// pages/signup.tsx
export default function Signup() {
const searchParams = useSearchParams();
const plan = searchParams.get('plan') || 'starter';

const handleSubmit = async (formData) => {
try {
const user = await createAccount(formData);

// Track signup conversion
if (typeof sealmetrics !== 'undefined') {
sealmetrics.conv('signup', 0, {
plan: plan,
source: document.referrer.includes('pricing') ? 'pricing' : 'other'
});
}

router.push('/onboarding');
} catch (error) {
// Handle error
}
};

return (
<form onSubmit={handleSubmit}>
{/* Form fields */}
</form>
);
}

App Dashboard

// components/UpgradeButton.tsx
export function UpgradeButton({ toPlan, price }) {
const handleUpgrade = async () => {
const result = await processUpgrade(toPlan);

if (result.success && typeof sealmetrics !== 'undefined') {
sealmetrics.conv('upgrade', price, {
from_plan: currentPlan,
to_plan: toPlan,
billing_cycle: billingCycle,
currency: 'USD'
});
}
};

return (
<button onClick={handleUpgrade}>
Upgrade to {toPlan}
</button>
);
}

Key Metrics to Track

MetricHow to CalculateEvents Needed
Visitor → Trialsignup / unique visitorspageview, signup
Trial → Paidsubscription / signupsignup, subscription
Onboarding Completiononboarding_completed / signupsignup, onboarding_*
Feature Adoptionfeature_activated / active usersfeature_activated
Expansion Revenueupgrade + annual_upgrade valueupgrade, annual_upgrade
Churn Ratecancel_confirmed / active subscriptionscancel_confirmed

Dashboard Analysis

After implementing, analyze:

Acquisition

  • Which channels drive trial signups
  • Pricing page conversion rate
  • Plan preference by source

Activation

  • Onboarding completion rate
  • Time to first value
  • Feature activation patterns

Revenue

  • Trial to paid conversion by plan
  • MRR by acquisition source
  • Upgrade patterns

Retention

  • Churn reasons
  • Feature usage before churn
  • Reactivation success