I think it’s because Touch and TouchEnded might fire multiple times when a part is moving inside another part. I think those two events were meant for collision or touching of part surfaces, not the inside of a part.
I recommend you use ZonePlus instead.
If not, you can use Workspace:GetPartsInPart() or Workspace:GetPartBoundsInBox() to detect if the player entered or left the zone.