Setup
Supabase setup
This template uses Supabase for Postgres, authentication, row-level security (RLS), and (optionally) storage. You need one Supabase project per deployment.
1. Create the project
- Sign in at https://supabase.com and create a new project.
- Pick the region closest to your users. Save the database password shown at creation time — you will not see it again.
- Wait for the project to provision (about a minute).
2. Grab your keys
Open Project Settings → API in the Supabase dashboard. Copy:
- Project URL →
NEXT_PUBLIC_SUPABASE_URL - anon / public key →
NEXT_PUBLIC_SUPABASE_ANON_KEY - service_role key →
SUPABASE_SERVICE_ROLE_KEY
Paste them into .env.local.
Do not commit the service-role key. It bypasses RLS entirely. The repo's
.gitignorealready excludes.env.local— keep it that way.
3. Run the migrations
All schema changes live in supabase/migrations/ as plain SQL and are
idempotent (safe to re-run). The simplest way to apply them:
Option A — SQL Editor (quickest)
- Open SQL Editor in the Supabase dashboard.
- For each file in
supabase/migrations/, in numeric order:001_initial_schema.sql002_pipelines_enhancements.sql003_broadcast_recipient_wamid.sql004_contact_delete_set_null.sql005_broadcast_counts_incremental.sql006_automations.sql007_automations_increment_counter.sql008_profile_avatars_storage.sql
- Paste into the editor and run. Each file prints its own status.
Option B — Supabase CLI
npm install --global supabase
supabase login
supabase link --project-ref <your-project-ref>
supabase db push
The CLI applies every file in supabase/migrations/ on top of the linked
project.
4. Verify
Open Table Editor in the Supabase dashboard. You should see tables
including profiles, contacts, conversations, messages, pipelines,
broadcasts, automations, and whatsapp_config. If any are missing, a
migration failed — re-run it and check the SQL output.
If the app logs PGRST205 with a message like Could not find the table 'public.profiles' in the schema cache or public.messages, the app is
connected to a Supabase project where these migrations have not been applied
yet, or .env.local points at a different project than the one you migrated.
5. Auth settings
Under Authentication → Providers, confirm:
- Email is enabled (default).
- Confirm email is on for production, off for local if you want frictionless testing.
Under Authentication → URL Configuration, add your production URL
(e.g., https://crm.example.com) to the allow-list so password-reset
emails link back correctly.
6. (Optional) Storage
The app downloads WhatsApp® media through Meta's /download endpoint and
currently relays it on demand rather than caching it in Supabase Storage.
No bucket setup is required for a default install.