Routers are all so different- sometimes it's "port forwarding", sometimes "virtual servers", sometimes "gaming/applications" or something different entirely, not to mention different languages. With UPnP at least I can tell people "ok click around advanced settings until you see "UPnP", then make that enable" and that will sometimes work. It was a real pain to implement since as you said the documentation is terrible.
Current solution is to send the local ip, ip4 and ip6 of the server to the client, and they try connecting to all of those before more complicated stuff with ports has to happen. Even then there are problems with mobile and third-world country ISPs that issue a different IP per connection because they're doing NAT with multiple IP4s.