Back to all·Back to Notes

Growth Lab · Note

From Website Analytics to Revenue Intelligence

A practical note on structuring SaaS data across acquisition, website behavior, CRM lifecycle, pipeline, and revenue.

Context

Most SaaS companies do not have a reporting problem. They have a data structure problem.

Analytics friction — the gap between “I want to know X” and “here is a reliable answer” — is rarely caused by a lack of tools. Most growth teams already have Google Analytics, a CRM, an ad platform, a marketing automation system, and some form of BI. The problem is that each of those tools captures a different slice of the customer journey, and those slices are rarely connected through a shared model of events, identifiers, properties, and business definitions.

The customer journey in a typical SaaS company runs through at least seven distinct systems:

Visitor → Session → Lead → MQL → SQL → Opportunity → Customer → Expansion

At each stage, a different platform holds the authoritative record. Acquisition platforms know spend and clicks. Website analytics knows sessions and behavior. Forms know intent. The CRM knows contacts and lifecycle stages. Sales tools know pipeline. Billing knows real revenue. Product analytics knows activation and retention.

When these layers are not stitched together with a common data model, teams optimize disconnected signals rather than business outcomes. Marketing optimizes for MQLs, sales optimizes for ARR, and neither number connects cleanly to the other.

This note maps where that structure usually breaks down, and what a minimum viable data model looks like before adding more tools.


The Analytics Friction Problem

Each platform in your stack captures a partial truth. Friction compounds every time context is lost moving from one layer to the next.

Acquisition platforms (Google Ads, LinkedIn Ads, Meta Ads) capture spend, impressions, clicks, campaign metadata, and platform-side conversions. They do not know what happened after the click.

Website analytics (GA4, GTM, server-side tracking) captures sessions, pageviews, scroll depth, events, and user behavior. It rarely knows the CRM contact ID or the deal outcome.

Forms capture intent signals at the moment of conversion. They frequently lose campaign context, UTM parameters, or session history because the form submission event is not connected to the upstream session.

CRM (HubSpot, Salesforce, Pipedrive) captures contacts, company data, lifecycle stages, and activity history. It is usually populated manually or through incomplete integrations, making it unreliable as a single source of truth for conversion quality.

Sales tools capture pipeline stages, forecasting data, and opportunity progression. They are often siloed from marketing attribution data.

Billing systems (Stripe, Paddle, Chargebee) capture real revenue: subscriptions, expansions, churns, refunds. They are rarely connected to the campaign or content that originally sourced the customer.

Product analytics (Mixpanel, Amplitude, PostHog) captures activation milestones, feature engagement, retention curves, and expansion signals. Product data is frequently unavailable to marketing teams when they need to identify high-intent accounts.

When these layers are not connected, teams end up optimizing isolated signals instead of business outcomes. The most common result: marketing reports strong MQL volume, sales reports weak pipeline quality, and no one can reconcile the two numbers because they are pulling from different systems with different definitions.


Common Data Structure Gaps

These are the structural problems that create friction. Solving for tools before addressing these gaps typically makes the problem worse, not better.

1. Events Without Naming Conventions

Problem: Different teams and different developers instrument events independently, using inconsistent naming patterns (ButtonClick, button_click, btn-click) for the same concept.

Impact: Queries break when schemas change. Reporting becomes unreliable. Analysts spend time cleaning data instead of answering questions.

Signal to watch: Event names that vary by page, by developer, or by campaign.


2. Inconsistent UTM Governance

Problem: UTM parameters are applied inconsistently across campaigns, ad platforms, emails, and social posts. No canonical taxonomy exists for utm_source, utm_medium, and utm_campaign values.

Impact: Attribution reports fragment into dozens of variations of the same channel. “Google Ads” becomes google, Google, google-ads, paid-search, and cpc depending on who built the link.

Signal to watch: More than three or four values for the same logical source in your analytics platform.


3. Disconnected Identifiers

