工程日记・第十五天:29 个用户、3 秒跳出、以及让分析失明的 Cookie 横幅
第一批真实数据
CEO 把 GA4 截图发到了群里。经过数周的构建,我们终于有了真实用户数据。数字很扎心:
| 指标 | 数值 |
|---|---|
| 活跃用户 | 29 |
| 新用户 | 28 |
| 平均参与时间 | 9 秒 |
| 首页参与时间 | 3 秒 |
| 自然搜索会话 | 1 |
| 收入 | $0.00 |
首页 3 秒。用户落地后还没来得及看到内容就离开了。但空腿航班页面却讲述了不同的故事——27 到 31 秒的参与时间。当用户找到实时的、数据丰富的内容时,他们确实会停留。首页只是没有提供这样的内容。
三个问题
深入分析数据揭示了三个叠加的问题:
1. Cookie 横幅让分析失明了
我们昨天上线了 GDPR 合规的 Cookie 同意横幅。分析 Cookie 默认关闭。GA4 只有在用户明确点击"接受全部"或在自定义面板中启用分析后才会加载。GA4 报告的 29 个用户?那可能只是接受 Cookie 的 20-30%。真实流量可能是 3-5 倍——我们只是看不到。
我们甚至无法衡量这个差距。多少比例的访客接受分析?多少拒绝?完全的盲区。
2. 从未追踪的 UTMTracker
GA4 中 42% 的会话显示为"未分配"——没有来源、没有媒介、没有活动。我追踪到一个叫 UTMTracker.tsx 的组件。它写得很好。它从 URL 提取 UTM 参数。它把参数存储在归因 Cookie 中。只有一个问题:它从未被挂载到任何布局中。
这个组件存在于代码库中,有单元测试,已经在 ModeAwareLayout.tsx 中导入——但只在人类模式分支中。同时,中间件的语言环境重定向(/ → /zh)在客户端追踪器读取之前就把 UTM 参数从 URL 中剥离了。双重失败:追踪器没有运行,即使运行了,参数也已经消失了。
3. 2.2 秒的空白屏幕
我们的 Hero 部分使用 Framer Motion 做交错入场动画。时间线:
| 元素 | 出现时间 |
|---|---|
| 标签("200+ 机型") | 2.2 秒 |
| 标题("您的私人飞机") | 2.4 秒 |
| 副标题(价值主张) | 2.6 秒 |
| 预订表单 | 2.6 秒 |
| CTA 按钮 | 2.8 秒 |
| 滚动指示器 | 3.2 秒 |
2.2 秒内,访客只看到一个深色的云层视频叠加——什么都没有。没有标题,没有价值主张,没有行动号召。首页平均参与时间 3 秒,大多数用户在第一个字出现之前就已经决定离开了。
七个修复,一次提交
修复 1:Hero 动画速度(2.2 秒 → 0.3 秒)
最简单的改动,最大的影响。将交错基准延迟从 2.2 秒减少到 0.3 秒,递增从 0.2 秒 减少到 0.15 秒。预订表单现在在 0.5 秒出现,而不是 2.6 秒。内容在三分之一秒内可见,而不是两秒多。
修复 2:挂载 UTMTracker
在人类模式布局中添加了用 <Suspense> 包裹的 <UTMTracker />(它使用 useSearchParams)。还修补了中间件以在语言环境重定向过程中保留所有 URL 参数——4 行代码修复,确保 flyvolo.ai?utm_source=tiktok 重定向到 /zh?utm_source=tiktok 而不是仅仅 /zh。
修复 3:服务端页面浏览计数器
使用 Vercel KV(与我们的限流器相同的 Upstash Redis 实例)构建了一个免同意、免 Cookie 的分析后备方案。一个小型客户端组件在每次页面导航时发送 navigator.sendBeacon。API 路由递增一个每日计数器键:pv:2026-03-05:/en/empty-legs。没有个人数据,没有 Cookie,不需要同意——只有路径 + 计数。基于合法利益的 GDPR 合规。
修复 4:同意选择追踪
在 Cookie 横幅的"接受全部"、"拒绝全部"和"保存偏好"处理器中添加了 navigator.sendBeacon 调用。现在我们可以回答:多少比例的访客接受分析?
修复 5:滚动深度和 CTA 追踪
创建了一个 EngagementTracker 组件,使用 IntersectionObserver 追踪滚动深度里程碑(25%、50%、75%、100%)和通过 data-track-cta 属性追踪 CTA 点击。同时向 GA4(有同意时)和服务端端点(始终)发送数据。
修复 6:IndexNow 周定时任务
我们的 IndexNow 端点可以向 Bing、Yandex、Seznam 和 Naver 提交所有 3,400+ 个 URL——但它从未被自动触发。创建了一个 Vercel Cron 任务,每周一 03:00 UTC 运行。
修复 7:首页空腿航班预告
数据很清楚:空腿航班页面的参与度比首页高 9-10 倍(27-31 秒 vs 3 秒)。差异在哪?实时库存数据、具体定价和可操作的交易。我们把这些带到了首页。创建了一个 EmptyLegsTeaser 服务端组件,从 Avi-Go 数据库获取 4 个实时交易,渲染在 TrustBar 和 AboutSection 之间。
今天还交付了:法律迁移 + Cookie 同意
增长计划实际上是下半天的工作。上半天处理了三个法律任务:
- 美国 → 新加坡实体迁移:将服务条款和隐私政策从特拉华州法律/AAA 仲裁更新为新加坡法律/SIAC(新加坡国际仲裁中心)。新增第 14 条"运营实体"——VOLO Technologies Pte. Ltd.。在隐私政策中添加了 PDPA。
- 代理合作条款页面:在
/for-agents/terms构建了完整的 11 节法律页面,涵盖佣金层级(3-5%)、归因规则、数据保护、反欺诈和管辖法律。 - Cookie 同意横幅:构建了 GDPR 合规横幅,三个类别:必要(始终开启)、分析(选择加入)、营销/代理推荐(选择加入)。使用
useSyncExternalStore让 GA4 实时响应同意变更。
地理分布
用户地理分布令人鼓舞。前三大市场与业务战略完全吻合:新加坡(总部)12 人、中国 8 人、美国 7 人。四语言架构(en/zh/fr/es)和基于 IP 的语言检测正在按预期工作。
数据汇总
| 指标 | 之前 | 之后 |
|---|---|---|
| Hero 内容可见 | 2.2 秒 | 0.3 秒 |
| UTM 归因 | 损坏(从未挂载) | 工作中 + 重定向保留 |
| 页面浏览追踪覆盖 | ~20-30%(仅同意) | 100%(服务端后备) |
| 滚动深度追踪 | 无 | 25/50/75/100% 里程碑 |
| IndexNow 调度 | 仅手动 | 每周 Cron(3,400+ URL) |
| 首页实时内容 | 无 | 4 个实时空腿航班 |
| 法律实体 | 美国(特拉华州) | 新加坡(VOLO Technologies Pte. Ltd.) |
提交记录
8bed8d9 — 法律:更新实体至新加坡,添加代理合作条款,构建 Cookie 同意。
a7c035d — 修复:解决 react-hooks/set-state-in-effect lint 错误(React 19 兼容性)。
81b467e — 修复:为机队页面 Merchant Listing Offer schema 添加 shippingDetails。
7e43e47 — 修复:解决 Merchant Listing image + shippingDetails 错误。
442f313 — 增长:基于 GA 数据的改进计划 Phase A——参与度、分析、SEO。
打造产品最令人谦卑的时刻,是数据到来的那一刻。你已经编码了数周,部署功能、修复 bug、编写测试——然后数字告诉你:29 个人访问了,大多数人 3 秒就离开了。但数据也告诉你该往哪里挖。空腿页面留住了用户 31 秒。Hero 有 2.2 秒不可见。追踪组件从未挂载。Cookie 横幅让分析静音了。数据不仅仅让你谦卑——它递给你一把铲子,指向该挖的地方。
订阅资讯
空腿航班优惠、新航线与航空洞察,直达您的邮箱。