Fundraising Wireframes
Purpose
Fundraising is the financial engine of the platform. These wireframes cover the admin-side screens used by the Finance Director and Org Admin to manage donations, build forms, track pledges, process refunds, handle cash, monitor compliance, run A/B tests, configure alliance splits, and manage payment processors.
The core UX challenge: fundraising touches money, compliance, and cross-org allocation — every screen must balance power with auditability. Actions are logged, amounts are precise, and destructive operations (refunds, cancellations) require explicit confirmation.
The supporter-facing donation experience (public donation form, portal home, donation history, recurring management, receipts, year-end statements) is wireframed in supporter/supporter-portal.md. This document covers admin-side screens only, with cross-references where the two overlap.
Scope
| ID | Screen | Personas | Offline | Mobile | Section |
|---|---|---|---|---|---|
| FUND-001 | Donation List | OA, FD | No | Yes | Donations |
| FUND-002 | Donation Detail | OA, FD | No | Yes | Donations |
| FUND-003 | Donation Form Builder | OA, FD | No | Desktop | Forms |
| FUND-004 | Donation Form Preview | OA, FD | No | Yes | Forms |
| FUND-005 | Donation Form — Public (Hosted) | S, Public | No | Primary | Forms (cross-ref) |
| FUND-006 | Donation Form — Embed Config | OA, FD | No | Desktop | Forms |
| FUND-007 | Recurring Donation Management | OA, FD | No | Desktop | Recurring |
| FUND-008 | Pledge Management | OA, FD | No | Desktop | Pledges |
| FUND-009 | Refund Processing | OA, FD | No | Desktop | Refunds |
| FUND-010 | Cash Donation Recording | OA, FD, V | Partial | Primary | Cash |
| FUND-011 | Cash Reconciliation | OA, FD | No | Desktop | Cash |
| FUND-012 | Compliance Flag Review | OA, FD | No | Desktop | Compliance |
| FUND-013 | A/B Test Setup | OA, FD | No | Desktop | A/B Testing |
| FUND-014 | A/B Test Results | OA, FD | No | Desktop | A/B Testing |
| FUND-015 | Alliance Split Configuration | OA, FD | No | Desktop | Alliance |
| FUND-016 | Alliance Fundraising Report | OA, FD | No | Desktop | Alliance |
| FUND-017 | Payment Processor Configuration | OA | No | Desktop | Settings |
| FUND-018 | Fundraising Campaign List | OA, FD | No | Yes | Campaigns |
| FUND-019 | Fundraising Campaign Create/Edit | OA, FD | No | Desktop | Campaigns |
| FUND-020 | Year-End Statement Generator | OA, FD | No | Desktop | Statements |
Finance Director Navigation Context
The Finance Director's sidebar organizes fundraising into a flat structure under a single "Fundraising" section:
OVERVIEW
Dashboard → DASH-003
FUNDRAISING
Donations → FUND-001
Forms → form list (within FUND-003)
Campaigns → FUND-018
Recurring → FUND-007
Pledges → FUND-008
Refunds → FUND-009
Cash → FUND-010 list / FUND-011
Compliance Flags → FUND-012
A/B Tests → FUND-013 list / FUND-014
Alliance Splits → FUND-015
Payment Processors → FUND-017
Statements → FUND-020
PEOPLE
Donors → CRM-001 (filtered to donor tag)
Segments → CRM-005
MESSAGING
Messages → messaging screens
FUND-001: Donation List
The primary browse screen for all donations. Answers "what money came in?" with filtering, search, and export.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Donations [Export ▾] [+ Record Cash] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Summary Bar │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
│ │ Today │ │ This Week │ │ This Month │ │ This Year │ │
│ │ $2,340 │ │ $14,780 │ │ $52,100 │ │ $347,200 │ │
│ │ 18 gifts │ │ 96 gifts │ │ 412 gifts │ │ 2,847 gifts │ │
│ └─────────────┘ └─────────────┘ └─────────────┘ └─────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ 🔍 Search by donor name, email, or transaction ID... │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Filters: [Type ▾] [Status ▾] [Method ▾] [Amount ▾] [Date Range ▾] │
│ [Campaign ▾] [Source ▾] │
│ │
│ ☐ Donor Amount Type Method Date Status │
│ ───────────────────────────────────────────────────────────────────────── │
│ ☐ María García $100.00 One-time Card Mar 3 ✓ Comp │
│ ☐ Anonymous $50.00 Recurring Card Mar 3 ✓ Comp │
│ ☐ Carlos Ruiz $250.00 One-time Transfer Mar 2 ◷ Pend │
│ ☐ Lucía Fernández $25.00 Recurring Card Mar 2 ✓ Comp │
│ ☐ Pedro Martínez $500.00 Pledge Cash Mar 2 ✓ Comp │
│ ☐ Anonymous $75.00 One-time M-Pesa Mar 1 ✓ Comp │
│ ☐ ⚠ Raj Patel $1,000 One-time Card Mar 1 ⚑ Flag │
│ ☐ Amina Diallo $30.00 Recurring Card Mar 1 ✓ Comp │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ Showing 1-50 of 2,847 ◀ 1 2 3 ... 57 ▶ │
│ │
│ Bulk actions: [Mark Reviewed] [Export Selected] │
└──────────────────────────────────────────────────────────────────────────────┘
Mobile
┌────────────────────────────┐
│ Donations [⋮] │
├────────────────────────────┤
│ │
│ Today $2,340 · 18 gifts │
│ │
│ 🔍 Search... │
│ [Filters ▾] │
│ │
│ ┌──────────────────────┐ │
│ │ María García │ │
│ │ $100 · One-time │ │
│ │ Card · Mar 3 ✓ │ │
│ ├──────────────────────┤ │
│ │ Anonymous │ │
│ │ $50 · Recurring │ │
│ │ Card · Mar 3 ✓ │ │
│ ├──────────────────────┤ │
│ │ Carlos Ruiz │ │
│ │ $250 · One-time │ │
│ │ Transfer · Mar 2 ◷ │ │
│ ├──────────────────────┤ │
│ │ ⚠ Raj Patel │ │
│ │ $1,000 · One-time │ │
│ │ Card · Mar 1 ⚑ │ │
│ └──────────────────────┘ │
│ │
│ Load more... │
└────────────────────────────┘
Filter Options
| Filter | Options |
|---|---|
| Type | One-time, Recurring, Pledge fulfillment, Cash |
| Status | Completed, Pending, Failed, Refunded, Flagged |
| Method | Card, Bank transfer, M-Pesa, Cash, Other |
| Amount | Custom range (min–max) |
| Date Range | Today, This week, This month, Custom |
| Campaign | All campaigns + "No campaign" |
| Source | Online form, Phone bank, Canvassing, Event, Direct, Import |
Interaction
- Row click → opens FUND-002 Donation Detail
- Flagged row (⚑): highlighted with warning background, flag icon. Click → detail with compliance info
- Export dropdown: CSV, Excel, PDF. Respects current filters. Audit-logged
- "+ Record Cash" → opens FUND-010 Cash Donation Recording
- Bulk actions: appear when checkboxes are selected
- Summary bar: updates in real time as filters change
States
- Empty: "No donations yet. Create a donation form to start accepting contributions." [Create Form]
- Filtered empty: "No donations match these filters." [Clear Filters]
- Loading: Skeleton rows with shimmer
FUND-002: Donation Detail
Full record view of a single donation. Answers "what happened with this gift?" — the complete transaction lifecycle.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← Donations Donation #TXN-2024-00847 [Refund] [⋮] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌────────────────────────────────┬──────────────────────────────────────┐ │
│ │ │ │ │
│ │ Donation Summary │ Donor │ │
│ │ ────────────────── │ ────── │ │
│ │ │ │ │
│ │ Amount $100.00 │ María García │ │
│ │ Processing fee −$3.20 │ maria.garcia@email.com │ │
│ │ Net amount $96.80 │ +1 (787) 555-0142 │ │
│ │ │ │ │
│ │ Type One-time │ 123 Calle Sol, San Juan PR │ │
│ │ Method Visa ••4821 │ │ │
│ │ Status ✓ Completed │ Donor since: Jan 2024 │ │
│ │ Date Mar 3, 2026 │ Total given: $1,450 (12 gifts) │ │
│ │ Time 2:34 PM AST │ │ │
│ │ │ [View Contact →] │ │
│ │ Campaign Spring Drive │ │ │
│ │ Source Online form │ │ │
│ │ Form Main website │ │ │
│ │ Designation General fund │ │ │
│ │ │ │ │
│ │ Fee covered Yes (+$3.20) │ │ │
│ │ Currency USD │ │ │
│ │ Processor ref ch_3Mx... │ │ │
│ │ │ │ │
│ └────────────────────────────────┴──────────────────────────────────────┘ │
│ │
│ Compliance │
│ ────────── │
│ Employer: Acme Corp Occupation: Software Engineer │
│ Contribution limit check: ✓ Within limits ($1,450 of $5,000 max) │
│ Flags: None │
│ │
│ ────────────────────────────────────────────────────────────────────────── │
│ │
│ Audit Trail │
│ ─────────── │
│ Mar 3, 2:34 PM Donation received via online form │
│ Mar 3, 2:34 PM Payment processed (Stripe: ch_3Mx...) │
│ Mar 3, 2:34 PM Receipt emailed to maria.garcia@email.com │
│ Mar 3, 2:35 PM Contact record updated (CRM-002 #4782) │
│ Mar 3, 2:35 PM Thank-you email queued │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Mobile
┌────────────────────────────┐
│ ← Donations [⋮] │
├────────────────────────────┤
│ │
│ $100.00 │
│ ✓ Completed · Mar 3 │
│ │
│ ───────────────────── │
│ │
│ María García │
│ maria.garcia@email.com │
│ [View Contact →] │
│ │
│ ───────────────────── │
│ │
│ Type One-time │
│ Method Visa ••4821 │
│ Net $96.80 │
│ Campaign Spring Drive │
│ Source Online form │
│ │
│ ───────────────────── │
│ │
│ Compliance │
│ Within limits │
│ ($1,450 of $5,000 max) │
│ │
│ ───────────────────── │
│ │
│ ▸ Audit Trail (5 events) │
│ │
│ ───────────────────── │
│ │
│ [Refund This Donation] │
│ │
└────────────────────────────┘
Flagged Donation Variant
When a donation has compliance flags, the detail view adds a prominent flag section:
│ ⚠ Compliance Flags │
│ ──────────────────── │
│ │
│ ⚠ Velocity alert: 3 donations from this donor in 24 hours │
│ Total in window: $2,750 │
│ Previous: $1,000 (Mar 1, 1:12 PM), $750 (Mar 1, 6:45 PM) │
│ │
│ Actions: [✓ Approve — Mark Reviewed] [↩ Refund] [⚑ Escalate] │
│ │
│ Notes │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Add a note about this review decision... │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ Required before Approve or Refund │
Interaction
- Refund button → opens FUND-009 Refund Processing pre-filled with this donation
- "View Contact" → navigates to CRM-002 for the donor
- Flagged actions require a note before Approve or Refund
- Audit trail: read-only, auto-generated, includes all system events
- Overflow menu (⋮): Resend receipt, Download receipt PDF, View in processor dashboard (external link)
Multi-Currency Variant
When the donation was in a non-settlement currency, the summary shows both:
│ Amount KES 12,500 │
│ (Converted) $96.15 @ 130.01 │
│ Processing fee −$3.08 │
│ Net amount $93.07 │
│ Currency KES → USD │
│ Rate locked Mar 3, 2:34 PM │
FUND-003: Donation Form Builder
Split-pane builder for creating and editing donation forms. The form builder configures what donors see on the public hosted page (FUND-005) or embedded widget (FUND-006).
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← Forms Edit: Spring Campaign Form [Preview] [Publish] │
├────────────────────────────────┬─────────────────────────────────────────────┤
│ │ │
│ FORM SETTINGS │ Live Preview │
│ ───────────── │ ───────────── │
│ │ │
│ Form name * │ ┌───────────────────────────────────────┐ │
│ ┌──────────────────────────┐ │ │ │ │
│ │ Spring Campaign Form │ │ │ 🌿 Partido Verde │ │
│ └──────────────────────────┘ │ │ │ │
│ │ │ Support our Spring Campaign │ │
│ Internal description │ │ │ │
│ ┌──────────────────────────┐ │ │ Your contribution makes a │ │
│ │ Primary form for spring │ │ │ difference in our community. │ │
│ └──────────────────────────┘ │ │ │ │
│ │ │ ┌─────┐ ┌─────┐ ┌──────┐ ┌─────┐ │ │
│ ▾ AMOUNTS │ │ │ $25 │ │ $50 │ │[$100]│ │$250 │ │ │
│ ────────── │ │ └─────┘ └─────┘ └──────┘ └─────┘ │ │
│ │ │ ┌─────┐ ┌───────┐ │ │
│ Suggested amounts * │ │ │$500 │ │ Other │ │ │
│ ┌──────────────────────────┐ │ │ └─────┘ └───────┘ │ │
│ │ 25, 50, 100, 250, 500 │ │ │ │ │
│ └──────────────────────────┘ │ │ ☐ Make this monthly │ │
│ │ │ │ │
│ Default amount │ │ ☐ I'd like to cover the │ │
│ ┌──────────────────────────┐ │ │ processing fee (+$3.20) │ │
│ │ 100 │ │ │ │ │
│ └──────────────────────────┘ │ │ First Name * Last Name * │ │
│ │ │ ┌──────────┐ ┌──────────┐ │ │
│ Min / Max │ │ │ │ │ │ │ │
│ ┌──────┐ ┌──────┐ │ │ └──────────┘ └──────────┘ │ │
│ │ 5 │ │ 5000 │ │ │ │ │
│ └──────┘ └──────┘ │ │ Email * │ │
│ │ │ ┌──────────────────────┐ │ │
│ ☑ Allow custom amount │ │ │ │ │ │
│ ☑ Show recurring option │ │ └──────────────────────┘ │ │
│ ☑ Show fee pass-through │ │ │ │
│ │ │ [Donate $100] │ │
│ ▾ DONOR FIELDS │ │ │ │
│ ────────────── │ └───────────────────────────────────────┘ │
│ │ │
│ Required: │ Device: [Desktop ▾] Lang: [Español ▾] │
│ ☑ First name │ │
│ ☑ Last name │ │
│ ☑ Email │ │
│ ☐ Phone │ │
│ │ │
│ Conditional (if jurisdiction │ │
│ requires): │ │
│ ☑ Address │ │
│ ☑ Employer │ │
│ ☑ Occupation │ │
│ │ │
│ ▸ APPEARANCE │ │
│ ▸ PAYMENT METHODS │ │
│ ▸ CONFIRMATION │ │
│ ▸ ADVANCED │ │
│ │ │
└────────────────────────────────┴─────────────────────────────────────────────┘
Collapsed Sections Detail
APPEARANCE:
- Hero heading text (rich text)
- Body text (rich text)
- Hero image (upload or URL)
- Button text (default: "Donate {amount}")
- Button color (defaults to tenant primary)
- Background color
- Language (multi-select from tenant's enabled languages)
PAYMENT METHODS:
- Checkboxes per available method, determined by the configured processor(s)
- Card (always available if processor connected)
- Bank transfer (if processor supports)
- M-Pesa (if Kenya processor connected)
- Each method shows the processor it routes to
CONFIRMATION:
- Thank-you page heading
- Thank-you page body text
- Redirect URL (optional — redirect after donation instead of showing thank-you page)
- Receipt email template (select from templates)
ADVANCED:
- Campaign assignment (select fundraising campaign)
- Designation / fund (free text or select from org-defined list)
- UTM tracking (auto-captured from URL params)
- A/B test enrollment (link to FUND-013)
- Form slug (URL path for hosted version)
Interaction
- Live preview: updates as settings change, no save required to see changes
- Device toggle: switches preview between desktop and mobile widths
- Language toggle: switches preview to show the form in selected language
- Publish: if form is new, shows confirmation dialog with hosted URL. If existing, applies changes immediately with "Changes published" toast
- Preview button: opens FUND-004 in new tab (full-page preview)
- Saving: auto-saves draft. Explicit Publish required to make changes live
- Validation: form name required, at least one suggested amount, at least one payment method
States
- New form: all fields empty, preview shows placeholder
- Published form: "Published" badge next to form name, last-published timestamp
- Draft changes: "Unpublished changes" warning badge
FUND-004: Donation Form Preview
Full-page preview of a donation form as donors will see it. Accessed from the builder's Preview button.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ⚠ PREVIEW MODE — This form is not live [← Back to Builder] [Publish] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ (Full rendering of the public donation form │
│ as it will appear to donors — identical │
│ to FUND-005 / supporter-portal.md public │
│ donation page, but with preview banner) │
│ │
│ Form interactions work (amount selection, │
│ field validation) but payment submission │
│ shows "This is a preview" instead of │
│ processing. │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- Form fields are interactive (validation fires, amounts toggle)
- Submit button shows "Preview — no payment will be processed" tooltip
- "Back to Builder" returns to FUND-003
- Publish publishes from preview context
- Mobile preview: accessible via the builder's device toggle or by opening the preview URL on a mobile device
FUND-005: Donation Form — Public (Hosted)
The public-facing donation page. For web donations, this is where the donor starts.
Cross-reference: The full wireframe for this screen is in
supporter/supporter-portal.md— "Public Donation Page (Pre-Auth)". It covers the tenant-branded donation form, amount selection, donor fields, payment method selection, and the confirmation/receipt flow.
This screen lives at /donate/:form-slug and uses the (public) layout group (no app shell, no login required).
FUND-006: Donation Form — Embed Config
Configuration screen for embedding a donation form on external websites. Generates HTML embed code and provides customization options.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← Forms Embed: Spring Campaign Form │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Embed Options │
│ ───────────── │
│ │
│ Embed type │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ [● Inline] │ │ ○ Modal │ │ ○ Button │ │
│ │ Form renders │ │ Opens in │ │ "Donate" btn │ │
│ │ directly on │ │ overlay when │ │ opens modal │ │
│ │ the page │ │ triggered │ │ on click │ │
│ └────────────────┘ └────────────────┘ └────────────────┘ │
│ │
│ Appearance overrides │
│ ☐ Hide header image │
│ ☐ Hide header text (amount buttons only) │
│ ☐ Match host page background (transparent) │
│ │
│ Allowed domains * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ partidoverde.org, campaign2026.pr │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ Security: embed will only render on these domains │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Embed Code │
│ ────────── │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ <script src="https://app.greengrass.io/embed/v1.js" │ │
│ │ data-form="spring-campaign" │ │
│ │ data-type="inline" │ │
│ │ data-tenant="partido-verde"> │ │
│ │ </script> │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ [Copy Code] │
│ │
│ Preview │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ (Rendered preview of the embed as it will appear on a host page) │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- Embed type: radio cards. Code snippet updates in real time as type changes
- Copy Code: copies to clipboard with confirmation toast
- Allowed domains: comma-separated. Embed script validates referrer at runtime
- Preview: live rendering of the selected embed type
- Domain field required — empty domain list means embed won't render anywhere
FUND-018: Fundraising Campaign List
Browse and manage fundraising campaigns. Campaigns are containers that group donation forms, track goals, and measure performance.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Fundraising Campaigns [+ New Campaign] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ [Active] [Upcoming] [Ended] [All] │
│ │
│ Campaign Goal Raised Progress Period │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Spring Drive 2026 $50,000 $32,100 ████████░░ 64% │
│ Online + events 412 donors $78 avg Ends Apr 15 │
│ │
│ Monthly Sustainer $5,000/mo $4,200/mo ████████░░ 84% │
│ Recurring focus 168 active $25 avg Ongoing │
│ │
│ Year-End Appeal $25,000 $25,780 ██████████ 103% ✓ │
│ Email + SMS 198 donors $130 avg Ended Dec 31 │
│ │
│ Launch Fund $10,000 $1,200 █░░░░░░░░░ 12% │
│ Seed funding 15 donors $80 avg Starts Apr 1 │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ Showing 1-4 of 4 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Mobile
┌────────────────────────────┐
│ Campaigns [+] │
├────────────────────────────┤
│ │
│ [Active] [Upcoming] [All] │
│ │
│ ┌──────────────────────┐ │
│ │ Spring Drive 2026 │ │
│ │ $32,100 of $50,000 │ │
│ │ ████████░░ 64% │ │
│ │ 412 donors · Apr 15 │ │
│ ├──────────────────────┤ │
│ │ Monthly Sustainer │ │
│ │ $4,200 of $5,000/mo │ │
│ │ ████████░░ 84% │ │
│ │ 168 active · Ongoing │ │
│ ├──────────────────────┤ │
│ │ Year-End Appeal ✓ │ │
│ │ $25,780 of $25,000 │ │
│ │ ██████████ 103% │ │
│ │ 198 donors · Done │ │
│ └──────────────────────┘ │
│ │
└────────────────────────────┘
Interaction
- Row click → opens FUND-019 Campaign Create/Edit in view mode
- Status tabs: filter by campaign lifecycle. Counts shown in tab labels
- Progress bar: green when on track (>50% of goal with >50% of time remaining), yellow when behind, full green with checkmark when goal met
- "+ New Campaign" → opens FUND-019
States
- Empty: "No fundraising campaigns yet. Campaigns help you set goals and track progress for fundraising drives." [Create Campaign]
FUND-019: Fundraising Campaign Create/Edit
Create or configure a fundraising campaign.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← Campaigns New Fundraising Campaign [Save] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Campaign Details │
│ ──────────────── │
│ │
│ Campaign name * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Spring Drive 2026 │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Description │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Primary fundraising push for spring campaign activities... │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Goal │
│ ┌────────────────┐ Currency ┌──────┐ │
│ │ 50000 │ │ USD ▾│ │
│ └────────────────┘ └──────┘ │
│ │
│ Period │
│ ┌────────────────┐ to ┌────────────────┐ ☐ Ongoing (no end date) │
│ │ Mar 1, 2026 │ │ Apr 15, 2026 │ │
│ └────────────────┘ └────────────────┘ │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ ▸ Donation Forms (2 linked) │
│ ▸ Linked Communications (5 sends) │
│ ▸ Alliance Split │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Performance (read-only in edit mode) │
│ ───────────── │
│ Total raised: $32,100 · 412 donors · Avg: $78 · Recurring: 23% │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Collapsed Sections
Donation Forms: List of linked forms with "Link Form" button. Each form shows its name, type (hosted/embedded), and donation count.
Linked Communications: Read-only list of email/SMS sends that reference this campaign's donation forms. Shows send date, channel, audience size, and donation attribution.
Alliance Split: If the org is in an alliance, option to enable alliance split for this campaign. Links to FUND-015 for configuration.
Interaction
- Save: validates required fields, saves campaign
- Delete (edit mode, overflow menu): confirmation dialog, only if no donations received. If donations exist, campaign can be archived but not deleted
- Ongoing checkbox: disables end date field
- Performance section: shown only in edit mode (existing campaign), read-only
FUND-007: Recurring Donation Management
Admin view of all recurring donation schedules. Answers "what's our recurring revenue health?"
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Recurring Donations [Export ▾] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Summary │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Active │ │ MRR │ │ Avg Amount │ │ Churn (30d) │ │
│ │ 168 │ │ $4,200 │ │ $25 │ │ 3.2% │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ [Active] [Paused] [Failed] [Cancelled] [All] │
│ │
│ 🔍 Search donor name or email... │
│ Filters: [Frequency ▾] [Amount Range ▾] [Payment Method ▾] │
│ │
│ Donor Amount Frequency Method Next Charge Status │
│ ───────────────────────────────────────────────────────────────────────── │
│ Lucía Fernández $25.00 Monthly Visa ••41 Mar 15 Active │
│ Anonymous $50.00 Monthly MC ••82 Mar 12 Active │
│ Carlos Ruiz $100.00 Quarterly Transfer Apr 1 Active │
│ Pedro Martínez $10.00 Monthly Visa ••63 — Paused │
│ Amina Diallo $30.00 Monthly Visa ••17 Mar 8 ⚠ Retry │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ Showing 1-50 of 168 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Status Definitions
| Status | Meaning | Visual |
|---|---|---|
| Active | Charges processing normally | Green text |
| Paused | Donor paused (self-service or admin) | Grey text, italic |
| Retry | Last charge failed, smart retry in progress (up to 4 attempts over 14 days) | Warning icon, amber |
| Failed | All retry attempts exhausted | Red text |
| Cancelled | Donor or admin cancelled | Strikethrough |
Row Detail Panel
Clicking a row opens a right-side detail panel:
┌──────────────────────────────────────┐
│ Lucía Fernández │
│ lucia.fernandez@email.com │
│ [View Contact →] │
│ │
│ ────────────────── │
│ │
│ Schedule │
│ Amount: $25.00 / month │
│ Method: Visa ••4821 │
│ Started: Jan 15, 2024 │
│ Next: Mar 15, 2026 │
│ Total paid: $325 (13 charges) │
│ │
│ ────────────────── │
│ │
│ Charge History │
│ Feb 15 $25.00 ✓ Completed │
│ Jan 15 $25.00 ✓ Completed │
│ Dec 15 $25.00 ✓ Completed │
│ Nov 15 $25.00 ⚠ Retry → ✓ │
│ ... │
│ │
│ ────────────────── │
│ │
│ Admin Actions │
│ [Pause] [Cancel] │
│ Both require confirmation dialog │
│ │
└──────────────────────────────────────┘
Interaction
- Row click → opens detail panel (desktop) or navigates to detail (mobile)
- Export: CSV with all recurring data, respects current filters
- Admin Pause/Cancel: confirmation dialog with reason field. Logged to audit trail. Pause is reversible (Resume button appears). Cancel sends notification to donor
- Retry status row: shows retry attempt count ("Retry 2 of 4, next attempt Mar 9")
States
- Empty: "No recurring donations yet. When donors choose recurring giving on your donation forms, they'll appear here."
FUND-008: Pledge Management
Track pledges made during phone banking, canvassing, or events that haven't yet been fulfilled.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Pledges [Export] [+ New Pledge] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Summary │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Outstanding │ │ Value │ │ Fulfilled │ │ Lapsed │ │
│ │ 47 │ │ $8,350 │ │ 62% │ │ 12% │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ [Pending] [Reminded] [Fulfilled] [Lapsed] [All] │
│ │
│ Donor Amount Source Pledged Status Actions │
│ ───────────────────────────────────────────────────────────────────────── │
│ María García $200 Phone bank Feb 28 Pending [⋮] │
│ Carlos Ruiz $100 Canvassing Feb 25 Reminded [⋮] │
│ Raj Patel $500 Event Feb 20 Pending [⋮] │
│ Amina Diallo $50 Phone bank Feb 15 Reminded [⋮] │
│ Pedro Martínez $150 Canvassing Feb 10 Fulfilled [⋮] │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ Showing 1-47 of 47 │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Pledge Lifecycle
Created ──→ Pending ──→ Reminded ──→ Fulfilled
│ ↑
│ (donor pays)─────────┘
│
└──→ Lapsed (after configurable grace period)
Row Actions Menu (⋮)
- Send Reminder: triggers reminder via configured channel (email, SMS, WhatsApp). Button disabled if reminded within last 7 days
- Record Fulfillment: links to a received donation, changes status to Fulfilled
- Mark Lapsed: manual override, requires note
- View Contact: navigates to CRM-002
Creating a Pledge (+ New Pledge)
┌──────────────────────────────────────────────────┐
│ New Pledge [Save] │
├──────────────────────────────────────────────────┤
│ │
│ Donor * [Search or create contact...] │
│ Amount * ┌────────────────────┐ │
│ │ │ │
│ └────────────────────┘ │
│ Source [Phone bank ▾] │
│ Campaign [Spring Drive ▾] │
│ │
│ Reminder schedule │
│ ○ Default (7 days, then 14, then 30) │
│ ○ Custom │
│ │
│ Notes │
│ ┌────────────────────────────────────────────┐ │
│ │ │ │
│ └────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────┘
States
- Empty: "No pledges recorded yet. Pledges can be created here, or automatically during phone bank and canvassing shifts."
FUND-009: Refund Processing
Initiate and track refunds. Only Finance Director and Org Admin can refund.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← Donations Refund: Donation #TXN-2024-00847 [Process ▾] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Original Donation │
│ ────────────────── │
│ Donor: María García │
│ Amount: $100.00 │
│ Date: Mar 3, 2026 │
│ Method: Visa ••4821 │
│ Status: ✓ Completed │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Refund Details │
│ ────────────── │
│ │
│ Refund type │
│ ● Full refund ($100.00) │
│ ○ Partial refund ┌────────────┐ │
│ │ │ │
│ └────────────┘ │
│ │
│ Reason * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Donor requested refund — duplicate donation │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ ⓘ Refund will be processed to original payment method (Visa ••4821). │
│ Processing time: 5–10 business days. │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ ⚠ Alliance Split Impact │
│ This donation was split across the alliance: │
│ · Partido Verde: $60.00 (60%) │
│ · Movimiento Ecologista: $40.00 (40%) │
│ Refund will reverse both allocations. │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ ⓘ This refund does NOT automatically cancel a recurring donation. │
│ To cancel recurring, go to Recurring Donations. │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Process Button Dropdown
- Process Refund: submits to payment processor. Confirmation dialog: "Refund $100.00 to Visa ••4821? This cannot be undone."
- Save as Pending: saves refund request for review by another admin before processing
Interaction
- Reached from FUND-002 "Refund" button (pre-fills donation data) or from FUND-001 bulk action
- Reason field: required, logged to audit trail
- Alliance split section: only shown if donation was split. Shows each org's portion and confirms reversal
- Cash donation refund: shows "Cash refunds must be handled manually. Record the refund here for audit purposes." with a "Record Manual Refund" button instead of processor submission
- Partial refund: amount field appears, validated against original amount
Refund History (accessed from Refunds sidebar item)
│ Refunded Donations [Export] │
│ │
│ Donor Original Refunded Type Date Reason │
│ ───────────────────────────────────────────────────────────────────────── │
│ María García $100.00 $100.00 Full Mar 3 Duplicate │
│ Carlos Ruiz $250.00 $75.00 Partial Feb 28 Overcharge │
FUND-010: Cash Donation Recording
Mobile-first form for recording cash donations at events or in the field. Works offline.
Mobile (Primary)
┌────────────────────────────┐
│ ← Cash Donation │
├────────────────────────────┤
│ │
│ Amount * │
│ ┌──────────────────────┐ │
│ │ $ │ │
│ └──────────────────────┘ │
│ │
│ ───────────────────── │
│ │
│ Donor (optional) │
│ │
│ ○ Named donor │
│ ● Anonymous │
│ │
│ (If Named:) │
│ Name │
│ ┌──────────────────────┐ │
│ │ │ │
│ └──────────────────────┘ │
│ Phone or Email │
│ ┌──────────────────────┐ │
│ │ │ │
│ └──────────────────────┘ │
│ │
│ ───────────────────── │
│ │
│ Event context │
│ ┌──────────────────────┐ │
│ │ Rally — Plaza del... │ │
│ └──────────────────────┘ │
│ │
│ Receipt photo │
│ ┌──────────────────────┐ │
│ │ 📷 Take Photo │ │
│ │ or tap to upload │ │
│ └──────────────────────┘ │
│ │
│ Notes │
│ ┌──────────────────────┐ │
│ │ │ │
│ └──────────────────────┘ │
│ │
│ Collected by │
│ You (Ana Reyes) │
│ │
│ [Record Cash │
│ Donation] │
│ │
│ ◌ Offline — will sync │
│ when connected │
│ │
└────────────────────────────┘
Desktop
Same form rendered in a centered card (max-width 480px) within the app shell. Used when Finance Director records cash from the office.
Interaction
- Amount: numeric keyboard on mobile, currency formatted
- Named/Anonymous toggle: anonymous hides name and contact fields. Jurisdiction rules may require named donor above certain thresholds — warning shown if anonymous exceeds threshold
- Receipt photo: uses device camera (Capacitor Camera API). Optional. Stored as attachment on the donation record
- "Collected by": auto-filled with current user, read-only. Chain of custody starts here
- Offline: form saves locally, syncs when connected. Shows offline indicator
- Submit confirmation: "Cash donation of $[amount] recorded" toast. Returns to previous screen or offers "Record Another"
Volunteer Access
Volunteers see a simplified version: amount, named/anonymous, event context, photo. No notes, no campaign assignment. The donation enters the reconciliation queue (FUND-011) automatically.
FUND-011: Cash Reconciliation
Finance Director matches recorded cash donations against bank deposits. Answers "does the money we recorded match the money we deposited?"
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Cash Reconciliation [+ Record Batch] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Unreconciled: 12 records · $1,340 Reconciled this month: $4,200 │
│ │
│ ┌───────────────────────────────────┬──────────────────────────────────┐ │
│ │ │ │ │
│ │ Recorded Cash Donations │ Bank Deposits │ │
│ │ ───────────────────── │ ───────────── │ │
│ │ │ │ │
│ │ ☐ Mar 3 $50 Ana Reyes │ Mar 3 $480 Ref: DEP-0312 │ │
│ │ Rally — Plaza del Sol │ (No linked records yet) │ │
│ │ │ │ │
│ │ ☐ Mar 3 $120 Ana Reyes │ Mar 1 $860 Ref: DEP-0311 │ │
│ │ Rally — Plaza del Sol │ Linked: 6 records ✓ │ │
│ │ │ │ │
│ │ ☐ Mar 3 $75 Jorge Vega │ │ │
│ │ Rally — Plaza del Sol │ [+ Add Deposit] │ │
│ │ │ │ │
│ │ ☑ Mar 2 $200 Miguel Torres │ │ │
│ │ Door-to-door collection │ │ │
│ │ │ │ │
│ │ ☐ Mar 2 $150 Miguel Torres │ │ │
│ │ Door-to-door collection │ │ │
│ │ │ │ │
│ │ ───────────────────── │ │ │
│ │ Selected: 1 · $200 │ │ │
│ │ [Match to Deposit ▾] │ │ │
│ │ │ │ │
│ └───────────────────────────────────┴──────────────────────────────────┘ │
│ │
│ ⚠ Discrepancies │
│ ───────────── │
│ DEP-0310 (Feb 28): Deposit $500, Linked records $475. Difference: $25 │
│ [Add Adjustment] [Add Note] │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- Two-column layout: recorded cash on the left, bank deposits on the right
- Matching workflow: select one or more cash records (checkboxes) → click "Match to Deposit" → select or create a deposit → records linked
- "+ Add Deposit": manually enter bank deposit reference and amount
- "+ Record Batch": opens a form to record a batch of cash (e.g., "Event envelope: $480, 6 individual records")
- Discrepancies section: auto-calculated when linked records don't sum to deposit amount. Adjustments require a note (logged to audit trail)
- Chain of custody: clicking a cash record shows the full chain (collector → handoff → deposit)
States
- Empty: "No unreconciled cash donations. All recorded cash has been matched to bank deposits."
- No deposits: right column shows "No deposits recorded yet. Add your first bank deposit to start matching."
FUND-012: Compliance Flag Review
Review donations flagged by automated fraud detection rules. Critical for campaign finance compliance.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Compliance Flags [Flag Settings ⚙] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ ⚑ Open │ │ ✓ Resolved │ │ Total (30d) │ │
│ │ 5 │ │ 23 │ │ 28 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ [Open] [Resolved] [All] │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ ⚠ HIGH — Contribution Limit Approaching │ │
│ │ Raj Patel — $1,000 donation on Mar 1 │ │
│ │ Total this cycle: $4,500 of $5,000 limit │ │
│ │ Flagged: Mar 1, 2:34 PM │ │
│ │ │ │
│ │ [✓ Approve] [↩ Refund] [View Donation →] │ │
│ │ │ │
│ ├──────────────────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ⚠ HIGH — Velocity Alert │ │
│ │ Unknown Donor (card ••9182) — 3 donations in 24 hours │ │
│ │ Amounts: $200, $200, $200 = $600 total │ │
│ │ Flagged: Mar 2, 8:15 AM │ │
│ │ │ │
│ │ [✓ Approve] [↩ Refund All] [⛔ Block Card] [View Donations →] │ │
│ │ │ │
│ ├──────────────────────────────────────────────────────────────────────┤ │
│ │ │ │
│ │ ⚡ MEDIUM — Geographic Mismatch │ │
│ │ Lisa Chen — IP location (California) ≠ billing address (PR) │ │
│ │ $150 donation on Mar 2 │ │
│ │ Flagged: Mar 2, 3:22 PM │ │
│ │ │ │
│ │ [✓ Approve] [↩ Refund] [View Donation →] │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Note required before any action ──────────────────────────────────────── │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Review notes... │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Flag Types
| Type | Severity | Trigger |
|---|---|---|
| Contribution limit approaching | High | Within 10% of jurisdiction max |
| Contribution limit exceeded | Critical | Over jurisdiction max |
| Velocity alert | High | Multiple donations from same source in short window |
| Geographic mismatch | Medium | IP location ≠ billing address |
| Info mismatch | Medium | Name/address variations across donations |
| Known bad actor | Critical | Previously blocked donor/payment method |
| Anonymous threshold | High | Anonymous donation exceeds jurisdiction limit |
Interaction
- Actions require note: the note field at the bottom must have content before Approve, Refund, or Block actions are enabled
- Approve: marks flag as resolved, donation proceeds normally. Logged to audit trail
- Refund: navigates to FUND-009 pre-filled. Flag resolved on refund completion
- Block Card: adds payment method to block list. Confirmation dialog warns this affects future donations
- Flag Settings (⚙): navigates to configuration screen for threshold values and automated rules
- Severity sorting: Critical flags always sorted first, then High, then Medium
States
- Empty (Open tab): "No open compliance flags. All flagged donations have been reviewed." ✓
- Empty (All): "No compliance flags in the last 30 days. Your fraud detection rules are configured in Flag Settings."
FUND-013: A/B Test Setup
Configure A/B tests for donation forms to optimize conversion.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← A/B Tests New A/B Test [Start] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Test name * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Spring form — suggested amounts test │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Base form * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Spring Campaign Form [▾] │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Variants │
│ ───────── │
│ │
│ ┌──────────────────────────────────┬──────────────────────────────────┐ │
│ │ A — Control (50%) │ B — Variant (50%) │ │
│ │ ───────────── │ ───────────── │ │
│ │ │ │ │
│ │ Amounts: $25, $50, $100, │ Amounts: $50, $100, $250, │ │
│ │ $250, $500 │ $500, $1000 │ │
│ │ Default: $100 │ Default: $250 │ │
│ │ │ │ │
│ │ (All other settings from │ What to vary: │ │
│ │ base form) │ ☑ Suggested amounts │ │
│ │ │ ☑ Default amount │ │
│ │ │ ☐ Button text │ │
│ │ │ ☐ Header text │ │
│ │ │ ☐ Hero image │ │
│ │ │ │ │
│ │ │ [Edit Variant →] │ │
│ └──────────────────────────────────┴──────────────────────────────────┘ │
│ │
│ Traffic split │
│ A: [50]% B: [50]% │
│ │
│ Minimum sample size │
│ ┌────────┐ donations per variant before results are significant │
│ │ 100 │ │
│ └────────┘ │
│ │
│ Auto-declare winner │
│ ☑ Automatically switch to winning variant when significance reached │
│ Metric: ○ Conversion rate ● Revenue per visitor ○ Average donation │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- Base form: dropdown of published donation forms. Control variant inherits all settings
- "Edit Variant": opens a subset of the form builder (FUND-003) with only the varied fields editable
- Traffic split: numeric fields, must sum to 100%. Slider alternative considered but numeric is more precise
- Start: begins the test. Confirmation dialog: "Start A/B test? Traffic to [form name] will be split between variants."
- Running test: Start button changes to "Stop Test". Variant settings become read-only. Traffic split can still be adjusted (e.g., to stop sending traffic to a losing variant)
A/B Test List (accessed from sidebar)
│ A/B Tests [+ New Test] │
│ │
│ Test Form Status Winner Started │
│ ───────────────────────────────────────────────────────────────────────── │
│ Amounts test Spring Campaign Running — Mar 1 │
│ Button color test Main Website Done B Feb 1 │
│ Header image test Year-End Done A Jan 15 │
FUND-014: A/B Test Results
Results dashboard for a running or completed A/B test.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ ← A/B Tests Amounts Test — Spring Campaign Form [Stop Test] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Status: Running · Started Mar 1 · 18 days │
│ │
│ ┌──────────────────────────────────┬──────────────────────────────────┐ │
│ │ A — Control │ B — Variant │ │
│ │ ──────────── │ ──────────── │ │
│ │ │ │ │
│ │ Visitors 1,247 │ Visitors 1,253 │ │
│ │ Donations 89 │ Donations 72 │ │
│ │ Conv. rate 7.1% │ Conv. rate 5.7% │ │
│ │ Revenue $6,230 │ Revenue $7,920 ★ │ │
│ │ Avg donation $70 │ Avg donation $110 ★ │ │
│ │ Rev/visitor $5.00 │ Rev/visitor $6.32 ★ │ │
│ │ │ │ │
│ └──────────────────────────────────┴──────────────────────────────────┘ │
│ │
│ Statistical Significance │
│ ──────────────────────── │
│ Revenue per visitor: B leads by 26% │
│ Confidence: 87% (target: 95%) │
│ Estimated samples needed: ~40 more donations per variant │
│ ████████████████████░░░░ 87% │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Daily Breakdown │
│ ──────────────── │
│ Date A visits A conv A rev B visits B conv B rev │
│ Mar 18 68 5 $350 72 4 $440 │
│ Mar 17 71 4 $280 65 3 $330 │
│ Mar 16 74 6 $420 70 5 $550 │
│ ... │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ [Declare B Winner] — applies variant B settings to the form permanently │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- ★ indicators: mark the leading variant for each metric
- Confidence bar: shows progress toward statistical significance
- "Declare Winner": confirmation dialog, applies winning variant's settings to the base form, ends the test. Button enabled when confidence > 90% or manually at any time
- "Stop Test": ends test without declaring a winner. Traffic returns to 100% control
- Completed test: shows final results with "Winner: B" badge, date declared, and impact summary
FUND-015: Alliance Split Configuration
Configure how donations are split between alliance member organizations. Requires unanimous consent from all participating orgs.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Alliance Fundraising Splits [+ New Split ▾] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ⓘ Split changes require approval from all member organizations. │
│ │
│ Active Splits │
│ ────────────── │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Spring Drive 2026 [Edit] │ │
│ │ Type: Percentage-based │ │
│ │ │ │
│ │ Partido Verde 60% ████████████░░░░░░░░ │ │
│ │ Movimiento Ecologista 25% █████░░░░░░░░░░░░░░ │ │
│ │ Candidatura Torres 15% ███░░░░░░░░░░░░░░░░ │ │
│ │ │ │
│ │ Applied to: Spring Campaign Form, Event Donation Form │ │
│ │ Disbursement: Immediate │ │
│ │ Status: ✓ Active — Approved by all 3 orgs │ │
│ │ │ │
│ ├──────────────────────────────────────────────────────────────────────┤ │
│ │ General Alliance Fund [Edit] │ │
│ │ Type: Fixed amount first, then percentage │ │
│ │ │ │
│ │ First $500 → Partido Verde (host org) │ │
│ │ Remainder: │ │
│ │ Partido Verde 40% ████████░░░░░░░░░░░░ │ │
│ │ Movimiento Ecologista 35% ███████░░░░░░░░░░░░░ │ │
│ │ Candidatura Torres 25% █████░░░░░░░░░░░░░░░ │ │
│ │ │ │
│ │ Applied to: Main Website Form │ │
│ │ Disbursement: Monthly batch │ │
│ │ Status: ✓ Active — Approved by all 3 orgs │ │
│ │ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Pending Approval │
│ ──────────────── │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Year-End Appeal Split [View Details] │ │
│ │ Proposed by: Movimiento Ecologista · Feb 28 │ │
│ │ Waiting on: Candidatura Torres │ │
│ │ ◷ Partido Verde ✓ Movimiento ✓ Torres ◷ │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
New Split / Edit Form
│ Split Configuration │
│ ─────────────────── │
│ │
│ Name * ┌──────────────────────────────────────┐ │
│ │ Spring Drive 2026 │ │
│ └──────────────────────────────────────┘ │
│ │
│ Split type │
│ ● Percentage-based (each org gets a fixed %) │
│ ○ Fixed amount first (one org gets first $X, rest split %) │
│ ○ Threshold-based (split changes at revenue thresholds) │
│ │
│ Allocations │
│ Partido Verde [60]% ████████████░░░░░░░░ │
│ Movimiento Ecologista [25]% █████░░░░░░░░░░░░░░ │
│ Candidatura Torres [15]% ███░░░░░░░░░░░░░░░░ │
│ ───── │
│ 100% ← must sum to 100 │
│ │
│ Apply to forms │
│ ☑ Spring Campaign Form │
│ ☑ Event Donation Form │
│ ☐ Main Website Form │
│ │
│ Disbursement │
│ ● Immediate (each donation split at time of receipt) │
│ ○ Monthly batch (split calculated and disbursed monthly) │
│ │
│ [Submit for Approval] │
│ All 3 member organizations must approve before this split activates. │
Interaction
- Percentage fields: must sum to 100%. Validation prevents save if sum ≠ 100
- "Submit for Approval": sends approval requests to all member org admins. Status changes to "Pending Approval"
- Approval flow: each org admin sees the proposal in their notification center and on this screen. Must explicitly approve. Unanimous required
- Edit existing: creates a new pending version. Current split remains active until new version is unanimously approved
States
- No alliance: "Your organization is not part of an alliance. Alliance fundraising splits allow coalition members to share donation revenue." [Learn More →]
- Alliance, no splits: "No fundraising splits configured. Create a split to share donation revenue across alliance members." [Create Split]
FUND-016: Alliance Fundraising Report
Cross-org fundraising analytics for alliance members.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Alliance Fundraising Report [Date Range ▾] [Export ▾] │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Coalición Verde — Fundraising Summary │
│ Period: Mar 1–31, 2026 │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Total Raised │ │ Donations │ │ Avg Gift │ │ Splits Paid │ │
│ │ $82,400 │ │ 847 │ │ $97 │ │ $78,200 │ │
│ │ across 3 orgs│ │ across 3 orgs│ │ │ │ of $82,400 │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │
│ Per-Organization Breakdown │
│ ────────────────────────── │
│ │
│ Organization Gross Split Recv'd Split Paid Net Position │
│ ───────────────────────────────────────────────────────────────────────── │
│ Partido Verde $52,100 $8,200 $20,840 $39,460 │
│ Movimiento Ecologista $18,300 $10,600 $7,320 $21,580 │
│ Candidatura Torres $12,000 $9,400 $4,800 $16,600 │
│ ───────────────────────────────────────────────────────────────────────── │
│ Alliance Total $82,400 $77,640 │
│ │
│ By Campaign │
│ ─────────── │
│ Campaign Total PV Share ME Share CT Share │
│ Spring Drive $52,100 $31,260 $13,025 $7,815 │
│ General Fund $18,300 $7,820 $6,405 $4,575 │
│ Events $12,000 $7,200 $3,000 $1,800 │
│ │
│ By Payment Method │
│ ───────────────── │
│ Method Count Amount % of Total │
│ Card 612 $64,800 78.6% │
│ Transfer 108 $12,400 15.0% │
│ Cash 94 $3,800 4.6% │
│ M-Pesa 33 $1,400 1.7% │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Disbursement History │
│ ───────────────────── │
│ Date Type From → To Amount Status │
│ Mar 15 Monthly Partido Verde → Mov. Ecologista $2,100 ✓ Sent │
│ Mar 15 Monthly Partido Verde → Cand. Torres $1,200 ✓ Sent │
│ Mar 1 Immediate Mov. Ecologista → Partido Verde $580 ✓ Sent │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- Date range: preset periods (This month, Last month, This quarter, This year, Custom)
- Export: CSV or PDF. PDF version formatted for board reporting. Audit-logged
- "Across N orgs" attribution: consistent with alliance visual pattern
- Member org view: when a member org (not the alliance admin) views this report, they see only their own columns with alliance totals. They cannot see other orgs' individual gross amounts — only the split amounts relevant to them
States
- No data: "No alliance fundraising activity in this period." [Change Date Range]
FUND-017: Payment Processor Configuration
Connect and manage payment processor accounts. OA-only screen.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Payment Processors │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ ⓘ Each payment method routes to a processor. Configure at least one │
│ processor to start accepting donations. │
│ │
│ Connected Processors │
│ ───────────────────── │
│ │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Stripe [Test] [⚙] │ │
│ │ Connected: Jan 15, 2024 │ │
│ │ Status: ✓ Live │ │
│ │ Methods: Card (Visa, MC, Amex), Bank transfer (ACH) │ │
│ │ Last transaction: Mar 3, 2026 (2 min ago) │ │
│ │ Success rate (30d): 98.2% │ │
│ ├──────────────────────────────────────────────────────────────────────┤ │
│ │ M-Pesa (Safaricom) [Test] [⚙] │ │
│ │ Connected: Feb 1, 2025 │ │
│ │ Status: ✓ Live │ │
│ │ Methods: M-Pesa mobile money │ │
│ │ Last transaction: Mar 2, 2026 │ │
│ │ Success rate (30d): 96.7% │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Add Processor │
│ ───────────── │
│ │
│ Recommended for your jurisdiction (Puerto Rico): │
│ │
│ ┌────────────────┐ ┌────────────────┐ ┌────────────────┐ │
│ │ ATH Móvil │ │ PayPal │ │ Other │ │
│ │ Local PR │ │ International │ │ Manual config │ │
│ │ [Connect →] │ │ [Connect →] │ │ [Connect →] │ │
│ └────────────────┘ └────────────────┘ └────────────────┘ │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Settlement Currency: USD ▾ │
│ Multi-currency acceptance: ☑ Enabled (donors can pay in their currency) │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Connect Flow (inline expansion)
Clicking "Connect →" expands a guided setup:
│ Connect Stripe │
│ ────────────── │
│ │
│ Step 1 of 3: Enter API credentials │
│ │
│ ⓘ Find these in your Stripe Dashboard → Developers → API Keys │
│ │
│ Publishable key * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ pk_live_... │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Secret key * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ •••••••••••••••• │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ 🔒 Encrypted in Vault. Never displayed again after saving. │
│ │
│ [Next: Verify Connection] │
│ │
│ Step 2: Verification (auto-runs) │
│ ✓ API connection valid │
│ ✓ Account active and verified │
│ ✓ Available methods: Card (Visa, MC, Amex), ACH │
│ │
│ Step 3: Test Transaction │
│ [Run Test Charge ($1.00)] — charges and immediately refunds │
│ Result: ✓ Test charge successful, refund processed │
│ │
│ [Save & Go Live] │
Interaction
- Credential entry: secret keys are write-only. After save, displayed as masked (••••). Cannot be viewed again, only replaced
- Test button (on connected processor): runs a test charge and refund. Shows result inline
- Settings gear (⚙): opens processor-specific settings (webhook URL, supported payment methods, fee configuration)
- Disconnect: in settings gear menu. Confirmation dialog warns about impact on active forms. Cannot disconnect if it's the only processor
Security Note
- API credentials stored in Vault, encrypted at rest
- Only Org Admin can access this screen
- All credential changes logged to audit trail
States
- No processors: "Connect a payment processor to start accepting online donations. GreenGrass supports multiple processors — you can connect one for each payment method." [Get Started]
FUND-020: Year-End Statement Generator
Generate and send consolidated year-end donation statements to donors.
Desktop
┌──────────────────────────────────────────────────────────────────────────────┐
│ Year-End Statements │
├──────────────────────────────────────────────────────────────────────────────┤
│ │
│ Generate Statements │
│ ─────────────────── │
│ │
│ Fiscal year * │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ 2025 [▾] │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Preview │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Donors with donations in 2025: 412 │ │
│ │ Total donations: $347,200 │ │
│ │ Donors with email addresses: 398 (96.6%) │ │
│ │ Donors without email (manual handling): 14 (3.4%) │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ │
│ Statement includes: │
│ ☑ All donations (one-time, recurring charges, fulfilled pledges) │
│ ☑ Per-campaign breakdown │
│ ☑ Tax-deductibility statement (jurisdiction-specific) │
│ ☑ Organization legal name and registration number │
│ ☐ Include refunded donations (shown as net $0) │
│ │
│ Delivery │
│ ● Email to all donors with email addresses (398) │
│ ○ Generate PDFs only (download as ZIP) │
│ │
│ Email preview │
│ ┌──────────────────────────────────────────────────────────────────────┐ │
│ │ Subject: Your 2025 Donation Statement — Partido Verde │ │
│ │ │ │
│ │ Dear {donor_name}, │ │
│ │ │ │
│ │ Thank you for your generous support in 2025. Attached is your │ │
│ │ consolidated donation statement for tax purposes. │ │
│ │ │ │
│ │ Total contributions: {total_amount} │ │
│ │ Number of gifts: {gift_count} │ │
│ │ │ │
│ │ [View Full Statement] │ │
│ │ │ │
│ │ With gratitude, │ │
│ │ Partido Verde de Puerto Rico │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
│ [Edit Email Template] │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ [Preview Sample Statement] [Generate & Send] │
│ │
│ ───────────────────────────────────────────────────────────────────────── │
│ │
│ Previous Generations │
│ ───────────────────── │
│ 2025 Generated Jan 15, 2026 398 sent, 14 manual [Download ZIP] │
│ 2024 Generated Jan 12, 2025 312 sent, 8 manual [Download ZIP] │
│ │
└──────────────────────────────────────────────────────────────────────────────┘
Interaction
- "Preview Sample Statement": generates a PDF preview using a real donor record (most recent large donor), opens in new tab
- "Generate & Send": confirmation dialog: "Generate 398 statements and send via email? 14 donors without email will be available for manual download." Progress bar during generation. Background process — user can navigate away
- "Download ZIP": downloads all generated PDFs for the year
- Fiscal year dropdown: lists years with donation activity
- Email template: editable subject and body with merge fields. HTML preview
States
- No donations: "No donations recorded for the selected fiscal year." [Change Year]
Empty States Summary
| Screen | Empty Message | Action |
|---|---|---|
| FUND-001 Donation List | No donations yet. Create a donation form to start accepting contributions. | Create Form |
| FUND-007 Recurring | No recurring donations yet. When donors choose recurring giving on your donation forms, they'll appear here. | — |
| FUND-008 Pledges | No pledges recorded yet. Pledges can be created here, or automatically during phone bank and canvassing shifts. | Create Pledge |
| FUND-012 Compliance | No open compliance flags. All flagged donations have been reviewed. ✓ | — |
| FUND-015 Splits (no alliance) | Your organization is not part of an alliance. | Learn More |
| FUND-015 Splits (no splits) | No fundraising splits configured. Create a split to share donation revenue across alliance members. | Create Split |
| FUND-017 Processors | Connect a payment processor to start accepting online donations. | Get Started |
| FUND-018 Campaigns | No fundraising campaigns yet. Campaigns help you set goals and track progress for fundraising drives. | Create Campaign |
Accessibility Notes
- All currency amounts use proper formatting with currency symbol and locale-appropriate separators
- Compliance flag severity levels are communicated via icon + text + color (not color alone)
- Donation status uses icon + text label (not just color)
- Form builder preview is not the only way to verify settings — settings panel shows all values textually
- Cash donation recording form uses large touch targets (48px min) for field use
- A/B test results use ★ text marker alongside visual indicators for leading variant
- Alliance split percentages shown as both numeric value and proportional bar
Design Decisions
| Decision | Choice | Rationale |
|---|---|---|
| Donation list summary bar | Inline metric cards above the table | Finance Director checks totals frequently — should be visible without scrolling |
| Flagged donations in main list | Warning row highlight + flag icon in status column | Flags must be noticeable but not separate from normal donation flow |
| Cash recording as mobile-first | Full-screen centered form, camera integration | Cash donations happen at events, in the field — phone is the primary device |
| Reconciliation as two-column | Cash records left, bank deposits right | Mirrors the mental model of matching two lists — like a bookkeeper's desk |
| A/B test as separate screens | Setup and Results are distinct (FUND-013, FUND-014) | Setup is a configuration task (edit mode), Results is an analytics task (read mode) — different mental modes |
| Alliance split approval inline | Approval status shown on the split card, not a separate queue | Splits are few and infrequent — a dedicated queue would usually be empty |
| Payment processor connect flow | Inline stepped expansion, not a wizard | Only 3 steps, simple enough for inline. Wizard overhead not warranted |
Open Questions
- Refund time limits — should there be a maximum age for refundable donations (e.g., 90 days)? Processor policies vary
- Pledge reminder channels — should pledge reminders support all channels (email, SMS, WhatsApp) or just email? Channel availability varies by contact data quality
- Cash photo requirements — should receipt photos be required above a certain cash amount? Balances audit needs against field friction
- A/B test variant count — should we support more than 2 variants (A/B/C testing)? Increases complexity but some orgs may want it
- Alliance split dispute resolution — what happens if a member org disputes a split calculation? Need a formal process beyond the approval flow