Contents
One Save vs Multiple Save Slots: How To Choose The Right Save Model For Your Game
Decide when a game should use one autosave, manual save slots, character slots, campaign slots, or account-level data.
The best save model starts with the player experience, not the database model.
Some games should have exactly one current save. Other games need manual slots, character slots, campaigns, challenge runs, or separate playthroughs. The mistake is choosing the complex model before the game actually needs it.
For many browser, idle, casual, and prototype games, one autosave is the right first version. Add multiple slots when players need to choose which progress branch they are loading.
This expands the shorter save-model note from How To Add Cloud Saves To An Idle Game. That article focuses on the idle-game save loop. This one focuses on the product decision: when one save is enough, when slots are worth the extra UI, and how to keep the model easy to explain.
Start With The Player Experience
Ask one question first:
When the player opens the game, should they continue immediately, or choose from several saves?
If the answer is "continue immediately", start with one save.
If the answer is "choose a character, campaign, manual save, or run", use slots.
That decision should come before internal ids, storage tables, or backend details. Players do not care how the save is stored. They care whether the game resumes the right progress without surprises.
When One Save Is Enough
Use one save when the game has one obvious current state.
Good fits:
- idle and incremental games
- casual browser games
- prototypes and game jam builds
- single-campaign games without manual saves
- mobile-style games where the continue button is the main path
- games where restarting means intentionally clearing progress
In Persistly's JavaScript SDK, the one-save path is intentionally short:
await PersistlyGameSaves.shared.saveData({
level: 7,
coins: 420,
checkpoint: "forest-gate",
});
const loaded = await PersistlyGameSaves.shared.loadData();saveData and loadData use the default autosave slot behind the scenes. Your game code does not need to invent a slot menu before the game has a real slot-menu problem.
When Multiple Slots Are Worth It
Use multiple slots when the player needs to select from separate progress branches.
Good reasons to add slots:
- multiple characters
- separate campaigns
- manual save slots
- challenge runs
- hardcore or permadeath runs
- local profiles on a shared device
- different build experiments during testing
- a load-game screen with several visible choices
Example:
await PersistlyGameSaves.shared.saveSlot("warrior", warriorSave, {
slotInfo: {
label: "Warrior",
className: "Guardian",
level: 12,
lastPlayedAt: new Date().toISOString(),
},
});
await PersistlyGameSaves.shared.saveSlot("mage", mageSave, {
slotInfo: {
label: "Mage",
className: "Arcanist",
level: 9,
lastPlayedAt: new Date().toISOString(),
},
});
const slots = await PersistlyGameSaves.shared.listSlots();The model is the same as one save: write local data first, then sync at safe moments. The difference is that your game now chooses a stable slot id.
Stable Slot IDs vs Display Names
Do not use a player-facing display name as the slot id.
Good slot ids:
autosaveslot-1campaign-mainwarriormage-runchallenge-2026-06
Risky slot ids:
Astra the BraveMy favorite save!!!Level 12 Mage- translated UI text
- any value the player may rename later
Use a stable slot id for storage and sync. Use slotInfo for labels shown in menus.
What Belongs In Full Save Data
Full save data should contain the playable state needed to resume the game.
Good save data:
type GameSave = {
schemaVersion: 1;
player: {
level: number;
xp: number;
coins: number;
};
inventory: Array<{
itemId: string;
quantity: number;
}>;
quests: Record<string, "locked" | "active" | "complete">;
lastSavedAt: string;
};Keep save data JSON-compatible, versioned, and small enough to migrate. Do not store temporary animation state, hover state, cached UI text, or every derived value on screen.
What Belongs In SlotInfo
slotInfo is preview data for save menus, support context, and lightweight slot selection.
Good slotInfo fields:
labelcharacterNameclassNamelevelchaptercheckpointlastPlayedAtplaytimeSeconds
Example:
await PersistlyGameSaves.shared.saveSlot("slot-1", gameSave, {
slotInfo: {
label: "Main save",
characterName: "Astra",
level: gameSave.player.level,
checkpoint: "forest-gate",
lastPlayedAt: gameSave.lastSavedAt,
},
});Do not put the full game state in slotInfo. Do not put secrets, auth tokens, payment state, or trusted economy decisions there. Treat it as small player-facing and support-facing metadata.
How Cloud Sync Changes The Design
Cloud sync adds two design requirements:
- Local progress must be safe before the network succeeds.
- Conflicts must be explicit when two devices edit the same save.
That means your game should save locally at meaningful moments and sync at safe moments.
Good sync moments:
- manual save
- checkpoint complete
- wave or run complete
- pause menu
- game tab hidden
- app going to background
- player reconnects
Bad sync moments:
- every frame
- every physics tick
- every coin increment in an idle loop
- every animation state change
Persistly is local-first cloud save infrastructure. It is not a real-time multiplayer backend or authoritative economy server.
Conflict Handling For Slots
Conflicts are easier to explain when the save model is clear.
For one-save games, the conflict question is usually:
Keep this device's autosave, keep the cloud autosave, or ask the player?
For multi-slot games, the conflict is slot-specific:
Slot
mage-runhas local changes and cloud changes. Which version should win?
Keep enough slotInfo to show useful recovery UI. A label, level, checkpoint, and last-played timestamp can be enough for a player to make the right decision.
When Account-Level Data Enters The Model
Some data is not tied to one slot.
Examples:
- accessibility settings
- global preferences
- account-wide unlock flags
- a shared stash in a single-player game
- global tutorial completion
Use account-level data only when the information truly belongs across slots. Do not move everything there just because it feels convenient. Slot-specific progress should stay in the slot's save data.
For a first release, many games can skip account-level data entirely and start with one autosave.
Practical Checklist
Use one save when:
- the game has a single continue path
- the player should not choose a slot
- progress is one continuous state
- you want the fastest possible integration
Use multiple slots when:
- players choose characters, campaigns, or manual saves
- separate runs can exist at the same time
- the game needs a load-game screen
- slot-specific conflicts need player-facing recovery
Use slotInfo when:
- a menu needs preview fields
- support tools need lightweight context
- the game wants to show level, chapter, class, or last-played time without loading every full save
Avoid:
- unstable slot ids
- storing full game state in
slotInfo - treating client saves as anti-cheat
- syncing every frame
- adding multi-slot UI before players need it
Next Steps
If you are building a simple browser game, start with the JavaScript SDK install guide. If you are working in Unity or Godot, use the matching SDK guide. If you already have multi-device saves, read the conflict guide before shipping.