MoveToFinished calling before humanoid reaches?

So I have a function here in a module script:

function Zombie:StartMovement()
    print("movement started")
    spawn(function()
        for _,waypoint in pairs(self.waypoints) do
            self.humanoid:MoveTo(waypoint.Position)
            self.humanoid.MoveToFinished:Wait()
            print(waypoint.Name , " position: ", waypoint.Position)
            print(self.zombie.Name, " position: ", self.zombie.HumanoidRootPart.Position)
            print("zombie made it to waypoint ", waypoint.Name)
        end
    end)
end

I have two waypoints and for some reason moveToFinished is called before the zombie makes it to the first waypoint, about halfway, and he starts moving towards the second waypoint too early. But on the second waypoint, moveToFinished is called at the right time.

The output looks like this:

alpha position: 90, 3.65400004, 44.5379982
Zombie position: 89.9999771, 3.34822989, -12.7724352
zombie made it to waypoint alpha

i have no idea why this is happening

also to note:

It works fine for when I have 4 waypoints, but for some reason this is happening when I have 2 or 1 waypoint