Resource:action — the SaaS default
The pattern `resource:action` (e.g. `billing:read`, `users:write`) is the most common in B2B SaaS for a reason: it reads like English, it groups naturally by resource, and it composes well. You can write `if (token.permissions.includes("billing:write"))` and the intent is obvious.
It scales to a few hundred permissions before token size becomes uncomfortable. Past that, group permissions into roles and put the role in the token instead of the full set; expand server-side as needed.