Skip to content

Troubleshooting

Common problems and how to fix them.


Almost always missing environment variables.

  1. Go to Vercel → your project → Settings → Environment Variables
  2. Verify both VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY are set
  3. Make sure the URL doesn’t have a trailing slash: https://abcd.supabase.co not https://abcd.supabase.co/
  4. After adding or changing variables, trigger a redeployment: Deployments → three-dot menu → Redeploy

Can’t log in / “Email provider not enabled”

Section titled “Can’t log in / “Email provider not enabled””

Supabase doesn’t enable email auth by default.

  1. Go to your Supabase project → Authentication → Providers
  2. Find Email and toggle it on
  3. Under Auth Settings, if you want immediate access without email confirmation, disable Confirm email

”Invalid API key” error in the browser

Section titled “”Invalid API key” error in the browser”

You’re likely using the wrong Supabase key. The VITE_SUPABASE_ANON_KEY should be the anon / public key, not the service role key. Both are JWTs but serve different purposes. Find the correct one at Supabase → Project Settings → API → Project API keys → anon public.

Data not appearing after running migrations

Section titled “Data not appearing after running migrations”

Check that the migrations ran successfully:

  1. Go to Supabase → Table Editor
  2. You should see tables like claude_usage, openclaw_usage, uptime_checks, relay_checks, custom_metrics
  3. If tables are missing, the migration didn’t run — go to the SQL editor and run the migration files from supabase/migrations/ in order

If tables exist but data isn’t showing, the RLS policies may not have been applied. Go to Supabase → Authentication → Policies and verify each table has policies defined. The migrations should create these, but if a migration failed partway through, policies may be missing.


”synced 0 sessions” — no data appearing

Section titled “”synced 0 sessions” — no data appearing”

The collector only processes files modified in the last 2 hours by default. A few possibilities:

  • No recent sessions — if you haven’t used Claude Code in the last 2 hours, nothing will sync. That’s expected.
  • Backfilling needed — if you just set up the collector, your historical data is outside the 2-hour window. Set cutoff = 0 in the script temporarily to import everything.
  • Wrong path — verify the session files exist: ls ~/.claude/projects/ and ls ~/.openclaw/agents/main/sessions/

You’re using the wrong key. Collector scripts require the service role key (bypasses RLS), not the anon key. Find it at Supabase → Project Settings → API → service_role. It’s a longer JWT.

Verify the cron entry exists: crontab -l

If the entry is there but the script isn’t running, check the log file you specified (e.g., tail -f /tmp/numbrs-claude.log). Common issues:

  • Full paths required — cron runs with a minimal environment. Use full paths like /bin/bash /Users/you/script.sh, not bash ~/script.sh
  • Environment variables not set — they must be in the crontab line itself, not in your shell profile
  • macOS cron permissions — on macOS, cron may need Full Disk Access. Go to System Preferences → Security & Privacy → Privacy → Full Disk Access and add /usr/sbin/cron

All three environment variables must be set: NUMBRS_SUPABASE_URL, NUMBRS_SUPABASE_SERVICE_KEY, and NUMBRS_OWNER_ID. The script exits with an error message if any are missing — check your terminal output or log file.

”delivery-mirror” model showing in Claude data

Section titled “”delivery-mirror” model showing in Claude data”

This is an internal routing model that older versions of the collector didn’t filter out. Update to the latest collector script — it explicitly skips delivery-mirror entries.

The script strips your username from directory names to create readable project labels. If the stripping logic produces odd results (can happen with unusual home directory paths), set CLAUDE_USERNAME explicitly:

Terminal window
CLAUDE_USERNAME=yourusername bash ~/numbrs-claude-collector.sh

  • Check the time range — if it’s set to “Last 1 hour” and you have no recent data, nothing will show. Extend the range.
  • Verify the metric name in the panel config matches exactly what you’re pushing. Metric names are case-sensitive.
  • Check that data is actually in the database: go to Supabase → Table Editor → find your table and see if rows exist.

There may be a short delay (up to a minute) before data appears on dashboards. Refresh the page after a moment.

If data still doesn’t appear, check the API response when you push the metric — a 200 OK confirms the data was accepted. A 401 means your API key is wrong.

Tags in numbrs are exact string matches. Make sure the tag keys and values you’re filtering by in the dashboard match exactly what you’re pushing in your metric payload.