Part 1 - Define achievements in Steamworks
In Steamworks, open your app and choose Edit Steamworks Settings → Stats & Achievements → Achievements. Click the banner at the top to open the new achievements editor. You need permission to edit the app's info. It has two tabs: Manage Achievements for creating and organizing, and Bulk Import/Export for CSV and icon uploads. The top of the editor shows how much of your achievement and set limits you've used.
Click Create Achievement in the set it belongs to. Achievements go in the Base game set unless you pick another. The fields:
| Field | What it does |
|---|---|
| API Name | The unique string your code uses, like ACH_FIRST_WIN. Pick a scheme and don't change it after release. |
| Display Name, Description | What players see. Both are localizable. |
| Icons | An Achieved and an Unachieved icon. See step 3. |
| Set By | Who may unlock it: the client, a game server, or an official game server. |
| Progress Stat | Optional. A stat that drives a progress bar, plus the Stat Range that maps to 0% and 100%. |
| Visibility | Visible, or Spoiler (previously called Hidden) to keep the name and description secret until it's unlocked or revealed. |
| Optional Status | Available, or Archived when it can no longer be earned. |
| In Set | Which set it belongs to. |
Use the Filter box to find achievements by name, description or API name.
Make icons 256 × 256 px PNG. They must be square and can be as small as 64 × 64, but Steam recommends the larger size and scales bigger images down to 256 × 256. JPG is also accepted. Make the achieved icon colourful and the unachieved one grayscale.
You don't have to make the unachieved icon yourself. Click Generate in the achievement editor, or tick Automatically generate unachieved icons when uploading in bulk, and Steam creates a grayscale version from the achieved icon. You can replace it later. If you want a locked look that's more than plain grey, our achievement icon creator makes custom locked variants.
Use the Language selector in the toolbar to edit each achievement in each of your languages. A warning icon appears when some are missing text. Click the edit button next to Language, or Configure Languages on the Bulk Import/Export tab, to choose which languages achievements support. To pass the release checklist, every achievement needs a name in every configured language, plus an icon.
Editor changes are saved to your app's draft configuration. Publish them from the Publish tab in Edit Steamworks Settings, like any other setting. Nothing works in-game before publishing. Also tick Steam Achievements under Supported Features in your store page's basic info.
Bulk import and export
The Bulk Import/Export tab lets you manage achievements as files: export CSVs, edit them in a spreadsheet, and upload them back with your icons. For a game with dozens of achievements this is much faster than editing one at a time.
Click Export Definitions (.csv), Export Localization (.csv) and/or Export Set Localization (.csv). If you have no achievements yet, the exports are templates with a couple of example rows starting with EXAMPLE_. Configure your languages first so the localization files include those columns.
Header rows include notes in parentheses, like spoiler (true or false). Steam ignores those notes on upload.
Drag your .csv and .png files onto the upload box, or click Select Files.... Check the Uploaded Files list for errors; removing a file undoes everything it contributed. Then review the Pending Changes. Nothing is saved until you click Save imported data.
| File | Columns |
|---|---|
<appid>-achievements-definitions.csv | api_name (required, unique), setid (blank means the base game set), permission (Client, GameServer or OfficialGameServer), spoiler, archived, and optionally progress_stat_name, progress_stat_min, progress_stat_max. Names and descriptions are not in this file. |
<appid>-achievements-localization.csv | Two rows per achievement, one for its name and one for its description. A column per language, like english, french, german. API names are case sensitive here. |
<appid>-achievement-sets-localization.csv | setid plus a column per language; english is required. Create sets in the editor first. The base game set can't be renamed. |
How a definitions upload is applied: rows with a new API name are added; existing achievements with changed values are modified; unchanged ones are left alone; and achievements missing from the file are kept unless you tick Delete these achievements. Be careful with that option, since you can't simply add a deleted achievement back. To rename an API name, change it in the editor first, or the old achievement's data will be removed. A progress stat must already exist and must have the same permission as the achievement.
If you upload a definitions CSV and a localization CSV together, localization for achievements missing from the definitions CSV isn't updated.
Name each icon with the achievement's API name followed by _ACHIEVED or _UNACHIEVED, for example LEVEL_20_ACHIEVED.png and LEVEL_20_UNACHIEVED.png. Steam assigns them to the matching achievement automatically. Tick Automatically generate unachieved icons to create grayscale unachieved icons for every achieved icon you upload. If you upload icons together with a definitions CSV, they're only assigned to achievements in that CSV; to upload icons on their own, leave the CSV out. Our icon creator names its ZIP this way.
Limits
| Item | Limit |
|---|---|
| Achievements per app | 5,000, or 100 for apps that haven't yet been vetted. Archived achievements count. |
| Sets per app | 40, including the base game set |
Deleting an achievement removes it for everyone, including players who already unlocked it. If players have earned it, the editor will suggest archiving instead.
Achievement Sets (beta)
Sets group achievements, track completion per group, and let you add or retire achievements without taking progress from players. They're configured entirely in Steamworks. Your game uses the same API names and calls as before, so there's no extra code.
| Kind | What it is |
|---|---|
| Base game | Every game has one. Achievements not assigned elsewhere live here. It can't be renamed, deleted or reordered, and is hidden when empty (but still counts toward the set limit). |
| Custom set | A named group, such as a mode, character, chapter or event. Restricted to all players, or to owners of a chosen DLC. |
| DLC set | A set restricted to DLC owners. Anyone can browse it, but only players who can play the DLC can earn it. It doesn't count toward base game completion, stays hidden until the DLC is released (so you can set it up early), and shows on the DLC's store page. Steam adds a "DLC" prefix to the name, so leave it out. |
| Developer-only | Visible only to developers, released or not, and only developers can unlock it. Use it to build and test new achievements. |
On the Manage Achievements tab, click Create New Set and enter a name. Players see it.
Under Restrictions, pick All players of the game, or select a DLC to make it a DLC set. The list includes the DLC attached to your game, with their app IDs.
A set with no achievements in it won't appear to anyone.
Managing sets
- Edit: open the set's menu and choose Edit set to change its name, restrictions or developer-only status, or to archive it.
- Visibility: each set shows Visible, Hidden by restrictions (developer-only, or its DLC isn't released yet) or Will be visible upon publish.
- Reorder: click Reorder Sets and drag. The base game set can't be moved.
- Delete: move or delete every achievement in it first. To retire a set without taking anything from players, archive it instead.
- Move achievements: change one achievement's In Set field, or use Bulk Move in the table header. Tick the achievements (filtering by API name first helps), pick a destination or Create New Set..., and click Move. The editor warns you if a move would hide an achievement from players who earned it, or break completion for players with progress in the destination set.
Archiving and completion
- Archived achievements stay visible to players who unlocked them and can still be featured on profiles. Players who haven't unlocked one won't see it, and it doesn't count against their completion.
- Archived sets are visible only to players who unlocked something in them, and nothing in them can be unlocked.
- Completion is per set. A player completes a set by unlocking every available achievement in it. Once complete, it stays complete even if you add more later. DLC sets only count for DLC owners. Completing any set qualifies the game for the Completionist Showcase on a player's profile.
- Spoiler and archived achievements aren't shown in the achievements panel on your store page.
Archiving doesn't change your game. Make sure your code stops awarding an achievement once you archive it. Steam won't unlock an archived achievement, or a DLC achievement for a player who can't play that DLC, so only award DLC achievements to owners.
What players see
- Achievements page (Steam client and Community site): progress and completion per set, comparison with up to 3 friends, global unlock rates with rare ones highlighted, and search and filters by unlock state or set.
- Store page: an achievements panel, without spoiler or archived achievements. DLC store pages show that DLC's set.
- Profiles: the Achievement Showcase counts games and sets completed, and a game can go in the Completionist Showcase once any of its sets is complete.
You can link straight to your game's achievements, with no player's progress, whether or not the visitor owns the game: https://steamcommunity.com/achievements/<appid>
Best practices
- Add new sets for new content. Adding achievements to a set players already completed shows it as completed with locked achievements, which is confusing. A new DLC, update or mode deserves its own set. Adding to a released set won't break completion, but it may not display naturally.
- Archive instead of deleting anything players have earned.
- Use DLC sets for DLC achievements, so players without the DLC can still complete your game.
- Keep set names short and descriptive. They show up in many places, including the Steam client. Localize them for every language you support.
- Test with developer-only sets before releasing new achievements.
Common questions
- Do I need a game or SDK update for sets? No. Same API names and calls.
- What happens to my existing achievements? They're all in the base game set and appear as one list unless you create other sets.
- Can I move an achievement after release? Yes, with the editor's warnings about hiding it or affecting completion.
Part 2 - Trigger them from your game
With Steamworks.NET in Unity (Facepunch.Steamworks is similar), the pattern is request stats once, set the achievement, then store:
// After SteamAPI initialises (e.g. SteamManager in scene)
using Steamworks;
public static class Achievements
{
public static void Unlock(string apiName)
{
if (!SteamManager.Initialized) return;
SteamUserStats.SetAchievement(apiName); // e.g. "ACH_FIRST_WIN"
SteamUserStats.StoreStats(); // commits to Steam, shows the popup
}
}
// Somewhere in gameplay:
Achievements.Unlock("ACH_FIRST_WIN");
Steam shows the overlay notification the moment StoreStats succeeds. Don't call StoreStats every frame; once per unlock or on save is enough.
Part 3 - Test and reset
Use the link at the top of the editor to preview your achievements on your own Steam achievements page. Put new achievements in a developer-only set to test them without showing players.
Run the game through Steam (or with steam_appid.txt beside the executable in development). Unlocks are real, so you'll want to reset between tests.
You don't need code for this. Start Steam with steam.exe -console, then run achievement_clear <appid> <achievement name> for one achievement, or reset_all_stats <appid> for everything. In code, SteamUserStats.ResetAllStats(true) from a debug key does the same. Keep debug keys out of release builds.