ServerScriptService.PlayerModule:9: attempt to index nil with UnlockIds

so ive been getting this error not for long but after our scripter made a update, since hes inactive im gonna make a post on why this is happening
when any error errors in this modulescript the game is stuck in a infinite loading loop
image
this is the error

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local PlayerData = DataStoreService:GetDataStore("PlayerData")
local MarketplaceService = game:GetService("MarketplaceService")
local Gamepasses = require(script.Parent.Gamepasses)

local function Reconcile(source, template)
	for k, v in pairs(template) do
		if not source[k] then
			source[k] = v
		end
	end
	return source
end

local function LeaderboardSetup(value, value2)
	local leaderstats = Instance.new("Folder")
	leaderstats.Name = "leaderstats"

	local money = Instance.new("IntValue")
	money.Name = "Cash"
	money.Value = value
	money.Parent = leaderstats
	
	local rebirth = Instance.new("IntValue")
	rebirth.Name = "Rebirths"
	rebirth.Value = value2
	rebirth.Parent = leaderstats
	return leaderstats
end

local function LoadData(player)
	local success, result = pcall(function()
		return PlayerData:GetAsync(player.UserId)
	end)
	if not success then
		warn(result)
	end
	return success, result
end

local function SaveData(player, data)
	local success, result = pcall(function()
		PlayerData:SetAsync(player.UserId, data)
	end)
	if not success then
		warn(result)
	end
	return success
end

local sessionData = {}

local playerAdded = Instance.new("BindableEvent")
local playerRemoving = Instance.new("BindableEvent")

local PlayerManager = {}

PlayerManager.PlayerAdded = playerAdded.Event
PlayerManager.PlayerRemoving = playerRemoving.Event

function PlayerManager.Start()
	for _, player in ipairs(Players:GetPlayers()) do
		coroutine.wrap(PlayerManager.OnPlayerAdded)(player)
	end

	Players.PlayerAdded:Connect(PlayerManager.OnPlayerAdded)
	Players.PlayerRemoving:Connect(PlayerManager.OnPlayerRemoving)

	game:BindToClose(PlayerManager.OnClose)
end

function PlayerManager.OnPlayerAdded(player)
	PlayerManager.RegisterGamepasses(player)

	player.CharacterAdded:Connect(function(character)
		PlayerManager.OnCharacterAdded(player, character)
	end)

	local success, data = LoadData(player)
	sessionData[player.UserId] = Reconcile(if success then data else {}, {
		Cash = 0,
		UnlockIds = {},
		Multiplier = 1,
		Rebirths = 0,
	})

	local leaderstats = LeaderboardSetup(PlayerManager.GetCash(player), PlayerManager.GetRebirths(player))
	leaderstats.Parent = player

	playerAdded:Fire(player)
end

function PlayerManager.OnCharacterAdded(player, character)
	local humanoid = character:FindFirstChild("Humanoid")
	if humanoid then
		humanoid.Died:Connect(function()
			wait(3)
			player:LoadCharacter()
		end)
	end
end

function PlayerManager.GetCash(player)
	return sessionData[player.UserId].Cash
end

function PlayerManager.GetRebirths(player)
	return sessionData[player.UserId].Rebirths
end

function PlayerManager.SetRebirths(player, value)
	if value then
		sessionData[player.UserId].Rebirths = value

		local leaderstats = player:FindFirstChild("leaderstats")
		if leaderstats then
			local rb = leaderstats:FindFirstChild("Rebirths")
			if rb then
				rb.Value = value
			end
		end
	end
end


function PlayerManager.SetCash(player, value)
	if value then
		sessionData[player.UserId].Cash = value

		local leaderstats = player:FindFirstChild("leaderstats")
		if leaderstats then
			local money = leaderstats:FindFirstChild("Cash")
			if money then
				money.Value = value
			end
		end
	end
end

function PlayerManager.AddMultiplier(player, multiplier)
	sessionData[player.UserId].Multiplier *= multiplier
end

function PlayerManager.GetMultiplier(player)
	return sessionData[player.UserId].Multiplier
end

function PlayerManager.AddUnlockId(player, id)
	local data = sessionData[player.UserId]

	if not table.find(data.UnlockIds, id) then
		table.insert(data.UnlockIds, id)
	end
end

function PlayerManager.GetUnlockIds(player)
	return sessionData[player.UserId].UnlockIds
end

function PlayerManager.ClearUnlockIds(player)
	local data = sessionData[player.UserId]

	table.clear(data.UnlockIds)
end

function PlayerManager.OnPlayerRemoving(player)
	SaveData(player, sessionData[player.UserId])
	playerRemoving:Fire(player)
end

function PlayerManager.OnClose()
	--if game:GetService("RunService"):IsStudio() then return end

	for _, player in ipairs(Players:GetPlayers()) do
		PlayerManager.OnPlayerRemoving(player)
	end
end

function PlayerManager.RegisterGamepasses(player)
	for id, passFunction in pairs(Gamepasses) do
		if MarketplaceService:UserOwnsGamePassAsync(player.UserId, id) then
			passFunction(player)
		end
	end
end
return PlayerManager

this is the code
i hope i can find a fix and i can get this done!

Line 81 change to:

sessionData[player.UserId] = Reconcile(data or {}, {
		Cash = 0,
		UnlockIds = {},
		Multiplier = 1,
		Rebirths = 0,
	})