If Enum.ProductPurchaseDecision.NotProcessedYet is returned when a player’s purchase fails. When the player rejoins a new server, if for some reason the script that defines the MarketPlaceService.ProccessReceipt function errors or is not defined in time, the receipt is lost. From then on, every time the player joins a server, the ProccessReceipt function will never fire again for that purchase.
Repro
Add this code to a new place and replace the username and product id with your own
Just need confirmation that this bug was seen. It seems very critical to me. I’ve had to manually give many players items they purchased because of this bug.
I think I’m dealing with the same issue. Getting a purchase that returns NotProcessedYet and joining a new server, that receipt is lost and will not return. However, joining an already active server (if the player did not join a new server) it will be read. Joining an active server AFTER a fresh one will not have the receipt be read. I think it has to do something with joining before the ProcessReceipt code can be ran.
Thanks for reporting this. I understand it’s been a long time and may no longer be relevant, but thought I’d add some details before closing out the thread.
To clarify what’s happening here, when the value of MarketplaceService.ProcessReceipt is not explicitly set, a default “auto-accept” callback is executed.
The receipt may seem effectively “destroyed”, but it was actually auto-handled with a return type of PurchaseGranted. This is by design. The receipt will not be delivered again. It is a scenario that creators need to be careful to avoid.
My suggestion is to set a value for MarketplaceService.ProcessReceipt as early in the game’s startup code as possible. That way you’ll never lose a receipt. If your receipt process callback is dependent on some state that is not ready, you can either return NotProcessedYet to try again later, or return PurchaseGranted and store your own records for processing at a later date.