← UX Grapher
About UX Grapher. It reads a web app’s source code and draws a map of the product: every screen, and every button and link between them. From that map it finds what users will run into: buttons that lead nowhere, pages nobody can reach, screens with no next step. It says how urgent each one is and exactly what to change. Nobody has to click through the app, and the code is never run.

Sample report: sadmann7/skateshop

Skateshop is a public, open-source online store built with Next.js (MIT). It was analysed with no setup at commit e954d54. Every problem marked critical or high was checked by hand against the source. Links under “Where” open the exact line on GitHub.

AI review

What a user sees after clicking Get AI review on this report: the model reads the analysis below and says which problems are real, which are deliberate, and what to fix first. Saved on 2026-09-25, took 123 s, cost US$0.57. Every page and line it names was checked against the analysis before it was shown.

Our hand check. We checked this review against the source. All five “fix first” items are right. Of the 31 verdicts on the findings below, 29 are right, one is too cautious (it calls the missing “Add product” button unsure; nothing in the code links that page, so it is real), and one is honestly unsure (the account page may belong to the sign-in provider). Of the 18 other judgements, 17 are right; “View orders” is fine as labelled, since that page lists the customer’s orders.

In short

Many of the most-used links in the product go to pages that don't exist. Shoppers who browse by category from the main menu hit a missing page. Sellers can't open an order, a customer or a product edit screen, because the seller area still links to an old set of addresses that were retired. Buyers also have no visible way to find their order history after they pay.

