This is often harder to answer than it may seem at first. There can be numeric reasons why the WhenEvent isn’t keeping your solution from crossing 0. WhenEvents can only detect that the equation has crossed 0. It doesn’t predict that it will cross 0 and prevent this.
If the issue persists despite the suggestions, please try making a simple example of your problem, such as a simple differential equation with similar behavior to yours and post this.