Purchases and license types
Recording is safe to repeat: the same receiptId returns what it did the first time. Licenses belong to Enviglo accounts, on the account the player’s Roblox ID is linked to; a player who hasn’t joined gets a placeholder account that becomes theirs when they link Roblox. Every payment is kept as a purchase, which never changes. Your game is the only source of Roblox purchases: for game passes, check UserOwnsGamePassAsync when a player joins and record it (no receiptId needed; Enviglo records a pass once per player). Registering a pass again doesn’t undo a revoke, or bring back a license the player gave away.
Each product has a license type. One purchase: a player owns it once, and buying again while they do adds nothing. Buy more than once: every purchase is a license of its own, and check’s copies says how many they hold. Subscription: every new receiptId adds the product’s days (license.expiresAt), counted from the current end if it hasn’t passed; once it runs out, check answers owned: false until the player buys again. Whatever the type, a player whose license was revoked or given away gets a new one by buying again. Game passes can only be one-purchase products.