Roblox DataStore Tutorial — How to Save Player Data (Complete 2026 Guide)
Roblox DataStore Tutorial
Why DataStore Matters
Without DataStore, players lose ALL progress when they leave your game. No one will play a game that doesn't save.
Basic DataStore Setup
-- Server Script in ServerScriptService
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local playerStore = DataStoreService:GetDataStore("PlayerData_v1")
local function createPlayerData()
return {
coins = 0,
level = 1,
xp = 0,
inventory = {},
settings = {music = true, sfx = true},
lastLogin = os.time(),
}
end
local function loadPlayer(player)
local key = "Player_" .. player.UserId
local success, data = pcall(function()
return playerStore:GetAsync(key)
end)
if success then
if not data then
data = createPlayerData()
end
-- Store in player attributes or folder
player:SetAttribute("Coins", data.coins)
player:SetAttribute("Level", data.level)
player:SetAttribute("XP", data.xp)
else
warn("Failed to load data for " .. player.Name)
-- Give default data so player can still play
local defaults = createPlayerData()
player:SetAttribute("Coins", defaults.coins)
player:SetAttribute("Level", defaults.level)
end
end
local function savePlayer(player)
local key = "Player_" .. player.UserId
local data = {
coins = player:GetAttribute("Coins") or 0,
level = player:GetAttribute("Level") or 1,
xp = player:GetAttribute("XP") or 0,
lastLogin = os.time(),
}
local success, err = pcall(function()
playerStore:SetAsync(key, data)
end)
if not success then
warn("Failed to save: " .. err)
end
end
-- Auto-load on join
Players.PlayerAdded:Connect(loadPlayer)
-- Auto-save on leave
Players.PlayerRemoving:Connect(savePlayer)
-- Auto-save every 5 minutes
while true do
task.wait(300)
for _, player in ipairs(Players:GetPlayers()) do
savePlayer(player)
end
end
Common Pitfalls
1. Not using pcall() — DataStore calls can fail. Always wrap in pcall.
2. Saving too often — Roblox limits to 60 requests/minute per key.
3. Not versioning — Always version your DataStore name (v1, v2...).
4. Losing data on server shutdown — Use game:BindToClose().
game:BindToClose(function()
for _, player in ipairs(Players:GetPlayers()) do
savePlayer(player)
end
end)
Or Let AI Handle It
All of this code — including error handling, auto-save, versioning, and BindToClose — is automatically generated by Roblox Factory. Correctly. Every time.
Skip Everything — Use Roblox Factory
Roblox Factory generates your entire Roblox game — scripts, art, marketing — in one click.