How to show sponsored content only to players who can see ads
Ads you place yourself must be hidden from players whose AreAdsAllowed is false. How to check PolicyService before showing them.
What it looks like
The game shows advertising it placed itself, outside Roblox's ad products: a sponsor's billboard, a brand's message in NPC dialogue, a promoted game on a sign or a sponsored item. Every player sees it, with no check of AreAdsAllowed.
Luau
billboard.Text = "Ad · Play Turbo Karts this weekend!"
How to detect it
- Look for content that promotes something outside the game: sponsor lists, brand names in dialogue, "Ad" or "Sponsored" labels, promoted game links and timed campaign content.
- Roblox's advertising standards say that for independent ads, the game must use
PolicyService:GetPolicyInfoForPlayerAsyncand hide, replace or block the ad for any user whoseAreAdsAllowedisfalse. Games that fail to comply can be suspended. - Check that the ad is shown per player, after the policy result for that player, and that a failed policy call doesn't show the ad.
- The same standards say games can't make programmatic calls to third-party ad servers, even for analytics, and can only serve ad content uploaded to Roblox. Report
HttpServicerequests to ad or tracking networks as part of this finding. - Roblox's immersive ad units already show a fallback to ineligible users by default. They only need a check if the game wants to hide them completely.
What an exploiter could do
This isn't an exploit. Players Roblox has marked as not eligible for ads see the sponsor's content anyway. That breaks Roblox's advertising standards, and the game or account can be suspended.
How to fix it
- Call
GetPolicyInfoForPlayerAsyncfor each player inpcall, and only show the ad whenAreAdsAllowedistrue. Show neutral content otherwise, including when the call fails. - Mark ads clearly as ads, in a style that doesn't copy Roblox's own ad labels.
- Remove any requests to outside ad or tracking services.
Vulnerable example
Vulnerable
local Players = game:GetService("Players") local Workspace = game:GetService("Workspace") local player = Players.LocalPlayer local board = Workspace:WaitForChild("SponsorBoard") local sponsors: { string } = { "Ad · Race in Turbo Karts this weekend!", "Ad · Build your dream base in Sky Forts!", } local gui = Instance.new("SurfaceGui") local label = Instance.new("TextLabel") label.Size = UDim2.fromScale(1, 1) label.Parent = gui gui.Adornee = board gui.Parent = player:WaitForChild("PlayerGui") while true do for _, message in sponsors do label.Text = message task.wait(30) end end
Fixed example
Fixed
local Players = game:GetService("Players") local PolicyService = game:GetService("PolicyService") local Workspace = game:GetService("Workspace") local player = Players.LocalPlayer local board = Workspace:WaitForChild("SponsorBoard") local sponsors: { string } = { "Ad · Race in Turbo Karts this weekend!", "Ad · Build your dream base in Sky Forts!", } local fallback: { string } = { "Welcome to the lobby!" } local ok, policy = pcall(PolicyService.GetPolicyInfoForPlayerAsync, PolicyService, player) local messages: { string } = if ok and policy.AreAdsAllowed == true then sponsors else fallback local gui = Instance.new("SurfaceGui") local label = Instance.new("TextLabel") label.Size = UDim2.fromScale(1, 1) label.Parent = gui gui.Adornee = board gui.Parent = player:WaitForChild("PlayerGui") while true do for _, message in messages do label.Text = message task.wait(30) end end
Common false positives
- Rewarded video ads and immersive ad units are Roblox-served ads, with eligibility handled through
AdServiceresults and fallback content. Judge rewarded video rewards with Rewarded ad prizes granted outside the receipt. - The game's own shop, passes and events aren't independent ads.
- Credits and thanks to the game's own team or tools aren't advertising unless they promote something.