Ah, my old script is too old and broken :d but I can say you can make it something like this
I don’t really have time to make a full tutorial from 0 so I have given my scripts
Save
function module.Save(player) if players:FindFirstChild(player.Name) and player:FindFirstChild("IsLoaded") then local status, message = pcall(function() local SaveFile = {} for i,v in ipairs(Values) do local Folder = player:findFirstChild(v) if Folder then for i,v in ipairs(Folder:GetChildren()) do local Value = v if Value:IsA('ValueBase') then table.insert(SaveFile,{ Value.Name, Value.Value, Value.ClassName, Value.Parent.Name, }) end end end end print(game:GetService('HttpService'):JSONEncode(SaveFile)) DataStore:SetAsync(player.UserId, SaveFile) end) if status ~= true then print(player.Name .. " couldn't save, retrying... \n" .. message) module.Save(player) else print(player.Name .. " saved successfully!") end end end Load
function module.Load(player) if players:FindFirstChild(player.Name) then local status,errormsg = pcall(function() local SaveFile = DataStore:GetAsync(player.UserId) if SaveFile then print(game:GetService('HttpService'):JSONEncode(SaveFile)) for i,v in ipairs(SaveFile) do local Value = PlayerValues[player.Name][v[1]] if not Value then local val = CreateObject(player,v[3],{ Parent = player:findFirstChild(v[4]), Name = v[1], }) PlayerValues[player.Name][v[1]] = val Value = val end Value.Value = v[2] end end end) if status ~= true then if player.LoadAttempts.Value < 5 then print(errormsg) player.LoadAttempts.Value = player.LoadAttempts.Value+1 print(player.Name .. " couldn't load, retrying...") module.Load(player) else print('Error loading data') end else print(player.Name .. " loaded successfully!") end end end For Profile Service I recommend watching all the tutorials they have and Make a mix of them :d
First get the Profile Service:
Make a Folder under ServerScriptService, Put ProfileService under it
![]()
and Make another folder

