CRO: bring the feature-comparison matrix + full-plan value framing to the public /pricing page #91

Open
opened 2026-06-03 20:08:55 +03:00 by root · 1 comment
Owner

TL;DR (TR): Plan karşılaştırma matrisi giriş-yapmış /dashboard/subscription sayfasında zaten var ama public /pricing sayfasında yok; anonim ziyaretçi planları (starter / brand-specific / full) tek bakışta kıyaslayamıyor ve "full" planın değeri net değil. Bug değil — bir CRO/UX iyileştirmesi. 7 insight'ı (en yükseği occ34) konsolide eder.

Problem

A cluster of 7 insights (one with occ 34) flags the same theme: on /pricing and /dashboard/subscription, users dwell long, rage-click, and compare the starter / brand-specific / full plans, but do not convert. The original AI hypothesis was "no side-by-side feature comparison + value of 'full' unclear + price feels high."

Code investigation refines this: the comparison-matrix part is already solved on the logged-in page but missing on the public marketing page, and the value framing for the full plan is genuinely weak. So this is a CRO/UX improvement, not a defect.

What already exists (do NOT rebuild)

  • apps/web/src/routes/dashboard/subscription/index.tsx:788 renders <FeatureMatrix />.
  • FeatureMatrix (same file, :2067:2154) is a proper side-by-side table: 4 plan columns, a brand-count row, Check/Minus per feature for all 6 features in ALL_FEATURES (:186), per-plan price, sticky header. Added in commit 1eefd93 (2026-05-12), polished in b8bbdbd.
  • Plan-choice helper subscription.planHelper shown on both pages (pricing.tsx:141, PlanHelperHint at index.tsx:1035).

The gap (evidence — apps/web)

  1. No comparison matrix on public /pricing. apps/web/src/routes/pricing.tsx renders only 4 PlanCards with per-card vertical feature lists (:149:153, :295:308). Missing features are simply absent (no explicit "not included"), so an anonymous visitor cannot compare plans at a glance. The highest-volume insight cmp5g8uf400011bak7sw46qmo (occ 34, concern=price) and the anonymous cmpof8qry001m14ozungt2pfj (486s on /pricing) map here.
  2. Value-of-full is under-explained. Plans: brand1 20,000 / brand2 35,000 / brand3 50,000 / full 99,900 TRY/mo (pricing.tsx:26:63). full is ~5× brand1 but differs only by unlimited brands + oemSearch. 6 of 7 insights have viewed_tier=full; 4 cite likely_concern=price — users look at full, can't justify the jump, and leave.

Proposed fix (scope tightly — this is a CRO experiment)

  1. Extract FeatureMatrix + ALL_FEATURES into a shared component (e.g. apps/web/src/components/subscription/feature-matrix.tsx) and render it on pricing.tsx below the plan cards. Both pricing.tsx and dashboard/subscription/index.tsx already declare an identical plans array (pricing.tsx:26, index.tsx:147) — dedupe into the shared module too (single source of truth for plan prices/features).
  2. Strengthen full value framing: add a callout near the full card — per-brand effective cost (e.g. "vs buying 5× brand1") and a "best for shops handling 4+ brands / unlimited markalar" line, reusing the planHelper tone.
  3. (Optional A/B) Measure conversion lift of matrix-on-/pricing + full-framing vs the current per-card lists. Events pricing_plan_cta_clicked and checkout_started already exist for the funnel.

Acceptance criteria

  • Public /pricing shows the same feature-comparison matrix (with explicit "not included" markers) as /dashboard/subscription.
  • Plan prices/features come from a single shared source (no duplicated plans array drift between the two routes).
  • The full card has an explicit value/breakeven framing (per-brand cost or "best for 4+ brands").
  • Matrix is responsive (mobile: horizontal scroll or stacked) and accessible (proper table semantics, sticky header).
  • No visual/behavioral regression on /dashboard/subscription after the component extraction.

