Enum.ProductPurchaseDecision.PurchaseGranted means the player bought the devproduct
Enum.ProductPurchaseDecision.NotProcessedYet means the purchase request has been sent but not yet processed.
Emm, someone made the purchase, the custom function runs, but something went wrong, then we return NotProcessedYet, Roblox will try to validate that purchase many times after that.
It’s specified in the documentation that the callback is fired once again when the player joins the game or purchases another product until PurchaseGranted is returned. I ran some tests and this is true. However, the callback is only fired again if the player joins the same server it made the original purchase in. Same thing applies for the second statement, the callback is only ran again if the product was purchased in the same server the original product was purchased in.
No, returning NotProcessedYet doesn’t deduct the Robux.
Yes, Roblox will still run the callback again whether it’s a custom function or not. It will follow the conditions I talked about in the first answer.
Sorry for being very late, hope this is still helpful!
I know this is a old post but NotProcessedYet does deduct Robux, when returning ‘Enum.ProductPurchaseDecision.NotProcessedYet’ it takes the robux out of the account, unless this classifies as a bug.