Site Settings — Defaults Reference
Every setting below is stored as a row in the AppSetting key-value table and
is editable at runtime via Admin → Site Settings (or, for the first few,
the /setup wizard on a fresh install). None of them are required — this
page documents exactly what happens when a given key has never been saved.
Settings changes take effect within 60 seconds everywhere (the backend's
in-process settings cache TTL) without a server restart.
Organisation
| Setting |
Default when unset |
Notes |
org_name |
"Cross Code" |
Falls back to ORG_NAME env var first, then this hardcoded default (the platform vendor's name, used as a neutral placeholder — org_name is a required field in the setup wizard, so this fallback is practically unreachable once a site has been set up). Shown in the navbar, email headers/subjects, and WhatsApp messages. |
org_tagline |
"Connecting community through events" |
Falls back to ORG_TAGLINE env var first. Shown under the org name in the email header. |
org_email |
(blank) |
No fallback in most places. Exception: the Terms of Use / Privacy Policy pages default to privacy@example.com (an obvious placeholder) if unset — see the Legal section below. |
org_phone / org_address |
(blank) |
No fallback — simply omitted wherever shown if unset. |
app_base_url |
APP_BASE_URL or FRONTEND_URL env var, else http://localhost:3001 |
Used to build links in emails (password reset, ticket delivery, etc.). Should always be set in production. |
Branding
| Setting |
Default when unset |
Notes |
primary_color |
Legacy accent_color value if present, else #4F46E5 (indigo) on the website / #1e3a5f (navy) in emails |
See Two different fallbacks below — this is the one setting with a genuine inconsistency worth knowing about. Drives buttons, links, nav highlights, and the email header/CTA. |
secondary_color |
210 40% 96.1% background / near-black text (light gray "wash", shadcn's stock theme) |
The Branding tab's color picker pre-fills #8B5CF6 as a suggested starting point, but that's only a UI default — if you never hit Save, the actual site uses the light-gray fallback, not violet. |
accent_color |
210 40% 96.1% background / near-black text (same light gray as Secondary) |
Same story as Secondary — the picker pre-fills #EC4899 (pink) as a suggestion only. |
logo_url |
Bundled logo (frontend/src/app/church_logo.jpg) |
Shown in the navbar. This is still the original Hope Family Church artwork checked into the repo — swap the file (or upload a real logo via the Branding tab) before deploying for a different organisation. |
favicon_url |
frontend/public/favicon.ico (the site's original generic favicon) |
Shown in the browser tab. |
Two different fallbacks for primary_color
If primary_color has never been saved (no admin has ever used the new
3-color Branding tab) and there's no legacy accent_color value either,
the website and outgoing emails currently disagree on what "no color" means:
- Website (
globals.css / tailwind.config.js static defaults): #4F46E5, a bright indigo.
- Emails (
backend/src/utils/email.js getOrg()): #1e3a5f, a dark navy — unless overridden by the EMAIL_HEADER_COLOR env var.
In practice this only matters on a brand-new install before the setup wizard
or Branding tab has been saved even once — the wizard always writes
primary_color, so this gap closes itself the moment setup completes.
Notifications
| Setting |
Default when unset |
Notes |
reg_notification_emails |
REGISTRATIONS_EMAIL env var, else (blank) |
If truly blank, no internal notification email is sent for new registrations/payments/donations — it's silently skipped, not an error. |
Email delivery (SMTP)
| Setting |
Default when unset |
Notes |
smtp_host |
SMTP_HOST/EMAIL_HOST env var, else (blank) |
If blank, the app does not send real email — it uses nodemailer's jsonTransport, which just logs the would-be email to the console. This is the single biggest "nothing is configured" gotcha — ticket/payment/password-reset emails silently don't go anywhere until SMTP is set up. |
smtp_port |
587 |
|
smtp_secure |
false |
|
smtp_user / smtp_pass |
(blank) |
Stored AES-256-GCM encrypted (key derived from JWT_SECRET). |
smtp_from |
(blank) |
If blank, outgoing mail's From: address falls back to the literal no-reply@crosscode.local. |
Legal (Terms of Use / Privacy Policy)
| Setting |
Default when unset |
Notes |
legal_operator_name |
"[operator details not yet configured]" |
Deliberately a generic, obviously-incomplete placeholder rather than any real person's or organisation's name. Unlike org_name, these legal fields are optional and can realistically stay unset on a live site — defaulting them to Cross Code's (or anyone else's) real identity would misrepresent who's legally responsible for that deployment. |
legal_io_name |
"[not yet configured]" |
Same reasoning as legal_operator_name. |
legal_io_email |
"io@example.com" |
Rendered as a mailto: link, so the placeholder stays a syntactically valid address on the IANA-reserved example.com domain rather than a bracketed non-email string that would break the link. |
legal_website_url |
"example.com" |
Same reasoning — used to build an https:// link. |
legal_effective_date |
"[not yet set]" |
Plain text only, no link — a bracketed placeholder is fine here. |
org_email (as used on legal pages specifically) |
"privacy@example.com" |
Different fallback than org_email's general default (blank) — also rendered as a mailto: link, so it needs to stay a valid-looking address. |
WhatsApp
| Setting |
Default when unset |
Notes |
WAWP_ACCESS_TOKEN / WAWP_INSTANCE_ID |
WAWP_ACCESS_TOKEN/WAWP_INSTANCE_ID env vars, else (blank) |
No hardcoded default — WhatsApp sending is simply unavailable until both are configured (Admin → Site Settings → WhatsApp). |
Setup state
| Setting |
Default when unset |
Notes |
setup_complete |
false (treated as "not true") |
Controls whether /setup redirects to /login or runs the first-time wizard. Set to "true" automatically when the wizard finishes. |