-- Run in Supabase SQL Editor (Dashboard → SQL) create table if not exists public.profiles ( id uuid primary key references auth.users (id) on delete cascade, email text, plan text not null default 'free' check (plan in ('free', 'pro', 'business')), billing_period text check (billing_period in ('monthly', 'annual')), stripe_customer_id text, stripe_subscription_id text, updated_at timestamptz not null default now() ); alter table public.profiles enable row level security; create policy "Users can read own profile" on public.profiles for select using (auth.uid() = id); create policy "Users can update own profile" on public.profiles for update using (auth.uid() = id); -- Optional: auto-create profile on signup create or replace function public.handle_new_user() returns trigger language plpgsql security definer set search_path = public as $$ begin insert into public.profiles (id, email, plan) values (new.id, new.email, 'free') on conflict (id) do nothing; return new; end; $$; drop trigger if exists on_auth_user_created on auth.users; create trigger on_auth_user_created after insert on auth.users for each row execute function public.handle_new_user();