Skip to main content

Satire A demo of deceptive design by a11ypract.org. Nothing is for sale. Nothing you type leaves your browser.

What is this? Receipt Lab

Deon, the honest side Back to the storefront (the satire)

For tool builders and researchers

The Lab

One deceptive pattern per page. Isolated, repeatable, and labelled where a tool cannot peek.

The storefront mixes many tricks on one screen, the way real sites do. That is good for people and bad for measurement. The Lab takes the tricks apart: 8 specimens that each show one pattern, and 3 controls that show none.

Every Lab page is plain HTML in the page itself. No frames, no shadow DOM, no text drawn on a canvas. What a person can see, a tool can read.

Specimens

Each page opens as Deon ships it: deceptive. Add ?twin=fair to the address to get the honest twin of the same page.

Specimens: one deceptive pattern per page
SpecimenPatternExpected findingsFair twin
01 Boxes ticked in advance preselection 4 The same boxes, empty. Near-misses on both versions: an unchecked add-on (#s2) and a harmless checked default (#s4). Open fair twin
02 Declines that shame confirmshaming 3 Every decline says “No thanks”, the same size and style as the yes. Near-miss: a plain “Not now” (#s3). Open fair twin
03 A countdown that restarts on reload fake-countdown 1 No countdown. The price is the price. Open fair twin
04 A countdown that starts over fake-countdown 1 No countdown. The price does not depend on how long you take. Open fair twin
05 Stock and crowd claims fake-scarcity 3 “In stock”, and nothing about other shoppers. Near-miss on both versions: “30-day returns” (#s4), a number that is a plain fact. Open fair twin
06 Renewal terms in small or pale text buried-terms 2 The same terms at 17 pixels and full contrast, above the button. Open fair twin
07 Consent with a lopsided choice lopsided-consent 1 Reject all and Accept all as two buttons of the same size and style. Open fair twin
08 Consent with no way to refuse no-reject 1 Reject all, Accept all and Choose on the first screen, as equal buttons. Open fair twin

Controls

Honest pages that look suspicious. A good detector reports nothing on them. A detector that only matches words will trip on every one.

Controls: honest pages that look suspicious
ControlExpected findingsWhy it is honest
C1 An honest product page 0 An empty newsletter box, a harmless checked default, a plain “No thanks”, “In stock”, renewal terms at 17 pixels and full contrast, and opening hours that look like a timer and never tick.
C2 An honest consent dialog 0 Reject all and Accept all are the same size and style, on the first screen.
C3 A real deadline 0 The countdown runs to midnight UTC. Reload and it has moved on by exactly the time that passed.

Ground truth

The answers are in one file: /lab/manifest.json. For each specimen it lists the pattern, the page, the deceptive elements as #id selectors, how many findings to expect, and what the fair twin changes. For each control it says why the page is honest.

The answers are not in the pages. Deceptive elements carry neutral ids such as s1, and no class, id or data attribute on a Lab page names a pattern. The build fails if one does. A tool has to work it out the way a person would.

Counting

“Expected findings” is the number of deceptive elements on the page as Deon ships it. Some pages also hold honest near-misses, such as an add-on box that starts empty. Reporting one of those is a false alarm.

What you can rely on

Two specimens need time

A fake countdown cannot be proven from one look. Lab 03 restarts on every page load: a tool has to load it, wait, and load it again. Lab 04 starts over by itself after 20 seconds: a tool has to watch for about 25 seconds. The control with a real deadline keeps counting across reloads, and must stay unflagged.

The stock and viewer numbers in Lab 05 change every two to three seconds. A tool that watches for ten seconds sees them go up as well as down.

Using the Lab

  1. Read the manifest and visit each url on this site.
  2. Run your tool. Collect the elements it reports.
  3. Compare them with targets. A reported target is a hit. Anything else on the page is a false alarm. A target that was not reported is a miss.
  4. Do the same with ?twin=fair and with the controls. Every finding there is a false alarm.

Cepti, the browser add-on made alongside Deon, runs its own tests against these pages.

Not legal advice

Pattern names follow the sources listed on the About page. They are general information about design, not a statement about what any law requires.