Org Admin Guide

Activity & Replay

Track play sessions, forward chat messages, capture server replay snapshots, and report player geolocation — all with single function calls in your server script.

Activity tracking#

Activity tracking records when players join and leave each server. The data powers the Activity heatmap, session history, and Leaderboard in the dashboard.

fnEnableActivityTracking
RoPerms.EnableActivityTracking()

Hooks PlayerAdded and PlayerRemoving to automatically send activity.join and activity.leave events to the backend. Call this once at server startup.

lua
RoPerms.Init()
RoPerms.EnableActivityTracking()

Once enabled, every join and leave is recorded with the player ID, timestamp, and server job ID. Sessions are shown on the player's profile under the Activity tab, and aggregated on the org-level Activity page.

Chat logging#

Chat logging forwards in-game messages to the backend so staff can review them from the Chatlogs tab on a player's profile.

fnEnableChatlogs
RoPerms.EnableChatlogs()

Wires up both TextChatService.MessageReceived (for modern chat) and legacy Player.Chatted to forward chat messages. Call once at server startup.

lua
RoPerms.EnableChatlogs()

Player privacy

Only enable chat logging if it is disclosed to your players in your game description or rules. Forwarding private messages without disclosure may violate Roblox's Terms of Service and players' expectations of privacy.

Server replay#

Server replay captures periodic snapshots of every player's position and character state. Staff can then watch a 2D top-down replay of a server from the dashboard to review incidents.

fnEnableReplay
RoPerms.EnableReplay(opts: table?)

Starts capturing position snapshots at a regular interval. Snapshots are uploaded to the backend and associated with the current server job ID.

lua
RoPerms.EnableReplay({
    -- How often (seconds) to capture a snapshot. Default: 5
    interval = 5,

    -- Maximum snapshot history to keep per server (in seconds).
    -- Older snapshots are pruned. Default: 3600 (1 hour)
    maxHistory = 3600,
})

Viewing replays

In the dashboard, go to Activity → Server Replay and enter the job ID of the server you want to review. The replay viewer shows a 2D top-down map with player positions animated over time. You can scrub through the timeline.

Map calibration

The replay viewer uses coordinates from the game world. For the map overlay to align correctly, you may need to calibrate the coordinate bounds in the replay viewer settings. Contact your RoPerms admin or check the dashboard's replay settings panel.

Geolocation reporting#

RoPerms can show a player's country and region in the dashboard, and display a globe visualisation on their profile. The data comes from Roblox's own region metadata — it is not precise below country/region level.

fnReportPresence
RoPerms.ReportPresence(player: Player, country: string, region: string)

Reports the player's country (ISO alpha-2 code) and region string to the backend. Typically called on PlayerAdded after resolving the player's location from Roblox's LocalizationService.

lua
local LocalizationService = game:GetService("LocalizationService")

Players.PlayerAdded:Connect(function(player)
    local ok, countryCode = pcall(function()
        return LocalizationService:GetCountryRegionForPlayerAsync(player)
    end)
    if ok and countryCode then
        RoPerms.ReportPresence(player, countryCode, "")
    end
end)

GetCountryRegionForPlayerAsync

LocalizationService:GetCountryRegionForPlayerAsync()is a Roblox API that returns the player's country code. It can fail with an error for some players — always wrap it in a pcall.

Server heartbeat#

See the Modcalls & Enforcement page for EnableServerHeartbeat() — this keeps the Live Servers panel populated and lets staff see active server player counts.

Full activity setup#

ServerScriptService/RoPermsSetup.lualua
local Players = game:GetService("Players")
local LocalizationService = game:GetService("LocalizationService")
local RoPerms = require(game.ServerScriptService.RoPerms)

RoPerms.Init()
RoPerms.EnableActivityTracking()
RoPerms.EnableChatlogs()
RoPerms.EnableServerHeartbeat()
RoPerms.EnableReplay({ interval = 5 })

Players.PlayerAdded:Connect(function(player)
    local ok, code = pcall(function()
        return LocalizationService:GetCountryRegionForPlayerAsync(player)
    end)
    if ok and code then
        RoPerms.ReportPresence(player, code, "")
    end
end)