Skip to content

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.uk covering the golden path.
  • Observability. Sentry DSN is in .env.example but not wired. Wire it for the PWA, then for the plugin.
  • Secrets hygiene. .env.local is 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

  1. Small reversible calls — just ship.
  2. Anything that touches production data, shared infra, or the customer-visible price — ask before acting.
  3. 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.