-- A/B test event log. One row per exposure / cta_click / conversion. -- Kept narrow on purpose: the goal is "did variant X get more conversions -- than control" — not full session reconstruction. create table if not exists ab_events ( id bigserial primary key, experiment text not null, variant text not null, event_type text not null check (event_type in ('exposure', 'cta_click', 'conversion')), anon_id text not null, meta jsonb not null default '{}'::jsonb, created_at timestamptz not null default now() ); create index if not exists ab_events_experiment_variant_idx on ab_events (experiment, variant, event_type, created_at desc);