Loading...
Loading...
Analytics and live ops - AnalyticsService economy/funnel/onboarding/progression/custom events, player segments, experience configs via ConfigService, A/B experiments, badges, experience notifications, timed events, daily rewards, season passes. Use when instrumenting a game, tuning economy or onboarding, running A/B tests or feature flags, or planning live events and re-engagement.
npx skill4agent add el4cteo/roblox-skills roblox-analytics-liveopsAnalyticsServiceFire*Log*--!strict
local AnalyticsService = game:GetService("AnalyticsService")
local Analytics = {}
-- Currency sources and sinks → Economy dashboard.
function Analytics.coinsEarned(player: Player, amount: number, balance: number, source: string)
AnalyticsService:LogEconomyEvent(
player,
Enum.AnalyticsEconomyFlowType.Source,
"Coins", -- currency type
amount,
balance, -- ending balance
Enum.AnalyticsEconomyTransactionType.Gameplay.Name, -- or a custom string like "QuestReward"
source -- item SKU / source id
)
end
function Analytics.itemBought(player: Player, price: number, balance: number, itemSku: string)
AnalyticsService:LogEconomyEvent(
player,
Enum.AnalyticsEconomyFlowType.Sink,
"Coins",
price,
balance,
Enum.AnalyticsEconomyTransactionType.Shop.Name,
itemSku
)
end
-- First-session tutorial funnel (steps must be sequential, 1-based).
function Analytics.onboarding(player: Player, step: number, stepName: string)
AnalyticsService:LogOnboardingFunnelStepEvent(player, step, stepName)
end
-- Recurring funnels (e.g. shop purchase flow); share a session id per attempt.
function Analytics.shopFunnel(player: Player, sessionId: string, step: number, stepName: string)
AnalyticsService:LogFunnelStepEvent(player, "ShopPurchase", sessionId, step, stepName)
end
-- Level progression.
function Analytics.levelStarted(player: Player, level: number)
AnalyticsService:LogProgressionStartEvent(player, "MainPath", level, `Level{level}`)
end
function Analytics.levelCompleted(player: Player, level: number)
AnalyticsService:LogProgressionCompleteEvent(player, "MainPath", level, `Level{level}`)
end
-- Anything else: numeric custom events, sliced by up to 3 custom fields.
function Analytics.bossKilled(player: Player, bossId: string, seconds: number)
AnalyticsService:LogCustomEvent(player, "BossKillTime", seconds, {
[Enum.AnalyticsCustomFieldKeys.CustomField01.Name] = bossId,
})
end
return AnalyticsendingBalanceAnalyticsService:GetPlayerSegmentsAsync(player)pcallConfigService--!strict
local ConfigService = game:GetService("ConfigService")
local ok, snapshot = pcall(function()
return ConfigService:GetConfigAsync()
end)
local function get(key: string, default: any): any
if not ok then
return default
end
local value = snapshot:GetValue(key)
return if value == nil then default else value
end
local bossHealth = get("bossHealth", 500)
print("boss health", bossHealth)
if ok then
snapshot.UpdateAvailable:Connect(function()
snapshot:Refresh() -- apply newly published values at a safe moment (e.g. between rounds)
print("new boss health", get("bossHealth", 500))
end)
endConfigService:GetConfigForPlayerAsync(player)GetConfigAsyncroblox-open-cloudConfigService:SetTestingValue(key, value)ClearTestingValueBadgeService:AwardBadgeAsync(userId, badgeId)pcallUserHasBadgeAsyncCheckUserBadgesAsyncAwardBadgeUserHasBadgeExperienceNotificationService:CanPromptOptInAsync()PromptOptIn()POST /cloud/v2/users/{userId}/notificationseventStarteventEndos.time()workspace:GetServerTimeNow()math.floor(os.time() / 86400)lastClaimDayroblox-monetizationroblox-data-storesroblox-open-cloudroblox-game-systems