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:
- ecommerce · saas · lead_gen · affiliate · content
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 id — group: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:
good— The check passed on the measured page.needs_work— The check failed, and the fact states what was measured.note— Worth knowing, not a failure — a fact we can prove that does not by itself indicate a defect.unknown— The page did not expose enough to decide. Never a pass, never a failure. Example: “At least 1.3 MB across 17 measurable resources, but 12 cross-origin resources did not expose a size. The true weight cannot be determined from the page.”
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
a11y:link-text- Link text a11y
a11y:named-controls- Named controls a11y
a11y:page-title- Page title a11y
a11y:skip-link- 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:
- Ads and emails. A crawl sees public pages, not a brand's ad creative or email sequence. UXXRAY never claims what an ad or email does.
- Interactive / JS-wizard steps. A multi-step flow built as an on-page JavaScript wizard (no distinct URLs) is captured as its lander, not its individual steps.
- Bot-walled or login-gated pages return
blocked— no score is invented. - Coverage ≠ business quality. A high score means a funnel ships many of the measurable persuasion patterns for its type; it is not a claim about revenue, product, or taste. A clean, minimalist funnel can score low on purpose.
- Sample size. Prevalence on a rarely-seen tactic is a small-n signal — read it as exploratory.
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:
- "UXXRAY measured {domain}'s funnel at {score}/100 on evidence coverage ({date})."
- "Across UXXRAY's crawled corpus of 1968 funnels, X% run {tactic} (UXXRAY, {date})." — not "X% of the web".
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.