漏斗事件 让你跟踪用户在体验的关键阶段的进度。这包括:
- 入职 - 用户在开始使用您的体验时会掉落到哪里?
- 进度 - 用户在哪里停止通过您的体验前进?
- 商店 - 用户在哪里放弃购买?
一旦您的体验开始跟踪漏斗事件,您就会解锁创建者中心的分析仪表板的漏斗页。您可以为仪表板添加多达十个管道的选项卡。
跟踪漏斗事件
要跟踪通道事件,首先识别您体验中最重要的通道并将其分为步骤。您的入职流程是一个很好的开始地点,因为这是您可能会失去大部分用户的地方。
跟踪一次性漏斗
一次性漏斗监控仅发生一次每用户的转换事件。
一个常见的例子是一个 入职漏斗 ,这对理解如何提高您的体验新用户保留率和会话时间至关重要。以下示例是为 植物 启动的漏斗,新用户在这里进入农场、种植种子、浇水植物等,按顺序进行:
在植物中跟踪入职步骤
local AnalyticsService = game:GetService("AnalyticsService")-- 记录FTUE的第一步AnalyticsService:LogOnboardingFunnelStepEvent(player,1, -- 步数"In Farm" -- 步的名称)-- 记录第二步AnalyticsService:LogOnboardingFunnelStepEvent(player,2, -- 步数"Plant Seed" -- 步的名称)
跟踪重复漏斗
一个重复的漏斗监控用户多次发生的转换事件。
一个常见的例子是一个 商店漏斗 ,它对于理解如何提高您的体验支付转换、ARPPU 和收入至关重要。以下示例是用户打开商店、查看物品、添加物品到购物车等的商店漏斗。
使用 funnelSessionId 来区分重复漏斗中不同用户的不同会话,例如在单个会话中多次打开商店。
跟踪商店步骤
local AnalyticsService = game:GetService("AnalyticsService")local HttpService = game:GetService("HttpService")funnelSessionId = HttpService:GenerateGUID()-- 当用户打开商店时记录AnalyticsService:LogFunnelStepEvent(player,"ArmoryCheckout", -- 用于将步骤组合在一起的通道名称funnelSessionId, -- 此独特支付会话的漏斗会话ID1, -- 步数"Opened Store" -- 步的名称)-- 当用户查看物品时记录AnalyticsService:LogFunnelStepEvent(player,"ArmoryCheckout", -- 用于将步骤组合在一起的通道名称funnelSessionId, -- 此独特支付会话的漏斗会话ID2, -- 步数"Viewed Item" -- 步的名称)-- 当用户查看添加到购物车时记录AnalyticsService:LogFunnelStepEvent(player,"ArmoryCheckout", -- 用于将步骤组合在一起的通道名称funnelSessionId, -- 此独特支付会话的漏斗会话ID3, -- 步数"Added to Cart" -- 步的名称)
实现funnelSessionId
当实现漏斗时,funnelSessionId 可以帮助您跟踪事件,但可能不适用于每个情实例。使用以下指南:
- 一次性漏斗 - 你不需要使用 funnelSessionId 为一次性漏斗,因为它们只发生一次每个用户。
- 商店漏斗 - 使用 funnelSessionId 来区分不同会话的同一用户在重复漏斗中,例如在单个会话中多次打开商店在 以前的例子 中。在这种情况下,玩家可能在单个会话中多次打开商店,建议使用GUID作为funnelSessionId。
- 物品升级 - 使用 funnelSessionId 来区分不同的物品升级路径,通常超过单个游戏会话的更长时间期间。而不是使用商店漏斗案中的GUID,你经常可以根据正在升级的物品建立独特的键,例如:<playerId>-<itemId>。
初始步骤
当第一步被记录时,漏斗开始运行。如果你想立即在玩家加入时启动漏斗,你需要在 PlayerAdded 事件上记录第一步。
记录玩家添加事件的第一步
local AnalyticsService = game:GetService("AnalyticsService")
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
AnalyticsService:LogOnboardingFunnelStepEvent(
player,
1, -- 步数
"Player Joined" -- 步的名称
)
end)
重复步骤
如果用户在隧道中重复步骤,隧道只考虑步骤的第一个实例。例如,如果用户两次记录了漏斗的步骤 2,漏斗只计算第一次步骤 2。
跳过步骤
如果由于某些原因你在漏斗中跳过了一步,那么更早的步骤将自动完成。
例如,如果你有一个漏斗包括步骤 1、2 和 3。如果您没有记录步骤 1 或 2 而记录步骤 3,管道会将步骤 1 和 2 视为已完成。
使用筛选器管道
Roblox 提供过滤器来帮助您分析您的漏斗数据。这些包括玩家数据、设备数据,你也可以发送自定义数据。在某些情况下,玩家的状态可能会在漏斗期间发生变化,例如当玩家从移动设备切换到桌面设备时。
为了避免重复计数管道,过滤器总是 仅适用于管道的第一步 。这意味着如果玩家在漏斗期间切换设备,漏斗只会在他们进入漏斗时将其设备归为漏斗。
类似地,通道会按照群组显示,这意味着如果玩家于 6/19 进入通道,即使他们于 6/20 完成通道,通道也会归于 6/19 群组。
修改管道
在你对你的管道步骤进行更新之后,设置正确的日期范围以查看最新的管道是很重要的。如果当前日期为 6/21 且你于 6/14 更新了你的入职漏斗的步骤 2,你应该将日期范围设置为 6/14 – 6/21 来查看最新的漏斗。
如果您选择包含漏斗步更新的日期范围,相关步骤上会显示警告:

