| high |
Accelerated checkout outranks the primary Add-to-Cart The Add to Cart is a low-emphasis outlined button; the solid purple “Buy with Shop Pay” below it dominates the buy box. |
Full-width solid oxblood Add-to-Cart as the single dominant control; express checkout as a ghost button beneath. |
Product page |
In the design |
| high |
Judge.me installed, rendering nowhere Judge.me's widget stylesheet and its jdgm-* class set are present in the product page markup — 48 references — yet no star average, review count or “no reviews yet” indicator renders on the product page or the collection card. |
Designed empty-state star row near the title linking to a reviews section, and the same state on every card — built on Shopline's native product reviews. |
Product page |
In the design |
| high |
Free-shipping message contradicts the cart The announcement bar rotates “Free Shipping Available” while the cart states “shipping calculated at checkout” with no qualifying conditions shown. |
Banner and cart both read one FREE_SHIP_THRESHOLD constant; the cart shows a shipping line and a progress meter. |
Cart |
In the design · needs client policy |
| high |
No total order cost estimate near Checkout “Estimated total $19.00 USD” with taxes, discounts and shipping all deferred to checkout. |
Subtotal, discount, shipping, estimated tax and total in the drawer and on the cart page, computed from one store module. |
Cart |
In the design |
| high |
No product video and no hover zoom The gallery is image-only with a Dawn lightbox model; no magnifier trigger, no external zoom window, no inline video. |
Inline autoplay video slot and a full-screen lightbox. The external zoom pane was built and then withdrawn at the client’s request, so the magnifier half of this finding is not answered by the design as it stands. |
Product page |
Partly in the design · zoom withdrawn, needs real product film |
| high |
No delivery estimate near the buy actions The only timing signal is “Pre-Order Now (Ships October 2026)” rotating in the announcement bar. |
Delivery line inside the buy box and beside Checkout, in both the pre-order and launched states. |
Product page |
In the design |
| high |
Cart is transaction-only Line items offer quantity adjustment and remove; no save-for-later, no recently-viewed, no cross-sell. |
Per-line save-for-later persisting signed-out, plus a recently-viewed strip — Shopline wishlist and recently-viewed natives. |
Cart |
In the design |
| high |
The second product 404s, and the homepage still links to it Checked 23 August 2026: /products/korean-black-ginseng-concentrated-extract returns 404, and /collections/all reports “1 product”. The homepage markup still carries a link to that handle, so the store's own front page points at a dead page. The 22 August review was written while the product was reachable. |
Both SKUs live in the shop, filterable, with the concentrate as a genuine cross-sell from the sticks PDP and in the cart drawer. Whatever the reason for the unpublish, the redirect map has to cover the handle so the link doesn't carry the 404 across the migration. |
Collection |
In the design |
| high |
One thumbnail, no rating, alphabetical default sort The single card exposes one image; the 30-pack quantity is legible only inside the title; default sort is “Alphabetically, A–Z”; filters are Availability and Price only. |
3–4 hover-swap images, gold pack badge, review empty state, merchandising-led default sort, Pre-order/Subscription/Bundles filters. |
Collection |
In the design |
| high |
No supplement facts, dosage or storage guidance Persuasive copy is interwoven with factual detail; no usage/dosage instruction, no storage advice, no complete supplement-facts panel on an ingestible product. |
Factual accordions with a complete supplement-facts table; persuasive copy isolated in a labelled band. |
Product page |
In the design · needs lab + compliance sign-off |
| Medium |
Symptom queries reach nothing The brand markets around burnout and fatigue; the default engine maps no symptom terms to products, and the placeholder is a plain “Search”. |
Symptom/benefit vocabulary in the search index, related-searches row, misspelling correction, designed no-results state. |
Search |
In the design · vocabulary is custom dev |
| Medium |
Non-product page tiles rank alongside the product The results page shows the “How It's Made” page tile at equal weight with the two products, and no related-search suggestions. |
Products scored above page tiles in the overlay; labelled related-searches row above results. |
Search |
In the design |
| Medium |
Theme-default accessibility gaps across every template Measured on the live store: two unlabelled inputs on the homepage and two on the product page, two H1s on the cart page, and muted text below 4.5:1 on the dark ground. The review additionally flags a truncated PDP title and duplicate utility headings. Alt text is the exception — every image carries the attribute, though six of eleven on the homepage are marked decorative. |
Fixed at the token and component layer: 15 pages × 2 grounds contrast-audited (4 failures fixed), Lighthouse accessibility 100 desktop and mobile, keyboard and live-region behaviour verified by hand. |
Accessibility |
In the design |
| Medium |
281 requests and 2.0MB on the homepage, 354 on the product page 17–18 third-party hosts across templates; mobile page load measured 3,235ms. |
Own-origin assets, sized WebP at 400/800/1200/1800w, and no animation library at all — GSAP, ScrollTrigger and Lenis were trialled and removed. |
Performance |
In the design |
| Medium |
Three failed resources and a 403 in the console 3× net::ERR_FAILED plus a 403 recorded during the crawl of the live store. |
Identify and resolve or remove before migration — on a brand with no traffic yet, broken tracking is invisible until the data is needed. |
Technical |
Build · migration infrastructure |
| high |
No redirect or metadata map exists Products, collections, pages and four blog articles are indexed under Shopify URLs; a platform change without 301s 404s them on day one. |
A full 301 map plus product and breadcrumb structured data. The prototype ships Product JSON-LD on both product pages as a starting shape. |
Migration |
Build · out of prototype scope |
| high |
Shop Pay has no Shopline equivalent The dominant control in the current buy box is a Shop Pay express button. |
The design treats the native Add-to-Cart as primary and express as subordinate, so nothing depends on Shop Pay existing. |
Migration |
In the design |
| high |
Pre-order deposit mechanics will not carry across The refundable-deposit model is Shopify app behaviour; the review flags it, localization, the Judge.me integration and Klaviyo wiring as things the store does quietly that migrate silently to nothing. |
Scope the Shopline pre-order app early — the buy box design assumes refundable-deposit semantics. |
Migration |
Build · client decision |
| Medium |
The live palette has drifted from the brand book korjin.com runs a dark oxblood ground with a brick-red primary and Noto Sans; the guide specifies Hanji Cream, oxblood, gold, Displace 2.0 and Brooklyn. |
Both directions built and switchable from one token layer, so the client decides on real pages. Our review argued for preserving the live palette; the guide and the client survey argue the other way. |
Brand |
Client decision · open |
| Medium |
Mobile homepage LCP of 15.7s on the live store Lighthouse 12, throttled mobile preset: performance 66, LCP 15.7s, TBT 240ms on korjin.com. Desktop is fine at 97 — the cost lands on mobile. |
Own-origin sized WebP and no app payload in the critical path. The prototype's mobile homepage measures LCP 3.5s at performance 89, before analytics and email are wired back in. |
Performance |
In the design |
| Medium |
Best Practices at 78–79 on every live template The most consistent signal in the Lighthouse run — identical across home, collection, product and cart, on both form factors. Third-party cookies and the failed resources are the likely drivers. |
Audit the app payload during migration; the prototype scores 100 on every template, though it carries no apps yet. |
Technical |
Build · migration infrastructure |
| Medium |
Two prototype templates still shift on desktop — shop 0.099, cart 0.114 Re-measured on 28 August against the current deployment: shop 0.099 desktop (down from 0.199 on 23 August) and cart 0.114. Both are clean on mobile — 0.000 and 0.006 — and every other prototype template is under 0.01, so these two are the outliers. |
The same fix as the other three: reserve the height of what JS injects. The shell, the review module and the mobile gallery all now do it; the shop card grid and the cart’s line list are what is left. |
Prototype |
Prototype punch list |
| low |
The mobile product page shift — fixed Was 0.405 on 27 August and 0.293 on the first 28 August run, with mobile performance at 71–76. The gallery column had no height between first paint and the swipe track being built, so the buy panel was laid out 389px too high and then pushed down. |
Reserved the track's own shape — a square slide plus the dot row — dropped by :has() the moment the track exists. Re-measured 28 August: CLS 0.000, mobile performance 91. |
Prototype |
Fixed 28 August |
| low |
Launched buy state doesn't propagate past the product page With the launched state on, the product page reads “In stock · order today, delivered …” while the cart drawer, cart page and checkout still print the pre-order deposit line. |
Read the buy state from one place, as the free-shipping threshold already is. Prototype-only — the demo switch does not ship to Shopline. |
Prototype |
Prototype punch list |
| low |
The customer-stories demo state must not reach launch <korjin-stories> defaults to its launch state — an invitation, three promises, and the real 30-day course as what the films will follow. A demo toggle swaps in four sample tiles built from brand stills; they are watermarked SAMPLE, named “Sample tile” and captioned as format demonstration only, and both are logged in the placeholder register. |
Ship the launch state. Replace the sample tiles with real verified customer video at day 30, and strip the demo toggle with the rest of the prototype scaffolding. |
Prototype |
Prototype punch list |