Ross D. Regarding comparing previous deal value to new deal value I can share what I previously build:
We had a workflow running that was triggered when the deal amount changed. We used a second deal amount property (Old Deal amount) to store the old value. So when the worflow triggers you have the new deal amount (In the actual deal amount property) and the old deal amount in the other property to compare them against each other and calculate uplift and store it in another property. Then with a couple minutes delay you update the "Old deal amount" again so it's ready for the next change.
We only used it for monitoring significant changes in our pipeline, but it should work for your use case, too. One downside I see is that multiple value changes in a short period of time (Depending on your delay to update the "old deal amount") can lead to errors. Also if multiple upsells happen over time you would need multiple properties to store these occasions separately. But I think you could make it work ๐