← All devlog posts

Shipping Solo: the Meta Submission Checklist Nobody Tells You About

  • devlog
  • shipping
  • meta-quest

Get Buckets VR is now in submission to the Meta Horizon Store, which means I have spent the last few weeks reading Meta’s developer documentation more carefully than I have read almost anything else this year. Some of what is in there is exactly as dry as it sounds. Some of it is the kind of thing that only becomes obvious after it has already cost someone a shipped game, and a few of those points are worth writing down properly, because I had to piece them together from scattered forum threads rather than one clear checklist.

Your bundle ID is permanent the moment you upload

The Android package name you set in Unity’s Player settings becomes the app’s permanent identity on the Meta Quest Developer Center the first time you upload a build to any release channel, including the private alpha channel. There is no rename operation. Decide you do not like it after your first internal test upload, and your only real option is to create an entirely new app listing and start over, alphas, reviews, and all. I treated this the way I would treat naming a public GitHub repo I intend to keep, picked the final com.eonnexus.getbucketsvr style identifier before the first upload, and never touched it again.

The signing keystore is a credential you cannot lose

Every Android build is signed with a keystore, and Meta requires every subsequent update to an app be signed with that same keystore. Lose it, and there is no recovery path, no support ticket that gets it back, because the whole point of code signing is that nobody, including the platform, can substitute a new key and have it still count as the same app. Losing your keystore for a shipped app means you cannot ship another update to it, ever, under that listing.

For a solo developer this is worth treating like a root credential rather than a build artifact. Mine lives in a password manager entry, on an encrypted external drive, and in a second physical location, because “my laptop’s SSD” is not a backup strategy, it is a single point of failure with a hard deadline attached.

Unity does not remember your keystore password the way you think it does

Unity’s Keystore Manager will happily take your keystore password and use it for the current editor session, and then forget it the next time you open the project, unless you have gone into the player settings and explicitly told it to keep the key alongside the keystore. I assumed the first successful build meant it was saved. It was not. I found out mid unattended build, when a scripted build step failed on a password prompt with nobody at the keyboard to answer it. The fix is one settings checkbox, but it is very easy to skip because everything works fine right up until the moment it does not.

Store metadata gets rejected for reasons that feel unfair until you think about it

This is a basketball game, and Meta’s review flags anything that reads as trading on real league or team branding, even accidentally, even in a screenshot caption. No NBA, no real team names, no implied endorsement or affiliation, even in throwaway marketing copy that was never meant to be taken literally. I had a screenshot caption calling a shot “an NBA-range three” rejected in an early metadata pass, purely descriptive, zero intent to imply affiliation, and it still came back flagged. The lesson was not “the reviewers are being difficult,” it was “write every public facing string as if a trademark lawyer will read it literally,” which is a genuinely useful discipline even outside submission.

The rest of the checklist, briefly

A working privacy policy URL is required before submission, not optional, which is part of why this site has one. The build itself must be IL2CPP with ARM64 as the target architecture; Meta rejects Mono or x86 builds outright at upload. Screenshots need to be captured clean, at the required resolution, with no debug overlays or developer UI visible. And the first review pass can take one to two weeks, sometimes longer, so it needs to be in the schedule as its own milestone, not an afterthought tacked onto the end of a ship date.

None of this is complicated once you know it. All of it is expensive to learn the hard way, which is exactly why it is worth writing down before I forget the details myself.