保护您的漏斗免受滥用者的侵害
为了保持数据清洁,在服务器代码中添加一定程度的数据验证很重要,以防止恶意程序向您的分析服务发送无效数据。
例如,如果您有 3 步的入门管道,您可以使用 RemoteEvent 通知服务器当玩家完成每一步后,并添加服务器检查以确保步骤数字在记录事件之前是有效的:
客户端事件代验证码
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local onboardingEvent = ReplicatedStorage:WaitForChild("OnboardingEvent")
local function fireOnboardingEvent(step: number)
onboardingEvent:FireServer({ step = step })
end
fireOnboardingEvent(1)
fireOnboardingEvent(2)
fireOnboardingEvent(10) -- invalid step
服务器端事件代验证码
local AnalyticsService = game:GetService("AnalyticsService")
local ReplicatedStorage = game:GetService("ReplicatedStorage")
local onboardingEvent = ReplicatedStorage:WaitForChild("OnboardingEvent")
local maxStep = 3
local function onPlayerEventFired(player: Player, args: { step: number })
local step = args.step
if(step > maxStep) then
warn(`Invalid tutorial step {step} received from client.`)
return
end
print(`{player.Name} completed step: {step}`)
AnalyticsService:LogOnboardingFunnelStepEvent(player, step)
end
onboardingEvent.OnServerEvent:Connect(onPlayerEventFired)
使用自定义字段
漏斗事件还允许对自定义字段进行分解,以支持更轻松地比较不同部分之间。例如,您可以跟踪哪辆起始车给玩家提供最佳进度,或附加不同的地图以确定是否有某地图的游戏循环比其他地图更好。

了解更多信息,请参阅自定义字段。
使用管道来增长您的体验
要跟踪的最重要的漏斗之一是新手教程,因为许多体验与新用户的保留率和互动与率存在问题。
在下面的 植物 入职漏斗中,最大的掉落是步骤 2(“植物种子”)。

基于这些数据,你可以:
- 添加上下文指示器以更好地指导用户在开始时种植种子。
- 设计一个新用户体验,需要用户种植种子并生长成功的植物才能探索体验的其余部分。您可以通过创建 正面反馈元素 或其他游戏设计技巧来改善这个事件。
