Published on the site: https://nsva.org/help/admin-site-guide — use this page in the browser for printing or sharing; no source code access required.
New to the Admin screens? Start with the non-technical walkthrough: Admin dashboard — simple guide.
Contract / SOW traceability (A–I): see SOW / contract traceability.
This document is an overview of what the NSVA website can do, focused on:
- What each role can access
- What admin panels exist
- What workflows generate notifications / email
- Where to look when something is “stuck”
It is intended to be printed/exported to PDF for officers and administrators.
1) Quick map of the site
Public (not signed in)
- Homepage: overview and navigation
- Membership: membership information + application
- Events: public events + convention registration page
- Donate: opens the external Zeffy donation page (not processed inside nsva.org today — national office sees those gifts in Zeffy unless the integrated donate flow is enabled later)
- Locations: island locator
- Member roll (
/member-roll): name + primary island for active members (full roster is members-only) - Commander's messages (
/commander): National Commander blog posts flagged in the Bulletin editor - Forms: public forms and form submissions (where enabled)
- Bulletin Board: public posts (scoped by island/national rules)
- Can Do Archives: published issues and archives
Member Dashboard (signed in)
- Dashboard home: account summary
- Document library (
/members/library): searchable catalog of official PDFs (same catalog as sitewide; protected downloads per document rules) - Member Directory (
/members/directory): officers/islands from national data + Member roster tab (live DB, contact fields) + Buddy Finder - Messages: bulletin board interaction (where permitted)
- Orders: ships store order history
- Calendar: registrations and RSVP
- Notifications: in-app notifications for workflow activity
- Island Transfer: request transfer to another island
- Service history: buddy finder/service history features
- Settings: profile + email preferences
Admin Panel (signed in, permissioned)
Admins access the admin area at:
Admin Panel:/admin
The admin panel is composed of “feature panels” (Membership, Content, Operations). Each is shown/hidden by permissions (see below).
2) How access works (roles & permissions)
The platform uses RBAC (Role-Based Access Control):
- A member can have one or more roles
- Roles grant permissions
- Most admin APIs check permissions server-side (security boundary)
Important
- UI visibility (menu items) is also gated by permissions, so a user can be “admin” but not see every admin panel.
- The
super_adminrole has a server-side override for all permissions.
See SOP background:
3) Current roles (baseline)
These role names are the canonical system roles:
memberisland_officerisland_adminregional_commandersecretarynational_adminsuper_admin
4) Permissions (capability list)
These permission names are what the app checks to allow admin actions.
Membership
confirm_membership_payment: Treasurer — click Payment Received (confirm dues/funds before the file moves on)confirm_membership_paperwork: Admin / Secretary — click Paperwork Received (application complete and eligible to queue for verification)verify_membership: Membership Chair / Life — click Verified (finalize membership, create account, send welcome email)approve_members: legacy full access; also allows the Verified step (same asverify_membershipfor that button)manage_members: edit member profiles, unlock accounts, force resetsview_members: view the member list and member detailsexport_members: export member data
Content
post_blog: create/publish blog postsmanage_blog: edit/delete any blog postspost_message: post to message boardsmoderate_messages: remove/flag messagesmanage_site_images: edit public site imagery (hero/quick links/page banners)
Store
manage_store: manage store products/inventoryview_orders: view order detailsmanage_orders: update order status and shipping
Calendar
manage_calendar: create/edit calendar events
Forms / Admin
manage_forms: create/edit/publish custom formsview_audit_log: view audit history of sensitive actionsmanage_island: edit island details/settingsreview_island_transfers: process island transfer requestssend_newsletter: send email news blastsmanage_notifications: send system notificationsmanage_roles: create/modify rolesmanage_permissions: assign roles/permissions to members
Access / scope
access_admin_panel: access the admin landing page and admin panels that only need basic admin accessview_all_content: view content across islands (scope expansion)access_national_board: access national board content where used
System
system_admin: maintenance endpoints and high-privilege operations
5) Role → permissions (summary)
This is a summary of the baseline mapping currently seeded.
member- Post messages
island_officer- Post messages, view members
island_admin- Admin access + membership management + orders + calendar + island settings
regional_commander- Broad admin access + blog management + permissions management + audit log
secretary- Admin access + island transfer review + Paperwork Received on membership applications (when permission is assigned)
national_admin- Most permissions (everything except newsletter + system_admin by default)
super_admin- All permissions (developer/system role)
If someone can’t see a panel, they are missing the permission that gates it (see “Admin panels and what they do” below).
6) Admin panels and what they do
This section describes each major admin panel and the typical officer job function it supports.
Membership → Applications (/admin/applications)
Purpose
- Process new membership applications through a four-step national workflow
- Each step has one clearly labeled button, visible only to the officer responsible for that step
- Full audit history on each application (who clicked what, and when)
Who does what (training)
| Step | Officer | Button on the application | What it means |
|---|---|---|---|
| 1 | (Applicant) | — | Submits the form; site creates a pending record and notifies the Treasurer |
| 2 | Treasurer | Payment Received | Confirms payment is in hand (for paid types, online Stripe payment must be recorded first) |
| 3 | Admin / Secretary | Paperwork Received | Confirms the application is filled out correctly and the applicant is eligible; queues for verification |
| 4 | Membership Chair / Life | Verified | Finalizes membership, creates the member account, sends the welcome email (Life Chair sends the membership card offline) |
Status labels on the list (examples): Pending Treasurer, Pending Paperwork, Pending Verification, Approved, Rejected.
Primary permissions (assign in Admin → Roles & Permissions so each department can act):
confirm_membership_payment— Treasurerconfirm_membership_paperwork— Admin / Secretaryverify_membership— Membership Chair / Lifeapprove_members— optional legacy; grants Verified if you still use one national approver role
Anyone with any of the four permissions above can open the applications list; they only see action buttons for steps they are allowed to perform.
Workflow diagram
flowchart LR
A[Applicant submits] --> B{Payment required?}
B -->|Yes| C[Awaiting Payment / Stripe]
C --> D[Submitted — pending Treasurer]
B -->|No| D
D --> E[Treasurer: Payment Received]
E --> F[Admin/Secretary: Paperwork Received]
F --> G[Awaiting Verification]
G --> H[Chair: Verified]
H --> I[Approved + welcome email]
Using the screen (training checklist)
- Open Membership → Applications (
/admin/applications). - Use Needs action or status filters to find your queue.
- Expand an application; read contact info, island request, and DD-214 if present.
- Scroll to Audit history — every step is timestamped and attributed to the officer who clicked it.
- Click Take action — you should see only the button(s) your role owns (for example Treasurers see Payment Received, not Verified).
- For Verified, you may override island assignment before confirming.
- To decline at any active stage, use Reject Application (verifier permission).
Paid applications (Annual / Auxiliary)
- Applicant pays through Stripe on the site; that records online payment only.
- The application stays with the Treasurer until they click Payment Received (confirms funds are actually received).
- Membership is not auto-approved when Stripe succeeds.
Free / non-payment types (Life, Honorary, etc.)
- Application goes to Pending Treasurer immediately after submit.
- Treasurer still clicks Payment Received to advance the file (no dollar amount on file).
After approval
- Use Send new password email on approved rows if the member did not receive credentials.
Membership → Member Management (/admin/members)
Purpose
- Search and view members
- Unlock accounts
- Send password reset email (SMTP) or Set temp password (no email) when mail fails
- Update member info/status
Primary permissions
view_members(view/list)manage_members(edit/unlock/reset)
Membership → Island Transfers (/admin/island-transfers)
Purpose
- Review transfer requests
- Approve/reject/mark under review (workflow dependent)
Primary permissions
review_island_transfers(or broad admin)
Membership → Island Charter Applications (/admin/island-charter-applications)
Purpose
- Review island charter requests
- Approve/reject with notes
Primary permissions
approve_members
Membership → Duty Station Requests (/admin/duty-station-requests)
Purpose
- Review and approve/reject duty station submissions (data quality + moderation)
Primary permissions
approve_members(current gate)
Membership → Convention Registrations (/admin/convention-registrations)
Purpose
- Manage convention registrations (for example 2026 national convention)
- Approve / Reject / Cancel
- Mark Paid / Pending / Refunded (online Stripe payment for convention may be added later; registrants may pay by check per on-screen instructions)
- Sends office email and admin bell alerts when someone registers on the site
Primary permissions
access_admin_panel(and other membership/admin roles that include it)
Content → Island Locations (/admin/islands)
Purpose
- Create/edit island listings displayed on
/locations
Primary permissions
access_admin_panel+manage_island
Content → Site Images (/admin/site-images)
Purpose
- Update public-facing imagery:
- Homepage hero slideshow
- Quick Links images
- Hero/banner images across public pages
Primary permissions
manage_site_images
Content → Calendar (/admin/calendar)
Purpose
- Create, update, move, delete events
- Configure event fees and registration settings
Primary permissions
manage_calendar
Content → Can Do Uploads (/admin/can-do-issues)
Purpose
- Upload PDF issues and publish them to the public archive
Primary permissions
post_blogormanage_blog(current gate)
Content → News Blast (/admin/newsletter)
Purpose
- Send a newsletter blast to members (outbound email must be configured — see Email delivery setup)
Primary permissions
send_newsletter
Operations → Ships Store (/admin/store)
Purpose
- Create/edit products
- Manage store listings and inventory
Primary permissions
manage_store
Operations → Store Orders (/admin/orders)
Purpose
- Review orders
- Update shipping/tracking
- Mark refunds (where supported)
Primary permissions
view_orders/manage_orders/manage_store
Operations → Analytics & Reports (/admin/analytics)
Purpose
- Operational stats: pipeline counts, revenue, orders, membership trends
Primary permissions
- Broad admin access (one of:
view_orders,manage_store,access_admin_panel)
Operations → Sponsorship pipeline (/admin/sponsorship)
Purpose
- Review sponsorship inquiries and update their status
Primary permissions
access_admin_panel
Operations → Operations Center (/admin/operations)
Purpose
- Verify routing and SOP recipients
- Operational visibility
Primary permissions
access_admin_panel(and some endpoints allowmanage_notifications)
Operations → General Requests (/admin/general-requests)
Purpose
- Handle “contact us” / general request submissions
Primary permissions
access_admin_panel
Operations → Audit Log (/admin/audit-log)
Purpose
- Review sensitive actions and approvals across the site
Primary permissions
view_audit_log
Operations → Roles & Permissions (/admin/roles)
Purpose
- Assign roles to members
- Manage permission mappings
Primary permissions
manage_rolesand/ormanage_permissions
7) Emails & notifications (how routing works)
Official office mailboxes
Workflow email goes to role addresses (for example MembershipChair@nsva.org, Secretary@nsva.org, Commander@nsva.org) — not to individual officers’ personal email in the application. Mailboxes stay with the office when leadership changes; update Microsoft 365 access and forwarding when officers turn over.
Full mailbox list and Phase 2 island routing (x3commander@nsva.org, etc.): Digital operations SOP.
Who receives email vs. the admin bell
| What happened | Office email (examples) | In-app bell (who sees it in the site) |
|---|---|---|
| New membership application submitted | Membership Chair, Secretary, Treasurer | Members with confirm payment (Treasurer queue) |
| Online membership payment recorded (Stripe) | — | Treasurer (confirm_membership_payment) |
| Treasurer: Payment Received | — | Admin/Secretary (confirm_membership_paperwork) |
| Paperwork Received (queued for verification) | — | Verifier (verify_membership or approve_members) |
| Application verified / rejected | Membership Chair, Secretary, Treasurer | — |
| Convention registration submitted | Convention Chair, Events Coordinator, Secretary, Treasurer, Commander | Users with admin panel access |
| Island transfer requested | Secretary | Secretary role holders |
| Sponsorship inquiry | Fundraising, Sponsorship, Public Affairs | Admin panel access |
| Ship’s Store order paid (Stripe) | Ships Store, Treasurer, Store Manager | Store/order admins |
| Donation recorded through the site (integrated flow) | Treasurer, Commander, Fundraising, Donations | On payment confirm |
| Calendar event / registration intake | Events Coordinator, Secretary, Treasurer | Admin panel access (varies) |
Important: Public Donate on the menu goes to Zeffy outside the site — those gifts do not automatically email national offices through nsva.org today.
Phase 2 (not live yet): email Island Commander and Island Secretary based on the member’s assigned island.
Verify routing (admins)
Open Operations Center while signed in as an admin. It shows which addresses each workflow uses in the current environment.
Technical staff may also use server env vars NSVA_OFFICE_EMAIL_* when an alias differs from the SOP — see Email delivery setup.
Payments (what triggers store/membership email)
- Ship’s Store: Stripe checkout; store/Treasurer emails run after payment succeeds.
- Paid membership applications: Stripe records payment on the application; the Treasurer must click Payment Received before the workflow continues (no auto-approval on payment).
- Zeffy: optional for integrated flows; the live Donate menu link is external Zeffy only.
In-app notifications
The notification bell in the header helps admins who are logged in. It does not replace office mailboxes. If Commanders or Treasurers only read Commander@ / Treasurer@, confirm Microsoft 365 SMTP is working — see Email delivery setup and the troubleshooting section below.
8) Common “where is it?” troubleshooting
“A user can’t see an admin panel”
- They’re missing the permission that gates it (for example, Site Images requires
manage_site_images). - Verify in Admin → Roles & Permissions.
“A workflow didn’t email anyone”
- Confirm the event actually uses site routing (for example convention registration on nsva.org does; a gift only on the external Zeffy Donate page does not).
- Check Operations Center for the mailbox list.
- Verify Microsoft 365 sending (
noreply@nsva.org) — Email delivery setup. - Remember: the admin bell can show an alert even when email failed — do not rely on the bell alone for officers who only use mailboxes.
“A member didn’t receive password reset email”
- In Admin → Members, open the member and confirm an email is on file (imports sometimes have username only).
- Try Send Password Reset Email — if it fails, the password is not changed (by design).
- Use Set Temp Password (no email) and give the password by phone when mail is down.
- Ask the member to sign in with the email on file (not an old personal address) and check spam.
“A registration/order/application is stuck”
- Membership applications — check the status label on
/admin/applications:- Pending Treasurer → needs Payment Received (Treasurer; paid apps need Stripe payment recorded first)
- Pending Paperwork → needs Paperwork Received (Admin/Secretary)
- Pending Verification → needs Verified (Membership Chair)
- If the wrong officer sees no button, check Roles & Permissions for the three workflow permissions above
- Check the relevant admin panel queue:
- Membership applications:
/admin/applications - Transfers:
/admin/island-transfers - Convention:
/admin/convention-registrations - Store orders:
/admin/orders
- Membership applications:
- Check audit log for recent actions:
/admin/audit-log
9) GCP Cloud Scheduler (cron jobs)
These jobs call authenticated HTTP routes on the Cloud Run service. They are separate from Ship’s Store webhooks.
What runs
| Job | Route | Purpose |
|---|---|---|
| Membership renewal reminders | POST /api/cron/membership-renewal-reminders |
Emails at 90 / 30 / 7 days before annual expiry (UTC calendar days) |
| Commander digest | POST /api/cron/commander-digest |
Weekly email listing new National Commander posts (isCommanderMessage) |
Required environment (Cloud Run)
| Variable | Notes |
|---|---|
NSVA_CRON_SECRET |
Shared secret; send as X-Cron-Secret: <value> or Authorization: Bearer <value> |
APP_URL |
Public site base URL (e.g. https://nsva.org) — used in email links |
Optional in-process scheduling (long-lived Node only, e.g. some VMs): set NSVA_CRON_ENABLED=true with the same secret — see instrumentation.ts. Cloud Run scale-to-zero usually prefers Cloud Scheduler → HTTP instead.
Automation: Infrastructure operators may create the jobs in the Google Cloud Console or use a deployment runbook script, if your organization provides one. Jobs must use NSVA_CRON_SECRET (Secret Manager: nsva-cron-secret) and target https://nsva.org unless your service URL differs.
Example: create jobs (replace placeholders)
Set variables once:
export PROJECT_ID=your-gcp-project
export REGION=us-central1
export SERVICE_URL="https://YOUR-CLOUD-RUN-URL.run.app"
export CRON_SECRET="$(gcloud secrets versions access latest --secret=nsva-cron-secret)"
Daily renewal run (after 08:00 UTC the job catches members whose expiry is exactly 90/30/7 days away; adjust cron if needed):
gcloud scheduler jobs create http nsva-membership-renewal \
--project="$PROJECT_ID" --location="$REGION" \
--schedule="0 8 * * *" \
--uri="${SERVICE_URL}/api/cron/membership-renewal-reminders" \
--http-method=POST \
--headers="Content-Type=application/json,X-Cron-Secret=${CRON_SECRET}" \
--attempt-deadline=600s
Weekly Commander digest (Monday 08:00 UTC; aligns with default NSVA_CRON_DIGEST_SCHEDULE):
gcloud scheduler jobs create http nsva-commander-digest \
--project="$PROJECT_ID" --location="$REGION" \
--schedule="0 8 * * 1" \
--uri="${SERVICE_URL}/api/cron/commander-digest" \
--http-method=POST \
--headers="Content-Type=application/json,X-Cron-Secret=${CRON_SECRET}" \
--attempt-deadline=600s
Store NSVA_CRON_SECRET in Secret Manager (e.g. nsva-cron-secret) and reference it from Cloud Run env — do not commit secrets.
PII purge (optional, different secret): POST /api/admin/maintenance/purge-pii with X-Purge-Secret — configure PII_PURGE_* in the hosting environment / Secret Manager per your retention policy.
10) Exporting this document to PDF
- Open https://nsva.org/help/admin-site-guide in your browser.
- Use Print → Save as PDF (or your browser’s equivalent).