Skip to content

Repository files navigation

GrowthLoop

GrowthLoop 是一个面向产品与增长团队的增长活动工作台:创建活动、生成可归因链接与二维码、追踪访问和转化、运营邀请裂变,并用 OpenAI-compatible 模型辅助产出营销素材。仓库默认可以零配置体验 Demo Mode,并提供接入 Supabase 所需的数据库与事件采集基础设施。

Deploy with Vercel

当前状态:完整可交互的 Demo 产品。管理台、公开落地页、报名成功页、邀请排行榜、短链跳转、归因看板、AI 批量素材与复盘回退、公开事件 Route 均可运行;生产环境仍需接入管理台 Supabase adapter 与用户鉴权。

功能

  • 活动管理:活动状态、时间窗口、目标地址与奖励配置
  • 链接归因:短码、UTM 参数、点击量、二维码与分享入口
  • 漏斗分析:访问、点击、注册、转化趋势和渠道拆分
  • 邀请裂变:参与者、邀请码、邀请关系、排行榜与一次性奖励
  • 素材工作台:服务端 AI 批量生成文案、收藏、导出并创建追踪链接
  • AI 增长复盘:基于当前归因周期和渠道指标生成结论与下一步实验
  • Demo Mode:无需数据库或 AI Key 即可浏览与操作示例数据
  • Supabase 基础设施:PostgreSQL migration、RLS、受控埋点 RPC、可重复 seed

架构

Browser / landing page
  ├── Next.js 16 App Router UI
  ├── DemoStore(本地、确定性演示数据)
  └── Supabase client(生产模式)
        ├── PostgREST + Row Level Security
        ├── track_event RPC(匿名、受控埋点)
        └── PostgreSQL(归因 / 转化 / 邀请奖励)

Next.js server route
  └── OpenAI-compatible /chat/completions(API Key 仅服务端)
  • src/app:页面、布局、Route Handlers
  • src/components:工作台与复用 UI
  • src/lib:领域规则、Demo store、校验和 AI 服务端适配
  • supabase/migrations:数据库 schema、索引、触发器、函数、RLS
  • supabase/seed.sql:确定性演示数据(240 条事件)
  • docs/DATA_MODEL.md:数据关系、安全边界与归因规则

数据模型

用途 关键约束
campaigns 活动配置与所有权 唯一 slug、状态/时间窗口校验
tracking_links 分享链接与 UTM 全局唯一 code、同活动参与者 FK
visitors 活动内匿名访客 (campaign_id, anonymous_id) 唯一
events 行为事件流 可选 idempotency key、按活动/时间索引
conversions 注册/购买等结果 外部 ID 幂等、固定 first/last touch
participants 邀请活动参与者 每活动访客/邮箱/邀请码唯一
referrals 邀请人与被邀请人关系 防自邀、每访客只归属一次、奖励一次
creative_assets 生成或上传的素材 类型/状态校验、URL/路径/内容至少一项

完整关系与 RLS 说明见 docs/DATA_MODEL.md

本地启动

要求 Node.js 20+、pnpm 9+。如需本地数据库,还需要 Docker 与 Supabase CLI。

pnpm install
cp .env.example .env.local
pnpm dev

打开 http://localhost:3000。首次体验建议保留 Demo Mode;本地 Supabase 启动后再替换 .env.local 的 URL 和 key。

环境变量

变量 暴露范围 必需 说明
NEXT_PUBLIC_SUPABASE_URL 浏览器 生产数据模式 Supabase Project URL;未配置时 UI 使用 Demo 数据
NEXT_PUBLIC_SUPABASE_ANON_KEY 浏览器 生产数据模式 可公开 anon/publishable key,权限由 RLS 控制
SUPABASE_SERVICE_ROLE_KEY 服务端 管理写入/奖励任务 绕过 RLS,绝不能暴露给浏览器
NEXT_PUBLIC_APP_URL 浏览器/元数据 推荐 应用规范地址,默认 http://localhost:3000
NEXT_PUBLIC_SITE_URL 浏览器 可选 兼容部署/分享链接的站点地址;建议与 APP URL 相同
NEXT_PUBLIC_DEMO_MODE 浏览器 可选 true 强制演示模式;当前 UI 也会在缺少 Supabase URL 时自动演示
ADMIN_ACCESS_KEY 服务端 生产 adapter 可选 轻量管理入口密钥;Demo Mode 不需要,正式产品建议替换为完整鉴权
OPENAI_API_KEY 服务端 AI 生成时 OpenAI 或兼容服务的 API key
OPENAI_BASE_URL 服务端 可选 默认 https://api.openai.com/v1
OPENAI_MODEL 服务端 可选 /chat/completions 可用的模型名

不要将 service-role 或 AI key 添加 NEXT_PUBLIC_ 前缀。修改公开环境变量后需重新构建。

Supabase 初始化

# 安装 CLI 后启动本地服务,应用 migration 并执行 seed
supabase start
supabase db reset

# 获取本地 URL / anon key / service-role key
supabase status

supabase db reset 会重建本地数据库并执行 migrationseed。seed 与浏览器 Demo 的“AI Coding 线下分享会”示例保持一致,可重复运行,包含 1 个活动、30 个访客、20 个参与者、5 条链接、240 条事件、14 次转化、15 条邀请和 8 份素材。

