📊 产品分析:事件追踪 / 漏斗 / 留存,PostHog / Mixpanel / Umami

如果你不知道用户在做什么,你就不知道该做什么——数据驱动的产品决策从分析开始
📋 目录

为什么需要产品分析

三个关键问题驱动产品分析:

🎯
用户在做什么?

功能使用频率、用户路径、行为模式

📉
用户在哪里流失?

注册漏斗、付费转化、功能采用

🔄
用户会回来吗?

日/周/月留存、流失预警、粘性指标

没有分析的 SaaS 就像蒙着眼开车——你可能侥幸到达目的地,但更可能撞墙。

核心概念

1. 事件(Events)

事件是分析的原子单位。用户做的每件有意义的事都应该是一个事件。

📋 SaaS 必追踪事件清单
获客类
  • page_view — 页面访问
  • signup_started — 开始注册
  • signup_completed — 注册完成
  • invite_sent — 发出邀请
激活类
  • onboarding_step_completed — 引导步骤
  • first_project_created — 创建首个项目
  • first_data_imported — 首次导入数据
  • integration_connected — 连接集成
付费类
  • pricing_page_viewed — 查看定价
  • checkout_started — 开始结账
  • subscription_created — 订阅成功
  • subscription_cancelled — 取消订阅
参与类
  • feature_used — 功能使用
  • export_created — 导出数据
  • report_shared — 分享报告
  • collaborator_added — 添加协作者

2. 属性(Properties)

事件和用户都可以有属性,让分析更精细。

// 事件属性
{
  event: 'feature_used',
  properties: {
    feature_name: 'export_csv',
    plan: 'pro',
    export_size_mb: 12.5,
    platform: 'web'
  }
}

// 用户属性
{
  user_id: 'usr_123',
  properties: {
    plan: 'pro',
    signup_date: '2026-01-15',
    company_size: '11-50',
    industry: 'SaaS',
    mrr: 4900
  }
}

3. 关键指标

指标 公式 意义 健康范围
DAU/MAU 日活 / 月活 用户粘性 20%+ 优秀
注册→激活率 完成核心动作 / 注册数 产品体验 40%+ 良好
付费转化率 付费用户 / 活跃用户 价值感知 3-8%
月流失率 当月取消 / 月初订阅数 产品留存 <5%(B2C)<2%(B2B)
NRR 留存收入 + 扩展 - 流失 - 降级 增长健康度 >100% 优秀

分析工具对比

维度 PostHog Mixpanel Umami Amplitude Google Analytics
类型 产品分析全平台 产品分析 网站分析 产品分析 网站分析
开源 ✅ 是 ❌ 否 ✅ 是 ❌ 否 ❌ 否
自托管 ✅ 是 ❌ 否 ✅ 是 ❌ 否 ❌ 否
免费额度 1M 事件/月 1M 事件/月 100K 页面浏览/月 50K MTUs/月 无限(采样)
付费起步 $0.00031/事件 $0.28/1K 事件 $9/月(50K) 联系销售 GA4 免费
Session Replay ✅ 内置 ✅ 内置 ❌ 无 ✅ 内置 ❌ 无
Feature Flags ✅ 内置 ❌ 无 ❌ 无 ✅ 有 ❌ 无
A/B 测试 ✅ 内置 ❌ 无 ❌ 无 ✅ 有 ✅ Optimize
GDPR 合规 ✅ 自托管最优 ✅ 隐私优先 ⚠️ 有争议
数据归属 你自己的数据库 Mixpanel 云 你自己的数据库 Amplitude 云 Google 云
适合 SaaS 首选 成熟团队 隐私优先网站 企业级 流量分析

数据来源:PostHog Pricing (2026-05)、Mixpanel Pricing (2026-05)、Amplitude Pricing (2026-05)、Umami 官网 (2026-05)。

💡 推荐组合:

PostHog 详解

PostHog 是一个开源的产品分析平台,提供了从事件追踪到 Session Replay、Feature Flags、A/B 测试的全套工具。由 Y Combinator 孵化,截至写作时有 25,000+ GitHub Stars。

PostHog 核心产品

📈 Product Analytics

