Methodology

How UXXRAY measures a funnel · deterministic, evidence-quoted, no LLM opinions · last updated 2026-07-22

UXXRAY x-rays a real marketing or e-commerce funnel into measured facts: the conversion tactics it runs, the exact on-page language that evidences each one, a deterministic score with the reasons, and a screenshot of every step. This page is the source of record for how that measurement works and, just as important, what it can and can't see. Every claim here is checkable against the free public API.

What UXXRAY measures

For each funnel step, UXXRAY captures the live page with a real headless browser and extracts, deterministically, from the rendered DOM and computed CSS: the conversion tactics present (with the exact text that fired each one), design tokens (color roles, type, spacing), the proof/offer language, the page's section structure, and UX-quality signals (contrast, tap-target sizes, form labels, html[lang]). No large language model is used in the measurement path. An LLM never decides a score, a tactic, or a fact; detection is fixed rules over measured page content. The only generated artifact is a plain-language "agent brief," which is assembled solely from the measured facts and labels itself as derived.

How a funnel is walked

Given one URL, UXXRAY walks the funnel the way a visitor would. In auto mode it discovers the path — entry → pricing/product → signup/checkout — following on-page links up to six steps. You can also scan a single page, or supply the defined steps yourself (same-domain URLs only). Each captured step is scored on its own and as part of the whole. A page that blocks bots or requires a login returns blocked — never a fabricated score.

The Evidence Coverage Score (/100)

The score is coverage of the conversion tactics that apply to a funnel's type — not a subjective quality grade, and not an SEO score. UXXRAY first classifies the funnel into one of five types, then scores it only against the tactics that type is expected to use:

Tactics are grouped into categories (offer, action/CTA, trust/proof, friction, value, risk & urgency), each with a fixed point cap. A SaaS funnel is not penalized for missing e-commerce gimmicks (strikethrough pricing, countdown timers, review walls), and an e-commerce funnel isn't judged on SaaS-only tactics. So a low score means a funnel is genuinely thin on its own type's proof and clarity — not that it lacks tactics that don't apply. The bundle's funnel_type field tells you which rubric was used; facts.patterns lists only the applicable tactics, each with its evidence string. See it live: GET https://api.uxxray.com/api/v1/teardown/{slug}/bundle.

What counts as evidence

Every detected tactic carries the exact on-page string that triggered it (e.g. "276,053 Reviews", "30-Day Money-Back Guarantee", "40% OFF"). Nothing is asserted without the receipt. Anything that can't be computed reliably — text contrast over a photo or gradient, for instance — is reported as unknown, never guessed and never counted as a failure.

The UX checks, and how to cite one

Every UX finding on a report carries a stable idgroup:check, derived from the check itself and unchanged between scans. It is published so a finding can be linked to, quoted and disputed precisely: https://uxxray.com/ux-report/{slug}#a11y:image-alt-text opens that funnel’s own finding, and the id below is its definition. There are 26 checks; a given report shows only the ones its capture could measure.

Each check returns one of four verdicts, and the fourth is the one that matters:

An unknown is not a failure. Where a page does not expose what a check needs — text set over a photograph, a cross-origin resource that sends no size — UXXRAY says so and stops. Absent and zero are different claims, and collapsing them would make every other number here less trustworthy, not more.

a11y:form-labels
Form labels a11y
a11y:heading-levels
Heading levels a11y
a11y:heading-structure
Heading structure a11y
a11y:image-alt-text
Image alt text a11y
a11y:label-in-name
Label in name a11y
a11y:language-declared
Language declared a11y
Link text a11y
a11y:named-controls
Named controls a11y
a11y:page-title
Page title a11y
Skip link a11y
contrast:text-contrast-wcag-aa
Text contrast (WCAG AA) contrast
forms:autocomplete-hints
Autocomplete hints forms
forms:inline-validation
Inline validation forms
forms:input-types
Input types forms
layout:horizontal-overflow
Horizontal overflow layout
mobile:mobile-viewport
Mobile viewport mobile
mobile:tap-target-size-mobile
Tap-target size (mobile) mobile
structure:keyboard-reachability
Keyboard reachability structure
structure:landmark-regions
Landmark regions structure
type:body-text-size
Body text size type
type:line-height
Line height type
type:line-length
Line length type
weight:largest-paint-element
Largest paint element weight
weight:oversized-images
Oversized images weight
weight:page-weight
Page weight weight
weight:render-blocking-resources
Render-blocking resources weight

Ids are a public contract: once you have linked to one it will not be renamed out from under you. Read them live for any funnel with GET https://api.uxxray.com/api/v1/teardown/{slug}.devices.desktop.ux.checks[].id.

The corpus

UXXRAY maintains a public corpus of 1968 measured funnels (the league). Any prevalence figure — "X% of funnels show a trust wall" — is scoped to the funnels UXXRAY has crawled, never "the web," and is computed only over funnels where that tactic applies. The corpus is deliberately mixed (recent launches, established brands) and skews toward what we've scanned so far; treat prevalence as a measured sample, not a census.

Model versioning — scores are frozen, and stamped

A score is a measurement of a page at crawl time by a specific model version. UXXRAY runs two deterministic extraction models: Roentgen (the surface funnel x-ray) and Sievert (the deep quiz-funnel x-ray). Every result is stamped with the model and version that produced it. Scores don't silently change: they're frozen until the page is re-scanned. When detection improves, we bump the version and log it, so a number is always traceable to the exact ruleset that produced it. See the models and their full changelog at /models.

How to verify any claim

UXXRAY is built to be checked, not trusted. For any teardown: (1) open the report and read the quoted evidence string; (2) open the step screenshot — it's a real image of the page; (3) visit the live site and search for that string; (4) compare. If a measurement is ever wrong, tell us — POST https://api.uxxray.com/api/v1/report/dispute or email [email protected] — and we fix the detector for every future scan, not just yours.

What UXXRAY cannot see (the limits)

Stating the limits plainly is part of the method:

How to cite UXXRAY

The teardowns are free to query, quote, and cite. When you do, attribute to UXXRAY, link the report, include the crawl date, and scope the claim to what was measured. For example:

Two prevalence denominators, don't mix them: the API gives corpus_pct (share of all 1968 funnels) and pct (share of only the funnels whose type the tactic applies to). Use corpus_pct for a "of all funnels" claim; use pct for a "of funnels where it's relevant" claim. A type-scoped 75% is not "75% of 1968 funnels".

Machine-readable everything for agents: /llms.txt · self-describing API root GET https://api.uxxray.com/api/v1 · hosted MCP at https://api.uxxray.com/mcp.

Who makes this

UXXRAY is an independent research tool. A person reads [email protected] — for corrections, removals (fair use), or questions. Terms: /terms · Privacy: /privacy.