Methodology
How UXXRAY measures a funnel · deterministic, evidence-quoted, no LLM opinions · last updated 2026-07-22
How a live funnel becomes measured facts, and what the measurement cannot see.
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 count, 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.
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 count of how many of the patterns we look for were found, 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.
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 read on its own and as part of the whole. A page that blocks bots or requires a login is reported as Blocked — never a fabricated count.
Patterns detected (N of M)
UXXRAY publishes a simple count: "N of M patterns detected" — M is the number of conversion patterns we look for on that kind of funnel, N is how many of them we found on the page, each with its quoted evidence. It is not a grade and not an SEO score, and a low N does not mean a funnel is bad; it means we found fewer of the patterns we look for. UXXRAY first classifies the funnel into one of five types, then counts it only against the patterns that type is expected to use:
- ecommerce · saas · lead_gen · affiliate · content
A SaaS funnel is not counted as missing e-commerce gimmicks (strikethrough pricing, countdown timers, review walls), and an e-commerce funnel isn't counted against SaaS-only patterns — so M differs by funnel type and two counts are only comparable within a type. The bundle's funnel_type field tells you which set applied; facts.patterns lists only the applicable patterns, each with its evidence string, and coverage carries detected (N), applicable (M) and outcome. See it live: GET https://api.uxxray.com/api/v1/teardown/{slug}/bundle.
Every funnel ends in exactly one of four outcomes, and each is a claim about whether we could measure, never about the business: Measured (we read it and counted), Blocked (the site refused the crawl — we read nothing), Not measurable (the walk did not get far enough to read a funnel), and No funnel found (we read the pages and found no funnel within our walk). Only a Measured funnel has an N of M; the other three never show a count.
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 2526 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 — results are frozen, and stamped
A count 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. Results 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 count 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 count is invented.
- Coverage ≠ business quality. A high N means we found many of the measurable persuasion patterns for that funnel's type; a low N means we found few. Neither is a claim about revenue, product, or taste — a clean, minimalist funnel can show few patterns 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 detected {N} of {M} patterns on {domain}'s funnel ({date})."
- "Across UXXRAY's crawled corpus of 2526 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 2526 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 2526 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, operated by Benjo LLC. A person reads [email protected] — for corrections, removals (fair use), or questions. Terms: /terms · Privacy: /privacy.