事件分析、漏斗、留存、路径分析、生命周期

免费 1M 事件/月

🎬 Session Replay

用户操作录像,看真实用户怎么用你的产品

免费 5K 录制/月

🚩 Feature Flags

功能开关、渐进式发布、用户分群

免费 1M 请求/月

🧪 Experiments

A/B 测试、统计显著性计算

与 Feature Flags 一起计费

🐛 Error Tracking

错误监控、堆栈追踪、异常告警

免费 100K 异常/月

🗄️ Data Warehouse

整合多数据源、SQL 查询

免费 1M 行/月

数据来源:PostHog Pricing 页面 (2026-05)。免费额度每月重置。

PostHog 集成代码

// 安装
npm install posthog-js

// Next.js 初始化 (app/layout.tsx 或 pages/_app.tsx)
import posthog from 'posthog-js'
import { PostHogProvider } from 'posthog-js/react'

if (typeof window !== 'undefined') {
  posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
    api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST || 'https://us.i.posthog.com',
    person_profiles: 'identified_only', // GDPR 友好
  })
}

// 追踪页面浏览(自动)
posthog.capture('$pageview')

// 追踪自定义事件
posthog.capture('project_created', {
  project_type: 'saas',
  template_used: true,
  team_size: 5
})

// 识别用户
posthog.identify('user_123', {
  email: 'user@example.com',
  plan: 'pro',
  signup_date: '2026-01-15'
})

// Feature Flag 检查
const isNewDashboard = posthog.isFeatureEnabled('new-dashboard')
if (isNewDashboard) {
  // 展示新版本
}

// A/B 测试
const variant = posthog.getFeatureFlag('pricing-redesign')
// variant = 'control' | 'variant-a' | 'variant-b'

PostHog 自托管

# Docker Compose 部署
# https://github.com/PostHog/self-host

git clone https://github.com/PostHog/self-host.git
cd self-host
docker compose up -d

# 自托管的好处:
# 1. 数据完全自主——不存在第三方服务器
# 2. 无 GDPR 数据处理协议需求
# 3. 无事件量限制(只受你的服务器资源)
# 4. 可与内部数据仓库集成

# 最低要求:
# - 4 CPU / 8GB RAM / 50GB SSD
# - 推荐:8 CPU / 16GB RAM / 200GB SSD

Umami 详解

Umami 是一个轻量、开源、隐私友好的网站分析工具。如果你只需要"有多少人来、从哪来、看了什么",Umami 就够了。

Umami vs Google Analytics

维度 Umami Google Analytics 4
隐私 ✅ 不设 Cookie、不追踪个人 ❌ 追踪跨站、设 Cookie
Cookie Banner ✅ 不需要(符合 GDPR) ❌ 需要用户同意
脚本大小 ~2KB ~45KB+
数据归属 你的数据库 Google
界面 简洁、核心指标 复杂、功能多但学习曲线陡
成本 自托管免费 / 云版 $9/月起 免费
// Umami 集成(极简)
// 在 HTML head 中添加:
<script async src="https://analytics.yourapp.com/script.js"
  data-website-id="your-website-id"></script>

// 追踪自定义事件
umami.track('signup_completed', { plan: 'pro' })

// 追踪页面浏览(SPA)
umami.track('/dashboard')

// 自托管 Docker
docker run -d --name umami \
  -p 3000:3000 \
  -e DATABASE_URL=postgresql://user:pass@db:5432/umami \
  ghcr.io/umami-software/umami:postgresql-latest

集成实现

分析事件架构

用户操作 前端 SDK 事件队列 批量发送 分析平台

统一事件追踪层

// lib/analytics.ts — 统一分析接口
interface AnalyticsEvent {
  name: string;
  properties?: Record<string, any>;
  userId?: string;
}

class Analytics {
  private posthog: typeof import('posthog-js');
  private umami: any;

  init() {
    // PostHog for product analytics
    if (typeof window !== 'undefined') {
      posthog.init(process.env.NEXT_PUBLIC_POSTHOG_KEY!, {
        api_host: process.env.NEXT_PUBLIC_POSTHOG_HOST,
        person_profiles: 'identified_only',
        capture_pageview: false, // 手动控制
      });
    }
  }

