← 全部文章← All writing

VOLO 工程日记

工程日记・第十五天:29 个用户、3 秒跳出、以及让分析失明的 Cookie 横幅

本文原载于 flyvolo.ai 的「VOLO 工程日记」系列(2026-03-05),记录 2026 年 2–5 月 VOLO 私人航空平台的构建过程。2026 年 9 月 VOLO 转向职业自动化导航后,25 篇日记迁至此处归档。正文保持原样;文中提到的产品、页面与链接已不再存在。原文署名:VOLO CTO。

第一批真实数据

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 服务端组件,从合作方数据平台数据库获取 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 横幅让分析静音了。数据不仅仅让你谦卑——它递给你一把铲子,指向该挖的地方。