The issue gallery — spot these in the wild

Real, common UX failures — each shown as it actually appears on screen. Two families: deceptive patterns (working as designed, harming on purpose — taxonomy per Harry Brignull's deceptive.design, now cited in EU & FTC enforcement) and usability failures (nobody meant harm, users suffer anyway). Every card tells you how to log it.

Part A — Deceptive patterns (intentional · report even though they "work")

These pass every functional test. That's the point. Your report is often the only voice the user has.

Sneak into basket / PreselectionSEV HIGH
Trailhead Tent 2P£129.00 Gear-Guard™ £4.99/mo — added for you Total£133.99
A paid add-on arrives pre-ticked. The user never chose it — they just failed to notice it.
Log: "Paid add-on preselected at checkout — opt-OUT instead of opt-in. Repro: open checkout, observe ticked box."
Hidden costs / Drip pricingSEV HIGH
checkout — step 3 of 3 Subtotal£147.00 Handling & processing+£6.50 "Small order" fee+£2.99 Total£156.49
Fees that only appear at the last step, after the user is invested. The advertised price was fiction.
Log: "Fees first disclosed at final step — price on product page ≠ checkout total. Screenshot both."
ConfirmshamingSEV MED
Get 10% off your first order Yes, I love saving money No thanks, I prefer paying full price
The decline option is written to insult you. Choice is legal; humiliation is the pattern.
Log: "Opt-out copy uses shaming language — quote it verbatim in the ticket."
Hard to cancel (Roach motel)SEV HIGH
Join: one click ✓ Cancel: call us Mon–Fri 9–11am, wait ~40 min, confirm by post
Easy in, hard out. Sign-up is one tap; cancelling needs a phone call and a stamp.
Log: "Cancellation path materially harder than signup — count the steps of each and put both numbers in the report."
Fake scarcitySEV MED
Ridgeline 55LOnly 2 left! …same "2 left" yesterday, last week, and in incognito
Stock pressure that never changes. If "2 left" survives a week, it's not inventory — it's theater.
Log: "Scarcity claim not backed by stock data — same count across sessions/days. Attach dated screenshots."
Fake urgency (countdown)SEV MED
Flash sale ends in 01:59:12 refresh the page… it's 01:59:12 again
A timer that resets on refresh. The deadline is a prop.
Log: "Countdown resets on reload — record screen while refreshing to prove it."
Fake social proofSEV HIGH
★★★★★"Best tent ever!" — Anna K., 2 min ago — Anna K., 2 min ago (identical, different product)
Reviews or activity popups that are generated, duplicated, or unverifiable.
Log: "Identical review text/name across products — link both URLs side by side."
Trick wordingSEV MED
Untick this box if you do not want to avoid missing offers
Double and triple negatives engineered so any answer means "yes, email me."
Log: "Consent copy requires multi-negative parsing — paste the sentence, note the default state."
Disguised adsSEV MED
⬇ DOWNLOAD NOW actual download is a tiny text link below get file (2.3 MB)
The big shiny button is an advert; the real action is the small grey link. Classic on download sites.
Log: "Ad styled as the primary action — mark which element is the real control in an annotated screenshot."
NaggingSEV LOW
Enable notifications? YesAsk me later "later" = every single visit, forever · no "never" option
The same interruption on every visit with no permanent "no". Wears users down until they surrender.
Log: "Prompt reappears each session; no permanent decline. Note frequency and absence of 'never'."
Bait and switchSEV HIGH
Advertised: Tent £89from the ad On arrival: "Sold out" → shows £149 model
You came for one thing; it's mysteriously unavailable and a pricier one is waiting.
Log: "Advertised item consistently unavailable; redirect targets higher-price SKU. Keep the ad + landing screenshots."
Forced continuitySEV HIGH
FREE TRIAL — day 14card on file Tomorrow: charged £19reminder email: none
The free trial silently becomes a paid subscription. No warning, no reminder, charge first.
Log: "Trial converts to paid with no notice — verify: is there a reminder email/notification before charge? Test with a real trial."
Comparison preventionSEV MED
Scout
£9 /mo
Trekker
£0.63 /day*
Expedition
£499 /2yrs
three plans, three different units — good luck comparing
Prices shown in deliberately mismatched units (per day / per month / per 2 years) so no honest comparison is possible.
Log: "Plan prices use inconsistent units — normalize all to monthly in the ticket to show the obfuscation."

Part B — Usability failures (unintentional · still costs users and money)

Nobody designed these to hurt. They hurt anyway — and they're the easiest wins in your report.

Silent failureSEV HIGH
Delivery notes: leave at №14 Save changes…clicked. nothing. saved? who knows.
The action works (or fails) with zero feedback. Users click again, then distrust everything.
Log: "No success/failure feedback on Save — expected: toast/confirmation. Actual: silence. Video helps."
Cryptic error messageSEV HIGH
ERROR 204: VALIDATION_FAILED which field? what's wrong? what now?
An error that names nothing, blames nothing, offers nothing. The user's only option is to give up.
Log: "Error text is developer-facing — expected: what happened + how to fix. Paste exact string + trigger steps."
Form wipes on errorSEV HIGH
Email: dana@example ✗ Password: (was filled — now empty) Address: (gone too)
One invalid field and the form deletes everything the user typed. Punishment for a typo.
Log: "Validation error clears sibling fields — data loss on retry. List which fields survive and which don't."
Dead clickSEV MED
Free shipping over £50* underlined, blue, cursor: pointer… does nothing
Looks clickable, isn't. Every dead click erodes trust in every other control on the page.
Log: "Element styled as link but has no action — expected either behavior or non-link styling."
Rage-click magnetSEV MED
Continue disabled — but WHY? no hint. users click ×7
A disabled button with no explanation. The user can't know what's missing, so they hammer it.
Log: "Disabled CTA gives no reason — expected inline hint ('add a size first'). Session recordings will show rage clicks."
Infinite spinnerSEV HIGH
3 minutes now · no timeout · no error · no retry
Loading forever with no timeout or fallback. The app never admits it failed.
Log: "Request hangs with endless loader — expected timeout + retry after Ns. Note network state (throttle to repro)."
Totals disagreeSEV HIGH
Plan card says£19.00/mo Checkout says£22.80/mo VAT? fee? nobody says
Two screens, two different numbers for the same thing, no explanation between them.
Log: "Price mismatch: plan page vs checkout (£19 vs £22.80) — screenshot both, note if any label explains the delta."
No undo on destructive actionSEV HIGH
Delete project? DeleteCancel one tap · permanent · no undo · no grace period
Permanent destruction one accidental tap away, with no undo window or soft-delete.
Log: "Irreversible delete without undo/grace — expected: 30-day soft delete or undo toast."
Layout shift (CLS)SEV MED
ad loads 2s late, pushes everything down… Confirm orderCancel ← was where Confirm just was
Content jumps as things load and the user's finger lands on the wrong button.
Log: "Late-loading element shifts CTA position — misclick risk. Capture on slow 3G throttle; mention CLS."
Low contrast textSEV MED
Shipping takes 5–7 business days This line is readable. The one above failed WCAG.
Grey-on-white "aesthetic" text that fails accessibility contrast — invisible in sunlight, invisible to many always.
Log: "Text fails WCAG AA contrast (measure the ratio — DevTools shows it). Element + computed colors in ticket."
Tiny tap targetSEV MED
Gear-Guard™ £4.99/mo the remove ✕ is 9px on mobile — thumb needs 44px
The control users need most is the smallest thing on the screen. Coincidence, surely.
Log: "Tap target under 44×44px on mobile — name the element, device, and miss rate when you try it 5 times."
Keyboard trap / focus lostSEV HIGH
Newsletter modal Tab… Tab… Tab… focus cycles inside forever — Esc does nothing
Keyboard users get stuck inside a dialog with no Escape and no way out. A hard accessibility failure.
Log: "Modal traps keyboard focus; Esc/close unreachable without mouse — WCAG 2.1.2. Steps: open modal, Tab through."
Stale cache shows old dataSEV MED
Price shown£129 Price charged£149 page cached yesterday · price changed this morning
The page shows yesterday's price, the backend charges today's. Cache made the UI lie.
Log: "Displayed price stale vs charged price — repro with hard-refresh comparison; note cache headers if you can."