Skip the wait
The Developer Product that clears the cooldown, and sharing ProcessReceipt.
Players can pay Robux to make the next reward claimable now. It clears the timer and nothing else: no day is skipped, no reward is lost, the streak is untouched.
Creating the product
- On the Creator Dashboard, open your experience, then Monetization, Developer Products, and create one. Name it something like "Skip Daily Timer" and set a price.
- Copy its id.
- In
Shared/Config/Settings.luau:
Skip = {
Enabled = true,
DevProductId = 1234567890,
PriceText = "99 R$",
ManageProcessReceipt = true,
},
PriceText is only a label. Change the real price on the dashboard and update this
string to match, or the button will advertise the wrong number.
The button appears only when Enabled is true and DevProductId is above zero.
What the purchase does
The receipt handler sets the player's last claim time to one full interval ago. The next resolve therefore reports the reward as claimable, with the same day and the same streak index as before.
Applying it twice does nothing extra, which is why a retried receipt is safe to grant
again. Roblox retries ProcessReceipt until it is told the purchase was handled, and an
effect that is not idempotent gets applied several times for one payment.
Sharing ProcessReceipt
MarketplaceService.ProcessReceipt is one global callback and the last script to set it
wins. If this is the only thing in your game selling Developer Products, leave
ManageProcessReceipt = true and stop reading.
If anything else sells one, set it to false and route receipts yourself:
local RewardService = require(
game.ServerScriptService.uxrDailyRewardsSystem.DailyRewards.RewardService
)
MarketplaceService.ProcessReceipt = function(receiptInfo)
local decision = RewardService.handleReceipt(receiptInfo)
if decision ~= nil then
return decision
end
-- your own products from here
return myOwnHandler(receiptInfo)
end
handleReceipt returns nil for any product that is not the skip product, which is the
signal to keep processing. It returns PurchaseGranted when it recognised and applied
the purchase.
With two systems both claiming ProcessReceipt, one of them silently loses. Its products
are charged by Roblox and never delivered, and there is no error in Output because
nothing failed: the callback simply belongs to somebody else.
Exactly one owner. Everything else routes through it.
Not returning a decision
The shipped handler refuses to guess about products it does not own. When it manages the
callback and sees an unknown product, it does not return PurchaseGranted, because
granting somebody else's purchase without running their code takes the player's Robux and
delivers nothing. Roblox keeps retrying, which is recoverable; a wrongly granted receipt
is not.
That is the case ManageProcessReceipt = false exists to fix.
Testing it
Developer Product purchases work in Studio for the place owner without spending Robux.
Set ClaimIntervalSeconds low, claim once, then buy the skip while the countdown is
running: the panel should switch to claimable immediately and Hooks.onSkipPurchase
should fire.
Was this page helpful?