# FocusOne — Next-Task Guidance for ADHD: Lean MVP PRD

> Generated: 2026-04-25
> Source: `ScoredDemands/adhd-saas__scored-demand__20260425-0024.md`
> Decision: REVIEW (25/40) — PRD generated per explicit product owner request

---

## 1. Problem & User

**Target User:** Adults with ADHD (18–45) doing self-managed knowledge work — freelancers, remote employees, and students — who already use Todoist, Notion, or similar task managers but cannot convert their backlog into action.

**Core Pain:** ADHD users face a specific failure mode that neurotypical apps ignore: they know what needs to be done but cannot *start*. Opening a task list with 50 items triggers cognitive overload and task paralysis ("activation energy barrier"). They also cannot sense time passing (time blindness), so the day collapses after one interruption with no way to recover.

**User Quote:** "知道要做但启动不了" / "一件事没做完，整个日程就崩了，不知道如何重建"

**Why existing tools fail:**
- Todoist / Notion: excellent at capture, useless at "what do I do RIGHT NOW"
- Motion ($34/mo): auto-schedules but complex UI, unaffordable for individuals
- Structured: pretty visuals, no AI, no dynamic rescheduling
- Focus Bear / Forest: solves focus timer, not the prior decision problem

**Market Signal:** ADHD apps market growing ~37% CAGR; ~20M diagnosed US adults; $8-15/mo price gap between Tiimo (simple) and Motion (complex) is unserved.

---

## 2. Target Outcome & KPIs

**Primary Outcome:** A user with ADHD opens FocusOne, sees exactly one task to work on right now, starts it within 60 seconds, and completes more tasks per day than before.

| KPI | Target (30-day post-launch) |
|-----|---------------------------|
| Time-to-first-task (onboarding → first "Do This Now" screen) | ≤ 5 minutes |
| Daily active usage rate (users opening app on workdays) | ≥ 40% |
| Trial-to-paid conversion (14-day trial) | ≥ 8% |
| 30-day retention | ≥ 35% |
| NPS (ADHD-specific cohort) | ≥ 40 |

---

## 3. MVP Scope (In)

1. **Todoist import** — OAuth connect or personal API token; pull all active tasks with title, due date, priority, project
2. **Daily check-in** — 3-question entry: current energy level (low/medium/high), available minutes, context (work/personal/study)
3. **"Do This Now" screen** — shows exactly ONE recommended task; algorithm: overdue → due today → high priority → short estimated time → low friction
4. **Task breakdown** — one-click "Break it down" on any task → LLM generates 3 micro-steps (e.g. "Write report" → "Open doc / Draft intro paragraph / Save and close") → user picks one to execute
5. **Day rebuild ("Rescue Me")** — user marks that their day collapsed; app re-ranks remaining tasks for the time left
6. **Stripe billing** — $8/month or $72/year; 14-day free trial; paywall after trial expires

---

## 4. Out of Scope

- Native iOS/Android app (web-only MVP)
- Notion / Asana / Jira integration (Todoist only at launch)
- Team features, shared workspaces, manager views
- Calendar blocking / time-boxing (next phase)
- Custom AI model training or fine-tuning
- Body double / social accountability features
- Browser extension
- Offline mode

---

## 5. User Flow (Happy Path)

```
1. Land on /  →  "Sign in with Google" or email magic link
2. /onboarding  →  "Connect Todoist" (OAuth popup)
3. /onboarding  →  Import tasks (background, ~5s)  →  redirect to /today
4. /today  →  Daily check-in modal (energy/time/context, 3 taps)
5. /today  →  "Do This Now" card appears with ONE task
6. User clicks "Break it down"  →  modal shows 3 micro-steps
7. User selects step  →  card updates to show selected micro-step
8. User clicks "Done" (or "Skip")  →  next task surfaces
9. Day collapses?  →  "Rescue Me" button  →  reprioritized list for remaining time
10. Trial expires  →  /billing paywall  →  Stripe checkout  →  /today
```

---

## 6. Functional Requirements (P0 Only)

| ID | Requirement |
|----|-------------|
| P0-1 | User can connect Todoist and import all active (non-completed) tasks |
| P0-2 | System presents exactly one recommended next task on /today based on check-in inputs |
| P0-3 | User can trigger one-click task breakdown; LLM returns 3 micro-steps within 5s |
| P0-4 | User can mark task done or skip; next recommendation surfaces immediately |
| P0-5 | "Rescue Me" re-ranks remaining tasks given updated available-minutes input |
| P0-6 | Stripe subscription checkout works; trial enforced; access blocked post-expiry |
| P0-7 | Daily check-in resets at midnight user-local timezone |

---

## 7. Minimal Data Model

```sql
users           (id, email, timezone, created_at, trial_ends_at)
integrations    (id, user_id, provider="todoist", access_token, last_synced_at)
tasks           (id, user_id, external_id, title, project, due_date, priority,
                 estimated_minutes, friction_score, completed, synced_at)
checkins        (id, user_id, date, energy_level, available_minutes, context)
micro_steps     (id, task_id, user_id, step_text, selected, created_at)
subscriptions   (id, user_id, stripe_customer_id, stripe_sub_id, status, plan)
```

---

## 8. API / Integration Notes

- **Todoist OAuth:** use `https://todoist.com/oauth/authorize` → exchange code for token → store in `integrations`; sync tasks via REST API v2 `GET /tasks`
- **LLM (task breakdown):** single call to OpenAI `gpt-4o-mini` or `gpt-4.1-mini` with prompt: "Break this ADHD task into 3 tiny actionable steps (5 words max each): {task_title}". Cost: ~$0.0001/call — negligible.
- **Stripe:** subscription product with monthly ($8) and annual ($72) prices; webhook for `customer.subscription.updated` → update `subscriptions.status`
- **Auth:** NextAuth.js with Google OAuth + email magic link; session stored in Supabase

