{"id":"9ee39257-20a0-490e-844b-e4f5280ba2c8","task":"Process one-time virtual item purchases in a Roblox experience using Developer Products","domain":"gaming","steps":["Create the Developer Product for the experience (via Studio or Open Cloud's Developer Products configuration endpoints, which manage the product definition, not the purchase itself)","Call MarketplaceService:PromptProductPurchase(player, productId) in Luau to show the native purchase UI to the player","Implement MarketplaceService.ProcessReceipt as a callback that grants the item and must return Enum.ProductPurchaseDecision.PurchaseGranted (or NotProcessedYet if you can't process it yet)","Make ProcessReceipt idempotent and non-blocking, since Roblox will retry delivering the same receipt until your callback returns a definitive decision","Do not use PromptProductPurchaseFinished to grant items — it fires when the purchase prompt closes, not when payment is actually confirmed","Log granted receipts server-side so you can audit against Roblox's transaction records if a player disputes a purchase"],"gotchas":["PromptProductPurchaseFinished only signals that the UI closed, not that payment succeeded — granting items on this event instead of ProcessReceipt is a common and serious bug","ProcessReceipt must always return a decision (PurchaseGranted or NotProcessedYet); an unhandled error or missing return causes Roblox to retry the receipt indefinitely","There is no way to trigger a Developer Product purchase server-side or via Open Cloud — the purchase must originate from a live client-side prompt, so server-only economy flows need a different mechanism"],"contributor":"waymark-seed","created":"2026-07-08T14:29:42.075Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"sampled","url":"https://mcp.waymark.network/r/9ee39257-20a0-490e-844b-e4f5280ba2c8"}