Google Sheets via a single Apps Script endpoint for Tier 2 waitlist captures until Supabase project is provisioned (≤1 week).
Back-office / browsable view
Supabase Studio for Talbot’s direct DB browsing. No separate CRM UI needed Phase A→B.
Revenue → books
Stripe → QuickBooks Online via the native QBO Stripe Sync app (no custom integration). RevenueEvent is mirrored into Supabase for internal reporting and for driving the 50% pledge routing.
50% Cancer Pledge routing
Split-Cart at Stripe level (Stripe Connect destination charges OR scheduled CanadaHelps API sweep) — triggered by a Supabase Edge Function on every RevenueEvent insert.
Migrate when?
Never forced migration. Supabase scales to Phase C. Add HubSpot Free only if/when the WealthCare 50 B2B pipeline needs a sales pipeline UI with >10 live partner conversations — layer HubSpot on top of Supabase, don’t replace it.
PIPEDA posture
Stage 1 stores nothing. Stage 2+ data lives in Supabase (Canadian region: ca-central-1) with RLS, encryption at rest, explicit consent flag per stage, and a documented retention + withdrawal procedure.
One-liner:For Phase A→B, use Supabase. Plan to layer HubSpot Free on top of Supabase at Phase C when WealthCare 50 Alliance partner count exceeds ~10 live conversations — never migrate off Supabase.
Airtable: PIPEDA exposure (US data residency, no row-level security). Hits API limits as rate alerts scale. Not a database, a spreadsheet with an API. Rejected for anything touching financial data.
HubSpot Free: Beautiful sales pipeline UI, but overkill for Phase A→B. The Hassle Threshold Engine needs programmatic reads/writes; HubSpot’s free tier rate-limits that. However — when WealthCare 50 Alliance hits 10+ active B2B conversations, add HubSpot Free as a view on top of Supabase for B2B relationship management only. Contact records sync from Supabase. Don’t migrate. Layer.
Notion + Zapier: Every integration step becomes a Zap. Zaps silently break. This is a solo operator’s nightmare. Rejected.
Custom SQLite extension: Already in use for rate-scanner.db — keep it there for rate data. User/transfer/revenue data is a different concern (multi-writer, PII, consent state). Do not conflate operational rate data with user/CRM data.
rate-scanner.db stays local — it’s the authoritative rate intelligence dataset, 100% public data, no PII. The Hassle Threshold Engine reads from it and writes alerts to Supabase.
Critical: DB trigger enforce_50_pct_pledge() rejects any insert where pledge_amount_cad != round(amount_cad * 0.50, 2). The 50% pledge cannot be manually overridden. This is the structural integrity of Cancer50Pledge.
Until transfer completed + 7 years (CRA) OR 36 months if no transfer
Tombstone user row; purge financial fields; keep anonymized revenue_events for books
Stage 4 (SIN, DOB, address, account number)
7 years post-transfer (CRA minimum for financial transactions)
After 7 years: auto-purge via scheduled job
revenue_events
7 years (CRA)
Never purged (books) — but user_id set null on withdrawal
rate_alerts behavioral data
24 months rolling
Anonymize on withdrawal (keep aggregate, drop user_id)
Rules of the road:
Canadian data residency: Supabase project created in ca-central-1 region. Non-negotiable.
Encryption at rest: Supabase standard. Stage 4 fields additionally column-encrypted at the app layer.
Consent: separate flag per KYC stage with timestamp. Never bundled into a single TOS checkbox.
Access logs: every Stage 4 read logged to an audit table (kyc_access_log).
Withdrawal procedure: single Supabase Edge Function user_withdraw_consent(user_id) that runs the stage-by-stage purge. Documented in Projects/CRM/PIPEDA-PROCEDURE.md (TBD).
Red flag flagged: Do not store Stage 4 data until Tier 3 is actually live. Do not collect SIN for “future use”. Collect at the moment of need.
⚠ CanadaHelps donation routing — pending API confirmation. If no API, weekly manual batch until an API or a different charity vehicle (direct cancer research donation through a registered charity with API) is secured. Decision needed.
⚠ Google Sheets waitlist → Supabase — one-time import at Supabase launch. Not a recurring manual step.
⚠ Founding Pledger certificates (1–50) — certificate PDF generation can be templated + auto-emailed, but certificate design approval is manual (each cert has the pledger’s org name).
UX: Progressive form with explicit disclosure: “This is required to pre-fill transfer paperwork on your behalf. It is encrypted, stored in Canada, and only used when you authorize a transfer.”
Stored: SIN (encrypted), DOB, address (encrypted), account number (encrypted). All encryption keys managed via Supabase Vault / KMS — separate from DB credentials.
Consent mechanism: Per-field consent with explicit use-case disclosure. Audit log entry on every read.
Advancement trigger: N/A — terminal stage.
Withdrawal: Immediate purge of Stage 4 fields on request (Stage 2/3 data and historical transfers retained per CRA 7-year rule).
HubSpot Free layered on for WealthCare 50 B2B sales pipeline only. Supabase wealthcare50_partners writes sync to HubSpot contacts via one-way mirror. Talbot uses HubSpot for sales pipeline UI, not for storing truth.
Open Banking (2026-27): new bank_connections table; Hassle Engine consumes live feeds alongside rate-scanner.db.
SDC (Rung 5): separate Supabase project (separate business), cross-linked via users.sdc_user_id.
CanadaHelps programmatic API — does it exist with donation-create + tax-receipt endpoints? If not, what’s the fallback charity vehicle? (Blocks full automation of 50% pledge routing.)
Cancer50Pledge.ca — same Supabase project with a separate schema, or separate project? Same project is simpler and cheaper; separate project has stronger blast-radius isolation.
Stage 4 encryption key custody — Supabase Vault (easier) vs. external KMS (e.g. AWS KMS Canada region, stronger separation)? Recommend Supabase Vault for Phase B→Next, revisit at Phase C.
Supabase region confirmation — ca-central-1 is available on Pro tier. Free tier may require region compromise. If Free tier can’t give Canadian residency, skip Free, start on Pro ($25/mo) — PIPEDA wins.
QBO Stripe Sync app — confirm current Canadian availability. If unavailable, fallback is Stripe → Supabase → manual weekly QBO import via CSV (acceptable at Phase A→B volumes).