---

## 9. Acceptance Criteria

1. A new user can complete full onboarding (sign up → Todoist connect → first "Do This Now" task) in under 5 minutes
2. Task recommendation changes correctly based on energy/time input (verified with 3 manual test cases)
3. Breakdown modal returns ≤ 5 seconds; shows exactly 3 steps; at least one is actionable
4. "Rescue Me" flow updates recommendation when available-minutes drops from 120 to 30 (verified manually)
5. Stripe test checkout succeeds; `subscriptions.status` updates to `active`; trial enforcement blocks /today after 14 days without payment
6. Zero P0 bugs in core happy path on desktop Chrome and Safari

---

## 10. Delivery Plan

### M1 — Foundation: Auth + Data + Todoist Sync (Day 1 AM, ~6h)

**Why first:** All other features depend on having tasks in the DB and a logged-in user.

Files to create:
- `prisma/schema.prisma` — full data model (users, integrations, tasks, checkins, micro_steps, subscriptions)
- `app/api/auth/[...nextauth]/route.ts` — NextAuth config with Google + email providers
- `app/api/integrations/todoist/connect/route.ts` — OAuth start endpoint
- `app/api/integrations/todoist/callback/route.ts` — token exchange + initial task import
- `lib/todoist.ts` — fetchTasks() helper using Todoist REST API v2
- `app/onboarding/page.tsx` — connect Todoist UI step

**Exit criteria:**
- `GET /api/integrations/todoist/callback` with valid code → tasks written to DB, `integrations.last_synced_at` updated
- `npx prisma migrate dev` succeeds with no errors
- User can log in via Google OAuth on localhost

---

### M2 — Core Engine: Check-in + Recommendation + Breakdown (Day 1 PM – Day 2 AM, ~9h)

**Why second:** Core value proposition; all user-facing screens depend on this.

Files to create:
- `lib/recommend.ts` — ranking algorithm: overdue → due_today → priority → short est → low friction
- `app/api/checkin/route.ts` — POST checkin; stores energy/time/context; triggers re-rank
- `app/api/tasks/next/route.ts` — GET recommended next task for user
- `app/api/tasks/[id]/breakdown/route.ts` — POST calls LLM, stores micro_steps
- `app/api/tasks/[id]/done/route.ts` — PATCH marks task complete, returns next task
- `app/api/tasks/[id]/rescue/route.ts` — POST with new available_minutes, returns re-ranked task
- `app/today/page.tsx` — main UI: check-in modal + "Do This Now" card + breakdown modal
- `components/TaskCard.tsx` — single task card with Done/Skip/Break It Down actions
- `components/CheckinModal.tsx` — 3-question check-in flow

**Exit criteria:**
- `POST /api/checkin` with `{energy:"low", available_minutes:30}` → `GET /api/tasks/next` returns task with shortest estimated time
- `POST /api/tasks/{id}/breakdown` returns JSON `{steps: [str, str, str]}` within 5s
- `POST /api/tasks/{id}/rescue` with `available_minutes:20` re-ranks correctly (verified with seeded test data)
- Full happy path navigable in browser: login → onboard → check-in → task card → breakdown modal → mark done → next task

---

### M3 — Billing + Polish + Deploy (Day 2 PM, ~5h)

**Why last:** Paywall depends on working core; polish and error handling is final layer.

Files to create:
- `lib/stripe.ts` — createCheckoutSession(), createBillingPortalSession()
- `app/api/billing/checkout/route.ts` — POST creates Stripe checkout session
- `app/api/billing/webhook/route.ts` — handles `customer.subscription.updated`
- `app/api/billing/portal/route.ts` — customer portal link
- `app/billing/page.tsx` — paywall UI for expired trials
- `middleware.ts` — protect /today route; redirect to /billing if trial expired and no active sub
- `app/error.tsx`, error boundaries on all API routes

**Exit criteria:**
- Stripe test checkout with card `4242 4242 4242 4242` → `subscriptions.status = active` in DB
- User with `trial_ends_at` in the past and no subscription → redirected to /billing on /today access
- `vercel build` succeeds with no TypeScript errors
- New user completes full end-to-end flow (sign up → Todoist → check-in → task → breakdown → done) in under 5 minutes

---

## 11. Risks & Mitigations

| Risk | Likelihood | Mitigation |
|------|-----------|-----------|
| Todoist API rate limits or OAuth approval delays | Medium | Use personal API token as fallback for launch; OAuth for v1.1 |
| LLM breakdown quality too generic or useless | Medium | Pre-test 50 real ADHD task titles; add few-shot examples to prompt |
| Low trial-to-paid conversion (ADHD users churn fast) | High | Add usage-based "nudge" email on day 3 and day 12 of trial |
| Recommendation feels wrong / not helpful | High | Build override — user can manually pick task; log skips to improve algorithm |
| Scope creep (calendar, mobile, teams) | Medium | Any new P0 must explicitly replace an existing P0; no stacking |

---

## 12. Chargeability Rationale

**Pricing:** $8/month or $72/year (14-day free trial)

Adults with ADHD lose an estimated 3–5 hours per week to task paralysis and ineffective planning — at a conservative $20/hr opportunity cost, that's $240–$400/month in lost productivity; paying $8/month to recover even 30 minutes per week delivers a clear positive ROI that motivated users can articulate. The $8 price point sits below the pain threshold for individual consumer SaaS, above Tiimo ($5.99) to signal capability, and well below Motion ($34) to capture the unserved mid-market.

**Tech stack:** Next.js 14 + App Router · Supabase (Postgres + Auth) · Prisma ORM · Stripe · OpenAI gpt-4o-mini · Vercel · Todoist REST API v2
