Steam Achievement Sets First Indie Beta Worksheet 2026
![]()
This is a fill-in steam achievement sets lab. You will create one set on an app you do not ship, put one throwaway achievement in it, mark the set developer-only, and stop before Publish.
Steam achievement sets arrived in the October 15, 2026 client beta. The Steamworks achievements guide says you configure sets in the partner site. You do not ship a new SDK, and you do not change SetAchievement. That is why this lab is an editor evening, not a depot evening. It is also why a careless Publish is easy.
The what-changed map explains base sets, DLC sets, and the 40-set cap. The archive refusal explains why you do not retire a live row the same night. This page is the blank form you fill before either of those decisions touches the app players already run.
Result: a draft set that only developers could see, on a lab app id, with Publish never clicked. Time: 70 to 90 minutes if the lab app already exists. Refuse: archive, moving earned achievements, and Publish on the shipping app.
Why this matters now
The October 15 announcement and the guide both put the new controls on the achievements editor. Create New Set, a restriction, a developer-only flag, and Archive sit in the same menus. The first time you open that page on a live game, the base set already holds every achievement you ship. Saving writes a draft. The Publish tab in Edit Steamworks Settings is what players can receive.
A first lab that uses the shipping app id will eventually publish, because the same browser session is how you fix a typo on a real achievement. Split the apps before you learn the buttons. The Verge reported the new achievements page in the Steam client beta. You do not need that client channel to complete this worksheet. You need a partner login and an app id that is not the one in your store build.
Direct answer: Sections A through F below. Copy the blanks into a ticket. Stop when Section E says the draft is unpublished. Do not continue into a live set the same night.
Who fills this in
| Reader | Done when… |
|---|---|
| Beginners | The lab app id and the shipping app id are different numbers on the page |
| Developers | One developer-only set contains one new API name the game does not call |
| Creators | You can say “we did not publish” in a devlog without hedging |
| Companies | The receipt names an owner and a Publish value of no |
If you only have one app id, and it is already live, do not invent a second product tonight. Use Section A’s fallback. The fallback is still “developer-only, do not publish, do not move existing rows.” It is narrower than a lab app. It is not permission to reorganize the base set.
Decision before Section A
| Latch | Meaning | This worksheet |
|---|---|---|
| LAB_DRAFT | One new set, developer-only, unpublished | Pass |
| SHIP_APP | Any edit on the app id your players run, including a “tiny” rename | Fail this lab |
| HOLD | You cannot name a non-shipping app and you will not accept the fallback | Stop. No editor |
LAB_DRAFT is the only pass. The set may be saved. Saved is a draft. Players do not see a draft. The guide’s visibility label Will be visible upon publish means the set is not public yet. Hidden by restrictions is what you want if the developer-only flag is on. Either label is acceptable in Section E. Visible on a set you just created means you already published, and this lab has failed.
Section A — Two app ids (fill in)
Open Steamworks and write both numbers before you click Achievements.
| Blank | Your value |
|---|---|
| A1. Shipping app id (the one in the live depot) | |
| A2. Lab app id (unreleased, playtest, or a demo you can spoil) | |
| A3. Are A1 and A2 different? | yes / no |
| A4. Lab app status | unreleased / playtest / internal demo / fallback-only |
| A5. Your partner account can open Edit Steamworks Settings on A2 | yes / no |
Pass: A3 is yes, A5 is yes, A4 is not “fallback-only.”
Fallback, only if A3 is no: you may open A1, and only if you accept all of these in writing on the ticket. You will not publish. You will not edit any existing achievement. You will not move any row out of the base set. You will not archive. You will create one developer-only set and one new API name. If you cannot accept that list, latch HOLD and close the tab.
Fail: A2 is blank and you are already on the Achievements page of A1. Back out. The Unity unlock help page is the page for a grant that never fires. It is not a lab app. Do not “test sets” by triggering a real API name.
Success check: you can read A1 and A2 aloud and they are not the same integer.
Section B — Read the base set before you add one (fill in)
On the lab app, open Edit Steamworks Settings, then Stats & Achievements, then the achievements editor. Stay on Manage Achievements. The guide says every achievement that is not assigned elsewhere already sits in the base game achievements set. That set cannot be renamed, deleted, or reordered. It is always shown first unless it is empty, and an empty base set still counts toward the 40-set limit.
Do not click Create New Set until this table is filled.
| Blank | Your value |
|---|---|
| B1. Achievements used, from the toolbar counter | |
| B2. Cap you believe applies (100 if the app is not vetted, 5,000 if it is) | 100 / 5,000 |
| B3. Sets used, including the base set | |
| B4. Sets remaining under 40 | |
| B5. Name of the base set as shown (it cannot be renamed) | |
| B6. Count of achievements currently in the base set | |
| B7. Any custom set already present | none / list names |
Pass: B3 is at least 1 (the base set) and B4 is at least 1. You need a free set slot. Forty includes the base set. If B3 is 40, stop. This lab does not include deleting a set. Deleting a set requires every achievement in it to be moved or deleted first, which is a live-schema operation even on a lab app if those rows were ever published.
Do not “tidy” B6. Moving an achievement between sets is allowed, and the editor warns when a move can hide an earned row or disturb completion. This worksheet’s achievement is new. It is not a move.
Success check: B7 is written, even if the word is “none.” You know the counter before you add one.
Section C — One developer-only set (fill in)
The guide’s create path is five steps. Do them once.
- On Manage Achievements, click Create New Set.
- Enter a set name players would see if this were ever public. For the lab, use a name that cannot be mistaken for a feature.
LAB SETis enough. Keep it short. Set names show up in the client. - Under Restrictions, choose All players of the game. Do not pick a DLC. A DLC restriction is a real product rule. The guide will prefix the public name with “DLC”, so you must not type DLC into the name. You are not practicing that tonight.
- Mark the set Developer-only.
- Save.
A developer-only set is visible only to developers of the app, whether or not the app has been released. Only developers can unlock achievements in it. That flag is the safety rail if someone publishes later by habit. It is not a substitute for “do not publish.” Both apply.
A set with no achievements does not appear to anyone. Section D is what makes the set real in the editor. Until then, an empty set is a name in the draft.
| Blank | Your value |
|---|---|
| C1. Set name you typed | |
| C2. Restriction | All players of the game |
| C3. Developer-only | yes |
| C4. You typed the word DLC into the name | no |
| C5. You clicked Archive on this set or any other | no |
| C6. You clicked the Publish tab | no |
Fail C3, C5, or C6: stop the lab. If you archived anything, follow the archive page’s recovery notes. Do not “undo” by deleting earned rows. If you published, say so in Section F. Do not pretend the draft is still private.
Success check: the new set is in the editor, C3 is yes, C6 is no. The base set is still first and still not renamed.
Section D — One throwaway achievement (fill in)
Click Create Achievement inside the set from Section C. Do not create it in the base set and move it. The form’s In Set field should already be the lab set.
Use a new API name. The guide’s example shape is a string such as ACH_WIN_ONE_GAME. Your lab name must be one the shipping build does not pass to SetAchievement. A safe pattern is LAB_SET_DO_NOT_SHIP. The API name is what code sends. The display name is what a developer would read on the preview. They are different fields.
Fill the minimum the editor requires for the row to exist. An icon and localized names matter for the release checklist, which demands a name in each configured language and an icon before achievements fully clear that checklist. This lab is not a release. Still give the row an English name and a temporary icon so you see the real form, not a half-broken draft you do not understand. Do not localize twelve languages tonight unless your lab app already has those languages configured and the warning icon is teaching you something specific. Note the warning if it appears. The guide shows a warning in the toolbar when languages are missing, and English is required on the set-name localization CSV. The base set cannot be renamed through that CSV. You are not importing a CSV in this lab.
Leave progress stat blank. A progress stat has to exist already and share the achievement’s permission. Inventing a stat is a second feature.
| Blank | Your value |
|---|---|
| D1. API name | |
| D2. Display name (English) | |
| D3. In Set | must match C1 |
| D4. Hidden / spoiler flag | off for this lab |
| D5. Progress stat | blank |
| D6. Icon added | yes / no |
| D7. This API name appears in the shipping game’s source | no |
| D8. Global unlock rate shown for this new row | expect 0 or empty |
Pass: D3 matches C1, D7 is no, D8 is not a public rate you recognize from the live game. If D8 already shows a percentage, you edited an old row. Stop.
Spoiler achievements, which used to be called hidden, hide their name and description until unlock. Leave that off. You want to see the name in the editor without an extra reveal step.
Success check: the achievements table shows one new row whose set column is C1, and the base set’s count (B6) did not drop.
Section E — Read visibility, then leave (fill in)
Open the set menu and read visibility. Do not choose Edit set unless a blank above is wrong. The guide lists three visibility states.
| State | Meaning | Allowed in this lab? |
|---|---|---|
| Hidden by restrictions | Players cannot see it yet, for example developer-only or unreleased DLC | Yes. This is the expected state |
| Will be visible upon publish | Players would see it after you publish | Only if you forgot developer-only. Go back and set C3 before you continue |
| Visible | Players can see it | Fail. You published, or this was not a new set |
| Blank | Your value |
|---|---|
| E1. Visibility label | |
| E2. Sets used now (should be B3 + 1) | |
| E3. Achievements used now (should be B1 + 1) | |
| E4. Preview link opened from the top of the editor | yes / no |
| E5. On that preview, the lab set is absent for a normal player view, or marked so only developers would see it | yes / no / could not tell |
| E6. Publish tab clicked | no |
| E7. Any achievement’s Archived box or set Archived flag | no |
| E8. Browser tab closed without a second save that clears developer-only | yes |
Preview is your own achievements page, linked from the editor. It is not the public store panel. The store panel omits spoiler and archived achievements. You did not archive, so do not use the store panel as the proof. E4 is optional if the preview confuses you. E6 and E7 are not optional.
If E1 is “Will be visible upon publish,” the set is still a draft, but it is one click from players. Set developer-only, confirm E1 changes to hidden by restrictions, then stop. Do not publish in order to “see it once.”
Pass: E6 is no, E7 is no, E2 is B3 plus one, E3 is B1 plus one.
Success check: you can leave the partner site. The draft can sit. An unpublished lab set does not change the shipping depot, the SDK, or SetAchievement.
Section F — Latch and the one sentence (fill in)
| Blank | Your value |
|---|---|
| F1. Latch | LAB_DRAFT / SHIP_APP / HOLD |
| F2. One sentence a teammate can read | |
| F3. Date | |
| F4. Owner (partner account, not a nickname you invent for a stranger) | |
| F5. Will anyone else open this app’s Publish tab today | no |
F2 must include the lab app id, the set name, and the word unpublished. A usable sentence looks like this, with your numbers:
LAB_DRAFT on app 000000: set LAB SET is developer-only, API name LAB_SET_DO_NOT_SHIP, Publish not clicked.
Fail the sentence if it says the shipping app id, if it says archived, or if it says players can see the set.
If F1 is SHIP_APP, write what was published and stop. Do not “balance” it by archiving the lab set. Archive is a separate, planned retire. A lab set that was published by mistake should be fixed by someone who has read the visibility rules, in a second sitting, not in the same hour.
Gates you can paste above the ticket
All eight must be true before you call the evening done.
| Gate | Pass condition |
|---|---|
| G1 | Shipping app id and lab app id differ, or the written fallback is attached and Publish stayed unused |
| G2 | Base set was not renamed, deleted, or reordered |
| G3 | Exactly one new set |
| G4 | That set is developer-only |
| G5 | Exactly one new achievement, and its API name is absent from the shipping build |
| G6 | No achievement was moved between sets |
| G7 | Nothing was archived |
| G8 | Publish was not clicked |
Four of those are the minimum a lead should read in stand-up. G1, G4, G7, G8. The other four catch the quiet mistakes. Moving a row and renaming the base set are easy to do while “just looking.”
What you are not proving
This lab does not prove the Steam client beta shows set progress bars to players. The new page is in the client beta, and your set is developer-only and unpublished. A friend on the stable client who sees one flat list has not invalidated your worksheet.
This lab does not prove SetAchievement works. You chose an API name the game does not call. If you want a grant test, that is a later build on the lab app id, with Steam initialized, and it is still not a publish of the shipping app. The help page linked above is the path when a real API name never stores.
This lab does not free achievement slots. The toolbar counter went up by one. Archived rows count toward the cap too, which is irrelevant tonight because you did not archive. An unvetted app still lives under the 100-achievement ceiling. If B1 was 99, you spent the last slot on a lab row. That is a reason to use a separate lab app, not the shipping app, when the live game is near the cap.
This lab does not localize a commercial set. If the toolbar warning is on, write “languages missing” in the receipt and leave it. English on a set name matters when you eventually publish a real set. The set localization CSV is one row per set, with setid and a column per language. You create the set in the editor before that file can name it. Skip the file tonight.
Receipt you can drop in the repo
Save this next to the ticket. It is a form, not a claim that a studio already ran it. Replace every empty string. Do not invent unlock rates.
{
"receipt": "steam_achievement_sets_lab_receipt_v1",
"date": "",
"latch": "LAB_DRAFT",
"shipping_app_id": "",
"lab_app_id": "",
"set_name": "",
"developer_only": true,
"api_name": "",
"api_name_in_shipping_build": false,
"archived": false,
"published": false,
"sets_used_after": "",
"achievements_used_after": "",
"visibility": "Hidden by restrictions",
"owner": ""
}
Reject the file if published is true, if archived is true, if developer_only is false, or if the two app ids match and you did not attach the fallback note. A receipt that says latch: LAB_DRAFT and published: true is a contradiction. Fix the latch, do not fix the story.
The Steamworks resource list is where depot and partner-doc links live. This receipt is not a depot manifest. There is no build id because you did not upload a build.
Ninety minutes, in order
| Minutes | Do | Stop if |
|---|---|---|
| 0–15 | Section A. Write both app ids. Open only the lab app | You are inside the shipping app’s editor |
| 15–30 | Section B. Copy the toolbar counters. Do not create yet | Sets used is 40 |
| 30–45 | Section C. One developer-only set. Save | You opened Publish or Archive |
| 45–70 | Section D. One new API name inside that set. Confirm it is not in the shipping source | The set column shows the base set |
| 70–80 | Section E. Read visibility. Do not publish | Visibility says Visible |
| 80–90 | Section F and the receipt JSON | The sentence names the shipping app |
If you finish early, do not spend the remainder creating a second set, a DLC restriction, or a CSV import. Those are real tools. They are a second evening. The definitions CSV can carry setid and archived. Importing archived: true on a lab sheet is how a “practice file” retires a row. Do not import tonight.
A filled example that is still not a case study
The numbers below are a shape for the blanks. They are not a report from a released game.
| Blank | Example only |
|---|---|
| A1 | 480001 |
| A2 | 480099 |
| C1 | LAB SET |
| C3 | yes |
| D1 | LAB_SET_DO_NOT_SHIP |
| D7 | no |
| E1 | Hidden by restrictions |
| E6 | no |
| F1 | LAB_DRAFT |
If your lab app’s ids happen to match a real product, change them. The pass condition is the relationship. A2 is not A1. The API name is not in the build. Publish stayed closed.
What failure looks like on the same table: A2 copied from A1, D1 set to ACH_WIN_ONE_GAME because the guide used that string and your game also uses it, E6 yes because the preview “did not show anything” and you published to force it. That last step makes a developer-only set exist on the live configuration. Players still should not see a developer-only set, and you still violated G8. Write SHIP_APP, tell the person who owns Publish, and do not archive it to hide the evidence.
Developer mistakes that pass a quick glance
Creating the achievement in the base set. The row exists, the new set stays empty, and an empty set does not appear. The lab did not attach the API name to the set. Check the set column, not only the achievement list.
Clearing developer-only to “preview as a player,” then saving. Visibility moves toward “will be visible upon publish.” You are one Publish away from a public lab set named LAB SET on whatever app you had open. Set the flag again before you leave.
Using the shipping app because the lab app has zero achievements and the editor felt pointless. Zero achievements is the right starting counter. The base set may be empty. It still counts as a set. Your new set is number two. That is the whole lesson.
Reordering sets. The base set cannot be moved. Custom sets can. You have one custom set. Reorder does nothing useful. Skip it.
Testing the unlock in the shipping build with the lab API name “just to see.” You told Section D the shipping build does not contain that string. Adding it to the shipping branch couples the lab to the depot. Test grants, if you ever do, on a build uploaded to the lab app id.
Publishing “only the achievement text” from the Publish tab. That tab publishes Steamworks configuration as a bundle of pending changes, the same way other settings publish. Assume the lab set is in the pending pile. If the pile also contains an unrelated price or depot note, do not publish the pile to “clear the badge.”
How this sits next to the other two pages
Use the what-changed article when someone asks what a DLC set does to base completion, or whether the SDK moved. Use the archive article when someone wants to retire a seasonal row that already has a global unlock rate. Use this worksheet when nobody has created a set on purpose yet. The free tools list is the toolbox, not a second lab.
Do not merge the three jobs into one evening. A team that reads the map, archives a holiday row, and creates a lab set on the shipping app has done three publishes’ worth of risk and zero labs. The pass is boring. One set. One API name. No Publish.
The fest hour-one parity checklist still uses “set” to mean the list of achievements a demo is allowed to show. That is not a Steamworks set object. Passing this lab does not freeze a fest overlay. Failing to pass it does not excuse a demo that advertises chapter-four icons.
Key takeaways
- The October 15, 2026 sets beta is configured in Steamworks. This lab does not bump the SDK or call a new API.
- LAB_DRAFT means one new developer-only set on a non-shipping app id, left unpublished.
- Write the shipping app id and the lab app id in Section A before you open Achievements. They are different numbers.
- Read the toolbar counters first. You need a free slot under the 40-set cap, which includes the base set.
- Create the set with All players of the game, then mark Developer-only. Do not put “DLC” in the name.
- Put one new achievement in that set. The API name must not exist in the shipping build.
- Do not move existing achievements. Do not archive. Do not rename the base set.
- Visibility should read Hidden by restrictions. Visible means this lab failed.
- Saving is a draft. The Publish tab is the action this worksheet forbids.
- A receipt with
published: truecannot also sayLAB_DRAFT. - Stop after ninety minutes. A second set, a CSV import, and a DLC restriction are later sittings.
FAQ
Do I need the Steam client beta installed to do this lab?
No. You create the set on the partner site. The client beta is where players see the new achievements page. Your set stays developer-only and unpublished, so a friend on the stable client is not the success check.
Can I run the lab on the live app if I promise not to publish?
Only as the Section A fallback, and only with a developer-only set, a brand-new API name, and no edits to existing rows. A separate lab app is the pass this worksheet is written for. The Publish tab does not know you promised.
What if the new set does not show on my personal achievements page?
An empty set does not appear. A developer-only set is for developers of that app. Confirm the achievement’s set column, then the visibility label. Do not publish to force a public row.
Should the lab achievement be hidden or archived?
No. Leave the spoiler flag off so you can read the name. Leave archive off. Archive changes who still sees a row and what counts as completion. That is the other article, not this form.
Will this lab change achievement completion for players?
Not if you never publish and you never move or archive an existing achievement. A draft on a lab app does not touch the shipping app’s completion math.
What did I do wrong if the base set count dropped?
You moved or deleted an existing achievement. This lab only adds a row. Stop, write what you moved, and do not publish. Put the row back only if you are sure it was never player-visible. If it was, get a second person before any further edit.
Can I delete the lab set when I am finished learning?
You can delete a set only after its achievements are moved or deleted. On a lab app that never published, deleting the throwaway achievement and then the empty set is a reasonable later cleanup. Do that in a second sitting, on the lab app id, and do not practice the delete clicks on the shipping app.
Is the API name from the official guide safe to reuse?
Only if your game does not already use it. ACH_WIN_ONE_GAME in the guide is a sample. If your project copied the sample, pick a different lab string and grep the shipping branch before you save.
What to do next
Copy Sections A through F into a ticket and fill them on the lab app. Attach the receipt JSON with published false.
If you cannot name a lab app id, stop with HOLD. Reading the what-changed page is the useful substitute. Archiving a live seasonal achievement is not the substitute.
When the receipt is honest, you have earned the right to talk about a real set on the shipping app. That conversation still starts unpublished, and it still does not happen in the same hour as this lab.