I prefer Seperating them to edit it easly
Lets start with easiest:
Template is the Module script where you put your Values to use inside profile:
Template
local module = { Gold = 0, Level = 1, Rebirth = 0, XP = 0, XPNeeded = 50, LevelLimit = 100, AttackSpeed = 2, DamageBoost = 1, RewardsBoost = 1, UpgradesDone = 0, Damage = 15, XPBoost = 1, GoldBoost = 1, TotalGoldEarned = 0, TotalBlocksMined = 0, PickaxeEquipped = "LvL. 1 Pickaxe", GiftGold = 0, GiftAttackSpeed = 0, GiftDamageBoost = 0, GiftRewardsBoost = 0, GiftXPBoost = 0, GiftGoldBoost = 0 } return module Then next is Manager!
Manager
local ReplicatedStorage = game:GetService("ReplicatedStorage") local TownLevel = ReplicatedStorage:WaitForChild("TownLevel") local CurrentTownLevel = TownLevel:WaitForChild("CurrentTownLevel") local EXPBOOST = CurrentTownLevel:WaitForChild("EXPBOOST") local GOLDBOOST = CurrentTownLevel:WaitForChild("GOLDBOOST") local module = {} module.Profiles = {} --- LeaderStats STUFF function module:AddGold(player, amount) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end profile.Data.Gold += (amount * profile.Data.GoldBoost) * GOLDBOOST.Value player.leaderstats.Gold.Value = profile.Data.Gold end function module:GiftGold(player, NameOfValue, AmountOfValue, target) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end local Players = game:GetService("Players") if target == player.Name then warn("Bro trying to put Stat from his 1 pocket to another") else if Players:FindFirstChild(target) then local RealTarget = Players:FindFirstChild(target) local Gifts = RealTarget:WaitForChild("Gifts") local Gold = Gifts:WaitForChild("GiftGold") local AttackSpeed = Gifts:WaitForChild("GiftAttackSpeed") local DamageBoost = Gifts:WaitForChild("GiftDamageBoost") local RewardsBoost = Gifts:WaitForChild("GiftRewardsBoost") local XPBoost = Gifts:WaitForChild("GiftXPBoost") local GoldBoost = Gifts:WaitForChild("GiftGoldBoost") if AmountOfValue >= 1 then if profile.Data[NameOfValue] - AmountOfValue >= 0 then if NameOfValue == "Gold" then profile.Data[NameOfValue] -= AmountOfValue Gifts["Gift"..NameOfValue].Value += AmountOfValue player.leaderstats.Gold.Value = profile.Data.Gold print("Successfully Sent "..AmountOfValue.." Amount Of Gold to: "..RealTarget.Name) elseif NameOfValue == "AttackSpeed" or NameOfValue == "DamageBoost" or NameOfValue == "RewardsBoost" or NameOfValue == "XPBoost" or NameOfValue == "GoldBoost" then profile.Data[NameOfValue] -= AmountOfValue Gifts["Gift"..NameOfValue].Value += AmountOfValue player.Stats[NameOfValue].Value = profile.Data[NameOfValue] print("Successfully Sent "..AmountOfValue.." Amount Of "..NameOfValue.." to: "..RealTarget.Name) else warn("Value Not Found: ", NameOfValue) end else warn("You can't go Negative Stats! Stat Used: ", NameOfValue) end elseif AmountOfValue == 0 then warn("Can't Send 0, its pointless") elseif AmountOfValue < 0 then warn("You trying to Steal from Player?") end else warn("Target not Found ", target) end end end function module:ControlGifts(player) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end local function UpdateGiftGold() if player.Gifts.GiftGold.Value > 0 then profile.Data.Gold += player.Gifts.GiftGold.Value player.leaderstats.Gold.Value = profile.Data.Gold player.Gifts.GiftGold.Value -= player.Gifts.GiftGold.Value else return false end end local function UpdateGiftAttackSpeed() if player.Gifts.GiftAttackSpeed.Value > 0 then profile.Data.AttackSpeed += player.Gifts.GiftAttackSpeed.Value player.Stats.AttackSpeed.Value = profile.Data.AttackSpeed player.Gifts.GiftAttackSpeed.Value -= player.Gifts.GiftAttackSpeed.Value else return false end end local function UpdateGiftDamageBoost() if player.Gifts.GiftDamageBoost.Value > 0 then profile.Data.DamageBoost += player.Gifts.GiftDamageBoost.Value player.Stats.DamageBoost.Value = profile.Data.DamageBoost player.Gifts.GiftDamageBoost.Value -= player.Gifts.GiftDamageBoost.Value else return false end end local function UpdateGiftRewardsBoost() if player.Gifts.GiftRewardsBoost.Value > 0 then profile.Data.RewardsBoost += player.Gifts.GiftRewardsBoost.Value player.Stats.RewardsBoost.Value = profile.Data.RewardsBoost player.Gifts.GiftRewardsBoost.Value -= player.Gifts.GiftRewardsBoost.Value else return false end end local function UpdateGiftXPBoost() if player.Gifts.GiftXPBoost.Value > 0 then profile.Data.XPBoost += player.Gifts.GiftXPBoost.Value player.Stats.XPBoost.Value = profile.Data.XPBoost player.Gifts.GiftXPBoost.Value -= player.Gifts.GiftXPBoost.Value else return false end end local function UpdateGiftGoldBoost() if player.Gifts.GiftGoldBoost.Value > 0 then profile.Data.GoldBoost += player.Gifts.GiftGoldBoost.Value player.Stats.GoldBoost.Value = profile.Data.GoldBoost player.Gifts.GiftGoldBoost.Value -= player.Gifts.GiftGoldBoost.Value else return false end end local function UpdateGiftDataToProfile() profile.Data.GiftGold = player.Gifts.GiftGold.Value profile.Data.GiftAttackSpeed = player.Gifts.GiftAttackSpeed.Value profile.Data.GiftDamageBoost = player.Gifts.GiftDamageBoost.Value profile.Data.GiftRewardsBoost = player.Gifts.GiftRewardsBoost.Value profile.Data.GiftXPBoost = player.Gifts.GiftXPBoost.Value profile.Data.GiftGoldBoost = player.Gifts.GiftGoldBoost.Value UpdateGiftGold() UpdateGiftAttackSpeed() UpdateGiftDamageBoost() UpdateGiftRewardsBoost() UpdateGiftXPBoost() UpdateGiftGoldBoost() end UpdateGiftDataToProfile() end function module:AddLevel(player, amount) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end profile.Data.Level += amount player.leaderstats.Level.Value = profile.Data.Level end function module:AddRebirth(player) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end if player.leaderstats.Level.Value == player.Stats.LevelLimit.Value then profile.Data.Rebirth += 1 player.leaderstats.Rebirth.Value = profile.Data.Rebirth local RebirthStatMultipler = 0.5 profile.Data.GoldBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.XPBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.DamageBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.RewardsBoost = 2.5 + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.LevelLimit = 100 * 2 ^ player.leaderstats.Rebirth.Value profile.Data.Damage *= 2 profile.Data.Level = 1 player.leaderstats.Level.Value = profile.Data.Level profile.Data.Gold = 0 player.leaderstats.Gold.Value = profile.Data.Gold player.Stats.GoldBoost.Value = profile.Data.GoldBoost player.Stats.XPBoost.Value = profile.Data.XPBoost player.Stats.DamageBoost.Value = profile.Data.DamageBoost player.Stats.RewardsBoost.Value = profile.Data.RewardsBoost player.Stats.LevelLimit.Value = profile.Data.LevelLimit player.Stats.Damage.Value = profile.Data.Damage else return false end end function module:AddUpgrade(player) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end local BaseGoldMultiplier = 10 if profile.Data.Gold >= ((100 + BaseGoldMultiplier * player.leaderstats.Rebirth.Value) * 2 ^ player.Stats.UpgradesDone.Value) then local function UpgradeSTATS() local StatsBoostsToGive = 2.5 local BoostsToGive = 1 local RebirthStatMultipler = 0.5 if player.Stats.UpgradesDone.Value >= 1 then profile.Data.Gold -= ((100 + BaseGoldMultiplier * player.leaderstats.Rebirth.Value) * 2 ^ player.Stats.UpgradesDone.Value) elseif player.Stats.UpgradesDone.Value <= 0 then profile.Data.Gold -= 100 + (BaseGoldMultiplier * player.leaderstats.Rebirth.Value) end player.leaderstats.Gold.Value = profile.Data.Gold profile.Data.UpgradesDone += 1 player.Stats.UpgradesDone.Value = profile.Data.UpgradesDone local function AttackSpeedCalculator() if profile.Data.AttackSpeed + 1 <= 100 then profile.Data.AttackSpeed += 1 elseif profile.Data.AttackSpeed + 1 >= 100 then profile.Data.AttackSpeed = 100 end end if player.Stats.UpgradesDone.Value == 1 then BoostsToGive = 1 profile.Data.GoldBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.XPBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.DamageBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value) profile.Data.RewardsBoost = StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value) AttackSpeedCalculator() elseif player.Stats.UpgradesDone.Value > 1 then BoostsToGive = 2 ^ player.Stats.UpgradesDone.Value profile.Data.GoldBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive) profile.Data.XPBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive) profile.Data.DamageBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive) profile.Data.RewardsBoost = ((StatsBoostsToGive + (0.5 * player.leaderstats.Rebirth.Value)) * BoostsToGive) AttackSpeedCalculator() end end UpgradeSTATS() player.Stats.GoldBoost.Value = profile.Data.GoldBoost player.Stats.XPBoost.Value = profile.Data.XPBoost player.Stats.DamageBoost.Value = profile.Data.DamageBoost player.Stats.RewardsBoost.Value = profile.Data.RewardsBoost player.Stats.AttackSpeed.Value = profile.Data.AttackSpeed else print("Not Enough Gold: " , ((100 + BaseGoldMultiplier * player.leaderstats.Rebirth.Value) * 2 ^ player.Stats.UpgradesDone.Value) ) end end --- LeaderStats STUFF --- EXP STUFF function module:AddXP(player, amount) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end if player.leaderstats.Level.Value < player.Stats.LevelLimit.Value then profile.Data.XP += (amount * profile.Data.XPBoost) * EXPBOOST.Value player.Stats.XP.Value = profile.Data.XP else return false end end function module:CheckXP(player) local Profiles = module.Profiles local profile = Profiles[player] if player.Stats.XP.Value >= player.Stats.XPNeeded.Value then profile.Data.XP = 0 profile.Data.Level += 1 player.Stats.XP.Value = profile.Data.XP player.leaderstats.Level.Value = profile.Data.Level else return false end profile.Data.XPNeeded = (50 * 2 ^ player.leaderstats.Level.Value) player.Stats.XPNeeded.Value = profile.Data.XPNeeded end --- EXP STUFF --- STATS STUFF function module:AddTotalGoldEarned(player, amount) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end profile.Data.TotalGoldEarned += (amount * profile.Data.GoldBoost) * GOLDBOOST.Value player.Stats.TotalGoldEarned.Value = profile.Data.TotalGoldEarned end function module:AddTotalBlocksMined(player, amount) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end profile.Data.TotalBlocksMined += amount player.Stats.TotalBlocksMined.Value = profile.Data.TotalBlocksMined end --- STATS STUFF --- Equipment STUFF function module:EquipPickaxe(player, itemName) local Profiles = module.Profiles local profile = Profiles[player] if not profile then return end profile.Data.PickaxeEquipped = itemName player.Equipped.PickaxeEquipped.Value = profile.Data.PickaxeEquipped end --- Equipment STUFF --- Functions? which i don't use... function module:Get(player, key) local Profiles = module.Profiles local profile = Profiles[player] assert(profile.Data[key], string.format("Data Does not Exist for %s", key)) return profile.Data[key] end function module:Set(player, key, value) local Profiles = module.Profiles local profile = Profiles[player] assert(profile.Data[key], string.format("Data Does not Exist for %s", key)) assert(type(profile.Data[key]) == type(value)) profile.Data[key] = value end function module:Update(player, key, callback) local Profiles = module.Profiles local profile = Profiles[player] local oldData = self:Get(player, key) local newData = callback(oldData) self:Set(player, key, newData) end --- Functions? which i don't use... --- return module You make Functions in the Manager then use it with require in scripts like:
local ServerScriptService = game:GetService("ServerScriptService") local playerdatahandler = require(script.Parent.Manager) then you can use it like:
playerdatahandler:FunctionName(key1, key2, etc.) Data:
local Players = game:GetService("Players") local ServerScriptService = game:GetService("ServerScriptService") local Template = require(script.Parent.Template) local ProfileService = require(ServerScriptService.Libs.ProfileService) local Manager = require(script.Parent.Manager) -- Always set to Production when publishing local ProfileStore = ProfileService.GetProfileStore("Production", Template) local function GiveLeaderstats(player: Player) local profile = Manager.Profiles[player] if not profile then return end local leaderstats = Instance.new("Folder", player) leaderstats.Name = "leaderstats" local Gold = Instance.new("NumberValue", leaderstats) Gold.Name = "Gold" Gold.Value = profile.Data.Gold local Level = Instance.new("NumberValue", leaderstats) Level.Name = "Level" Level.Value = profile.Data.Level local Rebirth = Instance.new("NumberValue", leaderstats) Rebirth.Name = "Rebirth" Rebirth.Value = profile.Data.Rebirth end local function GiveOtherStuff(player: Player) local profile = Manager.Profiles[player] if not profile then return end local Stats = Instance.new("Folder", player) Stats.Name = "Stats" local Equipped = Instance.new("Folder", player) Equipped.Name = "Equipped" local Gifts = Instance.new("Folder", player) Gifts.Name = "Gifts" --- Folders local XP = Instance.new("NumberValue", Stats) XP.Name = "XP" XP.Value = profile.Data.XP local XPNeeded = Instance.new("NumberValue", Stats) XPNeeded.Name = "XPNeeded" XPNeeded.Value = profile.Data.XPNeeded local LevelLimit = Instance.new("NumberValue", Stats) LevelLimit.Name = "LevelLimit" LevelLimit.Value = profile.Data.LevelLimit local AttackSpeed = Instance.new("NumberValue", Stats) AttackSpeed.Name = "AttackSpeed" AttackSpeed.Value = profile.Data.AttackSpeed local Damage = Instance.new("NumberValue", Stats) Damage.Name = "Damage" Damage.Value = profile.Data.Damage local DamageBoost = Instance.new("NumberValue", Stats) DamageBoost.Name = "DamageBoost" DamageBoost.Value = profile.Data.DamageBoost local RewardsBoost = Instance.new("NumberValue", Stats) RewardsBoost.Name = "RewardsBoost" RewardsBoost.Value = profile.Data.RewardsBoost local UpgradesDone = Instance.new("NumberValue", Stats) UpgradesDone.Name = "UpgradesDone" UpgradesDone.Value = profile.Data.UpgradesDone local XPBoost = Instance.new("NumberValue", Stats) XPBoost.Name = "XPBoost" XPBoost.Value = profile.Data.XPBoost local GoldBoost = Instance.new("NumberValue", Stats) GoldBoost.Name = "GoldBoost" GoldBoost.Value = profile.Data.GoldBoost local TotalGoldEarned = Instance.new("NumberValue", Stats) TotalGoldEarned.Name = "TotalGoldEarned" TotalGoldEarned.Value = profile.Data.TotalGoldEarned local TotalBlocksMined = Instance.new("NumberValue", Stats) TotalBlocksMined.Name = "TotalBlocksMined" TotalBlocksMined.Value = profile.Data.TotalBlocksMined local PickaxeEquipped = Instance.new("StringValue", Equipped) PickaxeEquipped.Name = "PickaxeEquipped" PickaxeEquipped.Value = profile.Data.PickaxeEquipped local GiftGold = Instance.new("NumberValue", Gifts) GiftGold.Name = "GiftGold" GiftGold.Value = profile.Data.GiftGold local GiftAttackSpeed = Instance.new("NumberValue", Gifts) GiftAttackSpeed.Name = "GiftAttackSpeed" GiftAttackSpeed.Value = profile.Data.GiftAttackSpeed local GiftDamageBoost = Instance.new("NumberValue", Gifts) GiftDamageBoost.Name = "GiftDamageBoost" GiftDamageBoost.Value = profile.Data.GiftDamageBoost local GiftRewardsBoost = Instance.new("NumberValue", Gifts) GiftRewardsBoost.Name = "GiftRewardsBoost" GiftRewardsBoost.Value = profile.Data.GiftRewardsBoost local GiftXPBoost = Instance.new("NumberValue", Gifts) GiftXPBoost.Name = "GiftXPBoost" GiftXPBoost.Value = profile.Data.GiftXPBoost local GiftGoldBoost = Instance.new("NumberValue", Gifts) GiftGoldBoost.Name = "GiftGoldBoost" GiftGoldBoost.Value = profile.Data.GiftGoldBoost end local function PlayerAdded(player: Player) local profile = ProfileStore:LoadProfileAsync("Player_"..player.UserId) if profile == nil then player:Kick("Data issue, try again shortly. If issue persists, contact us!") return end profile:AddUserId(player.UserId) profile:Reconcile() profile:ListenToRelease(function() Manager.Profiles[player] = nil player:Kick("Data issue, try again shortly. If issue persists, contact us!") end) if player:IsDescendantOf(Players) == true then Manager.Profiles[player] = profile GiveLeaderstats(player) GiveOtherStuff(player) else profile:Release() end end for _, player in ipairs(Players:GetPlayers()) do task.spawn(PlayerAdded, player) end Players.PlayerAdded:Connect(PlayerAdded) Players.PlayerRemoving:Connect(function(player: Player) local profile = Manager.Profiles[player] if not profile then return end profile:Release() end) For the data as you can see, you first give their paths

Then DataStore Name, in here which is “Production”

Then you can add Functions to make things easier:
Then PlayerAdded Stuff:
Don’t forget to call functions:

With this, you are ready to use ProfileService!
For Inventory Function:
To Template you add Inventroy as
Inventory = {}
then you can use it however you want
-- Add an item to the player's inventory function module:AddToInventory(player, itemName, amount) local profile = module.Profiles[player] if not profile then return end -- Check if the item is already in the inventory, if not, create it if not profile.Inventory[itemName] then profile.Inventory[itemName] = 0 end -- Add the specified amount to the inventory profile.Inventory[itemName] = profile.Inventory[itemName] + amount end -- Use this function to retrieve the player's inventory function module:GetInventory(player) local profile = module.Profiles[player] if not profile then return end return profile.Inventory end 

