πŸ’΅ Almighty Dollar

Expo (React Native + Web) directory connecting Christian businesses with church and school communities. Customers connect, buy, and a tithe percentage flows back to the org they choose β€” tracked end-to-end from lead pipeline to verified payout. Backend is Convex with custom session auth.

Overview Features Flow Tech Roadmap Test results πŸ§ͺ Pair test plan

Overview

E2E verifiedStaging E2E onlyWeb deploy automation open (#11)

2026-09-27 β€” verified against repo, docs page is partially stale: almightydollar.us is live (HTTP 200, SPA renders; bundle pins useful-antelope-558.convex.cloud), the org-list pagination fix and searchable org picker shipped in PR #18, bulkImport is admin-gated, and password reset (Resend) shipped in PR #19. The warnings below predate those. πŸ§ͺ Pair test plan published.
Repomicrospaces/almightydollar-app
LocalC:/Users/AI/Repos/almightydollar-app
Owner agentalmightydollardev (#dev)
BackendConvex (cloud project + npx convex dev --local for offline E2E)
WebVercel project useful-antelope-558 (expo export β†’ dist/) β€” current deploy returns 404, needs redeploy

App features

Flow

Build & run

npm install
npx convex dev                  # push schema/functions, generate _generated/ (needs EXPO_PUBLIC_CONVEX_URL)
npm run web                     # Expo web dev server β†’ localhost:8081
npm run build                   # expo export --platform web β†’ dist/

Runtime request

  1. Browser loads the SPA from Vercel (dist/ + rewrite to /index.html).
  2. Convex client connects to EXPO_PUBLIC_CONVEX_URL, baked at build time.
  3. Session token lives in AsyncStorage; every call is a Convex query/mutation scoped by role.

Tithe lifecycle

  1. Customer connects with a business β†’ picks the org that receives the tithe (org picker; single-org path skips it).
  2. Owner advances the lead: pending β†’ contacted β†’ quoted β†’ closed.
  3. Owner records a sale β†’ tithe computed at the org's % β†’ status awaiting verification.
  4. Org admin verifies the tithe β†’ marks payout received β†’ org impact total and customer tithing history update.

Deploy

Backend: GitHub Actions Deploy Convex on push to main (npx convex deploy with CONVEX_DEPLOY_KEY) or workflow_dispatch.

Web: manual vercel CLI deploy β€” no git integration (automation tracked in issue #11). Production at almightydollar.us is live and current (verified 2026-09-27).

Convex read-cap gotcha (2026-08-15): the NCES import (scripts/importNCES.js) pushed 29,422 orgs into the table; organizations:list blew past Convex's 8,192-doc return cap β†’ blank white Home/Directory on the cloud deploy. Fixed via searchable/paginated org picker (PR #18, 2026-09). Journeys now run against staging (upbeat-giraffe-329).

End-to-end walkthrough: customer β†’ work β†’ payment β†’ tithe

What actually happens, step by step, with the exact DB states (connections.ts / sales.ts):

#ActorWhat happensWhat's recorded
1CustomerFinds the business in the Directory (filter by category/location/org) and taps Connect. An org picker asks which church/school receives the tithe β€” skipped when the business has exactly one affiliated org.connections row created: status pending, source app/web, chosen organizationId.
2Business ownerLead appears on the Business Dashboard (customer name + phone/email + chosen org). Owner does the work off-platform: reaches out, quotes, performs the job. Each stage is a tap.Connection status: pending β†’ contacted β†’ quoted (owner-only; customer may cancel their own request).
3CustomerPays the business directly β€” today that's off-platform (cash, check, card, invoice; no money moves through the app yet β€” Stripe Connect is on the roadmap).β€”
4Business ownerRecords the sale against the connection: enters the amount the customer paid. The tithe is computed automatically from the org's tithing % (default 10%, per-org configurable) and the connection closes.sales row: amount, tithingPercentage, tithingAmount = amount Γ— %, status pending_verification. Connection β†’ closed.
5Org adminSale shows on the Org Dashboard as awaiting verification. Admin confirms the tithe actually arrived from the business (cash/check today), then hits Verify.Sale status β†’ verified (verifiedAt set). Amount counted in the org's pendingPayout.
6Org adminOnce the funds are in the org's hands, marks the payout Received.Sale status β†’ paid_to_org (paidAt set). Counted in the org's paidOut total.
7EveryoneNumbers roll up automatically across all surfaces.Customer: Tithing History + Profile tithe impact Β· Org public page: total sales, total tithing, pending payout, paid out, sale count (tithingSummary, powers the public impact section) Β· Owner: sales list per business.

Worked example (from the E2E journeys): customer connects to Loaves & Lines Bakery choosing Grace Community (15%) β†’ owner advances the lead and does the work β†’ customer pays $200 β†’ owner records the sale β†’ tithe auto-computed: $200 Γ— 15% = $30 β†’ org admin verifies β†’ marks received β†’ Grace Community's public impact page now shows $30 total and Loaves & Lines as a member business.

Honest caveat: steps 3–6 track and verify real-world money; they don't move it. The tithe transfer is honor-system (owner self-reports the sale, admin verifies receipt). Stripe Connect will automate the payout leg β€” schema fields (verifiedAt, paidAt, payout statuses) already exist for it.

Tech

FrontendExpo 54 / React Native 0.76.7 + react-native-web, React Navigation 7, Expo Vector Icons
BackendConvex 1.32 β€” convex/schema.ts, custom auth (auth.ts + helpers.ts), per-domain modules (organizations.ts, businesses.ts, connections.ts, sales.ts, reviews.ts, seed.ts)
Vercelframework: null, installCommand: npm install, buildCommand: npm run build, outputDirectory: dist, SPA rewrites
CI.github/workflows/convex-deploy.yml β€” Convex deploy on push to main
E2EPlaywright 1.58 journey scripts (scripts/journey1-customer.mjs, journey2-owner.mjs dual-context, journey3-org.mjs + resume/final variants)
Data importsscripts/ β€” NCES school scrape/import, church scrape, bulk import tooling
Localnpm run web (8081) Β· npx convex dev --local for offline E2E β€” Git Bash / PowerShell on Windows
App.tsx                  # providers + navigation
app/
  components/ui.tsx      # shared UI primitives
  lib/AuthContext.tsx    # session token in AsyncStorage
  theme/theme.ts         # design tokens
  screens/               # Home, Directory, BusinessDetail, Organizations,
                         # OrgDetail, Auth, Profile, MyConnections,
                         # TithingHistory, BusinessDashboard, OrgDashboard,
                         # RegisterBusiness, RegisterOrg
convex/                  # schema, auth, domain functions, seed
scripts/                 # journey E2E + NCES/church import tooling

πŸ—‚οΈ Roadmap

Live roadmap, managed as GitHub issues (almightydollar-app issues). Add or close items on GitHub β€” β˜‘ = done, close as β€œnot planned” to remove.

Test results

Canonical scripts: scripts/journey1-customer.mjs, scripts/journey2-owner.mjs, scripts/journey3-org.mjs (+ 3b/3c resume/final). Results JSON + ~90 screenshots captured per run.

πŸ§ͺ Pair test plan β€” projects/almightydollar-test-plan.html: the live two-tester walkthrough (guest browse / accounts & listings / connect β†’ sale / org verify & payout / security probes) we execute together against staging, with the results-and-issue log filled in as we go.

2026-08-15/16 β€” Journey 1-3 E2E (local Convex, Playwright)

Cloud-deploy verification (useful-antelope-558) is blocked by the org-list pagination bug above β€” treat E2E results as local-stack verification, not cloud QA.