I feel like half of Ngrok's value prop is being undervalued here. Namely the fact that it captures requests for inspection and replay. That feature is an absolute game-changer for developing things like Webhooks.
First, it lets you easily see what the Webhooks payload looks like in real life. Second, it lets you hit your endpoint repeatedly with the same payload (while iterating on your code), without having to trigger the 3rd party event again.
That is a great feature, but a dev-centric one. If your focus is instead on self-hosting from behind a NAT, things like end-to-end encryption become more important. There are always tradeoffs.
First, it lets you easily see what the Webhooks payload looks like in real life. Second, it lets you hit your endpoint repeatedly with the same payload (while iterating on your code), without having to trigger the 3rd party event again.