Use Case
When a player has Roblox Plus, they receive an automatic discount: 10% for short-term subscribers and 20% after roughly 3 months. As developers, knowing which tier a player is in is valuable for:
- Surfacing accurate “you save X%” messaging in custom shop UIs.
- Rewarding Platform Loyalty: Developers want to honor a player’s platform-wide loyalty. Providing
IsLongTermSubscriberallows us to grant exclusive “Veteran” cosmetics or perks to long-term supporters, even if they didn’t originally subscribe within our specific experience.
Current Workaround (and why it’s painful)
Currently, developers are forced to manually calculate this tier by cross-referencing server-side base prices with client-side personalized prices via RemoteEvent round-trips. This involves setting up a “probe” product with regional pricing disabled, shipping its price to the client, and using thresholding logic to guess the discount percentage.
This entire process is redundant and inherently brittle. It is a “hack” to derive information that the platform already holds authoritatively. Instead of forcing developers to build these complex workarounds, Roblox should provide this native data point directly, ensuring better performance and reliability for everyone.
Proposed Solution
Add a single boolean field to the dictionary returned by MarketplaceService:GetRobloxSubscriptionDetailsAsync(player):
| Field | Type | Description |
|---|---|---|
| IsLongTermSubscriber | bool | Returns true if the user has been subscribed long enough to qualify for the higher discount tier (~3 months). Returns false for newer subscribers. Only meaningful when IsSubscribed is true. |
Privacy Considerations
The existing StartTime field is intentionally restricted, it’s only returned when IsOriginExperience is true, to avoid leaking cross-experience subscription history. IsLongTermSubscriber preserves that guarantee:
- It exposes a single bit (“over threshold or not”), not a date.
- It doesn’t reveal nwhere the user originally subscribed.
- It exposes strictly less information than the current price-comparison workaround already exposes (which lets you infer the same bit anyway).
Because the workaround already makes this information derivable, adding the field is a no-op for privacy and a significant ergonomics win for developers.
Example
local success, details = pcall(function()
return MarketplaceService:GetRobloxSubscriptionDetailsAsync(player)
end)
if success and details.IsSubscribed then
local discountPercent = if details.IsLongTermSubscriber then 20 else 10
-- show "You save X%" in the custom shop UI
end