roblox-datastores
Use when implementing player data persistence in Roblox, saving/loading player stats or inventory, building leaderboards with ordered datastores, handling data migration between versions, diagnosing data loss issues, or adding auto-save and shutdown-safe data handling with DataStoreService.
By sentinelcore · 480 installs
npx skills add sentinelcore/roblox-skills --skill roblox-datastores
Source repository · Upstream listing
roblox datastores
Reference for Roblox DataStoreService — saving, loading, and managing player data on the server.
Quick Reference
Method Signature Notes
GetDataStore DSS:GetDataStore(name, scope?) Returns a GlobalDataStore
GetOrderedDataStore DSS:GetOrderedDataStore(name, scope?) For leaderboards
GetAsync store:GetAsync(key) Returns value or nil
SetAsync store:SetAsync(key, value) No return value needed
UpdateAsync store:UpdateAsync(key, fn) Atomic read modify write
RemoveAsync store:RemoveAsync(key) Deletes key, returns old value
GetSortedAsync orderedStore:GetSortedAsync(asc, pageSize) Returns DataStorePages
Basic Setup
Loading Data (GetAsync + pcall)
Always wrap datastore calls in pcall . They can fail due to network issues or rate limits.
Saving Data (SetAsync vs UpdateAsync)
Use SetAsync for simple overwrites. Use UpdateAsync when the value must be based on the current stored value (e.g., incrementing a counter safely across servers).
Retry Logic
Auto Save: PlayerRemoving + BindToClose
Server shutdown without BindToClose silently discards unsaved data.
Ordered DataStores (Leaderboards)
Values must be positive integers.
Data Versioning / Migration
Include a version field and migrate in the load path.
Use a versioned datastore name ( PlayerData v2 ) for breaking schema changes.
Common Mistakes
Mistake Consequence Fix
No pcall around datastore calls Unhandled error crashes the script Always wrap in pcall
Saving on every Changed event Hits rate limits (60 + numPlayers×10 writes/min) Throttle; save on remove + periodic interval
No BindToClose handler Data lost on server shutdown Always flush all sessions in BindToClose
Giving default data on load failure Player silently loses progress Return nil on failure; kick or retry
SetAsync for atomic counters Race condition across servers Use UpdateAsync for read modify write
Storing Instances or functions Data silently drops Store only strings, numbers, booleans, plain tables
Reusing datastore name after schema change Old shape clashes with new code Append v2 , v3 to name on breaking changes