Problem: Each platform assigns its own user or session identifier. The website session ID, the CRM contact ID, the ad platform click ID, and the billing customer ID are never joined.

Impact: You cannot trace a closed deal back to its originating campaign without manual intervention. Attribution is guesswork.

Signal to watch: Revenue and marketing data can only be joined by email address, which breaks on any touchpoint before the form submission.


4. Forms That Do Not Pass Enough Context

Problem: The form submission event does not carry the session data, UTM parameters, or content context that preceded the conversion.

Impact: You know someone converted, but not from where, not after engaging with which content, and not with which campaign context.

Signal to watch: Form submissions with no associated source or campaign data in the CRM.


5. Manual Lifecycle Stage Management

Problem: Lifecycle stages (Lead, MQL, SQL, Opportunity, Customer) are updated manually or through weak automation rules that do not reflect actual qualification criteria.

Impact: Lifecycle-based reporting is unreliable. Conversion rate metrics are meaningless if stage definitions shift with the person updating them.

Signal to watch: Different team members give different answers to “how many MQLs did we create this quarter.”


6. Dashboards Without Ownership

Problem: Dashboards are built for a specific campaign or quarter, then abandoned when the campaign ends. No one maintains definitions or fixes broken data connections.

Impact: Teams lose trust in dashboards and revert to Slack threads and spreadsheets. Decision velocity drops.

Signal to watch: Dashboards with stale data dates, broken charts, or metrics that no one can explain.


7. Qualified Conversions Not Pushed Back to Ad Platforms

Problem: Ad platforms optimize on platform-side conversion events (form fills, page visits) rather than on downstream qualified events (MQL created, SQL created, deal won).

Impact: Campaigns optimize for volume instead of quality. CPL looks healthy while pipeline quality deteriorates.

Signal to watch: High lead volume with declining SQL-to-close rates on paid channels.


8. Revenue Disconnected From Campaign and Content History

Problem: Billing events (subscription started, expansion, churn) are not linked back to the original acquisition campaign or the content path that preceded the conversion.

Impact: You cannot calculate true CAC by channel, content ROI, or payback period by source. Budget decisions rely on proxies.

Signal to watch: No reliable answer to “which campaigns sourced customers who stayed?”


Main SaaS Data Sources

Source layer Examples Captures Main owner Risk if disconnected
Acquisition platforms Google Ads, LinkedIn Ads, Meta Ads, Microsoft Ads Spend, impressions, clicks, campaign metadata, platform conversions Marketing / Paid media Campaigns optimize for clicks, not pipeline or revenue
Search and content discovery Google Search Console, Ahrefs, Semrush Organic impressions, clicks, keyword rankings, content performance SEO / Content Organic contribution to pipeline is invisible
Website analytics GA4, GTM, server-side tracking Sessions, pageviews, events, user behavior, content engagement Marketing / Analytics No behavioral context attached to conversions
CRM HubSpot, Salesforce, Pipedrive Contacts, companies, lifecycle stages, deal records, activity logs Sales / RevOps Lifecycle and pipeline data unavailable for attribution
Marketing automation HubSpot, Brevo, Customer.io Email engagement, nurture sequences, lifecycle triggers, lead scoring Marketing Nurture contribution to conversion invisible
Product analytics Mixpanel, Amplitude, PostHog Activation events, feature usage, retention, expansion signals Product High-intent product signals unavailable to sales and marketing
Billing and revenue Stripe, Paddle, Chargebee Subscriptions, MRR, expansions, churns, refunds Finance / RevOps Revenue cannot be attributed to acquisition source or content
Warehouse and BI BigQuery, Snowflake, Looker Studio, Power BI Unified cross-system data, historical trends, custom metrics Data / Analytics No single source of truth; each team works from different numbers

A minimum viable SaaS growth data model does not require a full data warehouse from day one. It requires agreement on identifiers, event naming, and core business definitions before instrumentation begins.

