Casi siempre es lo mismo: la app funciona en tu ordenador y se rompe al publicarla. En tu máquina existe un fichero con la dirección y la clave de Supabase, pero ese fichero no se sube al desplegar, a propósito, porque contiene credenciales. El servidor donde vive tu app publicada no las tiene, así que la variable llega vacía.
El otro motivo habitual es el nombre. Las herramientas que compilan la app solo dejan pasar al navegador las variables que empiezan por un prefijo concreto, y cada una usa el suyo: Vite y las apps hechas con Lovable o Bolt usan VITE_, Next.js usa NEXT_PUBLIC_. Si la variable se llama SUPABASE_URL a secas, existe en el servidor pero nunca llega al navegador, y el resultado es idéntico al de no haberla puesto.