Roadmap¶
Where Fruit Plug is going, phase by phase. This page is forward-looking; for what's already shipped see the Changelog.
How to read this
✅ = shipped · 🚧 = in progress · ⏳ = queued · 🔒 = blocked (reason noted)
Phase 1 — MVP PWA + backend plumbing¶
Goal: Full replacement PWA at parity with the current Butcher-theme site, plus the backend groundwork (loyalty, custom boxes, saved state) that the old site can't do. Ship enough that the cutover from fruitplug.co.uk to the new PWA is a DNS flip.
| # | Deliverable | Status | Blocker |
|---|---|---|---|
| 1.0 | A2 cleanup + PHP 8.2 + fruitplug-api plugin installed |
✅ | — |
| 1.1 | Shop + PDPs + cart + PWA shell on dev.fruitplug.co.uk |
✅ | — |
| 1.2 | Brand polish — fonts, mascot, icons, splash | ✅ | — |
| 1.3 | Custom Box Builder — client UI | ✅ | — |
| 1.4 | Custom Box Builder — server validation + anchor-price pinning + Fruit Costs admin | ✅ | — |
| 1.5 | A2 deploy of the updated fruitplug-api plugin (Week 5 changes) |
✅ | — |
| 1.6 | SEO baseline — robots, sitemap, JSON-LD, canonicals, env-gated indexability | ✅ | — |
| 1.7 | JWT auth foundation — plugin + Bearer filter + PWA proxy + cookie | 🚧 | server-side + proxy done; /login + /account UI paused for UX direction |
| 1.8 | Stripe checkout on /checkout |
🔒 | test keys |
| 1.9 | Cart-item composition meta via Woo Store API extension | ⏳ | unblocks after 1.8 |
| 1.10 | HPOS migration (one-click in wp-admin) | ⏳ | sync-first; low risk but needs a quiet window |
| 1.11 | Yoast SEO metadata passthrough to PWA | ⏳ | needs probe of Yoast setup on A2 |
| 1.12 | 26 fruit description rewrites from the preparation guide | ⏳ | content work in wp-admin — taxonomy now carries 32 fruits (24 originals + 8 Japanese premium) so the rewrite scope grew accordingly |
| 1.13 | Grit font swap (replace Caveat Brush) | ⏳ | drop grit.woff2 into apps/web/public/fonts/ |
| 1.14 | UX redesign pass (mobile-first, Apple-grade) | ⏳ | audit needed first — see Phase 1.5 below |
| 1.15 | GitHub push + CI auto-deploy | 🔒 | need repo URL or gh auth |
Exit criteria: customer can browse → build a box → check out with Stripe → see the order in /account → receive a loyalty-points email. When that works end-to-end on dev, we point fruitplug.co.uk at the PWA.
Phase 1.5 — UX redesign pass (mobile-first)¶
Goal: Before cutover, take the PWA from "functional" to "feels native". Mobile-first, one-hand-usable, trust-forward. Concrete audit + design system work, not decoration.
| # | Deliverable | Status |
|---|---|---|
| 1.5.1 | Audit live surfaces (home, shop, PDP, cart, box builder) on iPhone 14 viewport | ⏳ |
| 1.5.2 | Design system doc — spacing, typography hierarchy, motion, elevation | ⏳ |
| 1.5.3 | Bottom-nav / tab bar for core flows on mobile | ⏳ |
| 1.5.4 | Slide-up mini-cart + sticky floating CTA | ⏳ |
| 1.5.5 | PDP rebuild — above-the-fold sell, reorder intelligence, upsells | ⏳ |
| 1.5.6 | Checkout flow redesign for Apple Pay / one-tap | ⏳ (after 1.8) |
| 1.5.7 | /account layout — repeat order, saved baskets, subscriptions, tracking |
⏳ |
| 1.5.8 | Motion + loading skeletons pass | ⏳ |
Exit criteria: mobile Core Web Vitals green (LCP < 2.5s, CLS < 0.1, INP < 200ms), every golden path completable with one thumb, no horizontal scroll on any viewport.
Phase 2 — Retention features go live¶
Goal: Turn the PWA from "new site" into "better site". Subscriptions, loyalty, and the referral loop are all things the old Butcher theme cannot do.
| # | Deliverable | Status | Notes |
|---|---|---|---|
| 2.1 | Subscription rebuild on Stripe Billing (not WC Subscriptions) | ⏳ | current active: 1 sub, £51.98 MRR — migrate manually |
| 2.2 | Loyalty points — earn on completed orders | ⏳ | ledger schema exists, award rule needs tuning |
| 2.3 | Loyalty — redemption at checkout (coupon-style) | ⏳ | after 2.2 |
| 2.4 | Streaks — weekly-order badge + tier progression | ⏳ | daily cron skeleton exists |
| 2.5 | Fruit Passport — product-tried stamps on /account |
⏳ | table exists; UI + stamping hook pending |
| 2.6 | Referral loop — personal code → discount for both parties | ⏳ | fruitplug_referrals table exists |
| 2.7 | Saved-box share URLs (/b/{slug}) |
⏳ | endpoint live; public page + share UI pending |
| 2.8 | Email — transactional via Mailchimp transactional (Mandrill) or Resend | ⏳ | choose provider |
| 2.9 | Preparation Guides per fruit, linked from PDPs | ⏳ | content + design |
Exit criteria: 10% of active customers have opted into loyalty, subscriptions, or the referral program within one month of launch.
Phase 3 — Content engine + social growth¶
Goal: Turn the 64.4k-follower Instagram (349 reels, 151.6M plays) into a commerce flywheel. Reels become PDP galleries; new content auto-publishes to both platforms.
| # | Deliverable | Status | Notes |
|---|---|---|---|
| 3.1 | Instagram reel auto-sync to PDPs (nightly cron) | 🔒 | long-lived Graph API token |
| 3.2 | Admin UI to confirm/override reel↔product matches | ⏳ | after 3.1 |
| 3.3 | Web Push notifications — VAPID setup + subscribe flow | 🔒 | VAPID keys |
| 3.4 | Back-in-stock push/email per product | ⏳ | after 3.3 |
| 3.5 | Seasonal calendar UI (what's peak right now) | ⏳ | JSON option already seeded in plugin |
| 3.6 | User-generated content gallery from Instagram tagged posts | ⏳ | after 3.1 |
| 3.7 | A/B framework (probably GrowthBook or a minimal self-hosted flag system) | ⏳ | evaluate when we have traffic to split |
Exit criteria: reels appear on PDPs within 24h of posting, and one push notification campaign has measurable attributable revenue.
Phase 4 — Operations automation¶
Goal: Reduce manual fulfilment work and give ops better visibility.
| # | Deliverable | Status | Notes |
|---|---|---|---|
| 4.1 | Box Templates admin UI (edit credits/sections/eligible fruits in wp-admin) | ⏳ | replaces code-deploy for template edits |
| 4.2 | Margin report — per-order and per-period, pulling _fruitplug_cost_gbp |
⏳ | uses Fruit Costs data from Phase 1.4 |
| 4.3 | ShipStation richer sync — box composition in packing slip | ⏳ | after Phase 1.8 |
| 4.4 | Dead-simple ops dashboard — orders today, stock alerts, loyalty awards, push opt-in rate | ⏳ | MkDocs or small Next.js admin app |
| 4.5 | Automated nightly backups off A2 to S3 | ⏳ | complements the manual infra/a2/a2.py backup flow |
Cross-cutting / tech debt¶
Always-on items that don't belong to a phase.
- Test coverage. No automated tests yet. Start with Playwright smoke tests on
dev.fruitplug.co.ukcovering the golden path. - Observability. Sentry DSN is in
.env.examplebut not wired. Wire it for the PWA, then for the plugin. - Secrets hygiene.
.env.localis gitignored. Production env is/etc/fruitplug/web.env(0600). Document the rotation runbook. - WP → headless cutover checklist. Lives in deploy/cutover.md. Keep it current as each blocker clears.
How decisions get made¶
- Small reversible calls — just ship.
- Anything that touches production data, shared infra, or the customer-visible price — ask before acting.
- Anything that changes the phase plan itself — update this page in the same PR.
The authoritative plan document is .claude/plans/hazy-soaring-hedgehog.md (user-approved 2026-04-24). This page reflects it publicly. If they disagree, trust the plan doc and fix this page.