I've recently advertised a game of mine and after about 4 weeks it's stopped getting players. A huge problem is when the server had 8+ players, my datastore saving system would keep throttling and loosing player data although I really don't think I was saving/loading that much. I used this load function once when a player loads into the game and I use the save function every 120 seconds and when a player leaves. I even removed the autosave at one point and I still got some errors. I unfortunately didn't look into seeing if I was actually going over the limit when the game had players but I highly doubt I was using that many requests unless over like 10 players were joining and leaving within a minute.

My code, it's a lot, does anything look weird about it? Thanks

LoadData = function(plr, Coins, Level, EXP)
	local function CheckSAVE()
		local success, msg = pcall(function()
			GetData = PlayersStats:GetAsync(plr.UserId)
		end)
		if success then
			if GetData then
				Coins.Value = GetData[1]
				Level.Value = GetData[2]
				EXP.Value = GetData[3]
			else
				Coins.Value = 0
				Level.Value = 1
				EXP.Value = 0
			end
			return true
		else
			return false
		end
	end
	local a = CheckSAVE() wait()
	if a == false then
		pcall(function()
			plr:FindFirstChild("SR").Value = false
		end)
		wait(10)
		local b = CheckSAVE() wait()
		if b == false then
			wait(1)
			warn("Error loading "..plr.UserId.." data") wait()
			plr:Kick("There was an error loading data, please rejoin or try again later!")
		elseif b == true then
			pcall(function()
				plr:FindFirstChild("SR").Value = true
			end)
		end
	end
end

SaveData = function(plr)
	local ls = plr:FindFirstChild("leaderstats")
	local saveready = plr:FindFirstChild("SR")
	if ls ~= nil and saveready ~= nil then
		if saveready.Value == true then
			local Coins = ls:FindFirstChild("Coins")
			local Level = ls:FindFirstChild("Level")
			local EXP = plr:FindFirstChild("EXP")
			if Coins ~= nil and Level ~= nil and EXP ~= nil then
				local tableofstats = {
					Coins.Value,
					Level.Value,
					EXP.Value
				}
				local function AttemptSave()
					local success, msg = pcall(function()
						GetData = PlayersStats:GetAsync(plr.UserId)
					end)
					if success then
						if GetData then
							pcall(function()
								PlayersStats:UpdateAsync(plr.UserId, function() 
									return tableofstats 
								end) 
							end)
						else
							pcall(function()
								PlayersStats:SetAsync(plr.UserId, tableofstats) 
							end)
						end
						return true
					else
						return false
					end
				end
				local savetest = AttemptSave()
				if savetest == false then
					wait(10)
					local savetest2 = AttemptSave()
				end
			end
		end
	end
end