Currently the only way to do so is by using DataStore, however this only works for players who actually join the game after buying it.
Yes, edge cases, but still Robux spent.
I think a good way would be to somehow do
:PlayerOwnsAsset(PlaceId) or maybe
Often paid access is used for early access, and is also paired with things like getting exclusive items. These rewards usually last beyond the early access - meaning checks need to be done to whether they bought access or not.
Just now I was discussing with Sublivion how early access should be done. Unfortunately, they opened the game to paid access basically as soon as it started being developed, and had ~60 in total buy access.
However, since you can’t properly check whether someone bought access after the game is no longer paid access, I was pushing for gamepasses (which also opens up having different levels of access) and a player-kicker scripter with a whitelist.