Core Data Categories

Category Purpose Example fields
Session and user identifiers Link anonymous behavior to identified contacts anonymous_id, user_id, session_id, client_id
Campaign parameters Attribute sessions and conversions to campaigns utm_source, utm_medium, utm_campaign, utm_content, utm_term, gclid, li_fat_id
Content and resource identifiers Track which content influences conversion paths content_id, content_type, resource_slug, page_category
Form submission identifiers Connect form conversions to upstream session context form_id, form_type, submission_id
Lead and contact identifiers Join website behavior to CRM records contact_id, lead_id, email_hash
Lifecycle stage events Record when and why a contact moves between stages stage_name, stage_changed_at, disqualification_reason
Deal and revenue identifiers Connect revenue to pipeline and attribution deal_id, arr_value, subscription_id, plan_name
Consent state Respect user privacy preferences in all downstream data consent_analytics, consent_marketing, consent_timestamp
Source and attribution fields Preserve first-touch and last-touch attribution through the funnel first_touch_source, last_touch_source, first_touch_campaign, last_touch_campaign

Tracking Plan

Event Trigger Required properties Destination Business question answered
page_view Every page load page_path, page_title, session_id, utm_*, referrer GA4, warehouse Which pages drive engagement before conversion?
cta_click CTA button interaction cta_label, cta_location, page_path, session_id GA4, warehouse Which CTAs move users toward conversion?
resource_view Resource or asset page viewed resource_id, resource_type, resource_slug, session_id GA4, warehouse Which content assets influence the conversion path?
form_start User begins filling a form form_id, form_type, page_path, session_id, utm_* GA4, warehouse Where do users start but not complete forms?
form_submit Form successfully submitted form_id, form_type, submission_id, session_id, utm_*, page_path GA4, CRM, warehouse What is the conversion rate by form, page, and campaign?
contact_created New contact record created in CRM contact_id, source, form_id, utm_*, session_id CRM, warehouse What is the lead creation rate by channel?
lifecycle_stage_changed Contact moves between lifecycle stages contact_id, previous_stage, new_stage, changed_at, changed_by CRM, warehouse Where do contacts stall in the funnel?
mql_created Contact reaches MQL threshold contact_id, mql_score, mql_criteria, first_touch_campaign, last_touch_campaign CRM, ad platforms, warehouse Which campaigns and content produce qualified leads?
sql_created Contact accepted by sales contact_id, sql_criteria, assigned_rep, source_campaign CRM, warehouse What is the MQL-to-SQL conversion rate by source?
deal_created Opportunity created in pipeline deal_id, contact_id, arr_value, deal_stage, source_campaign CRM, warehouse How much pipeline is generated by channel?
deal_won Opportunity closed as won deal_id, contact_id, arr_value, close_date, first_touch_campaign, last_touch_campaign CRM, billing, warehouse What is the close rate and CAC by campaign?
subscription_started Billing subscription created subscription_id, contact_id, plan_name, mrr_value, trial_converted Billing, warehouse What is the conversion rate from trial to paid?
expansion_created Subscription upgrade or upsell subscription_id, contact_id, previous_plan, new_plan, expansion_mrr Billing, warehouse Which customer segments expand? What drives expansion?

Implementation Roadmap

Structure before instrumentation. Instrumentation before dashboards. Dashboards before optimization.

Step-by-Step Sequence

1. Define the business questions Start with the decisions that need to be made, not the data that is available. Write down the ten questions your team asks most frequently and cannot reliably answer. That list defines your instrumentation requirements.

2. Define lifecycle stages Agree on precise, criteria-based definitions for Lead, MQL, SQL, Opportunity, Customer, and Churned. Document who owns each stage transition and what data point triggers it. Without this, conversion rate metrics are undefined.

3. Standardize UTMs Create a UTM taxonomy document with canonical values for source, medium, campaign, content, and term. Include a URL builder template. Apply governance so that no campaign goes live without conformant UTMs.