连接远端项目:

supabase login
supabase link --project-ref <project-ref>
supabase db push

不要对生产库运行 db reset 或 demo seed。先创建 Supabase Auth 用户,再将真实活动的 owner_id 指向该用户。

Demo Mode

Demo Mode 使用 src/lib/seed.ts、领域 store 和浏览器 localStorage,不依赖网络,适合产品评审与界面开发。设置 NEXT_PUBLIC_DEMO_MODE=true,或不设置 NEXT_PUBLIC_SUPABASE_URL 即可启用。数据会在同一浏览器中保留,也可以在设置页一键重置;它不代表服务端持久化、并发、鉴权或生产级性能。

Supabase 的 seed.sql 是另一套数据库演示数据,用于验证 SQL、看板查询和 RLS,不等同于浏览器内存 Demo。

OpenAI-compatible 配置

服务端适配器调用标准 POST {OPENAI_BASE_URL}/chat/completions,因此可以连接 OpenAI 或支持该协议的网关/自托管服务。配置服务端 key、base URL 和模型;不要从客户端直接请求供应商。

OPENAI_API_KEY=...
OPENAI_BASE_URL=https://api.openai.com/v1
OPENAI_MODEL=gpt-5-mini

兼容服务需要支持 JSON 响应格式。生产环境应设置超时、速率限制、输入长度限制、内容安全策略与成本告警;AI 不可用时保留人工编辑/确定性模板回退。

埋点与归因

匿名客户端不直接写表,而调用 track_event RPC:

await supabase.rpc("track_event", {
  p_campaign_slug: "ai-coding-meetup",
  p_anonymous_id: anonymousId,
  p_event_name: "link_click",
  p_properties: { placement: "hero" },
  p_tracking_code: "share-demo-1",
  p_session_id: sessionId,
  p_page_url: location.href,
  p_referrer_url: document.referrer || null,
  p_idempotency_key: crypto.randomUUID(),
});
  • anonymous_id 应保存在第一方 cookie/localStorage;不要使用指纹技术绕过用户同意。
  • 每个业务事件使用稳定且唯一的 idempotency_key,重试不会重复入库。
  • visitors.first_touch 保留 occurred_at 最早的触点(支持晚到事件),更新的事件才推进 last_touch
  • 转化发生时把当时的 first/last tracking link 固化到 conversions,避免后续访问改写历史归因。
  • 入库前清理 URL 查询参数和 properties 中的密码、token、邮箱等敏感信息。

测试与验证

pnpm lint
pnpm exec tsc --noEmit
pnpm exec vitest run
pnpm build

# 安装 Docker + Supabase CLI 后验证完整数据库重建
supabase db reset

数据库验收重点:匿名直写被拒绝、跨 owner 数据不可见、重复事件只生成一行、自邀/重复邀请失败、同一邀请不能二次奖励,以及 first touch 不被晚到事件覆盖。

部署到 Vercel

  1. 在 Supabase 创建生产项目并执行 supabase db push
  2. 把仓库导入 Vercel,使用 pnpm 与默认 Next.js 构建命令。
  3. 按上表配置 Preview/Production 环境变量,生产设 NEXT_PUBLIC_DEMO_MODE=false
  4. 在 Supabase Auth 更新 Site URL 与 Redirect URLs;在 Vercel 配置域名。
  5. 先验证 Preview,再提升同一 commit 到 Production。

上线前逐项完成 DEPLOYMENT_CHECKLIST.md

产品截图

以下截图由项目本地 Demo Mode 的真实页面生成,便于在导入 Vercel 或接入 Supabase 前快速核对产品形态。

GrowthLoop 管理仪表盘

AI Coding 线下分享会公开活动页

已知限制

  • 管理台当前使用 Demo adapter;数据库 schema、RLS 与公开事件 Route/RPC 已就绪,但管理数据持久化和用户鉴权仍需接线。
  • 浏览器 Demo 数据仅保存在当前浏览器,无法跨设备同步,也不适合多用户并发。
  • 公共 RPC 不自带边缘限流、验证码或机器人检测;上线必须在入口补充防滥用措施。
  • 报表以应用查询为主,超大事件量需要聚合表、物化视图、分区和保留策略。
  • 素材表只保存 URL/路径/文本与元数据;文件上传、转码、内容审核和对象存储策略未包含。
  • Last-touch 采用最近接收的有效事件语义;跨设备身份合并与隐私同意管理尚未实现。

后续方向

  • 完成 Supabase repository adapter、Auth 与端到端 Route Handler
  • 增加服务端事件签名、限流、bot/fraud scoring 和 webhook 重放队列
  • 增加实时漏斗、队列化聚合、cohort/LTV 与多触点归因模型
  • 增加奖励审批、预算上限、退款冲正和审计日志
  • 接入 Supabase Storage、素材版本、内容审核与多模型路由
  • 增加 Playwright E2E、SQL/RLS 集成测试、可访问性与可观测性基线

License

尚未指定许可证;对外分发前请补充 LICENSE

About

一体化增长运营工作台:活动搭建、UTM 短链、归因转化、邀请裂变与 AI 营销素材。

Topics

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages