RBLXEssentials
Free Roblox Studio pack

Datastore & Purchase System

Datastore & Purchase System is where your players' progress lives. You describe what a new player starts with in the RBLX Essentials Plugin, and every pack you install reads and writes that same save: cash, wins, pets, passes, whatever you add. It saves on a timer, on leave and on shutdown. No script editing.
Datastore & Purchase System

Core Features

Version 2.1.0: Update DataStore, Easy Pet System and Roulette together. Back up customized pack folders first. Restart old servers after updating; keep StoreVersion and existing player data unchanged.

The Default Data tree in the plugin, a Stats group holding Cash and Wins, with Meta, Pets and Purchases listed as built in
You describe the save, not the codeGroups and keys, typed as a number, a string or a true/false. Add one and it reaches players who are already playing on their next load. Remove one and it stays in their saved data, so nothing you delete here can lose what they earned.
The preview panel showing the exact JSON a new player receives, with Meta, Pets, Purchases and Stats filled in
See exactly what a new player getsThe panel prints the finished save before you press Play, your own keys merged with the ones the packs add. It is selectable text, so it is also the fastest way to check a key is spelled the way your code spells it.
The Datastore Settings section: auto save interval, the live and Studio datastore versions, and a red Wipe Studio Data button
Testing never touches live savesStudio runs against its own store, on its own version string, so a playtest cannot corrupt what your players have. Wipe Studio Data gives you a fresh new player on the next Play without inventing a second account.

Setup

1Drag the .rbxm into Studio
2Hit Install in the plugin
3Add the keys your game needs. Press Play.

Developer API

Reading and writing a save
local ds = ctx.require("DatastorePurchaseSystem")

-- A key is a path, however deep your tree goes.
local cash = ds.GetValue(player, "Stats.Cash")

ds.SetValue(player, "Stats.Wins", 1)

-- Increment returns the new value. The last argument
-- is a floor, so spending cannot go below zero.
ds.Increment(player, "Stats.Cash", -250, 0)

-- Or edit the whole table at once.
ds.Update(player, function(data)
    data.Stats.Cash += 100
end)
Every write replicates to that player straight away, so a leaderstat or a UI counter reading the same key updates without being told. Saving is automatic: on a timer, when they leave, and when the server shuts down. You never call Save unless you want to.
Passes and developer products
local ds = ctx.require("DatastorePurchaseSystem")

-- Cached per session, and remembered in the save.
if ds.HasPass(player, 123456789) then
    -- give them the perk
end

-- One handler per product. Return true and the
-- receipt is closed, once, never twice.
ds.registerHandler(987654321, function(player, receipt)
    ds.Increment(player, "Stats.Cash", 1000)
    return true
end)
The receipt loop is handled for you, including the case Roblox retries: a product already granted is confirmed rather than granted a second time. Pass ownership is checked once, then remembered, so asking about it in a loop costs nothing.

Customisation

Add a key without touching a script The add row in the plugin: a name field and a type picker for number, string or boolean + Variable takes a name and a type. + Group makes a folder to put them in, so a save can be as flat or as nested as your game wants. The path you type in code is just the names joined by dots.
Buy everything for free while you build The Purchase Settings section with the FreeMode toggle switched on FreeMode makes every pass read as owned and every product grant itself, without Robux and without a prompt. It is how you test a purchase path fifty times in an afternoon. Switch it off before you publish.
How often it saves The auto save interval is a number in the plugin, ninety seconds out of the box. Saves are spread out and retried rather than fired all at once, so a full server does not spend its request budget in one burst, and a player who leaves is written immediately regardless of where the timer was.
When a save cannot be read A player whose data fails to load is not dropped into the game with an empty save. They are told to rejoin, and their real data is still there when they do. This is the one case where doing nothing would quietly cost someone their progress.

Works great with

Leaderstats
Easy Leaderstats & Leaderboards SystemRanks it
Pet System
Easy Pet SystemPets
Roulette
Roulette SystemSpins
Time Rewards
Time Rewards SystemStreaks
Codes System
Codes SystemRedeems

These all keep their numbers in this one save, which is why a code, a spin and an egg can all pay out cash and the leaderboard ranks the total without anything being wired between them.

Documentation

Every setting, the plugin panels and the version history live at rblxessentials.com/docs.

Updates

📋 Version history and changelogs for all packs are available at rblxessentials.com/docs#changelog.

The rest of the ecosystem

Every pack saves through Datastore, plays its sounds through Sound System and puts its menu on the same HUD. Nothing needs wiring between them.

Datastore & Purchase System

Free Roblox player data saving with session locking, retries and safe defaults, plus game pass and developer product handling that survives a rejoin.