You are three weeks from your Steam page going live, someone opens the Steamworks achievement config, and the list looks like this: Complete Chapter 1. Complete Chapter 2. Complete Chapter 3. Twenty-four entries, eighteen of them the same idea with a different number. It ships. Nobody complains. Nobody ever talks about it either.
Achievements are one of the cheapest surfaces in your whole game — a few flags, some art, a line of text each — and one of the most consistently wasted. A good list does real design work. A bad list is a chapter counter.
Here's a framework you can run in an afternoon, using a small roguelike I'll call Tidewreck as the worked example: run-based, five biomes, six weapon families, roughly a 25-minute run.
What an achievement list is actually for
Three jobs, in priority order:
- Signposting. The list is a public statement of what your game rewards. If every entry is about finishing, players read the game as a corridor. If a third of them are about weird weapon combinations, players read it as a sandbox — before they've even bought it.
- Directing replay. Most small games have content the median player never touches: the alternate boss, the secret biome, the weapon nobody picks. Achievements are the cheapest tool you have for pushing a second and third session toward that content.
- Shaping the storefront. On Steam the achievement list is visible on your store page, and it's read by people deciding whether to buy. "Kill the Tidewarden using only thrown objects" sells a game. "Complete Chapter 3" does not.
Note what isn't on that list: rewarding time spent. Endurance achievements have a place, but if grinding is your main lever you're using the system as a retention gimmick instead of a design surface, and players can smell it.
Start with a completion curve, not a list
The mistake is brainstorming 24 achievements and then wondering why the list feels flat. Decide the shape first — how many players you intend to unlock each tier — and fill the buckets afterward.
For a 24-achievement list on a small game, a healthy target shape:
| Bucket | Target unlock rate | Count | What it's for |
|---|---|---|---|
| Onboarding | 80–95% | 3 | Fires in the first session. Teaches that the system exists. |
| Progression | 35–70% | 7 | Tracks the main path. The spine of the list. |
| Exploration | 15–35% | 5 | Off-path content, optional areas, hidden interactions. |
| Mastery | 8–20% | 6 | Skill or system expression. The ones people screenshot. |
| Long tail | 1–5% | 3 | Deliberately hard. Gives completionists a target. |
These are design targets, not predictions — you'll only learn the real curve after launch. But writing the intended rate next to each achievement changes how you write them. When you've already committed to "8–20% should unlock this," you stop writing another completion flag and start asking what 1-in-8 players actually do that's interesting.
Two rules fall out of the shape:
- At least one unlock inside the first ten minutes. In Tidewreck that's First Blood — clear the opening room. It costs nothing and tells the player the game is watching.
- Nothing in the long tail that requires luck alone. "Find the golden anchor" (0.5% drop) is not a mastery achievement, it's a lottery ticket. If randomness is involved, let the player farm toward it deterministically.
Five types, and how to write each
Once the buckets exist, generate candidates by type rather than by level.
Progression — the spine. Keep these coarse. Tidewreck has five biomes and three progression achievements, not five: reach biome 3, beat the game once, beat it on the hardest difficulty. Every extra "reach area N" you add dilutes the list.
Mastery — expresses skill or system understanding. Untouchable: clear a biome without taking damage. Pacifist Run: reach the third boss having killed fewer than 10 enemies. These are the entries that teach players your game has depth.
Exploration — pushes at content coverage. Full Armoury: use every weapon family at least once across your save. Deep Water: find the flooded vault. Good exploration achievements make a player say "wait, there's a vault?"
Expression — rewards using systems in unintended-looking ways. Salvage Economy: finish a run having bought nothing from any shop. Overloaded: carry four cursed items at once. These are the cheapest to design and the most fun to read, because they're just combinations of things your systems already track.
Endurance — time or repetition. Cap it at two or three, and make them cumulative across saves so they read as a running tally rather than a chore. Tidewreck has one: 100 total runs.
The anti-patterns, and what to do instead
| Anti-pattern | Why it hurts | Fix |
|---|---|---|
| Permanently missable | Player misses it in hour 2, learns in hour 30, refunds their goodwill | Make it repeatable, or add a chapter-select |
| Multiplayer-dependent in a small game | Unobtainable within a year as the population thins | Allow bots, or cut it |
| Pure grind (kill 10,000 enemies) | Reads as padding, not challenge | Reduce the number until it lands inside normal play |
| Hidden with no hint | Players go to a wiki instead of your game | Show the name, hide only the criteria |
| Achievement for buying DLC | Nothing was achieved | Delete |
On hidden achievements specifically: hide sparingly, and hide the description, not the entry. A row of grey question marks tells a player nothing except that they're missing something. A visible name like Deep Water with a hidden condition is a genuine hook.
Names and descriptions are copy, not labels
You get two short strings per achievement and they're read more often than most of your dialogue. Treat them as writing.
- Name: short, evocative, in the game's voice. Untouchable, not No Damage Clear.
- Description: state the condition precisely enough that a player can plan against it. "Clear any biome without taking damage" — not "Don't get hit!" Ambiguity here generates support threads.
- Watch the character budget. Steam truncates long names in some views, and every string here goes into localization. If you're planning to ship in more than one language, leave meaningful headroom — compound-heavy languages like German routinely need noticeably more space than the English source, and an achievement name that only just fits in English will break somewhere.
Wire it into production before you write the triggers
The failure mode isn't design, it's plumbing: three achievements never fire because the flag was set in a scene that reloads, and nobody notices until a player posts about it.
A short pre-ship checklist:
- Every achievement has an owner, a trigger location in code, and a test method written down
- Each one has been unlocked once on a clean save by someone who didn't implement it
- Nothing fires on save-load, scene reload, or replay of a completed section
- Cumulative counters persist across saves and survive a crash
- Icons exist for both locked and unlocked states, at the required resolution
- Names and descriptions are in your localization sheet, not hardcoded
- The list has been read end-to-end by someone outside the team, as if it were a store page
That last one catches more problems than any of the others.
If you're tracking this in GameDesignerX, the Achievements module is the place to keep the bucket, the target rate, the trigger condition, and the localized strings on one row per achievement — and it feeds the Steamworks prep checklist directly, so the list you designed is the list you upload rather than something retyped into a web form at 2am. Link each row to the mechanic or level it depends on and the orphans — the ones whose content got cut — show up immediately.
After launch, read the curve
Two weeks in, pull the global unlock percentages and compare them to the targets you wrote. Where reality diverges, it's telling you something specific:
- Onboarding achievement below 70% — players are bouncing before the first unlock, or the trigger is broken. Check the trigger first.
- A mastery achievement at 40% — it wasn't as hard as you thought, which usually means the underlying system is easier to break than you modelled.
- A progression achievement with a cliff after it — that's your drop-off point, named and located for free.
That last signal is worth the whole exercise on its own: a well-shaped achievement list is a funnel diagram embedded in the platform, updating forever. Log what you find so the next project starts from the real curve instead of the guess.