Verification checklist (confirm "fixed" / measure impact)

  • Manual/Playwright: open /pricing as an anonymous user → the matrix is present and lets you compare full vs brand3 at a glance (no need to scan 4 separate card lists).
  • Parity: /dashboard/subscription matrix renders identically to before (component extraction didn't change it).
  • Single-source check: changing a plan price in the shared module updates both pages.
  • Funnel data (A/B or pre/post): pricing_plan_cta_clicked rate and checkout_started from /pricing increase vs baseline; full-tier checkout starts increase; dwell-without-action on /pricing decreases.
  • Qualitative: session recordings show fewer rage-clicks / shorter indecisive dwell on /pricing and /dashboard/subscription.
  • The consolidated insights (cmp5g8uf occ34 + 6 siblings) do not recur (panel auto-flags regressed).

Notes

  • Low-volume signal: 6 of 7 insights are single-user; only cmp5g8uf400011bak7sw46qmo has occ 34. Hence P2 and framed as a CRO experiment, not an urgent bug.
  • PostHog session events for the cited session IDs were not retrievable from posthog_events (empty for those sessions); the verdict rests primarily on code evidence.
  • Consolidates insights: cmp5g8uf40 (occ34, canonical), cmp683ul60, cmp80zedj0, cmpa7v4iu0, cmpof8qry0, cmpv6aqvx0, cmpvbgydz0. (cmp80zedj0 also has a concern=trust flavor following a VIN-decode failure — its pricing-dwell is captured here.)

Filed from Süper Panel insight triage (2026-06-03). Covers insight(s): cmp5g8uf40 · cmp683ul60 · cmp80zedj0 · cmpa7v4iu0 · cmpof8qry0 · cmpv6aqvx0 · cmpvbgydz0. Canonical: cmp5g8uf400011bak7sw46qmo.

> **TL;DR (TR):** Plan karşılaştırma matrisi giriş-yapmış `/dashboard/subscription` sayfasında **zaten var** ama public `/pricing` sayfasında **yok**; anonim ziyaretçi planları (starter / brand-specific / full) tek bakışta kıyaslayamıyor ve "full" planın değeri net değil. Bug değil — bir **CRO/UX** iyileştirmesi. 7 insight'ı (en yükseği occ34) konsolide eder. ## Problem A cluster of 7 insights (one with **occ 34**) flags the same theme: on `/pricing` and `/dashboard/subscription`, users **dwell long, rage-click, and compare** the starter / brand-specific / full plans, but **do not convert**. The original AI hypothesis was *"no side-by-side feature comparison + value of 'full' unclear + price feels high."* Code investigation refines this: the comparison-matrix part is **already solved on the logged-in page** but **missing on the public marketing page**, and the **value framing for the `full` plan is genuinely weak**. So this is a **CRO/UX improvement, not a defect.** ## What already exists (do NOT rebuild) - `apps/web/src/routes/dashboard/subscription/index.tsx:788` renders `<FeatureMatrix />`. - `FeatureMatrix` (same file, `:2067`–`:2154`) is a proper side-by-side table: **4 plan columns**, a brand-count row, Check/Minus per feature for all 6 features in `ALL_FEATURES` (`:186`), per-plan price, sticky header. Added in commit `1eefd93` (2026-05-12), polished in `b8bbdbd`. - Plan-choice helper `subscription.planHelper` shown on both pages (`pricing.tsx:141`, `PlanHelperHint` at `index.tsx:1035`). ## The gap (evidence — `apps/web`) 1. **No comparison matrix on public `/pricing`.** `apps/web/src/routes/pricing.tsx` renders only 4 `PlanCard`s with per-card vertical feature lists (`:149`–`:153`, `:295`–`:308`). Missing features are simply **absent** (no explicit "not included"), so an anonymous visitor **cannot compare plans at a glance**. The highest-volume insight `cmp5g8uf400011bak7sw46qmo` (occ 34, `concern=price`) and the anonymous `cmpof8qry001m14ozungt2pfj` (486s on `/pricing`) map here. 2. **Value-of-`full` is under-explained.** Plans: `brand1` 20,000 / `brand2` 35,000 / `brand3` 50,000 / `full` **99,900** TRY/mo (`pricing.tsx:26`–`:63`). `full` is ~5× `brand1` but differs only by *unlimited brands* + `oemSearch`. **6 of 7 insights have `viewed_tier=full`; 4 cite `likely_concern=price`** — users look at `full`, can't justify the jump, and leave. ## Proposed fix (scope tightly — this is a CRO experiment) 1. **Extract `FeatureMatrix` + `ALL_FEATURES` into a shared component** (e.g. `apps/web/src/components/subscription/feature-matrix.tsx`) and render it on `pricing.tsx` **below the plan cards**. Both `pricing.tsx` and `dashboard/subscription/index.tsx` already declare an **identical `plans` array** (`pricing.tsx:26`, `index.tsx:147`) — dedupe into the shared module too (single source of truth for plan prices/features). 2. **Strengthen `full` value framing:** add a callout near the `full` card — per-brand effective cost (e.g. "vs buying 5× brand1") and a "best for shops handling 4+ brands / unlimited markalar" line, reusing the `planHelper` tone. 3. **(Optional A/B)** Measure conversion lift of *matrix-on-/pricing + full-framing* vs the current per-card lists. Events `pricing_plan_cta_clicked` and `checkout_started` already exist for the funnel. ## Acceptance criteria - [ ] Public `/pricing` shows the **same feature-comparison matrix** (with explicit "not included" markers) as `/dashboard/subscription`. - [ ] Plan prices/features come from a **single shared source** (no duplicated `plans` array drift between the two routes). - [ ] The `full` card has an explicit **value/breakeven framing** (per-brand cost or "best for 4+ brands"). - [ ] Matrix is responsive (mobile: horizontal scroll or stacked) and accessible (proper table semantics, sticky header). - [ ] No visual/behavioral regression on `/dashboard/subscription` after the component extraction. ## Verification checklist (confirm "fixed" / measure impact) - [ ] **Manual/Playwright:** open `/pricing` as an **anonymous** user → the matrix is present and lets you compare `full` vs `brand3` at a glance (no need to scan 4 separate card lists). - [ ] **Parity:** `/dashboard/subscription` matrix renders identically to before (component extraction didn't change it). - [ ] **Single-source check:** changing a plan price in the shared module updates **both** pages. - [ ] **Funnel data (A/B or pre/post):** `pricing_plan_cta_clicked` rate and `checkout_started` from `/pricing` increase vs baseline; `full`-tier checkout starts increase; dwell-without-action on `/pricing` decreases. - [ ] **Qualitative:** session recordings show fewer rage-clicks / shorter indecisive dwell on `/pricing` and `/dashboard/subscription`. - [ ] The consolidated insights (`cmp5g8uf` occ34 + 6 siblings) do **not** recur (panel auto-flags `regressed`). ## Notes - **Low-volume signal:** 6 of 7 insights are single-user; only `cmp5g8uf400011bak7sw46qmo` has occ 34. Hence **P2** and framed as a CRO experiment, not an urgent bug. - PostHog session events for the cited session IDs were not retrievable from `posthog_events` (empty for those sessions); the verdict rests primarily on **code evidence**. - **Consolidates insights:** `cmp5g8uf40` (occ34, canonical), `cmp683ul60`, `cmp80zedj0`, `cmpa7v4iu0`, `cmpof8qry0`, `cmpv6aqvx0`, `cmpvbgydz0`. (`cmp80zedj0` also has a `concern=trust` flavor following a VIN-decode failure — its pricing-dwell is captured here.) --- *Filed from Süper Panel insight triage (2026-06-03). Covers insight(s): [cmp5g8uf40](https://sp.semih.ai/insights/i/cmp5g8uf400011bak7sw46qmo) · [cmp683ul60](https://sp.semih.ai/insights/i/cmp683ul600091bak05teaylx) · [cmp80zedj0](https://sp.semih.ai/insights/i/cmp80zedj000n1bakfxw7q0l0) · [cmpa7v4iu0](https://sp.semih.ai/insights/i/cmpa7v4iu000olckff2bogoxw) · [cmpof8qry0](https://sp.semih.ai/insights/i/cmpof8qry001m14ozungt2pfj) · [cmpv6aqvx0](https://sp.semih.ai/insights/i/cmpv6aqvx0048fcph69ciiy5p) · [cmpvbgydz0](https://sp.semih.ai/insights/i/cmpvbgydz004hfcphjzuj9tda). Canonical: `cmp5g8uf400011bak7sw46qmo`.*
root added the insight-drivenseverity-P2sase-pilotuxcropricingweb labels 2026-06-03 20:08:55 +03:00
root closed this issue 2026-06-03 20:22:09 +03:00
root reopened this issue 2026-06-03 20:22:11 +03:00
Author
Owner

🤖 Fusion task opened: FN-437

Triage queue: https://fusion.semih.ai/tasks/FN-437

This comment was posted automatically by the fusion-plugin-gitea-issues bridge. A Fusion agent will update this issue when the task moves to in-progress, in-review, or done.

🤖 Fusion task opened: `FN-437` Triage queue: https://fusion.semih.ai/tasks/FN-437 _This comment was posted automatically by the `fusion-plugin-gitea-issues` bridge. A Fusion agent will update this issue when the task moves to in-progress, in-review, or done._
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: root/sase.tr#91