I need help with datastores, appearantly this module script doesn't work

local module = {}

module.BaseStats = {
	Credits = 0;
	Rank = 1;
	EXP = 0;
	Inventory = {
		AchievementPins = {}
	}
}

local dss = game:GetService("DataStoreService"):GetDataStore('PlayerData')

function save(player)
	local tries = 0
	local saved = false
	repeat wait()
		local inventory={
			AchievementPins={};
		}
		for _,v in pairs(player.Stats.Inventory.AchievementPins:GetChildren()) do
			inventory.AchievementPins[#inventory.AchievementPins+1] = v.Name
		end
		local success,message = pcall(function()
			dss:SetAsync('user_'..player.UserId,{
				Credits = player.Stats.Credits.Value;
				Rank = player.Stats.Rank.Value;
				EXP = player.Stats.EXP.Value;
				Inventory = inventory;
			})
		end)
		print("Attempting to save "..player.Name.."'s data("..tries..")")
		if success then
			saved = true
			print("Successfully saved "..player.Name.."'s data")
		else
			tries = tries + 1
			print("Attempting to save "..player.Name.."'s data("..tries..")")
		end
		wait()
	until (tries == 5) or saved
end

function module.ClientJoined(player)
	local stats = Instance.new('Folder',player)
	local credits = Instance.new('IntValue',stats)
	local rank = Instance.new('IntValue',stats)
	local exp = Instance.new('IntValue',stats)
	local inventory = Instance.new('Folder',stats)
	local achievementpins = Instance.new('Folder',inventory)
	
	stats.Name = 'Stats'
	credits.Name = 'Credits'
	rank.Name = 'Rank'
	exp.Name = 'EXP'
	inventory.Name = 'Inventory'
	achievementpins.Name = 'AchievementPins'
	
	local data = dss:GetAsync('user_'..player.UserId) or module.BaseStats
	
	credits.Value = data.Credits
	rank.Value = data.Rank
	exp.Value = data.EXP
	
	for _,v in pairs(data.Inventory) do
		for _,value in pairs(v) do
			Instance.new('StringValue',stats[v.Name]).Name = value
		end
	end
end

function module.ClientLeft(player)
	save(player)
end

game.Players.ChildAdded:Connect(function(player) module.ClientJoined(player) end)
game.Players.ChildRemoved:Connect(function(player) module.ClientLeft(player) end)

return module