Settings β
The Settings module is the single place an admin goes to change anything that affects the whole organization β what the app looks like, who can sign in to what, how outgoing emails are sent, which features show in the sidebar. Most of the work happens under Settings in the sidebar, with a few related surfaces broken out into their own pages (Modules, PWA App, Channels, Accessibility) because they need more screen space than a tab strip allows.

How Settings is organized β
Open the sidebar and click Settings. You'll see a strip of tabs across the top β branding first, then email, map, payments, domain, reminders, custom fields, completeness, integrations, WhatsApp, storage, offline, legal, general, accessibility. The strip scrolls horizontally on mobile so nothing gets buried.
Some tabs only show up when you have permission or when your plan supports the feature:
- Email, Payments, Reminders, Custom Fields, Integrations, WhatsApp, Storage, Accessibility β admins only.
- Map β anyone with the
map.managepermission. - Domain β Growth, Network, or Unlimited plans only.
- Offline β Growth+ plans, and only when
VITE_POWERSYNC_URLis configured on this build.
If you don't see a tab that this doc mentions, it's because your role or plan doesn't include it.
Related pages outside Settings β
A handful of related screens live elsewhere in the sidebar because they need a full page:
| Page | What it does |
|---|---|
| Modules | Turn whole features on or off for your org. |
| PWA App | Configure the installable app β name, icons, theme colours, push. |
| Channels | Wire up WhatsApp, SMS, email, push, and in-app providers. |
| Accessibility | Per-user visual + motion preferences, plus org defaults. |
These each get their own article because they're meaningful workflows on their own.
Where settings actually live β
For the curious (and for anyone debugging), settings are stored in three places:
app_settingsβ a key/value table for everything that isn't worth a dedicated column. Branding, PWA, email provider config, send-message rules, footer text. One row per(organization_id, key). Edits go through theupsertAppSettingshelper so RLS scopes bycurrent_org_id().organizationsβ the columns that other tables foreign-key to. Org name, plan, default language, default country, timezone (used by edge functions).- Feature-specific tables β
org_channel_config(channels),event_reminder_config(reminders),org_custom_domains(domain),reserved_slugs(platform-managed), accessibility prefs inuser_accessibility_preferencesandorg_accessibility_defaults.
You don't need to know any of this to use the UI β but if you're ever exporting an org or troubleshooting why a setting "didn't save," knowing where to look helps.
A note on the timezone trap β
organizations.timezone is the source of truth that edge functions read. The frontend reads app_settings.app_timezone via BrandingContext. The Branding article writes both at once when you save the regional form, so they stay in sync β but if you ever edit one directly in SQL, edit the other too.
Who can change what β
Most admin-only tabs are gated through the RBAC v2 permission system. The matrix:
| Tab | Required permission |
|---|---|
| Branding | any signed-in user can view; admins save |
| Email, Reminders, Custom Fields, Integrations, WhatsApp | isAdmin |
| Map | map.manage |
| Payments | isAdmin (PCI-sensitive) |
| Domain | isAdmin + Growth+ plan |
| Storage | isAdmin |
| Modules | isAdmin toggles; non-admins see read-only |
| Accessibility | self always; org defaults for admins |
The same checks run server-side via assertPermission in the edge functions that back each form, so a hand-crafted request can't bypass the UI guard.
Saving and the unsaved-changes bar β
Every tab that mutates data uses a sticky Unsaved changes bar at the bottom of the page. It stays visible while you scroll so you don't have to hunt for a Save button at the bottom of a long form. Refreshing the page (or navigating away) prompts you to confirm β the dirty form guard is intentional, since some of these settings affect every email you'll send tomorrow morning.
Next steps β
- Organization basics β set legal name, locale, timezone.
- Branding β logo, favicon, colours, footer.
- Email + notifications β wire up sender identity.
- Channels β per-provider config for messaging.
- PWA setup β make the app installable.
- Enable / disable modules β keep the sidebar relevant.