Revenue analytics for SaaS teams

Turn product signals into revenue decisions.

Northstar connects product usage, billing, and marketing data so your team can find churn risks, identify expansion opportunities, and improve conversion across the entire lifecycle.

See how it works
✓ SOC 2 Type II ✓ No credit card required ✓ SSO included

One workspace for product, revenue, and retention signals.

Stop stitching together spreadsheets, billing exports, product analytics, and CRM notes. Northstar creates a single source of truth for lifecycle teams.

📊

Unified revenue view

Join Stripe, product events, CRM records, and marketing touchpoints into one customer timeline.

🧭

Lifecycle funnels

Track trial → activation → paid conversion → expansion → retention with cohort-based insights.

⚠️

Churn alerts

Identify risky accounts before renewal with usage drops, support signals, and billing changes.

🔐

Governance & security

Role-based access, audit logs, SSO, and data residency controls built for enterprise teams.

Simple pricing that scales with your team.

Start free. Upgrade when you need deeper segmentation, lifecycle playbooks, and enterprise controls.

Starter

$49 / month
  • ✓ Up to 3 connected sources
  • ✓ Basic funnel dashboards
  • ✓ 30-day retention
  • ✓ Email alerts
  • ✓ Community support

Enterprise

Custom
  • ✓ SSO / SAML
  • ✓ Advanced data residency
  • ✓ Custom lifecycle playbooks
  • ✓ Dedicated success manager
  • ✓ SLA & security review
All plans include HTTPS, encrypted storage, and GDPR-ready workflows. Annual billing available.

Lifecycle teams use Northstar to close the loop between product and revenue.

Trusted by product, growth, and customer success teams working with subscription growth.

“Northstar gave us a shared view of usage and billing. We caught expansion opportunities that were invisible in our CRM.”

AM
Amelia Martinez VP Growth, Loopstack

“Our customer success team now has one dashboard for renewal risk, product usage, and support signals. It changed how we prioritize accounts.”

DK
Daniel Kim Head of CS, Cadence AI

“We reduced churn investigation time from days to minutes. The cohort and funnel reporting is unusually practical.”

SR
Sofia Reyes Director of Product, RelayOps

Frequently asked questions

Common questions from buyers evaluating analytics and lifecycle platforms.

How long does setup take?

Most teams connect their first billing and product data sources in under one hour. Advanced identity resolution and custom lifecycle events may take a few days.

Does Northstar integrate with our data warehouse?

Yes. Growth and Enterprise plans support warehouse syncs and reverse ETL patterns so Northstar can complement tools you already use.

Can we invite customer success and product teams together?

Yes. Role-based access lets each team see the metrics they need while keeping sensitive financial or customer data restricted.

What counts as a conversion in the trial?

You can define conversions based on trial signup, activation, paid conversion, expansion, renewal, or custom lifecycle milestones.

Is Northstar suitable for enterprise security reviews?

Enterprise includes SSO, audit logs, data residency options, security documentation, and support for procurement/security review workflows.

Ready to connect product usage to revenue outcomes?

Start a 14-day trial or book a guided walkthrough with our team.

View pricing
``` --- ## File 2: `modelname_analytics_dashboard.html` ```html Northstar Analytics Dashboard

Northstar Analytics Dashboard

Simulates querying the landing page analytics schema: visitors, page views, and conversions.

Mock SQL analytics environment
Visitors
0
Unique visitors in selected range
Email signups
0
Trial signup conversions
Demo requests
0
Sales-assisted conversions
Purchases
0
Paid conversions
Conversion rate
0%
Any conversion / visitors

Unique visitors over time

Traffic source breakdown

Conversion funnel

Top converting sections

Section Views Conversions Conversion rate
Schema and SQL queries used by this dashboard
-- Core analytics tables
CREATE TABLE visitors (
  visitor_id BIGSERIAL PRIMARY KEY,
  first_seen TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  last_seen TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TABLE sessions (
  session_id UUID PRIMARY KEY,
  visitor_id BIGINT NOT NULL REFERENCES visitors(visitor_id),
  source VARCHAR(80),
  medium VARCHAR(80),
  campaign VARCHAR(120),
  device_type VARCHAR(20),
  started_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

CREATE TABLE sections (
  section_id SERIAL PRIMARY KEY,
  page_url VARCHAR(500) NOT NULL,
  section_name VARCHAR(120) NOT NULL
);

CREATE TABLE page_views (
  view_id BIGSERIAL PRIMARY KEY,
  session_id UUID NOT NULL REFERENCES sessions(session_id),
  visitor_id BIGINT NOT NULL REFERENCES visitors(visitor_id),
  section_id INT NOT NULL REFERENCES sections(section_id),
  entered_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
  exited_at TIMESTAMPTZ,
  time_spent_ms INT
);

CREATE TABLE conversions (
  conversion_id BIGSERIAL PRIMARY KEY,
  session_id UUID NOT NULL REFERENCES sessions(session_id),
  visitor_id BIGINT NOT NULL REFERENCES visitors(visitor_id),
  conversion_type VARCHAR(50) NOT NULL,
  value_cents INT DEFAULT 0,
  status VARCHAR(30) NOT NULL DEFAULT 'new',
  attributed_section_id INT REFERENCES sections(section_id),
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

-- Daily visitor trend
SELECT
  date_trunc('day', s.started_at) AS day,
  COUNT(DISTINCT s.visitor_id) AS unique_visitors
FROM sessions s
WHERE s.started_at >= :start_date
  AND (:source = 'all' OR s.source = :source)
GROUP BY 1
ORDER BY 1;

-- Conversion funnel
SELECT
  COUNT(DISTINCT v.visitor_id) AS visitors,
  COUNT(DISTINCT CASE WHEN c.conversion_type = 'email_signup' THEN c.visitor_id END) AS email_signups,
  COUNT(DISTINCT CASE WHEN c.conversion_type = 'demo_request' THEN c.visitor_id END) AS demo_requests,
  COUNT(DISTINCT CASE WHEN c.conversion_type = 'purchase' THEN c.visitor_id END) AS purchases
FROM visitors v
LEFT JOIN conversions c ON c.visitor_id = v.visitor_id
WHERE v.first_seen >= :start_date;

-- Traffic source breakdown
SELECT
  s.source,
  COUNT(DISTINCT s.visitor_id) AS visitors
FROM sessions s
WHERE s.started_at >= :start_date
GROUP BY s.source
ORDER BY visitors DESC;

-- Top converting sections
SELECT
  sec.section_name,
  COUNT(pv.view_id) AS views,
  COUNT(c.conversion_id) AS conversions,
  CASE
    WHEN COUNT(pv.view_id) = 0 THEN 0
    ELSE COUNT(c.conversion_id)::numeric / NULLIF(COUNT(pv.view_id), 0)
  END AS conversion_rate
FROM sections sec
LEFT JOIN page_views pv ON pv.section_id = sec.section_id
LEFT JOIN conversions c ON c.attributed_section_id = sec.section_id
LEFT JOIN sessions s ON s.session_id = pv.session_id
WHERE pv.entered_at >= :start_date
GROUP BY sec.section_name
ORDER BY conversions DESC, conversion_rate DESC;