Quick answer: Before any build ships, run a layered check: a fast smoke test that proves the build is not dead on arrival, a pass over the critical paths every player relies on, and targeted regression around whatever you changed this release. You will not test everything, so spend your limited time where a failure would hurt most, and make the routine the same every release.

The scariest builds are the ones that look fine on the developer's machine and fall apart in the wild. Shipping is the moment your game leaves the safe, familiar environment where it was built and meets real devices, real saves, and real players who do things you never imagined. A structured pre-ship test is the gate that catches the avoidable disasters before they reach anyone, and for an indie team without a dedicated QA department, having a repeatable routine matters more than having a big one. This post covers a layered approach: a fast smoke test, a pass over the critical paths, and targeted regression around what changed, so you ship with confidence rather than hope.

Start with a smoke test

A smoke test is the fastest, cheapest check there is, and it answers one blunt question: is this build dead on arrival. It is a handful of steps that must always pass, run first, before any deeper testing. Launch the game, get past the splash and menus, start a new game, load a save, enter core gameplay, and quit cleanly. If any of these fail, the build is not shippable and there is no point testing anything else until it is fixed. The smoke test catches the catastrophic, embarrassing failures that should never reach a player.

The value of a smoke test is that it is short enough to run every single time, on every build, without anyone groaning about it. Keep it to a few minutes and a fixed script so it is the same each release and requires no thought, just execution. A build that passes the smoke test is not proven good, but a build that fails it is proven broken, and catching that in two minutes on your own machine is infinitely better than discovering it from a flood of one-star reviews an hour after release.

Cover the critical paths

Once the build survives the smoke test, walk the critical paths, the sequences of actions that the largest number of players depend on or that would cause the most damage if broken. For most games this includes the full new-player flow from first launch through the opening, the core gameplay loop, saving and loading, and anything involving real money like purchases or restoring them. These are the paths where a bug is least forgivable, because they touch nearly everyone or touch trust directly, so they earn a careful pass every release regardless of what changed.

Be deliberate about what counts as critical for your specific game, because it varies. A multiplayer game lives or dies on matchmaking and connection, a narrative game on save integrity across chapters, a live-service game on the daily login and reward flow. Write your critical path list down once and refine it over time, so the pre-ship pass is consistent and nobody has to remember what matters at eleven at night before a release. The list is your insurance that the things players cannot tolerate being broken get checked every single time you ship.

Targeted regression around your changes

You cannot retest the entire game every release, so spend your regression effort where this build actually changed. Whatever code, content, or systems you touched since the last release is where new bugs were introduced, so test those areas thoroughly and test the features adjacent to them, since changes have a way of breaking neighbors through shared code. A change to the inventory system warrants exercising not just inventory but anything that reads from it, like the shop, the loadout screen, and combat that consumes items.

Regression also means re-checking the specific bugs you fixed this release, confirming each fix actually works and that fixing it did not break something else. Keep a record of what changed so the regression scope is obvious rather than guessed, and lean on any automated tests you have to cover the repetitive cases, freeing your manual attention for the judgment-heavy ones. The combination of always-on critical paths plus change-targeted regression gives you broad safety on the things that always matter and deep coverage on the things you just put at risk.

Test on real and varied targets

A build that works on your high-end development machine can fail badly on the hardware your players actually own, so test on representative targets, not just the most powerful one in the room. Low-memory devices, older operating systems, and different graphics backends surface a whole class of problems, crashes, slowdowns, and rendering glitches, that a single powerful machine never reveals. You do not need a giant device lab, but a small spread of realistic targets, including the lower end of what you support, catches the failures that disproportionately hit real players.

Test with realistic state, too, not just a pristine empty profile. Load saves from previous versions, accounts at different progress levels, and players with content already downloaded, because the freshly built clean install is the least common way your game is actually run. Bugs love the messy middle of a long-played save or an upgraded install, and those bugs are invisible to anyone testing only from a clean slate. Realistic devices and realistic data together are what make a pre-ship test predict the live experience instead of an idealized one.

Setting it up with Bugnet

Pre-ship testing is most valuable when it produces clean, actionable reports rather than scribbled notes, and Bugnet turns your test pass into exactly that. When a tester hits a bug during the critical-path or regression pass, the in-game report button captures game state automatically, attaching the build, device, platform, and reproduction context, so the developer fixing it does not have to reconstruct what the tester did. Crashes during testing arrive with stack traces and device context, which on a varied device pass is exactly the information you need to tell a device-specific failure from a universal one.

Bugnet also extends your testing past the gate into the staged rollout. After you ship, occurrence grouping shows any new issue as one entry with a live count, so you can watch the build's real-world behavior and catch anything your pre-ship pass missed before it spreads. Filtering by build lets you compare the new release against the previous one in one dashboard, and the same reporting flow your testers used works for real players, making the transition from internal testing to live monitoring seamless rather than a separate, disconnected process.

Make it a repeatable ritual

The point of all this is repeatability, because a testing routine that changes every release is one you cannot trust. Write down the smoke test steps, the critical path list, and your regression approach as a short release checklist, and run the same one every time. A checklist is not bureaucracy, it is how a tired team at the end of a long cycle still remembers to check the things that matter, and how a solo developer avoids forgetting the step that always bites them. Consistency is what makes the routine reliable rather than a matter of mood.

Treat the checklist as a living document that learns from your mistakes. Every time a bug reaches players that your pre-ship test should have caught, ask what check would have caught it and add that check, so your gate gets a little stronger with each release. Over time this turns a small indie team's testing from anxious guesswork into a dependable process that catches the avoidable disasters every time, letting you ship faster precisely because you trust the gate. The goal is not perfect coverage, it is steady, repeatable confidence that what you ship is not broken on arrival.

You will not test everything, so test where failure hurts most. Smoke test first, walk the critical paths, regress what changed, and make it the same ritual every release.