Fundraising Hub
Fundraising Hub
Canonical doc file: 00-FUNDRAISING-HUB.md (replaces legacy 00-MARKETING-HUB.md).
Component file: src/features/fundraising/components/MarketingHub.tsx (exports `FundraisingHub`, lazy-loaded in PageRouter.tsx) Route / navigation: Base path `/fundraising` (PageView fundraising in src/store/types.ts). Tool selection: Zustand `fundraisingTool` (FundraisingTool), mirrored to `/fundraising/{fundraisingTool}` (and `/fundraising/{fundraisingTool}/{recordId}` for deep links); see navigationSlice.ts, navigationUrl.ts, and PageRouter.tsx. Access level: Parent org and fund users with Fundraising access (position-based) Last updated: March 23, 2026
Overview
The Fundraising Hub is the landing grid for fundraising tools. Choosing a card sets `fundraisingTool` in Zustand (src/store/slices/navigationSlice.ts) and PageRouter.tsx renders the matching screen.
User-visible titles and descriptions are set in `MarketingHub.tsx` via `useTranslation('marketing')` (see the t('…') paths there). English strings for the tiles also appear under the `hub` object in src/i18n/locales/en/marketing.json for reference.
Note (Mar 22, 2026): MarketingHub.tsx must import `useState` from React whenever local modal state is used — a missing import caused ReferenceError: Can't find variable: useState in strict browsers. Docs update (Mar 23, 2026): Snail Mail docs were refreshed for current implementation + styling standards. See 13-SNAIL-MAIL.md, SNAIL-MAIL-PRODUCT-AND-PRICING.md, and LETTER-CAMPAIGNS.md.
Hub tool cards (grid)
Nine tiles (order matches MarketingHub.tsx):
| # | Card title (English) | `fundraisingTool` id | Notes |
|---|----------------------|----------------------|--------|
| 1 | **Email Campaigns** | `email-campaigns` | List / manage campaigns; compose opens **`email-builder`**. |
| 2 | **Text Campaigns** | `text-campaigns` | `SMSCampaigns` |
| 3 | **Snail Mail** | `snail-mail` | `SnailMailHub` — upload-first print templates, campaigns, PCM submit. |
| 4 | **Video Blast** | `video-blast` | `VideoBlastManager` |
| 5 | **Events & Ticketing** | `events-ticketing` | `EventsManager` |
| 6 | **Donor Journeys** | `donor-journeys` | `DonorJourneys` |
| 7 | **MintBucks Manager** | `mintbucks` | `MintBucksManager` |
| 8 | **Mailing Lists** | `mailing-lists` | `ListsManager` |
| 9 | **Prospects** | `prospects` | `ProspectsCRM` |
Tier access: Fundraising hub tools are intended to be available broadly; individual flows may still enforce plan or MintBucks rules inside the tool (see each tool doc).
Sub-flows (not hub tiles)
These FundraisingTool values are used from inside email workflows (PageRouter.tsx):
| `fundraisingTool` | Component | How users reach it |
|-------------------|-----------|---------------------|
| `email-builder` | `EmailBuilderMJMLPage` | From Email Campaigns (new/edit campaign, templates). |
| `campaigns-analytics` | `CampaignAnalytics` | From Email Campaigns (analytics). |
| `templates-compose` | `TemplateCompose` | From Email Campaigns (template compose). |
Navigation mapping (authoritative)
| `fundraisingTool` | Renders (default export name) | Source module |
|-------------------|------------------------------|---------------|
| `null` | `FundraisingHub` | `MarketingHub.tsx` |
| `email-campaigns` | `FundraisingCampaigns` | `MarketingCampaigns.tsx` |
| `text-campaigns` | `SMSCampaigns` | `SMSCampaigns.tsx` |
| `campaigns-analytics` | `CampaignAnalytics` | `campaigns/CampaignAnalytics.tsx` |
| `templates-compose` | `TemplateCompose` | `campaigns/TemplateCompose.tsx` |
| `video-blast` | `VideoBlastManager` | `VideoBlastManager.tsx` |
| `events-ticketing` | `EventsManager` | `src/features/events/components/EventsManager.tsx` |
| `donor-journeys` | `DonorJourneys` | `DonorJourneys/DonorJourneys.tsx` |
| `mintbucks` | `MintBucksManager` | `MintBucksManager/MintBucksManager.tsx` |
| `mailing-lists` | `ListsManager` | `ListsManager/ListsManager.tsx` |
| `email-builder` | `EmailBuilderMJMLPage` | `EmailBuilderMJML/EmailBuilderMJMLPage.tsx` |
| `prospects` | `ProspectsCRM` | `ProspectsCRM.tsx` |
Type definition: `FundraisingTool` in src/store/types.ts.
State and layout
- Global tool selection: Zustand
useAppStore→fundraisingTool,setFundraisingTool,navigateTo('fundraising', toolId). - Hub grid:
HubGridwithpageId="fundraising-hub",sectionFamily="manage". Tier / paywall behavior comes fromHubGrid+useTierAccess/usePermissions. - Snail Mail: Same hub navigation as other tiles; Plus-tier gate via permissions / in-tool checks.
Public / standalone URLs (no hub chrome)
| Area | URL pattern | Doc |
|------|-------------|-----|
| Video Blast landing | `/vb/:publicUrl` | [04-VIDEOBLAST-LANDING-PAGE.md](./04-VIDEOBLAST-LANDING-PAGE.md) |
| Public event | `/events/...` | [events/05-PUBLIC-EVENT-PAGE.md](./events/05-PUBLIC-EVENT-PAGE.md) |
Documentation index (tool → page doc)
Use separate tool docs per hub tile or major surface; keep cross-links instead of merging everything into one file.
| `fundraisingTool` / surface | Primary doc | Notes |
|----------------------------|-------------|--------|
| Hub grid | This file (`00-FUNDRAISING-HUB.md`) | Entry + router map |
| `email-campaigns` (+ analytics / templates / builder entry) | [01-EMAIL-CAMPAIGNS.md](./01-EMAIL-CAMPAIGNS.md) | List UI, template flows, changelog, data/API sections. Sub-tool **`email-builder` (MJML):** [12-EMAIL-BUILDER-MJML.md](./12-EMAIL-BUILDER-MJML.md). Legacy bookmark: [01-MARKETING-CAMPAIGNS.md](./01-MARKETING-CAMPAIGNS.md). |
| `text-campaigns` | [11-TEXT-CAMPAIGNS.md](./11-TEXT-CAMPAIGNS.md) | **Text campaigns** (UI); `SMSCampaigns.tsx`; SMS/Telnyx under the hood |
| `snail-mail` | [13-SNAIL-MAIL.md](./13-SNAIL-MAIL.md) | PCM direct mail; `directMail.ts`, `send-direct-mail`. Pricing: [SNAIL-MAIL-PRODUCT-AND-PRICING.md](../../plans/SNAIL-MAIL-PRODUCT-AND-PRICING.md) |
| `video-blast` | [03-VIDEOBLAST-MANAGER.md](./03-VIDEOBLAST-MANAGER.md) | + [05-VIDEOBLAST-EMBED.md](./05-VIDEOBLAST-EMBED.md) |
| Public video page | [04-VIDEOBLAST-LANDING-PAGE.md](./04-VIDEOBLAST-LANDING-PAGE.md) | `main.tsx` route |
| `events-ticketing` | [06-EVENTS-TICKETING.md](./06-EVENTS-TICKETING.md) | + [events/](./events/00-EVENTS-OVERVIEW.md) subfolder |
| `donor-journeys` | [08-DONOR-JOURNEYS.md](./08-DONOR-JOURNEYS.md) | |
| `mintbucks` | [10-MINTBUCKS-MANAGER.md](./10-MINTBUCKS-MANAGER.md) | Points to deep-dive under `documentation/frontend/` |
| `mailing-lists` | [09-MAILING-LISTS.md](./09-MAILING-LISTS.md) | |
| `prospects` | [02-PROSPECTS-LIST.md](./02-PROSPECTS-LIST.md) | |
| Shared recipients UI | Described in `01` + `11` (+ `12` where builder) | Code: `shared/FundraisingCampaignRecipientsFields.tsx` |
Placement rule: Everything above lives under `documentation/pages/fundraising/` except the MintBucks implementation deep-dive (documentation/frontend/MINTBUCKS-MANAGER.md) and cross-cutting backend docs (documentation/backend/SMS-EMAIL-INFRASTRUCTURE.md, MINTBUCKS-SYSTEM.md, EMAIL-VARIABLE-TAGS.md, etc.).
Related documentation
- 01-EMAIL-CAMPAIGNS.md — Email campaigns, analytics, templates, changelog
- 12-EMAIL-BUILDER-MJML.md — MJML email builder (store, drafts, themes)
- 01-MARKETING-CAMPAIGNS.md — Redirect stub (old filename)
- 02-PROSPECTS-LIST.md — Prospects CRM
- 03-VIDEOBLAST-MANAGER.md — Video Blast manager
- 04-VIDEOBLAST-LANDING-PAGE.md — Public video page
- 06-EVENTS-TICKETING.md — Events & Ticketing
- 08-DONOR-JOURNEYS.md — Donor Journeys
- 09-MAILING-LISTS.md — Mailing Lists
- 10-MINTBUCKS-MANAGER.md — MintBucks (hub entry → frontend deep-dive)
- 11-TEXT-CAMPAIGNS.md — Text (SMS) campaigns
- events/00-EVENTS-OVERVIEW.md — Events component index
Synced from IFMmvp-Frontend documentation: pages/fundraising/00-FUNDRAISING-HUB.md
Ready to Get Started?
See how Alignmint can simplify your nonprofit's operations. Schedule a free demo with our team and we'll walk you through everything.
Questions? Email us at steven@getalignmint.org