  track(event: AnalyticsEvent) {
    // PostHog
    posthog?.capture(event.name, event.properties);

    // Umami(仅关键事件)
    if (['signup_completed', 'subscription_created', 'page_view'].includes(event.name)) {
      umami?.track(event.name, event.properties);
    }

    // 也可以发送到自己的后端
    if (process.env.NODE_ENV === 'development') {
      console.log('[Analytics]', event);
    }
  }

  identify(userId: string, traits: Record<string, any>) {
    posthog?.identify(userId, traits);
  }

  page(path: string) {
    posthog?.capture('$pageview', { $current_url: path });
    umami?.track(path);
  }

  group(groupId: string, traits: Record<string, any>) {
    posthog?.group('company', groupId, traits);
  }
}

export const analytics = new Analytics();

// 使用
analytics.track({
  name: 'project_created',
  properties: {
    project_type: 'saas',
    template: 'nextjs',
    team_size: 3
  }
});

服务端事件追踪

// 后端事件追踪(API 路由中)
import PostHog from 'posthog-node'

const posthog = new PostHog(process.env.POSTHOG_API_KEY!, {
  host: process.env.POSTHOG_HOST || 'https://us.i.posthog.com',
})

// 在 API 路由中追踪
app.post('/api/projects', async (req, res) => {
  const project = await db.projects.create(req.body)

  // 追踪事件
  posthog.capture({
    distinctId: req.user.id,
    event: 'project_created',
    properties: {
      project_id: project.id,
      project_type: project.type,
      $set: {
        last_project_created_at: new Date().toISOString(),
      }
    }
  })

  res.json(project)
})

// 优雅关闭
process.on('SIGTERM', () => {
  posthog.shutdown()
})

漏斗分析

漏斗是 SaaS 最重要的分析工具——它告诉你用户在哪一步流失。

核心漏斗

🔄 SaaS 全链路漏斗
████████████████████████ 访问网站 100%
████████████████████░░░ 注册开始 60%
██████████████░░░░░░░░░ 注册完成 40%
████████████░░░░░░░░░░░ 核心动作 25%
████████░░░░░░░░░░░░░░░ 试用付费功能 15%
████░░░░░░░░░░░░░░░░░░░ 付费转化 8%
███░░░░░░░░░░░░░░░░░░░░ 月留存 5%

漏斗优化策略

漏斗步骤 常见流失原因 优化方法
访问→注册 价值不清晰、表单太长 精简注册流程(SSO/邮箱一步注册)、强化价值主张
注册→激活 不会用、没引导 Onboarding 引导、模板/示例数据、快速到达 Aha Moment
激活→付费 看不到价值、定价不匹配 展示 ROI、免费试用、限时优惠
付费→续费 使用频率低、有替代品 使用追踪、功能深度引导、成功经理
// PostHog 漏斗 API 查询
// 查找注册→首次使用的转化时间
const funnel = await posthog.funnels.calculate({
  funnelSteps: [
    { event: 'signup_completed' },
    { event: 'first_project_created' },
  ],
  dateRange: '30d',
  breakdownBy: '$browser', // 按浏览器分组找问题
})

留存分析

留存是 SaaS 的生命线。高留存 = 可持续增长。

留存曲线类型

📈 三种留存曲线

提升留存的方法

🎯 短期(D1/D7)
  • 优化 Onboarding——让用户快速到达 Aha Moment
  • 邮件/推送激活——D1 欢迎、D3 提示、D7 引导
  • 示例数据/模板——零配置即刻体验
  • 进度指示——让用户看到完成的距离
🔄 长期(D30/D90)
  • 习惯养成——每日/每周触点(邮件报告、提醒)
  • 网络效应——协作功能让用户互相留存
  • 数据锁定——用户数据越多越离不开
  • 功能深化——引导用户发现更多价值
