Three apps in, this list has explained every one of these for me. Number 3 caught me twice: macOS does not care about capital letters in file names and the Linux box that builds your app does.
Workflow
Copied 9 times
1. Node version: what the host runs versus what you run. Compare `node -v` with the build log.
2. Environment variables: same names, set for the right environment, no trailing spaces or quotes.
3. File name case. `import Button from "./button"` works on macOS and fails on Linux.
4. Build versus dev: run the production build locally before you blame the host.
5. Database: local seed rows production does not have, and RLS that only bites the anon key.
6. Timeouts and cold starts: three seconds locally can exceed the function limit there.