Navigation: goal-oriented, not feature-oriented
- Overview → Home
- Campaigns → Collect ('I want people to pledge')
- Pledges → Money ('Where's the money?')
- Exports → Reports ('My treasurer needs numbers')
- Old routes still work via re-exports
Terminology: human language, not SaaS jargon
- new → Waiting
- initiated → Said they paid
- paid → Received ✓
- overdue → Needs a nudge
- Campaign → Appeal
- QR Source → Pledge link
- Reconcile → Match payments
- Rail → Payment method
- Pipeline by Status → How pledges are doing
- Conversion rate → % who pledged
- CRM Export Pack → Full data download
Visual identity: brand-consistent dashboard
- Sharp edges (no rounded-lg cards)
- Gap-px grids for stats (brand signature pattern)
- Left-border accents (brand signature pattern)
- Midnight/Paper/Promise Blue 60-30-10 color rule
- Typography as hero (big bold numbers, not card-heavy)
- No emoji in UI chrome
- Brand-consistent status badges (colored bg + text, not shadcn Badge)
- Consistent header typography (text-3xl font-black tracking-tight)
Pages rewritten: layout, home, events (collect), pledges (money),
exports (reports), reconcile, settings
Reconcile: auto-detects bank CSV format via presets + AI before upload
UX spec: docs/UX_OVERHAUL_SPEC.md
6.7 KiB
PNPL Dashboard — Complete UX Overhaul Spec
The Core Problem
The dashboard was built feature-first: each page maps to a technical concept (Events, Pledges, Reconcile, Exports, Settings). But the user doesn't think in features — they think in goals:
- "How do I get people to pledge?"
- "Has anyone paid yet?"
- "Someone said they paid but I can't find it"
- "My treasurer needs a report"
The current UI has 3 fatal problems:
- Jargon everywhere — "Reconcile", "QR Sources", "Rail", "Initiated", "Pipeline by Status", "Conversion rate". A masjid volunteer doesn't speak SaaS.
- Two visual identities — Landing pages are bold, typographic, high-contrast (BRAND.md). Dashboard is generic shadcn/ui with rounded cards, muted colours, and card-heavy layouts. They feel like different products.
- Feature-oriented, not goal-oriented — The user has to learn the system's mental model instead of the system matching theirs.
Personas & Their Real Journeys
Persona 1: Charity Admin (Aaisha)
Who: Fundraising manager at a UK Islamic charity. Not technical. Uses WhatsApp all day. Her actual journey:
- "I need to collect pledges at our gala next Saturday" → Create campaign + links
- "The event is tonight, give each table a QR code" → Print QR codes
- "It's Monday, who pledged? Who's paid?" → Check the money
- "My treasurer needs numbers for the trustees meeting" → Download a report
- "Ahmed said he paid but we can't see it" → Find & match a payment
What confuses her today:
- "Campaigns" (she calls them "appeals" or just "the dinner")
- "QR Sources" → she just wants "links for my volunteers"
- "Reconcile" → she'd say "check the bank"
- "Initiated" status → "what does that mean?"
- "Rail" → completely alien
- "Pipeline by Status" → ???
Persona 2: Volunteer (Yusuf)
Who: Table captain at the gala. Has his own QR code. Checks his phone to see pledges. His actual journey:
- Gets a link from Aaisha → opens volunteer view
- Shows QR code at his table → donors scan it
- Checks "how am I doing?" on his phone
- Wants to brag → shares leaderboard
He never sees the dashboard — his entire journey is /v/[code]. But if Aaisha asks him to "help manage", he'd see the dashboard and be completely lost.
Persona 3: Treasurer (Fatima)
Who: Charity trustee responsible for financial oversight. Needs Gift Aid reports, bank reconciliation, clean data. Her actual journey:
- "Download last month's Gift Aid declarations" → Export
- "Match bank statement to pledges" → Upload CSV, see matches
- "Show me the money: what's collected vs outstanding" → Summary
- "I need this for the trustees report" → Numbers she can screenshot
What confuses her today:
- Column mapping UI (Date Column, Description Column...) → she just wants to upload a file and it works
- Technical status names
- No clear "money in vs money out" view
Persona Overlap
Aaisha does 80% of the work. She IS the charity admin, the event organiser, AND does the bank checking. Fatima only logs in once a month. Yusuf never logs in.
This means: optimise everything for Aaisha. Make Fatima's tasks findable but not in the way. Yusuf is a non-factor for dashboard design.
The Redesign: Goal-Oriented Navigation
Before (feature-oriented)
Overview | Campaigns | Pledges | Reconcile | Exports | Settings
After (goal-oriented)
Home | Collect | Money | Reports | Settings
| Old | New | Why |
|---|---|---|
| Overview | Home | Everyone understands "Home" |
| Campaigns | Collect | "I want to collect pledges" — the verb, not the noun |
| Pledges | Money | "Where's the money?" — that's what they're checking |
| Reconcile | (merged into Money) | "Check the bank" is part of "where's the money" |
| Exports | Reports | Charities think in "reports", not "exports" |
| Settings | Settings | Fine as-is, but with friendlier sub-labels |
Terminology Overhaul
| Old (SaaS jargon) | New (human language) | Where used |
|---|---|---|
| Campaign | Appeal / Collection | Nav, headers |
| QR Source | Pledge link | Cards, dialogs |
| Reconcile | Match payments | Nav, page title |
| Rail | Payment method | Tables, detail |
| Initiated | Said they've paid | Status badge |
| Pipeline by Status | How pledges are doing | Dashboard card |
| Conversion rate | % who pledged | Stats |
| CRM Export Pack | Full data download | Export card |
| Webhook / API | Connect to other tools | Export card |
| GoCardless | Direct Debit | Settings |
| Reference prefix | Code prefix | Settings |
| Auto-confirmed | Automatically matched | Reconcile |
Status Labels (the biggest confusion)
| Old | New | Color | What it actually means |
|---|---|---|---|
| new | Waiting | Gray | Pledge made, no payment yet |
| initiated | Said they paid | Amber | Donor clicked "I've paid" or replied PAID |
| paid | Received ✓ | Green | Payment confirmed in bank |
| overdue | Needs a nudge | Red | No payment after reminder cycle |
| cancelled | Cancelled | Gray muted | Donor or staff cancelled |
Visual Identity: Bringing Brand into the Dashboard
Current Dashboard Style
- Generic shadcn/ui (rounded-lg cards, muted-foreground, hover:shadow-md)
- No brand colors except occasional trust-blue
- Card-heavy layout (everything in a Card with CardHeader/CardContent)
- Small text, low contrast
- Emoji as visual anchors (🤲, 💷, 🏦)
Target Dashboard Style (matching BRAND.md)
- Sharp edges — remove rounded-lg on cards, use squared or rounded-sm max
- Typography as hero — big bold numbers, not cards with icons
- Gap-px grids instead of card grids for stats
- Dark sections for key actions (1-2 per page)
- Left-border accents on feature items
- No emoji in UI — use the brand icon system
- 60-30-10 color rule — Midnight + Paper base, Promise Blue actions, Gold/Green/Red status only
- Signature numbered steps (01, 02, 03) in setup flow
Implementation Plan
Phase 1: Navigation + Terminology (layout.tsx)
- Rename nav items
- Update sidebar visual to match brand
- Remove emoji from sidebar help box
Phase 2: Dashboard Home (page.tsx)
- Rewrite with brand typography
- Gap-px stat grid instead of card grid
- Human status labels
- Remove jargon
Phase 3: Collect page (events → collect)
- Rename to "Collect"
- Simplify campaign creation
- Better empty state
Phase 4: Money page (pledges + reconcile merged)
- Two tabs: "People" (pledge list) and "Bank" (reconcile)
- Human column labels
- Human status badges
Phase 5: Reports page (exports)
- Cleaner cards
- Brand style
Phase 6: Settings page
- Friendlier labels
- Remove technical jargon