How to solve inconsistent character teleporting on player join

I’ve looked for a long time for a problem similar to mine on the forum and while there’s a lot of questions similar to mine, the solutions they have doesn’t seem to work for mine.

I’m trying to make a players character teleport to an available baseplate when they join the game and here’s the code.

local function TycoonStart(player)
	local ChosenTycoon = workspace.Tycoons:FindFirstChild("Tycoon")
	if ChosenTycoon then
		print("True") -- debugging, works fine
		ChosenTycoon.Name = player.Name
		local character = player.CharacterAdded:Wait() -- doesn't work
		character:WaitForChild("HumanoidRootPart") -- doesn't work
		wait(3) -- oh now it works?
		character:SetPrimaryPartCFrame(ChosenTycoon.SpawnLocation.CFrame)
		print(character)
	else
		DataManager.RemoveProfile(player, "Failed to find available tycoon base.")
	end
end

game.Players.PlayerAded:Connect(TycoonStart)

I’m waiting for the character to fully spawn using CharacterAdded:Wait() before teleporting the character but it’s not yielding enough.

How to solve inconsistent character teleporting on player join?

Edit: I found out the problem
From the developer page

  • “Note, CharacterAdded fires when the Character is assigned to the Player , which is before the Character is parented to the Workspace

For anyone having the same problem.

repeat
	game:GetService("RunService").Heartbeat:Wait()
until character.Parent == workspace