A complete reference for SaaS product analytics. All lifecycle events — from signup to churn — with parameters, data types, and data layer examples you can copy-paste into your tracking plan.
Most SaaS teams track too little or too much. They either rely on page views alone, missing critical product interactions, or fire hundreds of events with no naming standard, making analysis impossible. This reference gives you the middle ground: a structured schema covering the events that actually drive SaaS metrics.
SaaS Funnel Overview
SaaS analytics tracks users through five lifecycle stages. Each stage has distinct events that map to specific business metrics.
| Stage | Key Events | Business Metric |
|---|---|---|
| Signup | sign_up, login, sso_connect |
Registration rate |
| Onboarding | onboarding_start, onboarding_step_complete, onboarding_complete |
Activation rate |
| Engagement | feature_used, content_created, invite_sent |
DAU/MAU, feature adoption |
| Monetization | trial_started, plan_upgraded, payment_completed |
Conversion rate, MRR |
| Retention | session_start, plan_renewed, churn_initiated |
Retention rate, churn rate |
Signup & Authentication Events
These events track how users create accounts and authenticate. They’re the entry point of every SaaS funnel and directly impact your registration-to-activation conversion rate.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
sign_up |
method |
string | Account creation completed |
plan_type |
string | ||
referral_source |
string | ||
login |
method |
string | Successful authentication |
sso_connect |
provider |
string | SSO provider linked |
is_first_connection |
boolean | ||
email_verified |
time_to_verify |
number | Email confirmation clicked |
password_reset |
method |
string | Password reset completed |
The method parameter is reusable across signup, login, and password reset. Values like email, google, github, or saml let you compare authentication paths without creating separate events for each.
Onboarding Events
Onboarding is where most SaaS products lose users. When I audited a project management tool’s analytics, we discovered 68% of users dropped off before completing step 3 of a 5-step onboarding — but nobody knew because they only tracked onboarding_complete. Track each step individually.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
onboarding_start |
flow_name |
string | Onboarding flow initiated |
onboarding_step_complete |
flow_name |
string | Individual step finished |
step_number |
number | ||
step_name |
string | ||
onboarding_complete |
flow_name |
string | All steps finished |
total_time |
number | ||
onboarding_skip |
flow_name |
string | User skips onboarding |
skipped_at_step |
number | ||
tooltip_shown |
tooltip_id |
string | In-app tooltip displayed |
tooltip_action |
string |
Use flow_name consistently across all onboarding events — it lets you compare multiple flows (e.g., setup_wizard, quick_start, team_invite) and run A/B tests between them.
Feature Usage Events
Feature events are the core of SaaS analytics. They tell you what users actually do with your product. The key is using a single feature_used event with descriptive parameters instead of creating a separate event for every feature.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
feature_used |
feature_name |
string | Any feature interaction |
feature_category |
string | ||
action |
string | ||
content_created |
content_type |
string | User creates an object |
is_first_creation |
boolean | ||
content_deleted |
content_type |
string | User deletes an object |
search_performed |
query |
string | In-app search used |
results_count |
number | ||
invite_sent |
invite_method |
string | Team invite sent |
role |
string | ||
invite_accepted |
time_to_accept |
number | Invitee joins workspace |
export_completed |
format |
string | Data exported (CSV, PDF) |
integration_connected |
integration_name |
string | Third-party integration linked |
Why One Generic Event Works Better
GA4 limits you to 500 unique event names per property. A SaaS product with 50 features would burn through 150+ names using separate events (dashboard_viewed, report_created, filter_applied…). Instead, use feature_used with feature_name and action parameters. This conserves event slots and simplifies reporting.
Subscription & Billing Events
Billing events connect product usage to revenue. They’re essential for calculating MRR, LTV, and conversion rates. Always track these server-side for accuracy — client-side billing events can be lost to ad blockers or page refreshes.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
trial_started |
plan_name |
string | Free trial begins |
trial_duration_days |
number | ||
trial_ended |
plan_name |
string | Trial expires |
converted |
boolean | ||
plan_upgraded |
previous_plan |
string | Plan tier increased |
new_plan |
string | ||
value |
number | ||
currency |
string | ||
plan_downgraded |
previous_plan |
string | Plan tier decreased |
new_plan |
string | ||
reason |
string | ||
payment_completed |
value |
number | Successful payment |
currency |
string | ||
payment_method |
string | ||
payment_failed |
error_code |
string | Payment attempt fails |
retry_count |
number | ||
seats_changed |
previous_count |
number | Seat count adjusted |
new_count |
number |
Include value and currency on all monetization events. GA4 uses these for revenue reporting. Use ISO 4217 currency codes (EUR, USD) and pass values as numbers, not strings.
Retention & Churn Events
Retention events help you spot at-risk users before they cancel. In my experience, tracking churn_survey_submitted with a reason parameter provides more actionable data than any cohort analysis — you hear directly why people leave.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
churn_initiated |
plan_name |
string | Cancellation flow started |
tenure_days |
number | ||
churn_survey_submitted |
reason |
string | Exit survey completed |
feedback |
string | ||
churn_completed |
plan_name |
string | Subscription cancelled |
mrr_lost |
number | ||
churn_prevented |
offer_type |
string | User retained by offer |
reactivation |
previous_plan |
string | Churned user returns |
days_inactive |
number | ||
nps_submitted |
score |
number | NPS survey response |
comment |
string |
Naming Convention Reference
All events in this schema follow these rules. Consistent naming prevents the user_signup vs UserSignup vs sign-up chaos that plagues most SaaS analytics setups.
| Rule | Standard | Example |
|---|---|---|
| Case | snake_case, all lowercase | plan_upgraded not PlanUpgraded |
| Structure | object_action | invite_sent, trial_started |
| Tense | Past tense for completed actions | payment_completed not payment_complete |
| Length | Under 40 characters (GA4 limit) | onboarding_step_complete (26 chars) ✓ |
| Prefixes | No ga_, firebase_, google_ |
Reserved by GA4 |
| Parameters | Reuse generic names across events | content_type on create, delete, export |
For a deeper dive into GA4 naming rules, event limits, and GTM organization, see GA4 Event Naming Conventions: A Practical Guide.
Data Layer Examples
Push events to the data layer using standard dataLayer.push() calls. GTM, Matomo Tag Manager, or any tag management system can then pick them up.
Signup Event
dataLayer.push({
event: 'sign_up',
method: 'google',
plan_type: 'free_trial',
referral_source: 'product_hunt'
});
Feature Usage Event
dataLayer.push({
event: 'feature_used',
feature_name: 'dashboard',
feature_category: 'reporting',
action: 'created'
});
Plan Upgrade Event
dataLayer.push({
event: 'plan_upgraded',
previous_plan: 'starter',
new_plan: 'professional',
value: 49.00,
currency: 'EUR'
});
Churn Event
// Server-side recommended for billing events
dataLayer.push({
event: 'churn_completed',
plan_name: 'professional',
mrr_lost: 49.00,
tenure_days: 186
});
Validation Checklist
Run through this checklist before launching your SaaS tracking implementation.
Pre-Launch QA
- Naming: All events use snake_case, lowercase only
- Parameters: Consistent names across similar events (
plan_name, not sometimesplan, sometimesplan_name) - Data types: Numbers are numbers (not strings), booleans are booleans
- Currency: ISO 4217 codes (
EUR,USD) on all monetary events - Signup flow:
sign_upfires once on completion (not on form load) - Onboarding: Each step fires individually with correct
step_number - Feature events:
feature_usedfires on meaningful actions (not on page load) - Billing events: Server-side for
payment_completed,plan_upgraded - Churn flow:
churn_initiatedfires when cancellation starts (not when completed) - DebugView: All events visible in GA4 DebugView with correct parameters
- No duplicates: Events fire exactly once per user action
- No PII: No email addresses, names, or IPs in event parameters
FAQ
How many events should a SaaS product track?
Start with 10–15 core events covering signup, onboarding, feature usage, and billing. Expand to 25–40 events as your analytics matures. Tracking more than 50 custom events usually means your schema needs consolidation — use generic events like feature_used with descriptive parameters instead.
Should SaaS billing events be tracked client-side or server-side?
Always server-side. Client-side billing events can be blocked by ad blockers, lost to page refreshes during payment processing, or duplicated by retry logic. Use your payment provider’s webhooks (Stripe, Paddle) to fire billing events reliably from your backend.
What is the difference between feature_used and individual feature events?
A single feature_used event with feature_name and action parameters scales better than separate events per feature. GA4 limits you to 500 unique event names. A 50-feature product using individual events would consume 150+ names. The generic approach conserves event slots and simplifies analysis through parameter-based filtering.
How do I track onboarding drop-off points?
Fire onboarding_step_complete with step_number and step_name for each step. Also track onboarding_skip with skipped_at_step. In GA4, create a funnel exploration with each step as a stage — this shows exactly where users abandon the flow and what percentage skip versus complete.
Do I need to track every feature interaction?
No. Track meaningful actions — creating, configuring, or completing something — not every button click or hover. A good test: “Would a product manager make a decision based on this event?” If the answer is no, don’t track it. You can always add events later, but removing noisy data from reports is much harder.
Further Reading
- E-commerce Event Schema: The Complete Reference — If you also sell products alongside your SaaS
- GA4 Event Naming Conventions — Deep dive into naming rules and GTM organization
- Server-Side Tracking: When and How to Use It — Essential for reliable billing event tracking
- UTM Parameters Strategy Guide — Attribution for your acquisition campaigns
Product Analytics Specialist based in Munich. Helping teams implement clean, actionable analytics since 2015.