In the current implementation, any IAP goes to the IStoreListener function ProcessPurchase . There is no differentiation being made between a new purchase and a restored purchase. So if we send any analytics to a 3rd party platform, non-consumable purchases are being reported twice as the 2nd time happens when the IAP is restored. In our naive solution, we tried to set a flag when the user clicks on an IAP button so we know that this IAP is actually being purchased and not restored. But this fails, as on iOS, if the user clicks on the button, he can be prompted by Unity to "restore" that purchase for free and we as developers do not have any knowledge or callback that this IAP has been restored and is not a new one. Please advise.