One other thing to note is that there are a few alternatives which tend to be a bit more feasible to implement (and sustain). Namely, using a single campaign key but leverage an encoding scheme for the key/id rather than a randomly generated one. That way it can be parsed at collection time and every permutation doesn't have to be predefined in a dataset ahead of time. Then end users can still self-service link creation with a template provided to them (they input the usual utm parameters they're used to, but it spits out a link with a single encoded key).
Then on the receiving end, you use lookup tables or functions to decode the various aspects of the key, and explicitly define the relevant utm parameters in the call to Google Analytics (which it natively supports as an alternative to implicitly sniffing them from the URL string). Or if your encoding scheme is simple enough, you can send the key directly to GA and use Advanced custom filters[1] to decode the utm parameters there.
I've implemented this approach for my teams before. It's always a giant PITA without lots of effort around tooling to enforce conventions. It's useful though if you're trying to marry analytics tools without reinventing the wheel though because you can take out of the box UTMs and just transform them into some intelligible encoded format that first into some other tool's sole field for user-defined data.
Web analytics as a whole is a giant PITA without lots of effort around tooling. The default approach just has a silent failure state that is harder to detect, and becomes more of a hassle for the analyst that has to cope with the resulting data.
At least with this approach, the PITA becomes more explicit and easier to justify the tooling needs, allowing for it to be addressed and tackled at the outset by the upstream implementation team, rather than cascading to downstream consumers.
Then on the receiving end, you use lookup tables or functions to decode the various aspects of the key, and explicitly define the relevant utm parameters in the call to Google Analytics (which it natively supports as an alternative to implicitly sniffing them from the URL string). Or if your encoding scheme is simple enough, you can send the key directly to GA and use Advanced custom filters[1] to decode the utm parameters there.
[1] https://support.google.com/analytics/answer/1033162?hl=en