// 计算同期群留存(Cohort Retention)
// SQL 查询示例
WITH cohorts AS (
  SELECT
    user_id,
    DATE_TRUNC('month', created_at) AS cohort_month
  FROM users
),
activity AS (
  SELECT DISTINCT
    user_id,
    DATE_TRUNC('month', active_date) AS active_month
  FROM user_activity
)
SELECT
  c.cohort_month,
  COUNT(DISTINCT c.user_id) AS cohort_size,
  a.active_month,
  COUNT(DISTINCT a.user_id) AS retained,
  ROUND(COUNT(DISTINCT a.user_id)::numeric /
        NULLIF(COUNT(DISTINCT c.user_id), 0) * 100, 1) AS retention_pct
FROM cohorts c
LEFT JOIN activity a ON c.user_id = a.user_id
  AND a.active_month >= c.cohort_month
GROUP BY c.cohort_month, a.active_month
ORDER BY c.cohort_month, a.active_month;

隐私与合规

产品分析涉及用户行为数据,必须遵守隐私法规。

GDPR 合规要点

要求 做法 工具支持
合法基础 用户同意 or 合法利益 Umami 不需同意;PostHog 自托管可选
数据最小化 只收集必要数据 PostHog person_profiles: 'identified_only'
数据可删除 用户可要求删除其数据 PostHog API: posthog.deletePerson()
数据处理协议 与第三方签署 DPA PostHog 云版有 DPA;自托管不需要
Cookie 同意 追踪 Cookie 需用户同意 Umami 不用 Cookie;PostHog 可配置
// GDPR 友好的分析配置
// 1. PostHog:仅识别用户时建立个人档案
posthog.init(API_KEY, {
  person_profiles: 'identified_only', // 匿名用户不创建个人档案
  capture_pageview: true,
  persistence: 'localStorage', // 不用 Cookie
})

// 2. 用户请求删除数据
app.post('/api/privacy/delete-my-data', requireAuth, async (req, res) => {
  const userId = req.user.id;

  // PostHog 删除
  await posthogServer.deletePerson(userId);

  // Umami 删除(如使用)
  await db.analyticsEvents.deleteByUser(userId);

  // 你的数据库
  await db.users.anonymize(userId);

  res.json({ message: 'Data deletion request processed' });
});

// 3. Cookie Banner 集成
// 如果需要 Cookie 同意才启用分析
if (cookieConsent === 'granted') {
  analytics.init();
} else {
  // 只用不需要 Cookie 的工具(如 Umami)
  umamiInit();
}

高级话题

Product-Led Growth (PLG) 分析框架

🔍 获客
获客渠道 CAC
⚡ 激活
Aha! Moment
🔄 留存
习惯养成
💰 变现
LTV / NRR
📣 推荐
NPS / 病毒系数

寻找 Aha Moment

Aha Moment 是用户"顿悟"产品价值的那一瞬间。找到它是 PLG 的关键。

// PostHog:分析哪些行为与留存最相关
// 使用 Correlation Analysis
// 对比 D7 留存用户 vs 流失用户的行为差异

// 常见 Aha Moment 示例
const ahaMoments = {
  slack: '发送 2000 条消息的团队',
  dropbox: '在 2 个设备上安装',
  zoom: '举办第一次视频会议',
  notion: '创建 5 个页面',
  figma: '邀请第一个协作者',
}

// 你的 Aha Moment 需要通过数据发现
// 方法:
// 1. 找到 D30 留存用户
// 2. 回溯他们在 D1-D7 做了什么
// 3. 找出留存用户比流失用户更常做的行为
// 4. 那个行为很可能就是 Aha Moment

实时仪表盘

// 构建实时关键指标仪表盘
// 后端 API
app.get('/api/analytics/dashboard', async (req, res) => {
  const today = new Date();

  const metrics = {
    // 实时指标
    activeUsersNow: await getActiveUsers(today, '1h'),
    pageViewsToday: await getPageViews(today),

    // 趋势指标
    signupsThisWeek: await getSignups('7d'),
    mrr: await getMRR(),
    churnRate: await getChurnRate('30d'),

    // 漏斗
    signupToActivation: await getFunnelRate(
      ['signup_completed', 'first_project_created'], '7d'
    ),
    activationToPaid: await getFunnelRate(
      ['first_project_created', 'subscription_created'], '30d'
    ),
  };

  res.json(metrics);
});

事件追踪最佳实践

📋 追踪规范

🔗 相关章节