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.

warningLuaudit check: unchecked-independent-ads

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:GetPolicyInfoForPlayerAsync and hide, replace or block the ad for any user whose AreAdsAllowed is false. 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 HttpService requests 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 GetPolicyInfoForPlayerAsync for each player in pcall, and only show the ad when AreAdsAllowed is true. 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 AdService results 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.