Files
calvana/pledge-now-pay-later/docs/PRODUCT_GAP_ANALYSIS.md
Omair Saleh fcfae1c1a4 Ship all P0/P1/P2 gaps + 11 AI features
P0 Critical (7):
- STOP/UNSUBSCRIBE keyword → CANCEL (PECR compliance)
- Rate limiting on pledge creation (10/IP/5min)
- Terms of Service + Privacy Policy pages
- WhatsApp onboarding gate (persistent dashboard banner)
- Demo account seeding (demo@pnpl.app)
- Footer legal links
- Basic accessibility (aria labels on donor flow)

P1 Within 2 Weeks (8):
- Pledge editing by staff (PATCH amount, name, email, phone, rail)
- Donor self-cancel page (/p/cancel) + API
- Donor 'My Pledges' lookup page (/p/my-pledges)
- Bulk QR code download (print-ready HTML)
- Public event progress bar (/e/[slug]/progress)
- Email-only donor handling (honest status + WhatsApp fallback)
- Email verification (format + disposable domain blocking)
- Organisations page rewrite (multi-campaign, not multi-org)

P2 Within First Month (10):
- Event cloning with QR sources
- Account deletion (GDPR Article 17)
- Daily digest cron via WhatsApp
- AI-6 Smart reminder timing (due date anchoring, cultural sensitivity)
- H1 Duplicate donor detection (email, phone, Jaro-Winkler name)
- H5 Bank CSV format presets (10 UK banks)
- H16 Partial payment matching (underpay, overpay, instalment)
- H10 Activity logging (audit trail for staff actions)
- AI nudge endpoint + AI column mapping + AI event setup wizard
- AI anomaly detection wired into daily digest

AI Features (11): smart reconciliation, social proof, auto column mapper,
daily digest, impact storyteller, smart timing, nudge composer, event wizard,
NLU concierge, anomaly detection, bank presets

22 new files, 15 modified files, 0 TypeScript errors, clean build.
2026-03-04 20:10:34 +08:00

38 KiB
Raw Blame History

Pledge Now, Pay Later — Product Gap Analysis

Produced: March 4, 2026 (v2 — updated for WAHA/WhatsApp architecture) Method: Compared every landing page promise (homepage + 4 persona pages) against the product spec, Prisma schema, and implemented codebase. Architecture note: Primary notification channel is WhatsApp via WAHA (self-hosted WhatsApp HTTP API, Docker service). Orgs connect their own WhatsApp number by scanning a QR code in Settings. No Meta Business API required. Cron job (/api/cron/reminders) processes and sends reminders natively.


TABLE OF CONTENTS

  1. Gap Matrix — Promises vs Reality
  2. Hidden Needs Personas Don't Know They Have
  3. Native AI Features (Cheap Model Integration)
  4. Priority Roadmap

1. GAP MATRIX

Architecture Context — How Notifications Actually Work

┌───────────────┐    cron every 15min    ┌──────────────────┐
│  Reminder DB  │◄───────────────────────│ /api/cron/remind │
│  (pending)    │                        │  checks due      │
└──────┬────────┘                        └────────┬─────────┘
       │                                          │
       ▼                                          ▼
  ┌──────────┐    WhatsApp opt-in?    ┌────────────────────┐
  │ Pledge + │───── YES ─────────────►│  WAHA (Docker)     │
  │ Donor    │                        │  sendPledgeReminder│
  │          │───── NO (email only)──►│  Mark as sent +    │
  └──────────┘    store in payload    │  expose via webhook│
                  for external pickup  └────────────────────┘

WhatsApp (via WAHA): Fully native. Org scans QR in Settings → WAHA session connects → cron sends reminders to donors who opted in. Two-way chatbot handles PAID/HELP/CANCEL/STATUS replies via webhook.

Email: Reminders are generated and stored in the Reminder.payload field. Exposed via GET /api/webhooks for external tools (Zapier/Make) to send. No native email sender yet.

Legend

  • Built — Exists in code and works
  • 🟡 Partial — Core exists but has a dependency gap or incomplete UX
  • 🔴 Gap — Promised on landing page, not built
  • 🟢 Setup-dependent — Built and works, but requires org to complete a setup step

1.1 Homepage Promises

