"Is there a suitable 3rd-party solution that we can use? " This sounds simple but "suitable" tends to be a squishy term. Often the answer is "kinda", and you need to decide whether writing new code is less work than working around the limitations of existing solutions... Which kind of puts you back in square one.