Hello all scripters, i have encountered an unknown problem in my game that results in unreliable datastores.

One time it saved my stats as my friend who was playing the game. Sometimes it just doesnt even update, so when i join in again all the stats havent even changed from last time. But then sometimes it works fine??

here is the hefty datastore script i created.

--Variables
local leveldata = game:GetService("DataStoreService"):GetDataStore("level")
local EXPdata = game:GetService("DataStoreService"):GetDataStore("EXP")
local xpLeveldata = game:GetService("DataStoreService"):GetDataStore("xpLevel")
local Golddata = game:GetService("DataStoreService"):GetDataStore("Gold")
local toolsdata = game:GetService("DataStoreService"):GetDataStore("Tools")
local HttpService = game:GetService("HttpService")


--Data Storage Save
function savedata(dataname, playerid, value)
	game:GetService("DataStoreService"):GetDataStore(dataname):SetAsync(playerid, value)
end

--Leaderboard Variables
game.Players.PlayerAdded:Connect(function(player)
	playerKey = "user."..player.UserId	-- user key
	print(playerKey)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"
	leaderstats.Parent = player
	
	--Gold
	local gold = Instance.new("IntValue")
	gold.Name = "Gold"
	gold.Value = Golddata:GetAsync(playerKey) or 0
	gold.Parent = leaderstats

	
	--Level
	local level = Instance.new("IntValue")
	level.Value = leveldata:GetAsync(playerKey) or 1
	level.Name = "Level"
	level.Parent = leaderstats

	
	--XP
	local EXP = Instance.new("IntValue")
	EXP.Value = EXPdata:GetAsync(playerKey) or 0
	EXP.Parent = player
	EXP.Name = "Exp"
	
	--XP Needed
	local xpLevel = Instance.new("IntValue")
	xpLevel.Value = xpLeveldata:GetAsync(playerKey) or 84
	xpLevel.Name = 'ExpNeeded'
	xpLevel.Parent = player
	
	--tools
	local tools = toolsdata:GetAsync(playerKey)
	if tools then
		for i,v in pairs(tools) do
			local tool = game.ReplicatedStorage.Tools:FindFirstChild(v)
			if tool then 
				tool:Clone().Parent = player.Backpack
				tool:Clone().Parent = player.StarterGear					
			end
		end
	end

game.Players.PlayerRemoving:Connect(function(player) -- save player stats
	local toolsToSave = {}		
	for i,v in pairs(player.StarterGear:GetChildren()) do
		if v then
			table.insert(toolsToSave,v.Name)
		end
	end
	game:GetService("DataStoreService"):GetDataStore('Tools'):SetAsync(playerKey, toolsToSave)
	savedata('level',playerKey,player.leaderstats.Level.Value)
	savedata('EXP',playerKey,player.Exp.Value)
	savedata('xpLevel',playerKey,player.ExpNeeded.Value)
	savedata('Gold',playerKey,player.leaderstats.Gold.Value)
	print('data saved')
end)

if anyone could take a look and make any suggestions i would greatly appreciate it! thank you all!