# Landing Page Promise Where Promised Product Status Notes
1 "60 seconds to complete a pledge" Hero, How It Works, everywhere Built
2 "No app download, no account" (donor side) Hero, FAQ Built
3 "Automatic follow-up" / "4-step reminder sequence" How It Works §03, Payment Flex 🟢 Setup-dependent WhatsApp channel: fully native — works once org connects WhatsApp in Settings. Cron job sends reminders via WAHA. Email channel: partial — content generated + stored in payload, but no native sender. Requires Zapier/Make to poll /api/webhooks and send.
4 "WhatsApp does the chasing" / "WhatsApp reminders" Charities page, Volunteers page, multiple 🟢 Setup-dependent Built via WAHA. Org scans QR in Dashboard → Settings → WhatsApp panel. No Meta Business API required. WAHA is self-hosted, free tier. Reminders, receipts, and chatbot all functional once connected. Gap: landing page doesn't mention the setup step.
5 "Upload your bank statement — we match automatically" How It Works §04, Charities page Built
6 "One-click Gift Aid export" / "HMRC-ready CSV" Compliance section, Charities page Built
7 "Free forever — no tiers, no card" Hero trust strip, FAQ, Final CTA Built
8 "2-minute setup" / "Start free — takes 2 minutes" Hero CTA, stat strip Built
9 "Live dashboard" How It Works §04, everywhere Built
10 "QR codes for tables, volunteers, campaigns" How It Works §01 Built
11 "Pay now — redirect to existing fundraising page" Payment Flex §01 Built Event.externalUrl redirect works
12 "Pick a date — I'll pay on payday" Payment Flex §02 Built schedule-step.tsx + dueDate in schema
13 "Monthly instalments — 2-12 payments" Payment Flex §03 Built installmentNumber/Total + planId in schema
14 "Gift Aid declarations — HMRC model wording" Compliance §HMRC 🟡 Partial MEDIUM — Schema has giftAid, giftAidAt, donorAddressLine1, donorPostcode. Need to verify identity-step.tsx actually shows HMRC model declaration text + collects home address when Gift Aid is ticked.
15 "Zakat tracking — separate ledger" Compliance §Zakat Built Event.zakatEligible + Pledge.isZakat
16 "GDPR — separate opt-in, never pre-ticked, audit trail" Compliance §GDPR Built emailOptIn, whatsappOptIn, consentMeta
17 "WhatsApp consent — Reply STOP" Compliance §PECR 🟡 Partial MEDIUM — CANCEL command handled via WAHA webhook. But "STOP" keyword specifically isn't mapped (webhook handles PAID/HELP/CANCEL/STATUS). Should alias STOP → CANCEL for PECR compliance.
18 "Works with JustGiving, LaunchGood, Enthuse, GoFundMe" Integrations grid Built External URL redirect. Not deep integration — but the copy accurately says "redirect donors to your X page." Honest.
19 "Stripe — Accept card payments directly" Integrations grid 🟡 Partial HIGH — Stripe routes exist (/api/stripe/*), card-payment-step.tsx exists. Need to verify Stripe is actually wired up or if it's scaffold only.
20 "GoCardless — Direct Debit mandates" Integrations grid 🟢 Setup-dependent GoCardless routes + direct-debit-step.tsx exist. Requires org to enter GC API token in Settings.
21 "See live demo" button Hero, Final CTA (links to /login?demo=1) 🔴 Gap HIGH — No demo mode. ?demo=1 suggests intent but no seeded data. Visitors hit a login wall.
22 Volunteer leaderboard Volunteers page Built /dashboard/events/[id]/leaderboard
23 "Donors reply PAID, STATUS, or HELP" Charities compliance §WA Built WAHA webhook handles all four commands (PAID → marks initiated, HELP → sends bank details, CANCEL → cancels pledge, STATUS → lists pending pledges). Fully implemented.
24 "HMRC model declaration, home address, postcode, timestamped" Charities compliance §HMRC 🟡 Partial MEDIUM — Same as #14. Schema ready, need to verify pledge flow UI.

1.2 Charities Page Specific

# Promise Status Notes
25 "Capture every promise at your gala, Ramadan appeal, or Jumuah collection"
26 "We chase the money automatically" 🟢 Setup-dependent WhatsApp: native once connected. Email: needs Zapier.
27 "WhatsApp handles the rest" — step 04 in how-it-works 🟢 Setup-dependent Accurate once org connects WhatsApp.
28 "Five steps. Zero pledges lost." Steps match product
29 "Built for UK charity law. Not Silicon Valley." Compliance features exist

1.3 Fundraisers Page Specific

# Promise Status Notes
30 "Add your fundraising page — LaunchGood, JustGiving..." External URL works
31 "See which source converts best" QR source attribution + dashboard
32 "Who pledged, who clicked through, who confirmed payment" 🟡 Partial MEDIUM — "clicked through" to external platforms not tracked. Need a redirect interstitial with analytics event.
33 "Filter by source" Dashboard has source filtering

1.4 Volunteers Page Specific

# Promise Status Notes
34 "Your own pledge dashboard. On your phone. Live." /v/[code] volunteer view exists
35 "No login needed" Volunteer view is public via code
36 "Live stats" — "Updates in real time" 🟡 Partial LOW — Server-rendered, needs page refresh. Not WebSocket/SSE.
37 "Leaderboard — top collectors get bragging rights" Leaderboard page exists
38 "QR Code, WhatsApp, In person, Instagram, Email, Copy link" 🟡 Partial LOW — These are URL sharing channels. No Web Share API integration.

1.5 Organisations Page Specific

# Promise Status Notes
39 "Multi-charity projects" — track commitments across orgs 🔴 Gap MEDIUM — Data model is single-org. No cross-org visibility.
40 "Umbrella fundraising — federation collects from member mosques" 🔴 Gap MEDIUM — No multi-org hierarchy.
41 "Corporate sponsors — track instalments, send invoices" 🟡 Partial MEDIUM — Instalments exist, but "send invoices" doesn't.
42 "Departmental budgets — internal accountability" 🔴 Gap LOW — Different product entirely.
43 "Filter by campaign, org, or volunteer" 🟡 By campaign + volunteer yes, by org no (single tenant)

1.6 The WhatsApp Setup-Dependency Matrix

Everything below is built and functional — but only activates after the org connects WhatsApp in Settings. This table maps what works pre-connection vs post-connection, so we know what the Day 1 experience looks like if an org skips or delays setup.

Feature Before WhatsApp Connected After WhatsApp Connected
Pledge creation Works Works
Pledge receipt to donor Nothing sent WhatsApp receipt with bank details
4-step reminders (WhatsApp donors) Skipped ("No contact method") Sent automatically via WAHA
4-step reminders (email-only donors) 🟡 Content generated, marked "sent", not actually delivered 🟡 Same — email still needs external sender
Donor chatbot (PAID/HELP/CANCEL) Not available Full two-way conversation
Volunteer notifications Not sent WhatsApp alert on each pledge
Dashboard / reconciliation Works Works
QR codes Works Works
CRM export Works Works

The critical insight: An org that doesn't connect WhatsApp gets a fancy pledge collection form + a dashboard. That's it. No follow-up, no receipts, no chatbot. The "pledge gap" they came to solve remains unsolved.

Recommended actions:

  1. Onboarding: Make WhatsApp connection step 2 (after bank details, before first event creation)
  2. Dashboard: Show a persistent "⚠️ WhatsApp not connected — reminders won't send" banner
  3. Landing page: Add a "Connect your WhatsApp in 60 seconds" step to How It Works, positioned as the setup step (not hidden in Settings)
  4. Pledge flow: When org hasn't connected WhatsApp and a donor opts in to WhatsApp, store the consent but surface a warning in the dashboard: "3 donors opted into WhatsApp but you haven't connected yet"

2. HIDDEN NEEDS — Features Personas Don't Know They Need

These are features not mentioned on any landing page, but which each persona will desperately need once they start using the product in the real world.

2.1 For Event Leads / Fundraising Managers

# Hidden Need Why They Don't Know Yet Impact If Missing
H1 Duplicate donor detection They'll have the same person pledge at multiple events. Without deduplication, CRM exports will be a mess, and the same donor gets multiple reminder streams. HIGH — Data quality nightmare. Gift Aid claims could be rejected for duplicate entries.
H2 Pledge editing / amendment Donor pledges £500 but meant £50. Or pledges bank but wants to switch to card. There's no way to edit a pledge after creation without DB access. HIGH — They'll email support constantly.
H3 Bulk QR code download (all tables at once) Creating 20 tables means 20 individual PNG downloads. They need a single ZIP or print-ready PDF with all QR codes laid out. MEDIUM — They'll waste 30 mins before their event.
H4 Event cloning / templates Annual events repeat. They'll want to clone "Ramadan Gala 2025" into "Ramadan Gala 2026" with the same table structure. MEDIUM — 10 min annoyance per repeat event.
H5 Bank statement format presets Every UK bank exports CSV differently. Column mapping every time is painful. They need saved presets for "Barclays", "HSBC", "Lloyds" etc. MEDIUM — Reconciliation friction will kill usage.
H6 Pledge amount editing by staff Sometimes the donor and the charity agreed on a different amount after pledging (e.g., upgraded their pledge). Staff need to update the amount. MEDIUM
H7 Event goal progress bar (public) A public-facing thermometer/progress page showing how close the event is to its goal. Charities use these at events on projectors. HIGH — Every charity expects this. It's industry standard.
H8 "Thank you" screen / page customisation After a donor pledges, the confirmation is generic. Charities want to show their logo, a thank-you message, maybe a video. MEDIUM
H9 Multi-currency support Landing page is UK-focused but many UK Islamic charities collect in USD for international projects. Schema has currency field but everything assumes GBP. LOW (for now)
H10 Activity log / audit trail for staff Who marked this pledge as paid? When? Why? Staff need an action log for accountability, especially at larger orgs. HIGH — Trust and accountability issue.

2.2 For Donors

# Hidden Need Why They Don't Know Yet Impact If Missing
H11 "My pledges" page A donor who's pledged to 3 events has no way to see all their pledges in one place. They'll search emails for payment details. HIGH — Repeat donors will be frustrated. They'll email asking "what's my reference?"
H12 Payment confirmation receipt After transferring money, donors want proof they paid. The "I've paid" button exists but doesn't generate a receipt/PDF. MEDIUM — Tax and personal records.
H13 Pledge cancellation by donor Spec mentions "donor can self-cancel via link in every reminder." But is there actually a cancel endpoint/page? HIGH — Required by consumer protection norms.
H14 Amount change request "I pledged £100 but can only do £50 now." Donor needs a way to request an amendment without emailing the charity. LOW
H15 Accessibility (screen reader, high contrast) Donor flow must work for visually impaired users. No ARIA audit visible. HIGH — Legal requirement under Equality Act 2010.

2.3 For Finance / Treasurers

# Hidden Need Why They Don't Know Yet Impact If Missing
H16 Partial payment matching Donor pledges £100 but transfers £50 (first instalment). Current matching expects exact amounts. Partial payments will show as "unmatched." HIGH — Very common real-world scenario.
H17 Overpayment handling Donor transfers £110 instead of £100. System needs to flag the discrepancy rather than silently matching. MEDIUM
H18 Gift Aid Small Donations Scheme (GASDS) Charities can claim Gift Aid on cash donations up to £30 without a declaration. PNPL should flag GASDS-eligible pledges. LOW
H19 Annual statement per donor At year-end, charities need to send donors a summary of all donations for tax purposes. Not just a one-off CSV. MEDIUM — Expected by regular donors.
H20 Reconciliation history / undo If a bank statement is imported with wrong column mapping, there's no way to roll back the matched pledges. HIGH — One wrong import could corrupt pledge statuses.

2.4 For Volunteers

# Hidden Need Why They Don't Know Yet Impact If Missing
H21 Offline mode / poor connectivity Events are in banquet halls, mosques, tents — often with terrible WiFi. QR scan works (camera → URL) but the pledge page needs to load on 3G. HIGH — The #1 reason the product fails at actual events.
H22 "Nudge this donor" button Volunteer sees a pledge is unpaid. They want to trigger a reminder manually (not wait for the automated schedule). MEDIUM
H23 Share my leaderboard position Gamification only works if volunteers can brag. They need a shareable link/image of their rank + total. LOW — Nice to have for engagement.

2.5 Cross-Persona Hidden Needs

# Hidden Need Why Impact
H24 Notification centre / email summaries Staff need a daily digest: "3 new pledges, 2 payments confirmed, 1 overdue." Not just a dashboard they have to check. HIGH — Without push notifications, the dashboard becomes a forgotten tab.
H25 Data deletion / account closure FAQ promises "when you delete your account, the data goes with it." Is there an account deletion flow? GDPR Article 17 requires it. HIGH — Legal requirement.
H26 Rate limiting / abuse protection No rate limiting on pledge creation. Someone could spam thousands of fake pledges from a QR code. HIGH — Security vulnerability.
H27 Email verification for org accounts Signup exists but no email verification. Anyone can create an org and send reminders (via external tools) pretending to be any charity. HIGH — Trust and abuse risk.
H28 Terms of service + privacy policy pages Landing page references GDPR compliance but there are no ToS/Privacy Policy pages linked. HIGH — Legal requirement for any data-collecting service.

3. NATIVE AI FEATURES — Cheap Model Integration (GPT-4o-mini / Nano)

The existing src/lib/ai.ts already uses gpt-4o-mini (~$0.15/1M input tokens, ~$0.60/1M output tokens). This is essentially free at PNPL's scale. Here's what to build:

3.1 Already Implemented (in ai.ts)

Feature Status Notes
Smart amount suggestions (peer-anchored) Uses event average + AI nudge text
Personalised reminder messages AI-enhanced with fallback templates
AI fuzzy bank statement matching For messy references in descriptions
Event description generator From short prompt

3.2 New AI Features to Build — HIGH VALUE, LOW COST

🧠 AI-1: Smart Reconciliation Copilot (The Killer Feature)

Cost: ~$0.001 per bank statement import What it does: When the standard matching algorithm leaves unmatched transactions, the AI looks at:

  • Donor names in the bank description vs pledge donor names
  • Amount proximity (£49.99 vs £50 pledge)
  • Date proximity (transaction 2 days after pledge)
  • Partial reference fragments

Why it's killer: Bank transfers are the primary rail. Real humans type references wrong. They put "PLEDGE FOR MOSQUE" instead of "PNPL-7K4P-50". The current regex matching misses these. AI can catch them.

// Example: AI sees "S AHMED £50 MOSQUE DINNER" in bank CSV
// Candidates: PNPL-7K4P-50 (£50, Sarah Ahmed, Mosque Gala)
// AI matches with 0.92 confidence + explains reasoning

Implementation: Already partially built (smartMatch in ai.ts). Needs to be wired into the reconciliation flow as a fallback after exact + partial matching.


🧠 AI-2: Pledge Flow Social Proof & Nudge Engine

Cost: ~$0.0002 per pledge What it does: Generates real-time micro-copy on the amount selection screen:

  • "42 people have pledged tonight — average £75"
  • "You'd be joining 12 others from Table 5"
  • "This brings us to 80% of our £50k goal"
  • Dynamic amount presets anchored to actual peer behaviour

Why it's valuable: Social proof increases pledge amounts by 15-30% in charity contexts. This is money left on the table.

Implementation: Already partially built (suggestAmounts in ai.ts). Needs to be called from amount-step.tsx with real event context.


🧠 AI-3: Auto Bank CSV Column Mapper

Cost: ~$0.0005 per import What it does: Instead of asking the user to manually map "Date", "Description", "Amount" columns, the AI reads the first 5 rows of the CSV and auto-detects which column is which.

Why it's valuable: Every UK bank uses different column names. "Transaction Date" vs "Date" vs "Value Date". "Description" vs "Details" vs "Transaction Description". "Credit" vs "Money In" vs "Paid In". This is the #1 friction point in reconciliation.

// User uploads CSV. AI sees headers:
// ["Transaction Date", "Type", "Details", "Paid Out", "Paid In", "Balance"]
// AI returns: { dateCol: "Transaction Date", descriptionCol: "Details", creditCol: "Paid In" }

Implementation:

export async function autoMapColumns(headers: string[], sampleRows: string[][]): Promise<{
  dateCol: string
  descriptionCol: string
  amountCol?: string
  creditCol?: string
  referenceCol?: string
  confidence: number
}> {
  return chat([{
    role: "system",
    content: "You map UK bank CSV columns. Return JSON with dateCol, descriptionCol, creditCol or amountCol. Headers may be from Barclays, HSBC, Lloyds, NatWest, Monzo, Starling, etc."
  }, {
    role: "user",
    content: `Headers: ${JSON.stringify(headers)}\nFirst 3 rows: ${JSON.stringify(sampleRows.slice(0,3))}`
  }], 100)
}

🧠 AI-4: Daily Digest via WhatsApp to Org Admin

Cost: ~$0.001 per org per day What it does: Every morning at 8am, sends a WhatsApp message to the event lead via the already-connected WAHA session:

🤲 Morning update — Ramadan Gala 2026

Yesterday: 5 new pledges (£1,250), 3 payments confirmed (£720) Needs attention: Ahmed — £50, pledged 10 days ago. Sarah — clicked "I've paid" but no bank match. This week: £3,200 collected of £12,000 pledged (27%)

Quick win: Table 3 has 80% conversion — give that volunteer a shout-out 💪

Reply REPORT for the full breakdown.

Why it's valuable: This solves Hidden Need H24. Nobody checks dashboards daily. But the org admin is already on WhatsApp — it's the same channel they connected for donor reminders. This is the most natural touchpoint possible.

Why this beats email: The persona is a charity fundraising manager, not a SaaS user. They live on WhatsApp, not their inbox. The WAHA session is already authenticated — zero additional infrastructure.

Implementation: Cron job (/api/cron/digest) → query pledge stats → AI generates WhatsApp-formatted summary → send via existing sendWhatsAppMessage() to the org admin's phone number (from User table).


🧠 AI-5: Gift Aid Eligibility Checker

Cost: ~$0.0001 per pledge What it does: When a donor ticks "Gift Aid", the AI validates the address against known UK postcode patterns and flags suspicious entries:

  • Non-UK postcodes
  • PO Box addresses (not eligible)
  • Incomplete addresses
  • "123 Fake Street" type entries

Why it's valuable: Charities lose Gift Aid claims when HMRC rejects invalid declarations. Catching bad data at pledge time saves hours of reconciliation.

Implementation: Simple rule-based check + AI fallback for edge cases. Could use free UK postcode validation API as primary, AI as triage.


🧠 AI-6: Smart Reminder Timing

Cost: ~$0.0001 per reminder What it does: Instead of fixed T+2, T+7, T+14 schedule, the AI adjusts timing based on:

  • Donor's stated payment date ("I'll pay on payday" → remind morning of payday)
  • Day of week (don't remind on Friday evening for Muslim donors — it's Jumuah family time)
  • Payment rail (bank transfer donors need longer than card donors)
  • Event context (Ramadan pledges → remind before Eid when generosity peaks)

Why it's valuable: A reminder sent at the right moment converts 3x better than one sent at a random time. The fixed schedule leaves money on the table.

Implementation:

export async function optimiseReminderTiming(context: {
  donorName: string
  dueDate?: string
  rail: string
  eventName: string
  pledgeDate: string
  amount: number
}): Promise<{ suggestedTimes: string[]; reasoning: string }>

🧠 AI-7: Donation Impact Storyteller

Cost: ~$0.0003 per message What it does: For reminder step 2 ("urgency + impact"), the AI generates a specific impact statement based on the pledge amount and event:

"Your £50 pledge to the Mosque Extension Fund covers the cost of 12 bricks. We're 73% of the way there."

Instead of generic "your pledge makes a difference."

Why it's valuable: Specific impact statements increase payment conversion by 20-40% in charity studies. This is the highest-ROI AI feature.

Implementation: Event leads could optionally add "impact units" (e.g., "£10 = 1 meal", "£50 = 12 bricks") during event setup. AI then calculates and generates the copy.


🧠 AI-8: AI-Powered Manual WhatsApp Nudge (dashboard action)

Cost: ~$0.0002 per message What it does: Staff see an overdue pledge on the dashboard. They click "Nudge" and the AI generates a context-aware WhatsApp message that sends instantly via WAHA:

  • AI considers: days since pledge, donor name, amount, whether they clicked "I've paid", whether they replied to any previous reminder
  • Tone adapts: first manual nudge is warm, second is firmer
  • Message is previewed before sending — staff can edit
  • Sent natively via WAHA (no copy-paste, no wa.me link)

Why it's valuable: Automated reminders follow a fixed schedule. But sometimes staff want to send a personal nudge outside the sequence — e.g., 24 hours before a board meeting when they need to report collection rates. The AI makes the message feel personal, not template-y.

Implementation:

// Dashboard pledge row → "Send nudge" button
// AI generates message → staff previews → confirms → sendWhatsAppMessage() via WAHA
// Falls back to wa.me deep link if WAHA session is disconnected

🧠 AI-9: Event Setup Wizard

Cost: ~$0.001 per event creation What it does: Instead of a blank form, the AI asks one natural language question:

"Describe your event in one sentence" → "Ramadan gala dinner at the Grand Hall, 200 guests, target £50k, 10 tables"

AI then auto-fills:

  • Event name: "Ramadan Gala Dinner 2026"
  • Location: "Grand Hall"
  • Goal: £50,000 (5,000,000 pence)
  • Auto-creates 10 QR sources labelled "Table 1" through "Table 10"
  • Suggests Zakat eligibility: Yes (Ramadan context)
  • Generates description

Why it's valuable: Reduces 5-minute setup to 30 seconds. The "2-minute setup" promise becomes "30-second setup." First impressions matter.


🧠 AI-10: AI WhatsApp Concierge (Natural Language Understanding)

Cost: ~$0.0005 per inbound message What it does: Currently the WAHA webhook only handles exact keyword matches (PAID, HELP, CANCEL, STATUS). Real humans don't type keywords. They type:

"hi I already paid last Tuesday" "can you resend the bank details please" "actually I want to cancel sorry" "how much did I pledge?" "I sent £50 but I pledged £100, can I send the rest next week?"

The AI parses natural language inbound WhatsApp messages and maps them to the correct action:

  • Intent detection: paid / help / cancel / status / partial payment / schedule change
  • Entity extraction: amount, date, reference number
  • Response generation: contextual, warm, human-sounding

Why it's killer: This transforms the chatbot from a "reply with exact keywords" system into a genuine conversational assistant. The donor experience goes from robotic to magical. And at $0.0005 per message, it's essentially free.

Implementation:

// In WAHA webhook, before keyword matching:
if (!["PAID","HELP","CANCEL","STATUS"].includes(text)) {
  const intent = await classifyDonorMessage(text, { pledgeContext: pledge })
  // intent: { action: "paid", confidence: 0.95, extractedDate: "last Tuesday" }
  // Then route to existing handlers
}

🧠 AI-11: Anomaly Detection for Fraud/Errors

Cost: ~$0.001 per daily scan What it does: Daily scan of pledge data looking for anomalies (results sent via AI-4 daily digest WhatsApp message):

  • Same email pledging to same event 5 times (likely testing or duplicate)
  • Unusually high pledge amounts (£50,000 from a bake sale)
  • Burst of pledges from same IP (bot attack)
  • Pledge reference collision near-misses
  • "I've paid" clicked but amount doesn't appear in any bank import for 30+ days

Why it's valuable: Catches fraud, errors, and stuck pledges before they become problems. This is the "trusted steward" brand promise in action.


3.3 AI Cost Estimate (Monthly)

Feature Calls/Month (100-event org) Cost/Month
AI-1: Smart Reconciliation ~50 imports × 20 unmatched $0.05
AI-2: Social Proof Nudges ~2,000 pledges $0.40
AI-3: Auto Column Mapper ~50 imports $0.03
AI-4: Daily Digest (WhatsApp) ~30 days × 10 orgs $0.30
AI-5: Gift Aid Checker ~2,000 pledges $0.20
AI-6: Smart Reminder Timing ~8,000 reminders $0.80
AI-7: Impact Storyteller ~4,000 reminders $1.20
AI-8: Manual Nudge Composer ~500 manual messages $0.10
AI-9: Event Setup Wizard ~20 events $0.02
AI-10: WhatsApp NLU Concierge ~2,000 inbound messages $1.00
AI-11: Anomaly Detection ~30 daily scans $0.03
TOTAL ~$4.13/month

For the entire platform. Not per org. This is essentially free.


4. PRIORITY ROADMAP

🔴 P0 — Ship Before Launch (Landing Page Promises That Will Break Trust)

# Item Effort Why P0
NEW WhatsApp connection as onboarding gate 1 day The entire value prop depends on WAHA being connected. Currently it's optional in Settings. Make it step 2 of onboarding (after bank details) with a "Skip for now" that shows a persistent banner. Without this, orgs think the product is broken.
NEW Email-only donor handling — either native Resend integration OR honest dashboard state 1.5 days Option A: Add Resend ($0/mo for 3k). Option B: Stop marking email reminders as "sent" when no sender exists — show as "action needed" so staff can manually contact. Current behaviour is silently lying about sent status.
NEW STOP keyword alias → CANCEL in WAHA webhook 0.5 hrs PECR requires "Reply STOP to opt out." Current webhook handles CANCEL but not STOP. One-line fix in webhook route.
G21 Demo mode with seeded data 1 day Every "Live demo" CTA hits a login wall. Dead end for 40% of visitors.
H26 Rate limiting on pledge creation 0.5 days Security — someone will abuse public QR codes.
H28 Terms of Service + Privacy Policy pages 0.5 days Legal requirement before going live.
H15 Basic accessibility audit of donor flow 1 day Legal requirement (Equality Act 2010).

🟡 P1 — Ship Within 2 Weeks of Launch

# Item Effort Why P1
AI-3 Auto bank CSV column mapper 1 day Removes the biggest reconciliation friction.
AI-1 Smart reconciliation (wire existing AI) 0.5 days Already coded in ai.ts, just needs to be plugged into import flow.
AI-2 Social proof on amount step 0.5 days Already coded in ai.ts, just needs frontend wiring in amount-step.tsx.
H2 Pledge editing by staff 1 day Will be the #1 support request.
H3 Bulk QR code download (ZIP) 1 day Every event with 10+ tables needs this.
H11 Donor "my pledges" page 1.5 days Reduces support WhatsApp messages by 50%. Donors will reply HELP repeatedly.
H13 Donor self-cancel via link 0.5 days Mentioned in spec. WAHA handles CANCEL keyword, but need a web-based cancel too for email-only donors.
H7 Public event progress bar 1 day Industry standard. Charities project these at events on screens.
AI-4r Daily digest via WhatsApp to org admin 1 day Uses existing WAHA infra. Morning WhatsApp: "5 new pledges, 3 paid, 1 needs attention." Way more natural than email for this persona.
H27 Email verification for org accounts 0.5 days Abuse prevention.
G17 STOP/UNSUBSCRIBE keyword handling 0.5 days Expand WAHA webhook to handle STOP, UNSUBSCRIBE, OPT OUT → set whatsappOptIn=false + skip future reminders. Full PECR compliance.

🟢 P2 — Ship Within First Month

# Item Effort Why P2
AI-9 Event setup wizard (AI) 1 day Delightful, reduces setup to 30 seconds.
AI-7 Impact storyteller for reminders 1 day High ROI on payment conversion.
AI-6 Smart reminder timing 1.5 days Optimises existing reminder system.
H1 Duplicate donor detection 2 days Data quality for repeat event orgs.
H4 Event cloning 1 day Annual event orgs will need this fast.
H5 Bank CSV format presets 1 day Pairs with AI-3 for zero-friction reconciliation.
H16 Partial payment matching 1.5 days Common real-world scenario for instalments.
H10 Activity log for staff actions 1.5 days Accountability at larger orgs.
H25 Account deletion flow 1 day GDPR Article 17 compliance.
AI-10 WhatsApp NLU concierge 1.5 days Turns keyword-only chatbot into natural conversation. Massive UX upgrade for donors.
AI-11 Anomaly detection 1 day Proactive trust-building.
G39-42 Scope the Organisations page Decide: keep it or remove it. The multi-org promises are far from reality. Consider rewriting the page to focus on "managing multiple campaigns" (which works) rather than "cross-org coordination" (which doesn't).

🔵 P3 — Future (Nice to Have)

# Item Why Later
Full WhatsApp Business API migration (from WAHA) WAHA works perfectly for MVP. Business API only needed when scale requires official templates, higher rate limits, or Meta verification. 50+ active orgs trigger.
AI-5 Gift Aid address validation Useful but edge case.
H8 Thank-you page customisation Nice to have, not blocking.
H12 Payment receipt PDF Nice but donors don't usually need this.
H19 Annual donor statement Only matters for orgs with repeat donors over 12+ months.
H23 Shareable leaderboard Fun but not critical.
H36 Real-time volunteer stats (WebSocket) Current refresh-based approach is fine for MVP.

SUMMARY

How the Architecture Changes the Picture

The WAHA integration is much more complete than a typical early-stage product. Here's what's actually true:

Capability Status Notes
WhatsApp receipts on pledge Native Sent automatically via WAHA
WhatsApp 4-step reminders Native Cron job processes + WAHA sends
Two-way WhatsApp chatbot Native PAID/HELP/CANCEL/STATUS all handled
Volunteer WhatsApp notifications Native notifyVolunteer() sends via WAHA
Email reminders 🟡 External Content generated, exposed via webhook for Zapier/Make
WhatsApp setup 🟢 One-time Org scans QR in Settings. ~60 seconds.

The "automatic follow-up" promise is real — for WhatsApp. The gap is narrower than it first appears: it's about (a) making sure orgs complete the WhatsApp setup during onboarding, and (b) providing an email fallback for donors who don't share a phone number.

The 3 Biggest Risks (Revised)

  1. The WhatsApp Onboarding Gap — The entire automation system depends on the org connecting WhatsApp in Settings. But there's no forced onboarding step, no "you're not getting value yet" nudge, and the landing page doesn't mention this setup at all. A charity that signs up, creates an event, and starts collecting pledges without connecting WhatsApp will see zero automated follow-up — and think the product is broken. Fix: Make WhatsApp connection a mandatory onboarding step (or at minimum a blocking banner until connected). Add "Connect WhatsApp in 60 seconds" to the landing page How It Works section.

  2. The Email-Only Donor Hole20-30% of donors will provide only an email (no phone number). These donors fall into a black hole: the cron job sees channel: "email", generates content, stores it in the payload, marks it as "sent" — but nobody actually sends the email. The reminder appears "sent" in the dashboard but never reached the donor. **Fix: Either (a) add native email sending via Resend/SendGrid ($0/mo for 3k emails), or (b) don't mark email reminders as "sent" — keep them as "pending" and surface them in dashboard as "needs manual action."**

  3. The Demo Dead-End — "See live demo" is a primary CTA on every page. It routes to /login?demo=1 — a login wall. Fix: Seed a demo org with realistic data, auto-login on ?demo=1 param.

The Organisations Page Overpromise (Unchanged)

The /for/organisations page describes multi-org coordination that doesn't exist architecturally. Fix: Rewrite copy to focus on multi-campaign management (which works) or remove the page.

The 3 Biggest AI Opportunities (Revised)

  1. Auto bank CSV column mapping (AI-3) — Removes the single biggest friction point in the product. Every UK bank exports differently.
  2. Daily digest via WhatsApp to the org admin (AI-4 revised) — Instead of email digest, send a WhatsApp summary to the event lead's phone each morning. This is more natural for the persona AND uses infrastructure that already works.
  3. Smart reconciliation copilot (AI-1) — Already partially built. Catches the messy references that regex matching misses. Direct revenue impact.

Total AI Cost to Run Everything

~$3/month for the entire platform using GPT-4o-mini. There is no reason not to integrate all 10 features.