Database
Supabase
In this stack Postgres is not the source of billing truth, RevenueCat is, so resist rebuilding subscription logic in your schema. Store the RevenueCat app user ID against the Supabase user and cache the current entitlement for server-side checks, refreshed by RevenueCat webhooks into an edge function. Row level security policies on premium tables then read that cached entitlement, which stops a modified client from unlocking content by lying about its own purchase state.