-- SEO site audit history (technical checks + score) -- Idempotent. create table if not exists public.seo_audits ( id uuid primary key default gen_random_uuid(), tenant_id uuid not null references public.tenants(id) on delete cascade, site_url text not null, score numeric not null default 0, grade text not null default 'F', warning_count integer not null default 0, critical_count integer not null default 0, checks jsonb not null default '[]'::jsonb, summary text, created_at timestamptz not null default now() ); create index if not exists seo_audits_tenant_created_idx on public.seo_audits (tenant_id, created_at desc); alter table public.seo_audits enable row level security; drop policy if exists seo_audits_tenant_select on public.seo_audits; create policy seo_audits_tenant_select on public.seo_audits for select using ( tenant_id::text = coalesce( auth.jwt() -> 'app_metadata' ->> 'tenant_id', auth.jwt() -> 'user_metadata' ->> 'tenant_id' ) ); -- Agency writes via service role (bypasses RLS).