Fix first

  1. Category and subcategory links in the main menu lead to a missing page /categories/*
    Who it hurts
    Any shopper who browses by category from the main menu, whether they pick "All" or a subcategory. This happens on every storefront page, because the menu is on all of them. Right now subcategory pages can only be reached through the sitemap.
    What to do
    In the site menu config, change the category links from /categories/... to /collections/[category], and the subcategory links to /collections/[category]/[subcategory].

    src/config/site.ts:50src/config/site.ts:56

  2. Sellers can't open orders, customers or product edits: links use old addresses /store/[storeId]/orders/[orderId]
    Who it hurts
    Every seller running a store. Four actions lead to a missing page: "View details" on an order (so they can't fulfil it), "View orders" on a customer, and "Edit" on a product. Saving a product edit, creating a new store, and possibly switching stores do the same.
    What to do
    Replace every /dashboard/stores/... link with the current /store/[storeId]/... address. That covers orders/[orderId], customers/[customerId], products/[productId], the products list after saving, and the store page after creating or switching stores. While in there, check that the Products table has a working "New product" button to /store/[storeId]/products/new.

    src/components/tables/orders-table.tsx:124src/components/tables/customers-table.tsx:97src/components/tables/products-table.tsx:159src/app/(dashboard)/store/[storeId]/products/[productId]/_components/update-product-form.tsx:311src/app/(dashboard)/store/[storeId]/_components/create-store-dialog.tsx:86

  3. Homepage "Sell now" and "Featured stores" lead to missing pages /dashboard/stores
    Who it hurts
    Would-be sellers who click "Sell now" to start selling, and shoppers who click "Featured stores". Both links are on the homepage, the most-visited screen. The account menu's "Dashboard" item is the only working way from the homepage into selling.
    What to do
    Point "Sell now" where the account menu's "Dashboard" item goes: /onboarding for users with no store, /store/[storeId] for users who have one. Either build a store directory at /stores, or point "Featured stores" at /products.

    src/app/(lobby)/_components/lobby.tsx:88src/app/(lobby)/_components/lobby-skeleton.tsx:48src/app/(lobby)/_components/lobby.tsx:115src/app/(lobby)/_components/lobby-skeleton.tsx:72

  4. Buyers can't find their order history /dashboard/purchases
    Who it hurts
    Every buyer, either right after paying or when they come back later to check an order. Nothing in the account menu or on the payment success page links to their purchases.
    What to do
    Add a "Purchases" item to the account menu next to Billing and Settings. Also add a "View your order" button on the checkout success page that opens /dashboard/purchases.

    src/app/sitemap.ts:124src/components/layouts/auth-dropdown.tsx:119src/app/(checkout)/checkout/[storeId]/success/page.tsx:119

  5. More seller links that go nowhere: Billing, store Settings, sign-in /dashboard
    Who it hurts
    Store owners who click "Get started" on the Billing page while choosing a plan. Every seller who clicks "Settings" in the store sidebar. Sellers whose session has expired when they open the Add-product page: the redirect meant to send them to sign-in has a typo ("/sigin") and shows a missing page.
    What to do
    Point "Get started" at the plan checkout or at /store/[storeId]. Either build a store settings page or remove or retarget the sidebar "Settings" item. Fix the /sigin typo so it reads /signin.

    src/app/(dashboard)/dashboard/billing/_components/billing.tsx:116src/app/(dashboard)/store/[storeId]/_components/dashboard-sidebar.tsx:58src/app/(dashboard)/store/[storeId]/products/new/page.tsx:35

Not problems

  • /checkout/[storeId]/success: This is the page the payment provider sends buyers back to after checkout. Nothing should link to it directly.
  • /sso-callback/[[...sso-callback]]: This is the social-login return address. Only the login provider sends users here.
  • /preview/product/[productId]: This is a quick-view modal. If someone loads or refreshes the address directly, it forwards to the full product page on purpose.
  • /blog/[...slug]: The analyzer couldn't read the links, but they exist: the blog list links to each post through post cards, and posts link to each other with Previous and Next buttons.
  • signin->home: Sending users to the homepage after sign-in or sign-up is normal. Sign-in is reachable from the account menu.
  • /dashboard/billing: Billing, Settings, Log out and onboarding are meant to be reached from the account menu, and that is where they are.
Judgements (18)
  • high confidence Likely destination of an unread link: src/app/(lobby)/(content)/blog/_components/post-card.tsx:17 → /blog/[...slug]
    Probably links to /blog/[...slug]
  • high confidence Likely destination of an unread link: src/components/mdx/mdx-pager.tsx:35 → /blog/[...slug]
    Probably links to /blog/[...slug] ("Previous post")
  • high confidence Likely destination of an unread link: src/components/mdx/mdx-pager.tsx:45 → /blog/[...slug]
    Probably links to /blog/[...slug] ("Next post")
  • medium confidence Likely destination of an unread link: src/components/layouts/main-nav.tsx:98 → /products
    Probably links to /products ("Products")
  • medium confidence Likely destination of an unread link: src/components/layouts/main-nav.tsx:98 → /build-a-board
    Probably links to /build-a-board ("Build a Board")
  • medium confidence Likely destination of an unread link: src/components/layouts/main-nav.tsx:98 → /blog
    Probably links to /blog ("Blog")
  • medium confidence Likely destination of an unread link: src/app/(dashboard)/store/[storeId]/_components/store-switcher.tsx:109 → /store/[storeId]
    Probably links to /store/[storeId]
  • high confidence Fix this first: /store/[storeId]/products/new
    Sellers have no visible way to add a product to their store
    Seller work happens in the store cluster. Its screens link to each other heavily through the sidebar, and /store/[storeId]/products is one of that cluster's most-linked pages. Yet the products screen has no CTA to the new-product form, and nothing else links there either. A new seller finishes onboarding ('Skip for now' goes to /store/[storeId]), opens Products, and finds no way to fill an empty store. This blocks the first task every seller has to do, so it comes first. If the analyzer missed a button on the products table toolbar, a quick check of products-table.tsx would settle it.
  • high confidence Fix this first: /store/[storeId]/orders/[orderId]
    'View details' on the seller orders table points at a route that no longer exists
    This page isn't missing a link. The link exists but is broken. 'View details' in orders-table.tsx points at the old /dashboard/stores/*/orders/* path instead of /store/[storeId]/orders/[orderId], and that same table also appears on the customer detail screen. The seller Orders page is one of the most-linked pages in the store cluster, and opening an order is the everyday fulfilment task, so sellers will hit this over and over. The same stale /dashboard/stores prefix also breaks 'Edit' in products-table.tsx:159 and 'View orders' in customers-table.tsx:97, so one find-and-replace fixes all three orphans.
  • high confidence Fix this first: /dashboard/purchases
    Buyers can't find their order history after checking out
    Buyers outnumber sellers, and /dashboard/purchases is their only record of what they bought. The only way in is a constructed URL. The dashboard cluster is the sparsest group in the graph. The account dropdown offers Billing, Settings and a 'Dashboard' item that goes to seller onboarding or the store, but nothing called Purchases. The checkout success page offers only 'Back to cart' and 'Continue shopping'. So a buyer who wants to check an order right after paying, or later, has no route to it.
  • high confidence Label that misleads: /->/cart
    "Continue to checkout" in the cart sheet opens the cart page, not checkout
    The cart-sheet button reads "Continue to checkout", but it goes to /cart. Checkout is a separate step (/checkout/[storeId]) behind another "Checkout" button. A shopper who clicks it expects the payment form and lands on a second view of the cart they just saw. The same button appears on every storefront page, so this happens on nearly every purchase.
  • high confidence Label that misleads: /dashboard/settings->/store/*/settings
    Two "Settings" links go to different places (account vs store)
    The account dropdown's "Settings ⌘S" opens /dashboard/settings (account settings). The dashboard sidebar's "Settings" opens a store's settings. Both show on the same screen: on /dashboard/settings itself, the sidebar item labelled "Settings" leads away from the page the user is on. Nothing in either label says which settings it means.
  • medium confidence Label that misleads: #nav->/onboarding
    "Dashboard ⌘D" goes to either Stripe onboarding or a store page
    This one dropdown item has two conditional destinations: /onboarding (a connect-Stripe step) or /store/[storeId]. A user who clicks "Dashboard" expects an overview. Getting a payment-setup screen instead, possibly as a shopper who never meant to sell, doesn't match the label. Checking the condition would show whether plain buyers ever see the onboarding branch.
  • medium confidence Label that misleads: /dashboard/purchases->/store/[storeId]
    Sidebar "Dashboard" on account pages opens one store's admin
    On /dashboard/purchases, /dashboard/billing and /dashboard/settings, the sidebar's "Dashboard" item goes to /store/[storeId], a single store's seller overview. A buyer checking their purchases would expect "Dashboard" to be the account home they are already in, not a seller console for one store.
  • medium confidence Label that misleads: /dashboard/billing->/dashboard
    "Get started" on the billing page doesn't start a plan
    On the billing screen, "Get started" reads like "subscribe to this plan". Instead it links to /dashboard, which is not a route. So the label promises a plan action, and the link goes to a generic, broken place. The user expects a checkout or plan-activation flow.
  • medium confidence Label that misleads: /store/[storeId]/products->/product/[productId]
    "View" in the seller's product table opens the public storefront
    In the admin products table, "View" sits next to "Edit". A seller would read it as an admin detail view. It actually opens the public /product/[productId] page and leaves the dashboard. Something like "View in store" or "View live page" would say where it goes.
  • low confidence Label that misleads: /store/[storeId]/customers->/dashboard/stores/*/customers/*
    "View orders" on a customer row goes to a customer detail page
    On the customers table, "View orders" points at a customer detail URL, not the Orders screen. A seller could reasonably expect the Orders list filtered to that customer. The target path is also not a route (reported separately). When it gets fixed, either rename the label to "View customer" or point it at a filtered orders view.
  • low confidence Label that misleads: /->/products
    Homepage "Buy now" opens the full product catalogue
    The hero's "Buy now" goes to the unfiltered /products list. "Buy now" suggests an immediate purchase, and the product page uses the same words for a button that really adds to cart and goes to /cart. Using one label for two very different actions blurs what it means. "Shop now" or "Browse products" would match the destination.
18
problems to fix first
52
worth a look
35
screens mapped
86%
of links understood

At a glance: fix these first

  1. Critical“All” on the home page and 10 other screens leads to a page that doesn’t exist.
  2. CriticalA link on the home page and 10 other screens leads to a page that doesn’t exist.
  3. Critical“Sell now” and “Store not found” lead to a page that doesn’t exist.
  4. Critical“Featured stores” on the home page leads to a page that doesn’t exist.
  5. High“Get started” on the /dashboard/billing page leads to a page that doesn’t exist.
  6. High2 links, shown on 14 screens, lead to a page that doesn’t exist.
  7. High“View orders” on the /store/[storeId]/customers page leads to a page that doesn’t exist.
  8. High“View details” on the /store/[storeId]/customers/[customerId] page and 1 other screen leads to a page that doesn’t exist.
  9. High“Product not found” on the /store/[storeId]/products/[productId] page leads to a page that doesn’t exist.
  10. High“Edit” on the /store/[storeId]/products page leads to a page that doesn’t exist.
  11. HighA link on the /store/[storeId]/products/new page leads to a page that doesn’t exist.
  12. High“Settings” on the /dashboard/account page and 13 other screens leads to a page that doesn’t exist.
  13. HighThe /store/[storeId]/customers/[customerId] page exists, but users have no way to reach it.
  14. HighThe /store/[storeId]/orders/[orderId] page exists, but users have no way to reach it.
  15. HighThe /store/[storeId]/products/[productId] page exists, but users have no way to reach it.
  16. HighThe /store/[storeId]/products/new page exists, but users have no way to reach it.
  17. High“Add Product” can’t be done: no user can reach the screen that offers it.
  18. High“Update Product” can’t be done: no user can reach the screen that offers it.

Scorecard

Measured from code

11 good, 4 to watch, 8 to act on. Each KPI is read from the code, so it is the same on every run. They follow ISO 9241-11 (effectiveness, efficiency, satisfaction), Google’s HEART framework, Nielsen’s usability heuristics and WCAG 2.2. Open a KPI to see what it checks and what to look at.

Findability

Can users get to what matters?

Task completion

Can users finish what they start?

  • Key actions users can do2 of 2Good
    Details

    Is each key action offered on a screen users can reach? ISO 9241-11: effectiveness · HEART: Task success

  • A next step after every action12 of 12Good
    Details

    After doing something, does the screen users land on offer a way back or onward? Nielsen: user control and freedom · ISO 9241-11: effectiveness

  • Journeys users can repeat2 of 2Good
    Details

    Can each key action be done again, and does every declared story come back round? HEART: Engagement · Story loops

  • Screens with a next step35 of 35Good
    Details

    Does every screen offer somewhere to go next? Nielsen: user control and freedom

Efficiency

How much effort does it take?

  • Clicks to key actionsmedian 2 clicksGood
    Details

    How many clicks from the home page does a key action take, typically? ISO 9241-11: efficiency

    • “Pay”: 3 clicks
    • “Manage plan / Subscribe now”: 2 clicks
  • Clear routes to key actions0 of 2Act
    What to look at (2)

    Is every screen on the way to a key action free of clutter (8 options or fewer)? ISO 9241-11: efficiency · Hick's law

    • On the way to “Pay”, the home page offers 16 options
    • On the way to “Manage plan / Subscribe now”, the home page offers 16 options
  • Easy to go back87 of 87Good
    Details

    Where a screen links back, is the way back as short as the way in (2 clicks or fewer)? Nielsen: user control and freedom

Control and feedback

Do users know what happened, and can they undo it?

  • Actions that show they worked12 of 12Good
    Details

    After a save or submit, does the user see that it worked? Nielsen: visibility of system status

  • Deletes that ask first0 of 2Act
    What to look at (2)

    Is every delete confirmed before it happens? Nielsen: error prevention

    • “Delete item” deletes without asking
    • “Delete Product” deletes without asking
  • Things users can remove1 of 3Act
    What to look at (2)

    Can users delete or cancel what they create? Nielsen: user control and freedom

    • A notification can be created but never deleted
    • A store can be created but never deleted

Consistency

Do actions read and look the same, so users recognise them?

  • One name per action13 of 14Watch
    What to look at (1)

    Is each action called the same thing wherever it appears? Nielsen: consistency and standards

    • createStore is called “Add store” and “Create store”
  • One word per kind of action3 of 6Act
    What to look at (3)

    Does the product use one word for each kind of action, not “Delete” here and “Remove” there? Nielsen: consistency and standards

    • “create” is written “add”, “create”
    • “delete” is written “delete”, “remove”
    • “save” is written “save”, “update”
  • Deletes that look destructive1 of 2Act
    What to look at (1)

    Is every delete button styled as destructive, so users recognise it before pressing? Nielsen: consistency and standards · Nielsen: error prevention

  • Labels that say what they do18 of 18Good
    Details

    Does every action label start with what happens, not “OK” or “Submit”? Nielsen: match between system and the real world · Information scent

Accessibility

Can everyone use it, including with a screen reader or a keyboard?

Listening

Does the product ask users how it went?

  • Key actions followed by a feedback prompt0 of 2Act
    What to look at (2)

    Right after each key action, is there a rating, survey or feedback form? ISO 9241-11: satisfaction · HEART: Happiness

    • Nobody asks how “Pay” went
    • Nobody asks how “Manage plan / Subscribe now” went

Resilience

Does one broken screen stop the business?

  • Key actions with more than one way in1 of 2Act
    What to look at (1)

    Can users reach each key action without having to pass through one particular screen? Graph theory: dominators

    • Every path to “Pay” passes through the /cart page

Needs data

Part of the same frameworks, but only real usage or feedback can answer these.

  • Task success rateneeds analyticsNeeds data
    Details

    Of users who start each key action, how many finish it, and where do the rest drop off? ISO 9241-11: effectiveness · HEART: Task success

    • Track the start and the completion of each key action.
  • Lostnessneeds analyticsNeeds data
    Details

    Do users take the designed route, or wander? Actual clicks against the shortest path. Smith (1996) lostness · ISO 9241-11: efficiency

    • Track page views per session; the shortest paths come from this map.
  • Time on taskneeds analyticsNeeds data
    Details

    How long does each key action take from start to finish? ISO 9241-11: efficiency

    • Track timestamps at the start and the end of each key action.
  • Repeat useneeds analyticsNeeds data
    Details

    Do users come back and do key actions again within 7 or 30 days? HEART: Retention

    • Track key actions per user over time.
  • Satisfaction after key actionsneeds survey dataNeeds data
    Details

    How satisfied were users (CSAT), and how easy was it (CES)? ISO 9241-11: satisfaction · HEART: Happiness

    • Add a one-question rating after each key action.

The map of the product

Every screen the analyzer found, and every link between screens. Bigger circles have more ways in. Screens are grouped by section.

no findingshas a warninghas an error×dead-link target (no route)in the menuspaymentother action
100%
Export
Click a section name to zoom into it.
dashboardstoresigninblogcategoriescheckoutcollectionssignup///[...slug]/[...slug]/blog/blog/blog/[...slug]/blog/[...slug]/build-a-board/build-a-board/cart/cart/categories/*/categories/*/categories/*/*/categories/*/*/checkout/[storeId]/checkout/[storeId]/checkout/[storeId]/success/checkout/[storeId]/success/collections/[category]/collections/[category]/collections/[category]/[subcategory]/dashboard/dashboard/dashboard/account/[[...rest]]/dashboard/billing/dashboard/billing/dashboard/purchases/dashboard/purchases/[purchaseId]/dashboard/settings/dashboard/stores/dashboard/stores/dashboard/stores/*/dashboard/stores/*/dashboard/stores/*/customers/*/dashboard/stores/*/customers/*/dashboard/stores/*/orders/*/dashboard/stores/*/orders/*/dashboard/stores/*/products/dashboard/stores/*/products/dashboard/stores/*/products/*/dashboard/stores/*/products/*/onboarding/onboarding/preview/product/[productId]/preview/product/[productId]/product/[productId]/product/[productId]/products/products/sigin/sigin/signin/[[...signin]]/signin/[[...signin]]/signin/reset-password/[[...reset-password]]/signin/reset-password/[[...rese…/signin/reset-password/confirm/[[...confirm]]/signout/[[...signout]]/signout/[[...signout]]/signup/[[...signup]]/signup/[[...signup]]/signup/verify-email/[[...verify-email]]/signup/verify-email/[[...verify…/sso-callback/[[...sso-callback]]/sso-callback/[[...sso-callback]]/store/*/settings/store/*/settings/store/[storeId]/store/[storeId]/store/[storeId]/analytics/store/[storeId]/analytics/store/[storeId]/customers/store/[storeId]/customers/store/[storeId]/customers/[customerId]/store/[storeId]/customers/[cust…/store/[storeId]/orders/store/[storeId]/orders/store/[storeId]/orders/[orderId]/store/[storeId]/orders/[orderId]/store/[storeId]/products/store/[storeId]/products/store/[storeId]/products/[productId]/store/[storeId]/products/[produ…/store/[storeId]/products/new/store/[storeId]/products/new/stores/stores“Join newsletter” · POST /api/email/newsletter: create email, notification“Pay” · stripe.confirmPayment: create payment“Add to cart” · addToCart: create cart“Delete item” · deleteCartItem: delete cart“Add one item” · updateCartItem: update cart“Save preferences” · updateNotification: update email, notification“Add Product” · addProduct: create product“Delete Product” · deleteProduct: delete product“Update Product” · updateProduct: update product“Favorite” · updateProductRating: update product“Add store” · createStore: create store“Update store” · updateStore: update store“Connect to Stripe” · createAccountLink: create payment, store“Manage plan / Subscribe now” · managePlan: update payment

What users can do

Navigation changes what users see; an action changes what the product stores. These are the buttons and forms whose code reaches a database write, a payment, an email, or a request that changes data. Key actions are the actions that take payment.

ActionWhat it doesClicks from homeNext step afterCan users do it again?Feedback after
key“Manage plan / Subscribe now”
14 screens
update payment · takes payment2yesyes, right thereno
key“Pay”
/checkout/[storeId]
create payment · takes payment3yesyes, right thereno
“Add to cart”
4 screens
create cart · stores data1yesyes, 1 click backno
“Delete item”
13 screens
delete cart · stores data1yesyes, right thereno
“Add one item”
13 screens
update cart · stores data1yesyes, right thereno
“Favorite”
/product/[productId]
update product · stores data2yesyes, right thereno
“Add store”
15 screens
create store · stores data2yesyes, right thereno
“Update store”
/store/[storeId]
update store · stores data2yesyes, right thereno
“Connect to Stripe”
/onboarding, /store/[storeId]
create payment, store · stores data2yesyes, right thereno
“Delete Product”
/store/[storeId]/products, /store/[storeId]/products/[productId]
delete product · stores data3yesyes, right thereno
“Add Product”
/store/[storeId]/products/new
create product · stores dataunreachable——no
“Update Product”
/store/[storeId]/products/[productId]
update product · stores dataunreachable——no

Create, change, delete

For each kind of thing the product stores, what users can do to it. A thing users can create but never delete makes mistakes permanent.

Stored thingCreateChangeDeleteShown on
cart✓✓✓15 screens
email✓✓—0 screens
notification✓✓—1 screen
payment✓✓—5 screens
product—✓✓18 screens
store✓✓—11 screens

Asking users how it went

No screen asks users for feedback: no survey, rating, NPS or feedback form was found. A one-question prompt on /checkout/[storeId] and /dashboard/account/[[...rest]] would cover 100% of the key actions, right after users do them.

Model estimates

Not measured

These are not measurements. A simulation models how people might behave; a formula combines measured facts into one number. Use them to compare and prioritise, never as outcomes such as a conversion rate.

SimulatedBrowsing reach

In a simulation of random browsing, 30 of 1,000 visits reach a key action.

  • “Pay”: fewer than 1 of 1,000 visits
  • “Manage plan / Subscribe now”: 30 of 1,000 visits

How it is made: Simulated, not measured. Each simulated visitor starts on the home page, clicks a random link or button on each screen, and leaves with a 15% chance at every step. Real users are not random: use it to compare actions with each other, never as a conversion rate.

FormulaDecision effort

On the way to a key action, users weigh about 29 options.

  • “Pay”: 30 options across 3 screens
  • “Manage plan / Subscribe now”: 27 options across 2 screens

How it is made: Estimated from the code: the options (links and actions) on each screen of the least-effort route, added up. Hick's law says decision time grows with the log of the options, so a crowded screen slows people more than an extra click.

FormulaTravel share

39% of clicks on the way to value are travel.

How it is made: For each action, the clicks before the one that does it, over all clicks, weighted by what the action is worth.

FormulaValue accessibility index

53 out of 100.

How it is made: Weighted harmonic closeness: each action scores 1 divided by its clicks from the home page, weighted by worth (payment 5, stored data 3). 100 means every action is on the home page.

FormulaBusiest screens on the way to value

the home page, the /store/[storeId] page, the /cart page.

How it is made: Betweenness counted only on shortest routes that end at an action, weighted by worth. The ranking is the signal, not the score.

FormulaSections that match how screens link

58 out of 100.

  • /dashboard/account/[[...rest]] sits in “dashboard” but links like “store”
  • /dashboard/billing sits in “dashboard” but links like “store”
  • /dashboard/purchases sits in “dashboard” but links like “store”
  • /dashboard/purchases/[purchaseId] sits in “dashboard” but links like “store”
  • /dashboard/settings sits in “dashboard” but links like “store”

How it is made: Groups found in the in-page links by community detection (Louvain), compared with the sections by normalised mutual information. 100 means the same grouping.

Critical

4

Users are guaranteed to hit these, in the most visible places. Fix before anything else. Dead link ×4

CriticalDead link

“All” on the home page and 10 other screens leads to a page that doesn’t exist.

What users experience
Users who click “All” on the home page and 10 other screens land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It sits on the home page or in the navigation, so a large share of visitors can hit it. Broken buttons at the front door cost sign-ups and trust.
Why critical
Users are guaranteed to hit it, and it is usually a one-line fix.
AIReal problemhigh confidence

Every shopper who clicks a category in the main menu (the "All" item and its siblings) hits a missing page. Category pages live under /collections, not /categories.

Better fix: In src/config/site.ts:50, change the category nav href from /categories/${slug} to /collections/${slug} so it opens the existing /collections/[category] page.

Recommended fixPoint the “All” button at the right page, or remove it if the destination is gone for good.
Where
“All” on the home page and 10 other screenssrc/config/site.ts:50
Technical details

dangling-edge · /categories/* · error · confidence medium

No page.tsx backs /categories/*. The link is dead.

CriticalDead link

A link on the home page and 10 other screens leads to a page that doesn’t exist.

What users experience
Users who click a link on the home page and 10 other screens land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It sits on the home page or in the navigation, so a large share of visitors can hit it. Broken buttons at the front door cost sign-ups and trust.
Why critical
Users are guaranteed to hit it, and it is usually a one-line fix.
AIReal problemhigh confidence

The subcategory links in the main menu point at a path that doesn't exist. They are the only intended way into subcategory pages, so shoppers who browse by subcategory hit a missing page.

Better fix: In src/config/site.ts:56, change the href to /collections/${category}/${subcategory} so it matches /collections/[category]/[subcategory].

Recommended fixPoint the link at the right page, or remove it if the destination is gone for good.
Where
The home page and 10 other screenssrc/config/site.ts:56
Technical details

dangling-edge · /categories/*/* · error · confidence medium

No page.tsx backs /categories/*/*. The link is dead.

CriticalDead link

“Sell now” and “Store not found” lead to a page that doesn’t exist.

What users experience
Users who click “Sell now” on the home page and “Store not found” on the /store/[storeId] page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It sits on the home page or in the navigation, so a large share of visitors can hit it. Broken buttons at the front door cost sign-ups and trust.
Why critical
Users are guaranteed to hit it, and it is usually a one-line fix.
AIReal problemhigh confidence

"Sell now" on the homepage is the main way a would-be seller gets into selling, and it leads to a missing page. It is also why the homepage has no working in-page route into the seller area.

Better fix: In lobby.tsx:88 and lobby-skeleton.tsx:48, change the "Sell now" href to /onboarding. Onboarding already forwards to /store/[storeId] via "Skip for now".

Recommended fixDecide where these links should take users and point it there. The closest existing pages are /store/[storeId] and /store/[storeId]/orders; confirm which fits.
Where
“Sell now” on the home pagesrc/app/(lobby)/_components/lobby.tsx:88
“Store not found” on the /store/[storeId] pagesrc/app/(dashboard)/store/[storeId]/not-found.tsx:7
Technical details

dangling-edge · /dashboard/stores · error · confidence medium

No page.tsx backs /dashboard/stores. The link is dead.

CriticalDead link

“Featured stores” on the home page leads to a page that doesn’t exist.

What users experience
Users who click “Featured stores” on the home page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It sits on the home page or in the navigation, so a large share of visitors can hit it. Broken buttons at the front door cost sign-ups and trust.
Why critical
Users are guaranteed to hit it, and it is usually a one-line fix.
AIReal problemmedium confidence

The "Featured stores" link on the homepage leads to a missing page. Shoppers browsing stores hit a dead end on the most-visited screen.

Better fix: Either add a /stores listing page, or point "Featured stores" (lobby.tsx:115, lobby-skeleton.tsx:72) at /products, which already filters by store_ids.

Recommended fixPoint the “Featured stores” button at /store/[storeId]. The address has a typo; /store/[storeId] is the page it meant.
Where
“Featured stores” on the home pagesrc/app/(lobby)/_components/lobby-skeleton.tsx:72
“Featured stores” on the home pagesrc/app/(lobby)/_components/lobby.tsx:115
Technical details

dangling-edge · /stores · error · confidence high

No page.tsx backs /stores. The closest real route is /store/[storeId], so this looks like a typo.

/store/[storeId] exists and is one edit away.

High

14

Broken journeys or unreachable features. Fix in the next release. Dead link ×8 · Unreachable page ×4 · Action out of reach ×2

HighDead link

“Get started” on the /dashboard/billing page leads to a page that doesn’t exist.

What users experience
Users who click “Get started” on the /dashboard/billing page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
Every click is a failed task and a likely support ticket, and a visible broken link makes the whole product feel less reliable.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

A store owner who clicks "Get started" on the Billing page lands on a page that doesn't exist, right when they are trying to act on a plan.

Better fix: On /dashboard/billing (billing.tsx:116), point "Get started" at /onboarding for users without a store, or at /store/[storeId] for users who have one. This mirrors the conditional "Dashboard" item in the account menu.

Recommended fixEither add a page at /dashboard (for example an overview of the section), or point the “Get started” button at /dashboard/billing.
Where
“Get started” on the /dashboard/billing pagesrc/app/(dashboard)/dashboard/billing/_components/billing.tsx:116
Technical details

dangling-edge · /dashboard · error · confidence medium

No page.tsx backs /dashboard. It has pages under it, such as /dashboard/billing, but no page of its own.

Add a page at /dashboard, or point the link at /dashboard/billing.

HighDead link

2 links, shown on 14 screens, lead to a page that doesn’t exist.

What users experience
Users who click a link on the /dashboard/account page and 13 other screens land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It is reachable from 14 different screens, so it interrupts several journeys, and each click is a likely support ticket.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

A seller who creates a new store is sent to a page that doesn't exist right after creating it. Switching stores from the store switcher may do the same. The path is left over from an old /dashboard/stores URL scheme.

Better fix: In create-store-dialog.tsx:86 and store-switcher.tsx:110, push to /store/${store.id} instead of /dashboard/stores/${id}.

Recommended fixPoint these links at /store/[storeId]. That section moved there and these links were not updated.
Where
The /dashboard/account page and 13 other screenssrc/app/(dashboard)/store/[storeId]/_components/store-switcher.tsx:110
Technical details

dangling-edge · /dashboard/stores/* · error · confidence medium

No page.tsx backs /dashboard/stores/*. /store/[storeId] ends the same way, so this looks like a link left behind when the section moved.

/store/[storeId] exists and shares the rest of the path.

HighDead link

“View orders” on the /store/[storeId]/customers page leads to a page that doesn’t exist.

What users experience
Users who click “View orders” on the /store/[storeId]/customers page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
Every click is a failed task and a likely support ticket, and a visible broken link makes the whole product feel less reliable.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

A seller who clicks "View orders" on a customer in the Customers table gets a missing page. This stale link is the only reason the customer detail page has no way in.

Better fix: In customers-table.tsx:97, change the href to /store/${storeId}/customers/${customerId}.

Recommended fixPoint the “View orders” button at /store/[storeId]/customers/[customerId]. That section moved there and this link was not updated.
Where
“View orders” on the /store/[storeId]/customers pagesrc/components/tables/customers-table.tsx:97
Technical details

dangling-edge · /dashboard/stores/*/customers/* · error · confidence medium

No page.tsx backs /dashboard/stores/*/customers/*. /store/[storeId]/customers/[customerId] ends the same way, so this looks like a link left behind when the section moved.

/store/[storeId]/customers/[customerId] exists and shares the rest of the path.

HighDead link

“View details” on the /store/[storeId]/customers/[customerId] page and 1 other screen leads to a page that doesn’t exist.

What users experience
Users who click “View details” on the /store/[storeId]/customers/[customerId] page and 1 other screen land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It is reachable from 2 different screens, so it interrupts several journeys, and each click is a likely support ticket.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

A seller who clicks "View details" on an order, from the Orders page or from a customer's page, lands on a missing page. That means they can never open an individual order to fulfil it.

Better fix: In orders-table.tsx:124, change the href to /store/${storeId}/orders/${orderId}.

Recommended fixPoint the “View details” button at /store/[storeId]/orders/[orderId]. That section moved there and this link was not updated.
Where
“View details” on the /store/[storeId]/customers/[customerId] page and 1 other screensrc/components/tables/orders-table.tsx:124
Technical details

dangling-edge · /dashboard/stores/*/orders/* · error · confidence medium

No page.tsx backs /dashboard/stores/*/orders/*. /store/[storeId]/orders/[orderId] ends the same way, so this looks like a link left behind when the section moved.

/store/[storeId]/orders/[orderId] exists and shares the rest of the path.

HighDead link

“Product not found” on the /store/[storeId]/products/[productId] page leads to a page that doesn’t exist.

What users experience
Users who click “Product not found” on the /store/[storeId]/products/[productId] page and a link on the /store/[storeId]/products/[productId] page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
Every click is a failed task and a likely support ticket, and a visible broken link makes the whole product feel less reliable.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

After a seller saves a product edit, they are sent to a missing page (update-product-form.tsx:311). The recovery link on the product-not-found screen is broken the same way.

Better fix: In update-product-form.tsx:311 and not-found.tsx:15, route to /store/${storeId}/products.

Recommended fixPoint the “Product not found” button at /store/[storeId]/products. That section moved there and this link was not updated.
Where
“Product not found” on the /store/[storeId]/products/[productId] pagesrc/app/(dashboard)/store/[storeId]/products/[productId]/not-found.tsx:15
Technical details

dangling-edge · /dashboard/stores/*/products · error · confidence medium

No page.tsx backs /dashboard/stores/*/products. /store/[storeId]/products ends the same way, so this looks like a link left behind when the section moved.

/store/[storeId]/products exists and shares the rest of the path.

HighDead link

“Edit” on the /store/[storeId]/products page leads to a page that doesn’t exist.

What users experience
Users who click “Edit” on the /store/[storeId]/products page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
Every click is a failed task and a likely support ticket, and a visible broken link makes the whole product feel less reliable.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

"Edit" in the seller's Products table leads to a missing page, so sellers can't edit any product. This is why the product edit page has no way in.

Better fix: In products-table.tsx:159, change the "Edit" href to /store/${storeId}/products/${productId}.

Recommended fixPoint the “Edit” button at /store/[storeId]/products/[productId]. That section moved there and this link was not updated.
Where
“Edit” on the /store/[storeId]/products pagesrc/components/tables/products-table.tsx:159
Technical details

dangling-edge · /dashboard/stores/*/products/* · error · confidence medium

No page.tsx backs /dashboard/stores/*/products/*. /store/[storeId]/products/[productId] ends the same way, so this looks like a link left behind when the section moved.

/store/[storeId]/products/[productId] exists and shares the rest of the path.

HighDead link

A link on the /store/[storeId]/products/new page leads to a page that doesn’t exist.

What users experience
Users who click a link on the /store/[storeId]/products/new page land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
Every click is a failed task and a likely support ticket, and a visible broken link makes the whole product feel less reliable.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemhigh confidence

A seller whose session has expired and who opens the Add-product page is redirected to a typo'd URL and gets a missing page instead of the sign-in screen.

Better fix: In products/new/page.tsx:35, fix the redirect from /sigin to /signin.

Recommended fixPoint the link at /signin/[[...signin]]. The address has a typo; /signin/[[...signin]] is the page it meant.
Where
Technical details

dangling-edge · /sigin · error · confidence high

No page.tsx backs /sigin. The closest real route is /signin/[[...signin]], so this looks like a typo.

/signin/[[...signin]] exists and is one edit away.

HighDead link

“Settings” on the /dashboard/account page and 13 other screens leads to a page that doesn’t exist.

What users experience
Users who click “Settings” on the /dashboard/account page and 13 other screens land on a “page not found” instead of what they asked for. What they were trying to do stops there.
Why it matters
It is reachable from 14 different screens, so it interrupts several journeys, and each click is a likely support ticket.
Why high
A guaranteed failure for anyone who clicks it, and usually a one-line fix.
AIReal problemmedium confidence

The "Settings" item in the seller sidebar appears on every store screen, and no store settings page exists behind it. Every seller who clicks it hits a dead link.

Better fix: Either build /store/[storeId]/settings, or point the sidebar "Settings" item (dashboard-sidebar.tsx:58) at wherever store details are actually edited, likely /store/[storeId]. Remove the item if neither exists.

Recommended fixDecide where the “Settings” button should take users and point it there. The closest existing page is /dashboard/settings; confirm which fits.
Where
“Settings” on the /dashboard/account page and 13 other screenssrc/app/(dashboard)/store/[storeId]/_components/dashboard-sidebar.tsx:58
Technical details

dangling-edge · /store/*/settings · error · confidence medium

No page.tsx backs /store/*/settings. The link is dead.

HighUnreachable page

The /store/[storeId]/customers/[customerId] page exists, but users have no way to reach it.

What users experience
No button, link or menu entry leads to it. Links that were meant to open it point at an old address instead (/dashboard/stores/*/customers/*).
Why it matters
A feature that was designed, built and shipped is invisible. Whatever users would do there, they cannot, and the investment in it returns nothing.
Why high
Users are actively trying to get here and failing.
AIReal problemhigh confidence

Sellers can't open a customer's detail page because the one link meant to lead there, "View orders" in the customers table, points at the old /dashboard/stores path.

Better fix: Fix the href at customers-table.tsx:97 to /store/${storeId}/customers/${customerId}. That alone gives this page its way in.

Recommended fixFixing the dead link to /dashboard/stores/*/customers/* reconnects this page too.
Where
The /store/[storeId]/customers/[customerId] pagesrc/app/(dashboard)/store/[storeId]/customers/[customerId]/page.tsx:1
Technical details

orphan · /store/[storeId]/customers/[customerId] · error · confidence high

/store/[storeId]/customers/[customerId] exists as a route but nothing in the app links to it or builds its URL, sidebar included. It is a feature that was paid for and cannot be found.

Link /store/[storeId]/customers/[customerId] from its cluster "store", or delete the route.

HighUnreachable page

The /store/[storeId]/orders/[orderId] page exists, but users have no way to reach it.

What users experience
No button, link or menu entry leads to it. Links that were meant to open it point at an old address instead (/dashboard/stores/*/orders/*).
Why it matters
A feature that was designed, built and shipped is invisible. Whatever users would do there, they cannot, and the investment in it returns nothing.
Why high
Users are actively trying to get here and failing.
AIReal problemhigh confidence

Sellers can't open an individual order to see or fulfil it, because "View details" in the orders table points at the old /dashboard/stores path.

Better fix: Fix the href at orders-table.tsx:124 to /store/${storeId}/orders/${orderId}.

Recommended fixFixing the dead link to /dashboard/stores/*/orders/* reconnects this page too.
Where
The /store/[storeId]/orders/[orderId] pagesrc/app/(dashboard)/store/[storeId]/orders/[orderId]/page.tsx:1
Technical details

orphan · /store/[storeId]/orders/[orderId] · error · confidence high

/store/[storeId]/orders/[orderId] exists as a route but nothing in the app links to it or builds its URL, sidebar included. It is a feature that was paid for and cannot be found.

Link /store/[storeId]/orders/[orderId] from its cluster "store", or delete the route.

HighUnreachable page

The /store/[storeId]/products/[productId] page exists, but users have no way to reach it.

What users experience
No button, link or menu entry leads to it. Links that were meant to open it point at an old address instead (/dashboard/stores/*/products/*).
Why it matters
A feature that was designed, built and shipped is invisible. Whatever users would do there, they cannot, and the investment in it returns nothing.
Why high
Users are actively trying to get here and failing.
AIReal problemhigh confidence

Sellers can't reach the product edit screen because "Edit" in the products table points at the old /dashboard/stores path.

Better fix: Fix the "Edit" href at products-table.tsx:159 to /store/${storeId}/products/${productId}.

Recommended fixFixing the dead link to /dashboard/stores/*/products/* reconnects this page too.
Where
The /store/[storeId]/products/[productId] pagesrc/app/(dashboard)/store/[storeId]/products/[productId]/page.tsx:1
Technical details

orphan · /store/[storeId]/products/[productId] · error · confidence high

/store/[storeId]/products/[productId] exists as a route but nothing in the app links to it or builds its URL, sidebar included. It is a feature that was paid for and cannot be found.

Link /store/[storeId]/products/[productId] from its cluster "store", or delete the route.

HighUnreachable page

The /store/[storeId]/products/new page exists, but users have no way to reach it.

What users experience
No button, link or menu entry leads to it. The only way in is typing the address, which users will not do.
Why it matters
A feature that was designed, built and shipped is invisible. Whatever users would do there, they cannot, and the investment in it returns nothing.
Why high
A whole feature is unreachable; confirm whether it is still wanted.
AIUnsurelow confidence

If this is truly unlinked, sellers have no visible way to add a product, which is a core seller task. But data-table toolbars often pass a "New" link as a prop the analyzer may not resolve. It may also use the old /dashboard/stores path like its sibling links.

Better fix: Check the products table toolbar for a "New" link. Make sure it exists and points to /store/${storeId}/products/new. If there is none, add an "Add product" button on /store/[storeId]/products.

Recommended fixLink it from the screen where users need it, or delete it if it is no longer part of the product.
Where
Technical details

orphan · /store/[storeId]/products/new · error · confidence high

/store/[storeId]/products/new exists as a route but nothing in the app links to it or builds its URL, sidebar included. It is a feature that was paid for and cannot be found.

Link /store/[storeId]/products/new from its cluster "store", or delete the route.

HighAction out of reach

“Add Product” can’t be done: no user can reach the screen that offers it.

What users experience
The feature is built and stores data, but the only screens offering it have no way in from the home page or the menus.
Why it matters
Users cannot do something the product was built to let them do.
Why high
A working feature returns nothing because nobody can reach it.
Recommended fixLink /store/[storeId]/products/new from the screen where users need to create product.
Where
“Add Product” on the /store/[storeId]/products/new pagesrc/app/(dashboard)/store/[storeId]/products/new/_components/create-product-form.tsx:110
Technical details

unreachable-action · addProduct · warning · confidence high

addProduct writes product, but it sits only on /store/[storeId]/products/new, and no path from / leads there, menus included.

Link /store/[storeId]/products/new from the screen where users need to create product.

HighAction out of reach

“Update Product” can’t be done: no user can reach the screen that offers it.

What users experience
The feature is built and stores data, but the only screens offering it have no way in from the home page or the menus.
Why it matters
Users cannot do something the product was built to let them do.
Why high
A working feature returns nothing because nobody can reach it.
Recommended fixLink /store/[storeId]/products/[productId] from the screen where users need to update product.
Where
“Update Product” on the /store/[storeId]/products/[productId] pagesrc/app/(dashboard)/store/[storeId]/products/[productId]/_components/update-product-form.tsx:117
Technical details

unreachable-action · updateProduct · warning · confidence high

updateProduct writes product, but it sits only on /store/[storeId]/products/[productId], and no path from / leads there, menus included.

Link /store/[storeId]/products/[productId] from the screen where users need to update product.

Medium

8

Journeys that work but leak users. Plan these in. Delete without asking ×2 · unnamed-control ×3 · Single point of failure ×2 · Satisfaction not measured ×1

MediumDelete without asking

“Delete item” deletes immediately, without asking.

What users experience
One click removes the data. There is no “are you sure?” and no undo in the code.
Why it matters
Accidental deletes lose user data and generate support tickets that cannot be fixed.
Why medium
Rare, but costly and irreversible when it happens.
Recommended fixAsk for confirmation first, or make the delete undoable for a few seconds.
Where
“Delete item” on the home page and 12 other screenssrc/components/checkout/update-cart.tsx:88
Technical details

unguarded-destructive · deleteCartItem · warning · confidence medium

deleteCartItem removes cart and nothing on the way asks for confirmation: no confirm() call and no dialog around the trigger. One misclick loses data.

Put the trigger behind a confirmation dialog, or make the delete undoable.

MediumDelete without asking

“Delete Product” deletes immediately, without asking.

What users experience
One click removes the data. There is no “are you sure?” and no undo in the code.
Why it matters
Accidental deletes lose user data and generate support tickets that cannot be fixed.
Why medium
Rare, but costly and irreversible when it happens.
Recommended fixAsk for confirmation first, or make the delete undoable for a few seconds.
Where
“Delete Product” on the /store/[storeId]/products page and 1 other screensrc/app/(dashboard)/store/[storeId]/products/[productId]/_components/update-product-form.tsx:297
“Delete Product” on the /store/[storeId]/products page and 1 other screensrc/components/tables/products-table.tsx:169
Technical details

unguarded-destructive · deleteProduct · warning · confidence medium

deleteProduct removes product and nothing on the way asks for confirmation: no confirm() call and no dialog around the trigger. One misclick loses data.

Put the trigger behind a confirmation dialog, or make the delete undoable.

Mediumunnamed-control

1 button or link with no name a screen reader can say in src/app/(dashboard)/store/[storeId]/_components/dashboard-sidebar-sheet.tsx

What users experience
The control has no text, no aria-label and no image alt, so assistive technology announces it as "button" or "link", or reads out the address. (WCAG 2.2, 4.1.2 Name, Role, Value.)
Recommended fixGive each one an aria-label that says what it does, or visible text.
Where
The src/app/(dashboard)/store/[storeId]/_components/dashboard-sidebar-sheet.tsx pagesrc/app/(dashboard)/store/[storeId]/_components/dashboard-sidebar-sheet.tsx:53
Technical details

unnamed-control · src/app/(dashboard)/store/[storeId]/_components/dashboard-sidebar-sheet.tsx · warning · confidence high

The control has no text, no aria-label and no image alt, so assistive technology announces it as "button" or "link", or reads out the address. (WCAG 2.2, 4.1.2 Name, Role, Value.)

Give each one an aria-label that says what it does, or visible text.

Mediumunnamed-control

1 button or link with no name a screen reader can say in src/app/(lobby)/@modal/(.)preview/product/[productId]/page.tsx

What users experience
The control has no text, no aria-label and no image alt, so assistive technology announces it as "button" or "link", or reads out the address. (WCAG 2.2, 4.1.2 Name, Role, Value.)
Recommended fixGive each one an aria-label that says what it does, or visible text.
Where
The src/app/(lobby)/@modal/(.)preview/product/[productId]/page.tsx pagesrc/app/(lobby)/@modal/(.)preview/product/[productId]/page.tsx:63
Technical details

unnamed-control · src/app/(lobby)/@modal/(.)preview/product/[productId]/page.tsx · warning · confidence high

The control has no text, no aria-label and no image alt, so assistive technology announces it as "button" or "link", or reads out the address. (WCAG 2.2, 4.1.2 Name, Role, Value.)

Give each one an aria-label that says what it does, or visible text.

Mediumunnamed-control

1 button or link with no name a screen reader can say in src/components/usage-card.tsx

What users experience
The control has no text, no aria-label and no image alt, so assistive technology announces it as "button" or "link", or reads out the address. (WCAG 2.2, 4.1.2 Name, Role, Value.)
Recommended fixGive each one an aria-label that says what it does, or visible text.
Where
The src/components/usage-card.tsx pagesrc/components/usage-card.tsx:44
Technical details

unnamed-control · src/components/usage-card.tsx · warning · confidence high

The control has no text, no aria-label and no image alt, so assistive technology announces it as "button" or "link", or reads out the address. (WCAG 2.2, 4.1.2 Name, Role, Value.)

Give each one an aria-label that says what it does, or visible text.

MediumSingle point of failure

Every path to stripe.confirmPayment passes through the /cart page.

What users experience
There is no other way to reach this key action, menus included.
Why it matters
A bug, a slow load or a confusing layout on this one screen stops the business, not just a page.
Why medium
A single point of failure for what the product earns.
Recommended fixTest it hardest, monitor its errors and speed, and consider a second route to what lies behind it.
Technical details

revenue-single-point · /cart · info · confidence high

/cart dominates this goal: there is no route to it from the home page that avoids it, menus included. An error, a slow load or a confusing layout there stops the business, not just a page.

MediumSingle point of failure

Every path to stripe.confirmPayment passes through the /checkout/[storeId] page.

What users experience
There is no other way to reach this key action, menus included.
Why it matters
A bug, a slow load or a confusing layout on this one screen stops the business, not just a page.
Why medium
A single point of failure for what the product earns.
Recommended fixTest it hardest, monitor its errors and speed, and consider a second route to what lies behind it.
Technical details

revenue-single-point · /checkout/[storeId] · info · confidence high

/checkout/[storeId] dominates this goal: there is no route to it from the home page that avoids it, menus included. An error, a slow load or a confusing layout there stops the business, not just a page.

MediumSatisfaction not measured

The product never asks users how their key actions went.

What users experience
No survey, rating or feedback prompt appears right after the product’s key actions.
Why it matters
Satisfaction measured right after a task explains conversion and churn. Without it, a drop in satisfaction goes unnoticed until the numbers fall.
Why medium
Cheap to add, and it makes every other improvement measurable.
Recommended fixA short rating prompt on /checkout/[storeId] and /dashboard/account/[[...rest]] would cover 100% of the key actions by weight.
Technical details

unmeasured-value · * · info · confidence medium

No survey, rating or feedback form sits on any screen, so stripe.confirmPayment, managePlan happen without a satisfaction signal. Satisfaction measured right after a task explains conversion; a prompt anywhere else explains much less.

A short rating prompt on /checkout/[storeId] and /dashboard/account/[[...rest]] would cover 100% of the key actions by weight.

Low

44

Worth knowing; many are deliberate or cosmetic. No visible way in ×5 · Leftover redirect ×1 · One-way section ×4 · Possibly unreachable ×1 · Only in the menus ×4 · Many choices ×15 · Busy crossroads ×4 · Too many choices on the way ×2 · Hard to discover ×1 · inconsistent-label ×1 · No way to undo ×2 · mixed-controls ×1 · mixed-verbs ×3

LowNo visible way in

The /checkout/[storeId]/success page is only reached through a generated link.

What users experience
No button leads here; users arrive through an address the app builds, such as a link in an email.
Why it matters
Fine for hand-offs. If users should also find it in the product, they cannot.
Why low
Often deliberate.
AIDeliberatehigh confidence

This is the payment return page: Stripe sends the buyer here after checkout (checkout-form.tsx:80). Nothing should link to it directly.

Recommended fixIf it is meant to be browsable, give it a link where users need it.
Where
The /checkout/[storeId]/success pagesrc/components/checkout/checkout-form.tsx:80
Technical details

indirect-only · /checkout/[storeId]/success · warning · confidence medium

No CTA anywhere leads to /checkout/[storeId]/success. Its address is assembled in code — a handoff link or a URL held in state — so it works, but it has no door in the interface and no back edge to whatever opened it.

If /checkout/[storeId]/success is meant to be a destination people navigate to, give it a CTA. If it is a handoff target, confirm it offers a way back.

LowNo visible way in

The /collections/[category]/[subcategory] page is only reached through a generated link.

What users experience
No button leads here; users arrive through an address the app builds, such as a link in an email.
Why it matters
Fine for hand-offs. If users should also find it in the product, they cannot.
Why low
Often deliberate.
AIReal problemhigh confidence

Shoppers can't browse into a subcategory because the only intended link, the subcategory items in the main menu, points at the non-existent /categories path. Only the sitemap reaches this page.

Better fix: Fix src/config/site.ts:56 to /collections/${category}/${subcategory}. Also consider adding subcategory chips on /collections/[category].

Recommended fixIf it is meant to be browsable, give it a link where users need it.
Where
The /collections/[category]/[subcategory] pagesrc/app/sitemap.ts:99
Technical details

indirect-only · /collections/[category]/[subcategory] · warning · confidence medium

No CTA anywhere leads to /collections/[category]/[subcategory]. Its address is assembled in code — a handoff link or a URL held in state — so it works, but it has no door in the interface and no back edge to whatever opened it.

If /collections/[category]/[subcategory] is meant to be a destination people navigate to, give it a CTA. If it is a handoff target, confirm it offers a way back.

LowNo visible way in

The /dashboard/account page is only reached through a generated link.

What users experience
No button leads here; users arrive through an address the app builds, such as a link in an email.
Why it matters
Fine for hand-offs. If users should also find it in the product, they cannot.
Why low
Often deliberate.
AIUnsurelow confidence

This catch-all may be where the auth provider's profile component routes its sub-pages, which would make it deliberate. Or it may be an account page that signed-in users simply can't find.

Better fix: Check whether /dashboard/settings hosts the profile component with path routing. If not, add an "Account" item to the account menu (auth-dropdown.tsx) linking here.

Recommended fixIf it is meant to be browsable, give it a link where users need it.
Where
The /dashboard/account pagesrc/app/sitemap.ts:121
Technical details

indirect-only · /dashboard/account/[[...rest]] · warning · confidence medium

No CTA anywhere leads to /dashboard/account/[[...rest]]. Its address is assembled in code — a handoff link or a URL held in state — so it works, but it has no door in the interface and no back edge to whatever opened it.

If /dashboard/account/[[...rest]] is meant to be a destination people navigate to, give it a CTA. If it is a handoff target, confirm it offers a way back.

LowNo visible way in

The /dashboard/purchases page is only reached through a generated link.

What users experience
No button leads here; users arrive through an address the app builds, such as a link in an email.
Why it matters
Fine for hand-offs. If users should also find it in the product, they cannot.
Why low
Often deliberate.
AIReal problemhigh confidence

Buyers have no way to find their order history. After paying, or when they come back later, nothing in the menu or on the success page leads to their purchases.

Better fix: Add a "Purchases" item to the account menu in auth-dropdown.tsx next to Billing and Settings. Add a "View your purchase" link on /checkout/[storeId]/success.

Recommended fixIf it is meant to be browsable, give it a link where users need it.
Where
The /dashboard/purchases pagesrc/app/sitemap.ts:124
Technical details

indirect-only · /dashboard/purchases · warning · confidence medium

No CTA anywhere leads to /dashboard/purchases. Its address is assembled in code — a handoff link or a URL held in state — so it works, but it has no door in the interface and no back edge to whatever opened it.

If /dashboard/purchases is meant to be a destination people navigate to, give it a CTA. If it is a handoff target, confirm it offers a way back.

LowNo visible way in

The /sso-callback page is only reached through a generated link.

What users experience
No button leads here; users arrive through an address the app builds, such as a link in an email.
Why it matters
Fine for hand-offs. If users should also find it in the product, they cannot.
Why low
Often deliberate.
AIDeliberatehigh confidence

This is the OAuth sign-in callback. The social login provider redirects here (oauth-signin.tsx:31), and users never navigate to it on purpose.

Recommended fixIf it is meant to be browsable, give it a link where users need it.
Technical details

indirect-only · /sso-callback/[[...sso-callback]] · warning · confidence medium

No CTA anywhere leads to /sso-callback/[[...sso-callback]]. Its address is assembled in code — a handoff link or a URL held in state — so it works, but it has no door in the interface and no back edge to whatever opened it.

If /sso-callback/[[...sso-callback]] is meant to be a destination people navigate to, give it a CTA. If it is a handoff target, confirm it offers a way back.

LowLeftover redirect

The old /preview/product/[productId] page still ships, only to redirect elsewhere.

What users experience
Users do not notice; they are sent on automatically.
Why it matters
Leftover code to maintain, and a sign that links elsewhere may still point at the old address.
Why low
Housekeeping, invisible to users.
AIDeliberatehigh confidence

This is the modal preview pattern: clicking "Preview" opens the product in a modal (the @modal intercepting route). A hard load or refresh of that URL forwards to the full product page, so it is not a leftover.

Recommended fixDelete /preview/product/[productId] and point anything still referencing it at /product/[productId].
Where
The /preview/product/[productId] pagesrc/app/(lobby)/preview/product/[productId]/page.tsx:14
Technical details

legacy-route-live · /preview/product/[productId] · warning · confidence medium

/preview/product/[productId] is a stub whose only job is to redirect to /product/[productId].

Delete /preview/product/[productId] and point anything still referencing it at /product/[productId].

LowOne-way section

Users can enter product from collections but not come back.

What users experience
Going one way takes one click; returning takes several, or the menus.
Why it matters
Users feel lost and use the back button or restart, which breaks their flow.
Why low
An annoyance rather than a blocker.
AIReal problemmedium confidence

A shopper who opens a product from a category page has no in-page way back to that category. The product page only offers "Products" filtered by store, so comparing items within a category means using the browser Back button.

Better fix: Add a category breadcrumb on /product/[productId] linking to /collections/[category], next to the existing store link.

Recommended fixAdd a direct way back where users arrive.
Technical details

one-way-cluster · collections->product · warning · confidence medium

3 CTAs cross from collections into product, and none come back. That is the shape of an ingested data source rather than a peer area of the product.

If a user working in product ever needs the collections context, add the return CTA.

LowOne-way section

Users can enter home from signin but not come back.

What users experience
Going one way takes one click; returning takes several, or the menus.
Why it matters
Users feel lost and use the back button or restart, which breaks their flow.
Why low
An annoyance rather than a blocker.
AIDeliberatehigh confidence

Sign-in sends users home when they finish. Home reaches sign-in through the account menu's "Sign In", which is normal auth flow.

Recommended fixAdd a direct way back where users arrive.
Technical details

one-way-cluster · signin->home · warning · confidence medium

5 CTAs cross from signin into home, and none come back. That is the shape of an ingested data source rather than a peer area of the product.

If a user working in home ever needs the signin context, add the return CTA.

LowOne-way section

Users can enter home from signup but not come back.

What users experience
Going one way takes one click; returning takes several, or the menus.
Why it matters
Users feel lost and use the back button or restart, which breaks their flow.
Why low
An annoyance rather than a blocker.
AIDeliberatehigh confidence

Sign-up ends by sending the user home once their email is verified. Nothing on home needs to link back into the sign-up funnel beyond the auth screens.

Recommended fixAdd a direct way back where users arrive.
Technical details

one-way-cluster · signup->home · warning · confidence medium

3 CTAs cross from signup into home, and none come back. That is the shape of an ingested data source rather than a peer area of the product.

If a user working in home ever needs the signup context, add the return CTA.

LowOne-way section

Users can enter home from store but not come back.

What users experience
Going one way takes one click; returning takes several, or the menus.
Why it matters
Users feel lost and use the back button or restart, which breaks their flow.
Why low
An annoyance rather than a blocker.
AIReal problemmedium confidence

The homepage's in-page route into selling, "Sell now", is broken (it points at /dashboard/stores). The only working way from home into a store is the account menu's "Dashboard" item.

Better fix: Fix "Sell now" in lobby.tsx:88 to go to /onboarding. That restores the home-to-store path.

Recommended fixAdd a direct way back where users arrive.
Technical details

one-way-cluster · store->home · warning · confidence medium

9 CTAs cross from store into home, and none come back. That is the shape of an ingested data source rather than a peer area of the product.

If a user working in home ever needs the store context, add the return CTA.

LowPossibly unreachable

The /blog/[...slug] page may be unreachable. Worth a two-minute check.

What users experience
No link we could read leads here, but the /blog page has a link whose address is computed while the app runs. That link is probably the way in.
Why it matters
If the computed link works, nothing is wrong. If not, users cannot open these pages.
Why low
Most likely fine; it just could not be proven from the code alone.
AIAnalysis gaphigh confidence

The blog list links to each post through post cards (post-card.tsx:17), and posts link to each other via the pager (mdx-pager.tsx:35/45). The analyzer just couldn't read those links.

Recommended fixClick through once to confirm the link opens this page.
Technical details

orphan-unconfirmed · /blog/[...slug] · warning · confidence low

No resolved CTA leads to /blog/[...slug], but /blog has 1 whose destination is computed at runtime. One of them is probably the door. Check the evidence; if it is, nothing is wrong.

LowOnly in the menus

The /dashboard/billing page can only be reached from the menus.

What users experience
No screen links here in context. Users have to know to look for it in the navigation.
Why it matters
Users who would need it in the middle of a task do not discover it.
Why low
Reachable, just not where users would think to look.
AIDeliberatemedium confidence

Billing is an account-level page, and the account menu (with a keyboard shortcut) is the standard place for it.

Recommended fixLink to it from the screen where users need it.
Where
Technical details

rail-only-inbound · /dashboard/billing · warning · confidence medium

No screen links to /dashboard/billing; only the navigation rail does. Every journey to it costs a trip back to the rail.

Add an in-page CTA to /dashboard/billing from the screen a user is on when they need it.

LowOnly in the menus

The /dashboard/settings page can only be reached from the menus.

What users experience
No screen links here in context. Users have to know to look for it in the navigation.
Why it matters
Users who would need it in the middle of a task do not discover it.
Why low
Reachable, just not where users would think to look.
AIDeliberatemedium confidence

Account settings normally live in the account menu, and that is exactly where this one is.

Recommended fixLink to it from the screen where users need it.
Where
Technical details

rail-only-inbound · /dashboard/settings · warning · confidence medium

No screen links to /dashboard/settings; only the navigation rail does. Every journey to it costs a trip back to the rail.

Add an in-page CTA to /dashboard/settings from the screen a user is on when they need it.

LowOnly in the menus

The /onboarding page can only be reached from the menus.

What users experience
No screen links here in context. Users have to know to look for it in the navigation.
Why it matters
Users who would need it in the middle of a task do not discover it.
Why low
Reachable, just not where users would think to look.
AIDeliberatemedium confidence

Onboarding is shown through the account menu's "Dashboard" item to users who don't have a store yet. It is meant to be reached that way, though the homepage "Sell now" should also lead here.

Better fix: Point "Sell now" on the homepage (lobby.tsx:88) at /onboarding so new sellers aren't limited to the account menu.

Recommended fixLink to it from the screen where users need it.
Technical details

rail-only-inbound · /onboarding · warning · confidence medium

No screen links to /onboarding; only the navigation rail does. Every journey to it costs a trip back to the rail.

Add an in-page CTA to /onboarding from the screen a user is on when they need it.

LowOnly in the menus

The /signout page can only be reached from the menus.

What users experience
No screen links here in context. Users have to know to look for it in the navigation.
Why it matters
Users who would need it in the middle of a task do not discover it.
Why low
Reachable, just not where users would think to look.
AIDeliberatehigh confidence

Log out belongs in the account menu, and that is the only place it needs to be.

Recommended fixLink to it from the screen where users need it.
Technical details

rail-only-inbound · /signout/[[...signout]] · warning · confidence medium

No screen links to /signout/[[...signout]]; only the navigation rail does. Every journey to it costs a trip back to the rail.

Add an in-page CTA to /signout/[[...signout]] from the screen a user is on when they need it.

LowMany choices

The home page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · / · info · confidence low

Decision time grows with the number of options. 12 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /blog/… page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /blog/[...slug] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /build-a-board page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /build-a-board · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /collections/[category] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /collections/[category] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /collections/[category]/[subcategory] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /collections/[category]/[subcategory] · info · confidence low

Decision time grows with the number of options. 10 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /dashboard/billing page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /dashboard/billing · info · confidence low

Decision time grows with the number of options. 10 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /dashboard/purchases page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /dashboard/purchases · info · confidence low

Decision time grows with the number of options. 11 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /dashboard/purchases/[purchaseId] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /dashboard/purchases/[purchaseId] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /preview/product/[productId] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /preview/product/[productId] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /product/[productId] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /product/[productId] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /store/[storeId]/customers/[customerId] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /store/[storeId]/customers/[customerId] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /store/[storeId]/orders/[orderId] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /store/[storeId]/orders/[orderId] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /store/[storeId]/products page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /store/[storeId]/products · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /store/[storeId]/products/[productId] page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /store/[storeId]/products/[productId] · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowMany choices

The /store/[storeId]/products/new page offers a lot of choices at once.

What users experience
Users face many competing buttons on one screen.
Why it matters
More choices means slower decisions and more mistakes.
Why low
A measurement to be aware of, not a defect.
Recommended fixGroup or trim the options.
Technical details

choice-load · /store/[storeId]/products/new · info · confidence low

Decision time grows with the number of options. 9 competing CTAs on one screen is worth a look, though a dense hub can be correct.

LowBusy crossroads

Many journeys pass through the home page.

What users experience
It is a hub: users cross it on the way to much of the product.
Why it matters
A problem on this page affects everything behind it. Test it with extra care.
Why low
A measurement to be aware of, not a defect.
Recommended fixKeep it fast and stable; consider a second route to what lies behind it.
Technical details

chokepoint · / · info · confidence medium

Most journeys between areas pass through /. Quality, performance and copy budget belong here first; a bug here breaks many flows.

LowBusy crossroads

Many journeys pass through the /cart page.

What users experience
It is a hub: users cross it on the way to much of the product.
Why it matters
A problem on this page affects everything behind it. Test it with extra care.
Why low
A measurement to be aware of, not a defect.
Recommended fixKeep it fast and stable; consider a second route to what lies behind it.
Technical details

chokepoint · /cart · info · confidence medium

Most journeys between areas pass through /cart. Quality, performance and copy budget belong here first; a bug here breaks many flows.

LowBusy crossroads

Many journeys pass through the /signin page.

What users experience
It is a hub: users cross it on the way to much of the product.
Why it matters
A problem on this page affects everything behind it. Test it with extra care.
Why low
A measurement to be aware of, not a defect.
Recommended fixKeep it fast and stable; consider a second route to what lies behind it.
Technical details

chokepoint · /signin/[[...signin]] · info · confidence medium

Most journeys between areas pass through /signin/[[...signin]]. Quality, performance and copy budget belong here first; a bug here breaks many flows.

LowBusy crossroads

Many journeys pass through the /store/[storeId] page.

What users experience
It is a hub: users cross it on the way to much of the product.
Why it matters
A problem on this page affects everything behind it. Test it with extra care.
Why low
A measurement to be aware of, not a defect.
Recommended fixKeep it fast and stable; consider a second route to what lies behind it.
Technical details

chokepoint · /store/[storeId] · info · confidence medium

Most journeys between areas pass through /store/[storeId]. Quality, performance and copy budget belong here first; a bug here breaks many flows.

LowToo many choices on the way

Getting to “Manage plan / Subscribe now” means choosing among many options at every step.

What users experience
The route is only 2 clicks, but each screen on the way offers a crowd of links and buttons.
Why it matters
Decision time grows with the number of options. Crowded screens on the way to a key action slow people down and send some elsewhere.
Why low
A cost on the way, not a blocker.
Recommended fixTrim or group the options on the screens before managePlan, or give it a prominent direct CTA there.
Where
“Manage plan / Subscribe now” on the /dashboard/account page and 13 other screenssrc/components/manage-plan-form.tsx:50
Technical details

costly-decision · managePlan · info · confidence medium

The cheapest route to managePlan takes 2 clicks, but each crosses a screen with, on average, more than 8 options (3.9 bits a click; Hick-Hyman: log2 of options + 1). Choice load, not distance, is what slows people down on the way.

Trim or group the options on the screens before managePlan, or give it a prominent direct CTA there.

LowToo many choices on the way

Getting to “Pay” means choosing among many options at every step.

What users experience
The route is only 3 clicks, but each screen on the way offers a crowd of links and buttons.
Why it matters
Decision time grows with the number of options. Crowded screens on the way to a key action slow people down and send some elsewhere.
Why low
A cost on the way, not a blocker.
Recommended fixTrim or group the options on the screens before stripe.confirmPayment, or give it a prominent direct CTA there.
Where
“Pay” on the /checkout/[storeId] pagesrc/components/checkout/checkout-form.tsx:102
Technical details

costly-decision · stripe.confirmPayment · info · confidence medium

The cheapest route to stripe.confirmPayment takes 3 clicks, but each crosses a screen with, on average, more than 8 options (3.3 bits a click; Hick-Hyman: log2 of options + 1). Choice load, not distance, is what slows people down on the way.

Trim or group the options on the screens before stripe.confirmPayment, or give it a prominent direct CTA there.

LowHard to discover

Users exploring the product rarely find “Pay”.

What users experience
People who browse without a plan are pulled towards other links and actions long before they reach it.
Why it matters
Key actions found only by users who already know where they are cost the product its casual conversions.
Why low
A model of browsing, not a measurement; use it to compare actions.
Recommended fixPut a CTA towards stripe.confirmPayment on the screens most users pass through, such as the home page.
Where
“Pay” on the /checkout/[storeId] pagesrc/components/checkout/checkout-form.tsx:102
Technical details

diluted-value · stripe.confirmPayment · info · confidence low

A user who starts at /, picks among each screen's links and actions at random, and leaves with a 15% chance at every step ends up doing stripe.confirmPayment 0.03% of the time. Competing CTAs on the way dilute it. Real users are not random, so read this as a ranking against the other actions, not a conversion rate.

Put a CTA towards stripe.confirmPayment on the screens most users pass through, such as the home page.

Lowinconsistent-label

The same action is called “Add store” and “Create store”

What users experience
createStore is one action, but its buttons use different words for it. Users wonder whether they do different things.
Recommended fixPick one wording, such as “Add store”, and use it everywhere this action appears.
Technical details

inconsistent-label · createStore · info · confidence high

createStore is one action, but its buttons use different words for it. Users wonder whether they do different things.

Pick one wording, such as “Add store”, and use it everywhere this action appears.

LowNo way to undo

Users can create a notification but can never delete it.

What users experience
No screen offers a way to remove or cancel a notification once it exists.
Why it matters
Mistakes become permanent, and users write to support to undo them. Sometimes that is policy; often it is an oversight.
Why low
Often deliberate; confirm it is.
Recommended fixIf users should be able to, add a delete or cancel action for a notification.
Technical details

missing-inverse · notification · info · confidence low

POST /api/email/newsletter creates notification records, and no reachable action deletes or cancels one; updateNotification can only change it. That can be policy; if not, mistakes are permanent.

LowNo way to undo

Users can create a store but can never delete it.

What users experience
No screen offers a way to remove or cancel a store once it exists.
Why it matters
Mistakes become permanent, and users write to support to undo them. Sometimes that is policy; often it is an oversight.
Why low
Often deliberate; confirm it is.
Recommended fixIf users should be able to, add a delete or cancel action for a store.
Technical details

missing-inverse · store · info · confidence low

createStore, createAccountLink create store records, and no reachable action deletes or cancels one; updateStore can only change it. That can be policy; if not, mistakes are permanent.

Lowmixed-controls

1 of 2 delete buttons does not look destructive

What users experience
Deletes should share one destructive style so users recognise them before pressing. These use a regular style: “Delete item” (Button (outline)).
Recommended fixUse the destructive variant for every delete button.
Technical details

mixed-controls · delete · info · confidence medium

Deletes should share one destructive style so users recognise them before pressing. These use a regular style: “Delete item” (Button (outline)).

Use the destructive variant for every delete button.

Lowmixed-verbs

“create” is written 2 ways: “add”, “create”

What users experience
Labels across the product use “add” (“Add Product”, “Add items to your cart to checkout”), “create” (“Create store”) for the same kind of action. One word per kind is easier to recognise.
Recommended fixChoose one word for “create” and use it on every button and link.
Technical details

mixed-verbs · create · info · confidence medium

Labels across the product use “add” (“Add Product”, “Add items to your cart to checkout”), “create” (“Create store”) for the same kind of action. One word per kind is easier to recognise.

Choose one word for “create” and use it on every button and link.

Lowmixed-verbs

“delete” is written 2 ways: “delete”, “remove”

What users experience
Labels across the product use “delete” (“Delete Product”, “Delete item”), “remove” (“Remove one item”) for the same kind of action. One word per kind is easier to recognise.
Recommended fixChoose one word for “delete” and use it on every button and link.
Technical details

mixed-verbs · delete · info · confidence medium

Labels across the product use “delete” (“Delete Product”, “Delete item”), “remove” (“Remove one item”) for the same kind of action. One word per kind is easier to recognise.

Choose one word for “delete” and use it on every button and link.

Lowmixed-verbs

“save” is written 2 ways: “save”, “update”

What users experience
Labels across the product use “save” (“Save preferences”), “update” (“Update Product”, “Update store”) for the same kind of action. One word per kind is easier to recognise.
Recommended fixChoose one word for “save” and use it on every button and link.
Technical details

mixed-verbs · save · info · confidence medium

Labels across the product use “save” (“Save preferences”), “update” (“Update Product”, “Update store”) for the same kind of action. One word per kind is easier to recognise.

Choose one word for “save” and use it on every button and link.

Structure

“With navigation” counts the header and menus, which sit on every screen. “In-page only” is what the screens themselves offer. The gap shows how much the product leans on its menus.

MeasureWith navigationIn-page only
Destinations (screens and dead-link targets)4747
Links between screens253247
Screen pairs connected54.1%30.2%
Average clicks between screens1.781.72
Longest shortest path44
Screens with no way in1014

Sections

No navigation was declared, so sections come from the first part of each URL. The links themselves form 3 groups; their agreement with these sections is 0.58 on a scale where 1 is the same grouping and 0 unrelated. Screens that link like another section: /dashboard/account/[[...rest]] (in dashboard, links like store), /dashboard/billing (in dashboard, links like store), /dashboard/purchases (in dashboard, links like store), /dashboard/purchases/[purchaseId] (in dashboard, links like store), /dashboard/settings (in dashboard, links like store).

SectionScreensLinks insideLongest pathIndependent loops
dashboard12710
store1049132
signin3220
blog2110
categories2000
checkout2000
collections2000
signup2110
home1000
[...slug]1000
build-a-board1000
cart1000
onboarding1000
preview1000
product1000
products1000
sigin1000
signout1000
sso-callback1000
stores1000

Not checked

Missing way inno navigation declared, so no entry claims a destination through its active state
Broken journeyno cycles declared under `cycles:` in .uxgraph.yml