One-page summary. Detailed plan + checklists in
docs/plans/2026-04-30-week-of-may-4-board-plan.md(in repo). Read that for the full skill invocations and per-task details.
Single Q2 metric: Demand Distribution — paid rooms with ≥1 inquiry in 14d. Currently 53.1%, Q2 goal ≥60%. Everything below either moves this directly (more messages, fewer blocked messages) or unblocks future work that will move it.
| # | What | Owner | Direct hit on metric? |
|---|---|---|---|
| 1 | #4429 P1 — Verified Gmail users blocked from sending messages | Ahmed (Mon AM) | YES — every blocked message hits the numerator |
| 2 | #3525 P1 — Blocking a user doesn't deactivate their listings | Ahmed (Thu) | YES — denominator hygiene |
| 3 | 6 backlog PRs to master | Ahmed Mon-Tue + Mahmoud Mon | Indirectly — clears noise + ships small wins |
| 4 | Pro+Premium Listing Analytics page (refresh, 5 widgets, NO projection) | Ahmed BE + Mahmoud FE | Indirectly — drives Pro/Premium retention + price-tier nudges |
| 5 | Pro Video Tour (Cloudflare Stream) | Ahmed BE + Mahmoud FE | Indirectly — Pro retention; possible inquiry-rate lift on video'd listings |
| 6 | Broadcast CTA prework — migrate broadcast_cta_clicked GA4 → PostHog |
Ahmed (Thu) | Setup for future A/B |
Cut after review: price-projection widget (statistically indefensible without panel study), broadcast CTA A/B test (mathematically underpowered at current traffic).
| Day | Ahmed | Mahmoud |
|---|---|---|
| Mon | #4429 P1 first (use /bug-fix). Then drive backlog: #4544, #4485, #4496, #4326, #4006, #4052 |
Ship pre-rebased #3759, #3863, #3855. Start analytics mockup + video-tour mockup |
| Tue | Audit existing analytics service. Add rooms.last_analytics_view_at migration. Update getPricePosition copy to descriptive percentile only. Video back end: rooms migration + Pro accessor |
Both mockups → /design-review → Gaurav approval |
| Wed | Video back end: upload-URL endpoint + webhook (signature verification non-negotiable) + delete | Build refreshed analytics page Vue (5 widgets, no projection). Add vue-echarts to package.json |
| Thu | #3525 P1. Broadcast CTA migration: swap trackGA4 → track in RoomsGallery.vue:262 + broadcast_sent |
Build video tour FE: upload widget, <stream> player on Room.vue, play overlay on ResultsCard.vue |
| Fri | Tier-2 fixes (#3556, #3526) or shepherd PRs through staging→master | Finish video FE + analytics. Filter analytics audit. Visual self-review |
This is your week. Each task has a checklist in the full plan doc — check items off in your branch's PR description as you complete them.
- One issue, one branch, one PR. Use
rr-new <name>. Never branch from staging. Never commit to master. - Use the listed Claude skills — they're listed in the full plan per task. They exist because we hit specific failure modes without them. Don't shortcut.
- Tests first.
/test-writing→/create-test. Don't claim "done" without tests. - Visual changes are mockup-first.
/create-mockup→/design-review→ Gaurav approval BEFORE coding. /iterative-reviewbefore requesting human review. Get to zero Critical findings.- Then
/ready-for-review— adds label, requests reviewer, posts breadcrumb. - Audit block at end of every PR per CLAUDE.md — list which tool calls back each "tests pass / review done" claim.
- No
--no-verify. No skipped tests. No weakened assertions.
Stuck? Tried 2+ hypotheses on the same bug? /codex:rescue --background. Designing a feature? /writing-plans first.
PostHog free tier (1M events/mo, $100/mo cap per #3945). Don't reflexively send events to PostHog — most of what we want to measure can stay in GA4.
Use useAnalytics().trackGA4() (free, unlimited) for:
analytics_page_viewed,analytics_widget_impression(IntersectionObserver),analytics_widget_clicked,analytics_recommendation_seen,analytics_recommendation_cta_clicked
Use useAnalytics().track() (PostHog + GA4) ONLY for:
analytics_action_completed— fires from downstream save handlers (HaveRoom etc.) when a user takes an action that was preceded by an analytics-page view in the same session. Debounced 7-days per rule_key per user.
Derive from existing data, no new events:
- Pro/Premium retention → Stripe pipeline
- Median z-score → SQL on
rooms ⨝ city_price_statsmonthly cron - Time-on-page, scroll → GA4 auto-captures
The funnel: GA4 (volume) → PostHog (per-person bridge) → SQL/Stripe (retention outcome). One PostHog event for the entire feature.
- #4429 P1 merged to master
- #3525 P1 merged to master
- ≥6 backlog PRs merged to master
- Pro+Premium Listing Analytics page deployed to staging — 5 widgets, gate verified, descriptive percentile copy, GA4 events wired, single PostHog event wired, separate "Boost further with Pro" sub-section for Premium users
- Pro Video Tour deployed to staging — Cloudflare Stream upload + player + search-card overlay, webhook signature verification tested with valid + invalid + expired signatures, Pro gate working
- Broadcast CTA prework merged —
broadcast_cta_clicked+broadcast_sentdual-firing to PostHog - Filter analytics audit posted to #3944
This plan went through two reviews that materially changed scope:
- First review (Claude
/reviewing-plans): Caught that the original 5-arm broadcast CTA test would need ~5 months per arm at current traffic. Caught that per-city price IRRs aren't statistically reliable. - Codex adversarial challenge: Caught that
ListingAnalyticsServiceand Pro+Premium gate are already on master (the cherry-pick task was wrong). Caught that the price-projection widget isn't causally identified. Caught that several PostHog events the plan referenced don't exist in the codebase. Caught that even a 2-arm broadcast CTA test has only ~17% power at 4 weeks.
Result: we cut the price-projection widget (defer until we run a within-listing panel study), cut the broadcast CTA A/B (run later when we have more traffic or move to a higher-volume surface), and restored the Pro Video Tour (capacity freed by the cuts).
- Full plan:
docs/plans/2026-04-30-week-of-may-4-board-plan.mdin the repo - GitHub issues: comments on #2964 (analytics scope), #3944 (broadcast CTA), #4429 + #3525 (P1 schedule), #3087 (video tour)
- Daily digest: items will be queued for each weekday with the specific task, owner, and skills to use