Construye un programa de referidos en mi app. Stack: Next.js (App Router), Supabase (Postgres, auth, RLS) y Stripe. Textos en español de México.

Reglas del programa:
- Cada usuario tiene un código único, corto y legible (6 a 8 caracteres, sin 0/O ni 1/I).
- Quien invita gana [RECOMPENSA, p. ej. un mes gratis] cuando su invitado completa el evento de activación: [EVENTO, p. ej. «crea su primer proyecto»]. No al registrarse.
- El invitado recibe [BENEFICIO, p. ej. 20 % el primer mes] con un código promocional de Stripe limitado a primera compra.

Haz esto:
1. Migración SQL: tabla referral_codes (user_id único, code único) y tabla referrals (referrer_id, referred_id único, code, status: pending | activated | rewarded | rejected, created_at, activated_at, ip_hash, user_agent). Activa RLS: cada usuario solo lee sus filas; solo el servidor cambia status.
2. Captura del código: /r/[code] guarda el código en una cookie httpOnly de 30 días y redirige al registro. Al crear la cuenta, crea la fila en referrals como pending.
3. Activación: cuando ocurre el evento de activación, una función del servidor (o función de Postgres security definer) pasa el referido a activated y otorga la recompensa una sola vez (idempotente).
4. Antifraude básico: nadie se refiere a sí mismo; un usuario solo puede ser referido una vez; tope de recompensas por mes por usuario; marca para revisión si muchos registros comparten ip_hash o correo desechable; nunca confíes en el navegador para cambiar status.
5. Panel /invita: enlace personal, botón «Invitar por WhatsApp» que abre https://wa.me/?text=<mensaje con el enlace, codificado con encodeURIComponent>, botón de copiar, y contadores: invitados, activados, recompensas ganadas.
6. Registra eventos referral_link_shared, referral_signup y referral_activated en mi analítica.

Primero muéstrame el plan y la migración. Espera mi visto bueno antes de tocar el flujo de pago. Al final dime cómo probarlo de punta a punta con dos cuentas de prueba.