4. Define event naming conventions Choose a naming pattern (snake_case is most portable) and define it before any new instrumentation begins. Document required properties for each event category. Build a tracking plan document before building tracking.

5. Instrument website events Implement the core tracking plan events on the website. Prioritize the conversion path: page views, CTA clicks, form starts, and form submissions with full campaign context.

6. Connect form submissions with CRM Ensure that every form submission creates or updates a CRM contact with the session’s UTM parameters, content context, and source data. This is the single most impactful integration in most SaaS growth stacks.

7. Push qualified lifecycle events back to ad platforms Configure Google Ads enhanced conversions and equivalent offline conversion or conversion API workflows where supported, so qualified lifecycle events such as MQL or SQL can inform downstream campaign optimization. This shifts platform optimization from volume to quality without requiring a full attribution model.

8. Export analytics and CRM data to a warehouse Once events are structured and CRM data is reliable, export both to a data warehouse. This enables cross-system joins, custom attribution modeling, and reporting that is not constrained by individual platform limits.

9. Build dashboards around decisions, not vanity metrics Each dashboard should answer a specific question tied to a decision. “Leads by channel this month” is a vanity metric. “MQL-to-SQL conversion rate by channel with 90-day trend” is a decision metric.


SaaS Analytics Maturity Model

Level Name What it means
1 Basic tracking Pageviews and session counts. GA4 installed. No event taxonomy. UTMs inconsistent.
2 Structured events Named events with consistent properties. UTM governance in place. Form submissions tracked with campaign context.
3 CRM-connected lifecycle Website events joined to CRM contact IDs. Lifecycle stage transitions recorded. MQL and SQL events flowing.
4 Revenue attribution Billing events connected to campaign and content history. CAC calculable by channel. Qualified conversions sent to ad platforms.
5 Predictive or automated optimization Attribution modeling in warehouse. Ad platform bidding on downstream revenue signals. Product usage data feeding lead scoring and expansion identification.

Most growth teams should target Level 3 before investing heavily in Level 4 tooling.


What To Fix First

Do not try to fix every gap simultaneously. Instrumentation debt accumulates in layers, and fixing the wrong layer first produces data that is still unreliable because an upstream dependency is broken.

The right starting point is the intersection of three factors:

  • The most frequently repeated business question your team cannot answer cleanly
  • The highest-value conversion path in your current funnel
  • The most visible and persistent reporting disagreement between teams

Fix the structural problem that blocks that specific question, that specific path, and that specific disagreement. Everything else can wait.

Prioritization Framework

Problem First diagnostic question First practical fix
Attribution disagreements between marketing and sales Do MQL and SQL records contain originating UTM and source data? Connect form submissions to CRM with full UTM passthrough
Ad platforms optimizing for low-quality leads Are MQL or SQL events sent back to Google Ads and LinkedIn? Configure enhanced conversions with CRM lifecycle events
No reliable CAC by channel Is billing data joined to CRM contact and source fields? Export CRM and billing to warehouse; join on contact ID
Lifecycle conversion rates inconsistent across reports Are lifecycle stage definitions written down and criteria-based? Document stage definitions; automate stage transitions on criteria
Campaign content influence invisible Are resource and content engagement events tracked with contact identity? Instrument resource_view and cta_click events with session and CRM ID
Dashboard distrust across teams Do different tools report different numbers for the same metric? Audit metric definitions; create a shared metrics glossary

Before adding another analytics tool, map where context is lost between acquisition, website behavior, forms, CRM lifecycle, sales pipeline, and revenue. Then prioritize the first integration that improves decision quality — not data volume.

The goal is not more data. The goal is fewer unanswerable questions at the moments that matter.

Growth System Audit

Audit your growth system

Map the points where analytics, automation, CRM, and decision-making create avoidable friction.

Start a Conversation More in Notes