How to Add Badges to Your Roblox Game: Free Daily Limit, Setup Steps, and Awarding Them with a Script
Badges are one of the cheapest retention tools a Roblox creator has. They give players a visible reason to finish your tutorial, beat a boss, or come back for a secret ending — and the basic quota costs nothing. This.
How to Add Badges to Your Roblox Game: Free Daily Limit, Setup Steps, and Awarding Them with a Script
Badges are one of the cheapest retention tools a Roblox creator has. They give players a visible reason to finish your tutorial, beat a boss, or come back for a secret ending — and the basic quota costs nothing. This guide walks through creating a badge in the Creator Dashboard, sizing the artwork so it doesn't get cropped, and awarding it automatically with server-side Luau that won't crash when the platform hiccups.
What badges cost: the free daily quota
According to Roblox's official badges guide, you can create up to 5 badges for free in each 24-hour period (GMT) for each game you own. If you want to create more within that same 24-hour period, each additional badge costs 100 Robux.
Practical takeaway: if you're launching a game with a dozen achievement badges, you don't need to spend anything — spread the creation over three days and stay inside the free quota.
Creating a badge in the Creator Dashboard
Per the official guide, badge creation happens on the Creator Dashboard, not in Studio:
- Open the Creator Dashboard and find your experience.
- Hover over the game's thumbnail, click the ⋯ button, and choose Create Badge.
- Upload your badge image, then set the name, description, and the Badge is Enabled toggle, and click Create Badge.
Write the description as a hint, not a spoiler. "Found something glittering below the mines" pulls players in; "Touched the part at coordinates X,Y,Z" does not.
After creation, note the badge's ID from its URL or dashboard page — you'll need it in the awarding script below.
Image requirements: design for the circle
Badge artwork should use a 512×512 pixel template, and — this is the part people miss — the upload process trims and crops the image into a circular icon, so avoid putting important details outside the circular boundaries. If your badge's text or icon touches the corners of the square canvas, it will be cut off. Design inside an inscribed circle and treat the corners as disposable.
Awarding a badge from a script
Badges are awarded through BadgeService:AwardBadgeAsync(). Two things matter here, per the BadgeService API reference:
- The method yields and can fail (network issues, invalid badge ID, badge disabled), so wrap it in
pcall— the official code samples do exactly this. - The API lists the AssetManagement capability as a requirement.
A solid pattern also checks whether the player already owns the badge first, using UserHasBadgeAsync():
local BadgeService = game:GetService("BadgeService")
local Players = game:GetService("Players")
local BADGE_ID = 0000000 -- your badge ID from the Creator Dashboard
local function awardBadge(player: Player, badgeId: number)
-- Check ownership first; UserHasBadgeAsync also yields and can fail
local okCheck, hasBadge = pcall(function()
return BadgeService:UserHasBadgeAsync(player.UserId, badgeId)
end)
if not okCheck then
warn("Badge ownership check failed for", player.Name)
return
end
if hasBadge then
return -- already earned, nothing to do
end
local okAward, result = pcall(function()
return BadgeService:AwardBadgeAsync(player.UserId, badgeId)
end)
if not okAward then
warn("AwardBadgeAsync errored:", result)
elseif result ~= true then
warn("Badge was not awarded to", player.Name)
end
end
Hook awardBadge up to whatever event marks the achievement — a touched part, a boss's death, a quest completion.
Useful companions in BadgeService
CheckUserBadgesAsync()— batch-checks a list of badge IDs for one user and returns the owned ones, which is more efficient than callingUserHasBadgeAsync()in a loop when your game has many badges.GetBadgeInfoAsync()— reads a badge's metadata (name, description, enabled state, icon), handy for building an in-game achievements board that stays in sync with the dashboard.- Avoid the deprecated variants
AwardBadgeandUserHasBadge— the reference marks them as deprecated in favor of the async methods above.
Managing badges after launch
As your badge list grows, order matters — players see it on your game page. In the Creator Dashboard, the Badges section under Engagement supports drag-and-drop reordering of up to 50 badges at once: select Reorder, drag badges into your preferred order, and save. Surface your flagship achievements first and push seasonal or legacy badges down the list.
Quick checklist
- Artwork uses the 512×512 template with key content inside the circular safe zone.
- Badge created from the game thumbnail's ⋯ → Create Badge option, with name, description, and enabled status set.
- Stayed within 5 free badges per 24-hour GMT window (or budgeted 100 Robux per extra).
- Awarding runs via
AwardBadgeAsync()insidepcall, with aUserHasBadgeAsync()ownership check first. - Badge order curated on the Engagement → Badges page.
With that in place, your achievements award themselves reliably — and fail quietly instead of erroring — even when the platform has a bad moment.
Sources and verification
- Badges | Roblox Creator DocumentationFree quota of 5 badges per game per 24-hour GMT period with 100 Robux per additional badge; Creator Dashboard creation steps (hover thumbnail → ⋯ → Create Badge → image, name, description, enabled toggle); 512×512 template with circular crop warning; drag-and-drop reordering of up to 50 badges under Engagement > Badges; awarding via AwardBadgeAsync wrapped in pcall.
- BadgeService | Roblox Engine API ReferenceAwardBadgeAsync yields, can fail (pcall in samples), and lists the AssetManagement capability; UserHasBadgeAsync for ownership checks; CheckUserBadgesAsync for batch checks; GetBadgeInfoAsync for metadata; AwardBadge and UserHasBadge marked deprecated.