What it was
Every download path in the studio's launcher assumed the game was free. Their first paid title needed ownership checks across the launcher, backend and CDN. I worked on the Lambda entitlement checks, Akamai's gating around the files and the TypeScript and React launcher. We also added single-use vouchers for developers and beta testers. Launch day was an important part of the design, because almost no traffic could become the whole player base arriving within a few minutes.
Build
- Lambda checks the player's entitlement before a download is issued. The check is stateless, so it can scale up for a premium unlock.
- The download bytes go through Akamai. The entitlement service makes a small access decision and never carries the game files.
- Akamai enforces access at the delivery layer, so guessing or sharing the file URL is insufficient.
- The launcher checks the response before offering a download and tells the player why access was refused.
- Single-use vouchers provide beta access without leaving permanent entitlements to withdraw later.
- The paid path runs alongside the existing free-to-play downloads.
Key decisions
Lambda
The authorisation request has very uneven demand. Lambda suited that better than keeping a fleet warm for a launch spike. Cold starts were acceptable before a large download.
Beta vouchers
The codes could be used once, giving testers access without creating a permanent list of entitlements somebody would have to clean up.
Existing games
The free-to-play path was already live. I added the paid checks beside it so we could work on the new title without changing how the existing games downloaded.
Lesson learned
A backend check still left the file URL to protect.the rest of it ↓fold it back up ↑
I initially went looking for one place to enforce access. The launcher is on the player's machine though, so they can change what it does. A backend check doesn't stop somebody going straight to the file URL. And if the CDN refuses a request, the player still needs to understand why their download didn't start. There was some pushback on repeating the checks. Explaining the job of each one helped us get past that, particularly the difference between telling a player they can download and actually protecting the file.