90-Day MVP Roadmap
HOAHelper
Launch Plan
The core product is built. This roadmap covers the 90 days from "working prototype" to "revenue-generating, publicly launched product" — including billing, marketing, customer acquisition, and iteration.
Core app: complete
Billing: pending
Target: 25 paying communities
Target: $2,250+ MRR by Day 90
Important context: HOAHelper is not starting from zero. The Admin, Guard, and Resident portals are functional. The AI edge function is live. Supabase RLS is in place. This 90-day plan focuses on the gap between "it works" and "it earns" — specifically: Stripe billing, public launch, customer acquisition, and iterating on real feedback.
Section 01
MVP Scope & Definition
Core Value Proposition
HOAHelper gives HOA communities an AI that instantly answers resident bylaw questions and guides gate security decisions — grounded in their actual documents, not generic advice.
What's IN the MVP
- Admin setup wizard (neighborhood creation, role assignment)
- Bylaw upload: PDF text extraction + OCR fallback for scanned docs
- Resident bylaw chat with document citations and flagging
- Guard portal: DL barcode scan, AI security check, Allow/Flag/Deny
- Admin dashboard: real-time stats, visitor reports, review queue
- Google OAuth authentication
- Stripe billing: $49 trial + $9/mo subscription
- Landing page, favicon, OG images, PWA manifest
- Email/magic link auth (for non-Google users)
What's OUT (Post-MVP)
- Multi-community accounts (Property Manager plan)
- White-label / branded portals
- Native SMS integration via Twilio
- Resident mobile app (PWA install is sufficient for now)
- HOA accounting / maintenance request features
- Advanced analytics dashboard
- API for third-party integrations
- Multi-language support
25
Paying communities by Day 90
$2,250
Target MRR by Day 90
20%
Trial-to-paid conversion target
< $100
Customer acquisition cost target
Section 02
Feature Prioritization Matrix
| Feature | Status | User Value | Effort | Day Target |
Stripe billing + paywall $49 trial, $9/mo sub, webhook handling |
Not built |
Enables revenue. Blocking everything else. |
High |
Day 14 |
Landing page + domain hoahelper.app, SEO meta, OG images |
Partial |
First impression for every ad click. Conversion anchor. |
Low |
Day 7 |
Magic link / email auth OTP via Supabase — no Google required |
Not built |
Removes friction for non-Gmail users (significant HOA board segment) |
Low |
Day 10 |
Favicon + PWA manifest favicon.svg, apple-touch-icon, manifest.json |
Not built |
Trust signal. Guards can install as home screen app. |
Very Low |
Day 5 |
Admin portal Dashboard, bylaws, residents, reports, review queue |
✓ Built |
Core admin value. Fully functional. |
— |
Done |
Guard portal + DL scan AI security check, barcode scan, entry logging |
✓ Built |
Key differentiator. No competitor offers this. |
— |
Done |
Resident bylaw chat AI Q&A with citations, persistent history, flagging |
✓ Built |
Primary value for residents and board members. |
— |
Done |
Tesseract self-hosting Move OCR assets from unpkg.com to public/ |
Quick fix |
Reliability. Removes single CDN dependency for OCR. |
Very Low |
Day 3 |
Test coverage uplift ≥80% branch coverage on lib/ |
Partial |
Engineering confidence. Reduces production bugs. |
Medium |
Day 30 |
Should-Have (Days 31–60)
- Basic in-app onboarding tour for new admins (3 tooltips, skip-able)
- Email notifications for flagged review queue items
- Visitor report PDF export (currently CSV only)
- Mobile-optimized guard portal (larger tap targets, simplified flow)
- AI response disclaimer ("not legal advice") in chat UI
Could-Have (Days 61–90+)
- Multi-community accounts (Property Manager plan)
- Twilio SMS integration (residents text questions via phone number)
- Automated email digest of flagged items for admins
- Bulk resident import (CSV upload)
- White-label branding options
Section 03
Technical Architecture (as built)
The architecture is established. This section documents decisions for new contributors and identifies the two gaps to close before launch.
| Layer | Technology | Rationale | Gap to Close |
| Frontend SPA | React 19 + TypeScript + Vite 6 | Fast dev, strong ecosystem, RSC-ready for future | None |
| Styling | Tailwind CSS v4 | Rapid UI iteration, consistent design tokens | None |
| Database + Auth + Realtime | Supabase (Postgres 15 + RLS) | Handles auth, RLS, storage, realtime — zero backend servers | None |
| AI (provider-agnostic) | Supabase Edge Function (Deno) | Keys never hit browser; switch AI provider via env var | None |
| Document parsing | pdfjs-dist + Tesseract.js | Client-side = zero server cost; OCR fallback for scans | Self-host Tesseract assets |
| DL scanning | html5-qrcode (PDF417) | Works in any mobile browser, no native app required | None |
| Validation | Zod | Runtime type safety at every form boundary | None |
| Billing | Stripe Checkout + Webhooks | Industry standard, handles all payment edge cases | Build in Days 1–14 |
| Hosting | Vercel (recommended) or Netlify | Zero-config SPA deployment, global CDN | Configure for production domain |
| Monitoring | Sentry + PostHog (free tier) | Error tracking + feature analytics without overhead | Add Day 25–30 |
Section 04
Key User Journeys (Discovery → Value)
Journey A — Board Admin (Primary Buyer)
Sees Facebook ad
Discovery
→
Lands on hoahelper.app
Considers
→
Clicks $49 trial → Stripe
Converts
→
Uploads bylaws, shares link
Activates
→
Weekend inbox = quiet
Value realized
Critical drop-off points: (1) Landing page → Stripe checkout. (2) Stripe → bylaw upload. If admin doesn't upload bylaws, they get zero value and will churn.
Journey B — Gate Guard (Daily User)
Guard is set up by admin (no signup required). Admin adds them as staff → they receive access link → open Guard Portal on phone → scan first DL → AI security check runs → Allow/Flag/Deny logged. Value is realized on the first visitor interaction. The guard never touches billing — their experience is purely operational.
Key insight: Guard satisfaction drives admin retention. If guards find the portal slow or hard to use on mobile, admins hear about it. Mobile performance on the Guard Portal is a retention lever, not just a UX issue.
Section 05
90-Day Sprint Plan
Three phases: make it sellable (Days 1–30), sell it (Days 31–60), learn and grow (Days 61–90). Development and marketing run in parallel from Day 31.
Self-host Tesseract assets — copy WASM, core, eng.traineddata to public/tesseract/. Update paths in extractText.ts. ~2 hrs
Favicon + PWA manifest — favicon.svg, apple-touch-icon.png, manifest.json. Add <link rel="icon"> and <link rel="manifest"> to index.html. ~3 hrs
OG / Twitter card meta tags — og:image (1200×628), og:title, og:description. Verify with Facebook OG Debugger. ~2 hrs
Deploy to production domain — hoahelper.app on Vercel. Configure Supabase redirect URLs. Test OAuth flow end-to-end. ~4 hrs
Set up PostHog analytics — install @posthog/react, instrument: bylaw upload, chat message sent, DL scan, entry logged. ~3 hrs
🎯Deliverable: hoahelper.app is live, loads fast, has a favicon, and tracks user actions. Shareable with early testers.
Stripe Checkout Edge Function — create_checkout_session for $49 trial and $9/mo. Store stripe_customer_id and trial_ends_at on neighborhoods table.
Stripe webhook handler — Edge Function handles: checkout.session.completed, invoice.payment_failed, customer.subscription.deleted. Updates subscription_status in neighborhoods.
Paywall middleware — check subscription_status on portal load. Redirect past_due/canceled/expired to upgrade page. Trial_ends_at enforcement.
Magic link auth — enable Supabase OTP. Add email input to Login.tsx with "or continue with email" separator below Google button.
End-to-end billing test — use Stripe test mode: trial purchase → portal access → trial expiry → upgrade flow. All webhook events verified.
💳Deliverable: First real $49 payment can be collected. Trial enforcement works. Paywall blocks expired accounts.
Unit test coverage — run vitest --coverage. Write missing tests for extractText.ts, edge case aamva.ts specs, remaining validation schemas. Target: ≥80% branch coverage on lib/.
AI disclaimer copy — add "Responses are based on your community's uploaded documents and should not be considered legal advice" below the chat input.
Recruit 5 beta communities — post in r/HOA and r/fuckHOA, reach out to local Facebook HOA groups. Offer 3 months free in exchange for a testimonial and 30-min feedback call.
Set up Sentry error monitoring — install @sentry/react, configure DSN, test that uncaught errors and slow transactions alert correctly.
🧪Deliverable: Codebase is production-stable. 5 real HOA communities testing the product.
Beta feedback calls — 30 minutes each with 5 beta community admins. Structured: (1) What worked? (2) What confused you? (3) What would make you pay for this? Document verbatim quotes.
Fix top 3 feedback items — prioritize issues that affect trial-to-paid conversion. Quick wins only — no scope expansion.
Collect 2 testimonials — get written permission, photograph or use initials. Add to landing page social proof section. Update hero trust strip.
Convert beta users to paid — offer beta communities the $49 trial at the end of their free access. Target: 3 paying communities by Day 30.
🚀Deliverable: 3 paying communities. Real testimonials on the landing page. Known user friction points fixed.
DAY 30 MILESTONE — Product is live, tested, and collecting real revenue. 3+ paying communities. Testimonials in place.
Launch Facebook/Instagram ads — Problem angle creative (board burnout inbox visual). $30–50/day. Florida, Texas, Arizona geo-targeting. Use Campaign Angle 1 from the ad package.
Launch Google Search ads — Campaign A keywords ("HOA AI assistant", "HOA management software"). $20–40/day. Manual CPC initially.
Reddit organic engagement — Answer 5 HOA questions per week in r/HOA. No promotional posts. Build credibility. DM users who ask relevant questions to see if they want access.
Admin onboarding tooltip tour — 3 tooltips: (1) Upload bylaws first, (2) Share the chat link with residents, (3) Guards use the Guard Portal. Skip-able. Triggered on first login.
Email notification for flagged items — when needs_review=true, send admin an email via Supabase email edge function. "A resident question needs your review."
📣Deliverable: Paid ads running. First ad-sourced signups in Stripe. 8+ paying communities total.
A/B test hero headline — "Your bylaws. Instant answers." vs "Stop answering the same HOA questions." Run for 7 days, pick winner. Pause low-CTR ad creatives.
LinkedIn outreach to property managers — identify 50 property management firms managing 5+ communities in target states. Personalized DM with the property manager pitch (3 portals, white-label interest).
Post first Reddit AMA — "We built an AI that reads HOA bylaws and answers questions — AMA." Do it authentically; answer every reply. This single post can drive 10–20 signups.
Review churned/non-converted trials — look at PostHog funnel. Identify where admins drop out before going live (before bylaws upload? Before sharing link?). Fix the top drop-off point.
📈Deliverable: 15 paying communities. Best-performing ad creative identified. First property manager conversation started.
DAY 60 MILESTONE — 15 paying communities. $1,350+ MRR. CAC validated. First property manager conversation underway.
30-day health check calls — call every paying community at the 30-day mark. Ask: are guards using the portal? Have residents asked questions? What's missing? Document churn risks early.
Soft-launch Premium Support ($5/mo) — email current customers: "For communities that want a human to review flagged questions within 4 hours, we now offer Premium Support." Manual fulfillment initially.
Case study: write up one success story — pick the community with the most measurable outcome (e.g., "board went from 30 texts/week to 4"). Publish as a blog post + LinkedIn article.
Visitor report PDF export — add PDF export alongside CSV. Admins share with board meetings. Adds perceived value without changing the product experience.
💼Deliverable: 20 paying communities. First Premium Support upsell. Published case study for use in outreach.
Analyze 90-day data — PostHog: top drop-off in onboarding funnel. Stripe: trial-to-paid rate. Sentry: top error types. Build v1.2 backlog from these, not feature ideas.
Double budget on best-performing ad channel — whichever channel has lowest CAC at Day 75 gets 2x budget. Kill underperforming campaigns.
Close first property manager deal — follow up on LinkedIn outreach from Week 7–8. Target: one PM firm with 3+ communities on a pilot. Price: 3 communities at $9/mo each = $27/mo. Lock in relationship.
Scope v1.2 — lock in features for next 90 days based on data. Likely candidates: multi-community accounts, Twilio SMS, bulk resident import. Confirm with paying customers before building.
🏁Deliverable: 25 paying communities. $2,250+ MRR. v1.2 scope locked and validated with real customers.
DAY 90 MILESTONE — 25 paying communities. $2,250+ MRR. CAC < $100. First PM partnership. v1.2 roadmap locked.
Section 06
Testing Strategy
Day 21 — Internal QA
- Full admin onboarding flow on fresh account
- PDF upload: text PDF + scanned PDF (OCR)
- Guard portal DL scan on iOS + Android
- Resident chat on mobile browser (Safari + Chrome)
- Stripe test mode: trial → expiry → upgrade
- All webhook events fire correctly
- Paywall blocks access after trial
Day 28 — Beta User Testing
- 5 real HOA admins run full onboarding unassisted
- Record session (with permission) — watch where they hesitate
- Time from signup to first resident question answered
- Guards test DL scan in field conditions (outdoor light, fast scan)
- Collect SUS (System Usability Scale) score — target ≥ 70
Day 60 — Continuous
- PostHog funnel: track drop-off at each onboarding step weekly
- Sentry: zero P0 errors (crashes, blank screens) — alert immediately
- Stripe: webhook delivery rate ≥ 99.5% — monitor Stripe dashboard
- AI accuracy: manual review of 10 random chat responses per week
- Guard portal scan success rate in PostHog — alert if <75%
Section 07
Risk Mitigation
| Risk | Likelihood | Impact | Mitigation |
| Stripe billing breaks at launch — webhook misconfig, wrong price IDs in test vs live mode |
Medium |
High |
Test every Stripe webhook event in test mode before going live. Use Stripe CLI for local webhook testing. Keep billing logs table in Supabase as backup record. |
| Admin doesn't upload bylaws — buys trial, never activates, churns after 3 months with zero value |
Medium |
High |
Trigger email 24 hours after signup if bylaws field is empty: "You're set up — one thing left." Guide them to upload. Add this as a Day 1 activation metric in PostHog. |
| AI gives an inaccurate answer — cites wrong rule or invents something not in bylaws |
Low |
Medium |
System prompt explicitly instructs: only cite uploaded documents. Legal disclaimer below chat input. Weekly manual QA of 10 random chat responses. Flagging covers complex cases. |
| DL scanning fails on older Android devices — JS zxing fallback slower than native BarcodeDetector |
Medium |
Low |
Manual entry always available. UI copy sets expectations: "works best on a phone camera." PostHog tracks scan success rate — alert if <75% on mobile. |
| Ad CAC exceeds $100 — Facebook CPMs higher than projected, low landing page conversion |
Medium |
Medium |
Run A/B tests on headline and creative simultaneously. Pause campaigns under 0.5% CTR after 500 impressions. Reddit organic is free — lean into that if paid is expensive. |
| Board member resists adopting AI — "we don't want to give residents wrong information" |
High |
Medium |
This objection is handled in sales. Emphasize: (1) every answer cites the exact document, (2) complex questions go to human review, (3) 3-month trial with no commitment. Address in FAQ on landing page. |
Section 08
Launch Criteria
All boxes must be checked before spending any paid acquisition budget. Paid traffic to a broken funnel wastes money and first impressions.
Technical Readiness
All three portals functional and tested on mobile
AI chat returns accurate, cited responses on test bylaws
RLS confirmed on all 5 database tables
Stripe live mode active and tested (not test mode)
Paywall enforced after trial_ends_at
Favicon, OG images, and PWA manifest live
Sentry error monitoring active
PostHog analytics tracking key events
Business Readiness
Landing page live with pricing, FAQ, and testimonials
Privacy Policy and Terms of Service pages live
Support email (support@hoahelper.app) routing to founder
At least 2 real testimonials on landing page
AI disclaimer ("not legal advice") visible in chat UI
Facebook ad account set up with pixel installed
Google Ads account created with billing configured
3 paying communities confirmed before ad spend begins
The "3 paying before ads" rule: Do not start paid acquisition until 3 communities have paid and you've confirmed they're getting value. This validates the onboarding funnel and gives you real testimonials. Paid traffic to a pre-validated funnel is efficient. Paid traffic to an untested funnel is expensive learning.
Section 09
Post-Launch Iteration Plan
Days 1–14 post-launch
Stabilize & learn
- Monitor Sentry daily — zero P0s tolerated
- Watch PostHog onboarding funnel for drop-off
- Read every support email same day
- Call any churned/inactive trial community to understand why
- Fix critical bugs within 24 hours
- Log every piece of feedback in a single doc
Days 15–45 post-launch
Optimize conversion
- Fix top 2 onboarding drop-off points (data-driven)
- A/B test landing page CTA copy
- Add activation email sequence (Day 1, Day 3, Day 7 post-signup)
- Implement top-requested feature (that's in-scope)
- Build out NPS survey trigger at 30-day mark
- Scale winning ad channel
Days 46–90 post-launch
Build toward v1.2
- Scope multi-community feature (PM plan prerequisite)
- Evaluate Twilio SMS demand from customer calls
- Begin LinkedIn B2B outreach at scale
- Publish 1 long-form content piece per month
- First conference or HOA industry event (Florida or Texas)
- Validate white-label interest with 3 PM firms
The 18-Month Target
500 paying communities · $4,500/mo MRR · First property manager partnership · v1.2 shipped
At 500 communities × $9/month = $54,000 ARR from subscriptions alone. Add Premium Support upsell at 20% attach rate ($5/mo) = $63,000 ARR. Add one $50,000/year PM licensing deal = $113,000 ARR. This is well within reach at the current growth trajectory — the key variable is CAC. Keep it under $100 and the math works.