# Product variant URLs: what eight public pages actually selected

> An executed eight-variant study of URL selection, rendered options and JSON-LD offers, with captured facts and replayable extraction tests.

By George Kelly · Published 2026-10-17 · Updated 2026-10-17

Publication: iamgeorgekelly (https://www.iamgeorgekelly.com)

Canonical: https://www.iamgeorgekelly.com/field-guide/product-variant-url-evidence-study

## Short answer

In this eight-variant public sample, every exact URL selected the intended options and exposed a matching structured Offer. Reading the first Offer would still attach the wrong SKU in 5 of 8 cases and the wrong price in 2. Resolve the selected variant before choosing its offer; a common canonical URL or equal sibling price cannot do that work.

## Put this guide to work

[See the eight observations](https://www.iamgeorgekelly.com/field-guide/product-variant-url-evidence-study#eight-variants)

[Replay the study](https://www.iamgeorgekelly.com/field-guide/product-variant-url-evidence-study#reproduce)

## The page can be correct while the extraction is wrong

On October 4, 2026, this study captured eight variant URLs across three Studio Neat product families. Initial selection controls, rendered checked options, Product-level SKU and the Offer linked to each exact URL agreed in all eight observations.

The replay then applied two deliberately simple extraction rules against those captures: take the first Offer in the Product’s array, or treat the shared canonical URL as the selected item. The first rule returned a sibling SKU in five cases. In two of those, it also returned a different price. The canonical rule discarded the selection context for five nondefault variants.

These are failures of the tested extraction rules, not a merchant error rate, a search-policy audit or an observed AI-provider outcome. The correct offer was present on every inspected variant page. Confidence is high in the recorded snapshot comparisons and low in any claim about prevalence beyond this convenience sample.

| Observation | Result | Denominator |
| --- | --- | --- |
| Intended initial and rendered selection; matching exact-URL Offer | 8 agreed | 8 sampled variants |
| First Offer belongs to a different SKU | 5 | 8 evaluable Offer arrays |
| First Offer has a different displayed price | 2 | 8 evaluable prices |
| Exact variant page shares its base-page canonical | 8 | 8 canonical comparisons |
| Intended variant differs from captured base default | 5 | 8 base-default comparisons |
| Successful final HTTP captures / retrieval gaps | 14 / 0 | 3 catalogs + 3 base pages + 8 exact URLs |

Sources: [Studio Neat: Mark One base product URL](https://www.studioneat.com/products/markone); [Studio Neat: Mark Two base product URL](https://www.studioneat.com/products/marktwo); [Studio Neat: Totebook base product URL](https://www.studioneat.com/products/totebook); [Studio Neat: exact variant URL for MK1-BN](https://www.studioneat.com/products/markone?variant=17522303008833); [Studio Neat: exact variant URL for MK1S-BS](https://www.studioneat.com/products/markone?variant=48310475227413); [Studio Neat: exact variant URL for MK1-NS](https://www.studioneat.com/products/markone?variant=48537955041557); [Studio Neat: exact variant URL for MK2-BS-CL](https://www.studioneat.com/products/marktwo?variant=46227276628245); [Studio Neat: exact variant URL for MK2-BS-NC](https://www.studioneat.com/products/marktwo?variant=46227345277205); [Studio Neat: exact variant URL for MK2-NS-CL](https://www.studioneat.com/products/marktwo?variant=48537970868501); [Studio Neat: exact variant URL for TOTE-2PK](https://www.studioneat.com/products/totebook?variant=39368591736897); [Studio Neat: exact variant URL for TOTE-MINI-3PK](https://www.studioneat.com/products/totebook?variant=39388035973185)

## A frozen sample with a visible selection rule

This is a convenience sample from one publisher, chosen because its public product pages expose multi-option pens and two notebook pack variants. The discovery pass queried the known Mark One, Mark Two and Totebook product handles. The responses contained 15, 10 and 2 variants respectively: 27 catalog records within these three chosen families, not the merchant’s entire catalog.

Before the final capture, the method froze the first three returned variant IDs for Mark One, the first three for Mark Two and both Totebook IDs. The sample was not selected by whether an extraction mismatch appeared. Every sampled URL was retained; there were no failed or incomplete responses in the final 14-request batch.

The final initial-response capture ran from 14:22:04 to 14:22:13 UTC. Eight rendered browser observations ran separately from 14:16:23 to 14:16:50 UTC. The HTTP script sent no cookies or credentials. The browser used an existing Chrome profile; its prior cookies were not inspected. These are sequential observations in two capture contexts, not an atomic snapshot or a guaranteed fresh anonymous-browser session.

Shopify documents the product-handle JSON route and notes presentment-currency context. The download preserves the catalog’s raw price integers. This analysis compares the initial displayed dollar amounts, the rendered amounts and the matched Offer’s price and USD currency; it does not assign currency from the dollar sign alone.

Sources: [Studio Neat: Mark One public product JSON](https://www.studioneat.com/products/markone.js); [Studio Neat: Mark Two public product JSON](https://www.studioneat.com/products/marktwo.js); [Studio Neat: Totebook public product JSON](https://www.studioneat.com/products/totebook.js); [Shopify Ajax API: Product API reference](https://shopify.dev/docs/api/ajax/reference/product)

## Eight selected variants, five wrong first offers

Each selected label below came from the captured catalog and checked page options. Prices are the rendered amounts, with USD supported by the initial country/currency selector and the matched structured Offer. “First Offer” means the first array member in the captured Product node, not a minimum, AggregateOffer or the selected variant.

Three first offers happened to match because the sample included each family’s default first variant. The other five were sibling identities. Three of those siblings had the same price, so price equality alone concealed the identity error.

| Selected SKU and options | Displayed USD | First Offer SKU / USD | First-offer identity |
| --- | --- | --- | --- |
| MK1-BN · Black + Silver / Aluminum / Without Clip | 85 | MK1-BN / 85 | Matches |
| MK1S-BS · Black + Silver / Steel / Without Clip | 125 | MK1-BN / 85 | Wrong sibling |
| MK1-NS · Blue + Silver / Aluminum / Without Clip | 85 | MK1-BN / 85 | Wrong sibling; same price |
| MK2-BS-CL · Black + Silver / Yes | 125 | MK2-BS-CL / 125 | Matches |
| MK2-BS-NC · Black + Silver / No Clip | 110 | MK2-BS-CL / 125 | Wrong sibling |
| MK2-NS-CL · Blue + Silver / Yes | 125 | MK2-BS-CL / 125 | Wrong sibling; same price |
| TOTE-2PK · Standard, 2-pack | 25 | TOTE-2PK / 25 | Matches |
| TOTE-MINI-3PK · Mini, 3-pack | 25 | TOTE-2PK / 25 | Wrong sibling; same price |

[Download the replayed results and per-variant decisions](https://www.iamgeorgekelly.com/downloads/product-variant-url-study-results.json)

Sources: [Studio Neat: exact variant URL for MK1-BN](https://www.studioneat.com/products/markone?variant=17522303008833); [Studio Neat: exact variant URL for MK1S-BS](https://www.studioneat.com/products/markone?variant=48310475227413); [Studio Neat: exact variant URL for MK1-NS](https://www.studioneat.com/products/markone?variant=48537955041557); [Studio Neat: exact variant URL for MK2-BS-CL](https://www.studioneat.com/products/marktwo?variant=46227276628245); [Studio Neat: exact variant URL for MK2-BS-NC](https://www.studioneat.com/products/marktwo?variant=46227345277205); [Studio Neat: exact variant URL for MK2-NS-CL](https://www.studioneat.com/products/marktwo?variant=48537970868501); [Studio Neat: exact variant URL for TOTE-2PK](https://www.studioneat.com/products/totebook?variant=39368591736897); [Studio Neat: exact variant URL for TOTE-MINI-3PK](https://www.studioneat.com/products/totebook?variant=39388035973185)

## Keep selection identity separate from canonical identity

The steel Mark One URL selected Black + Silver / Steel / Without Clip and displayed USD 125. Its Product-level SKU was MK1S-BS. That same Product contained 15 offers. The first was MK1-BN at USD 85; the second linked to the requested steel URL and carried MK1S-BS at USD 125. The array described multiple offers, so its first position did not establish the current selection.

All eight inspected exact URLs had the same canonical as their respective base product page. The three base captures selected MK1-BN, MK2-BS-CL and TOTE-2PK. A canonical link therefore supplied a family-level identity for this task, while the query URL and checked controls supplied the selection.

Google’s variant guidance allows a common canonical for a single-page product group and calls for a distinct URL that preselects each variant. That documentation explains why a common canonical is compatible with distinct selections; it does not establish this merchant’s rich-result eligibility. Shopify’s ProductVariant reference separately associates SKU and applied option values with a specific product version.

The replay first resolves the sampled ID to its captured option values and SKU, checks initial and rendered selection evidence, and finds exactly one Offer whose URL matches the requested URL. It then compares that Offer’s SKU, price and currency. A missing or duplicate match stays on hold; another SKU or a contradictory price is a conflict. It never falls back to a sibling with an equal price.

Next step: [Turn variant evidence into a release decision](https://www.iamgeorgekelly.com/field-guide/product-variant-acceptance-test) — The acceptance guide adds feed, availability and compatibility checks beyond this URL-selection study.

Sources: [Studio Neat: exact variant URL for MK1S-BS](https://www.studioneat.com/products/markone?variant=48310475227413); [Studio Neat: Mark One base product URL](https://www.studioneat.com/products/markone); [Studio Neat: Mark Two base product URL](https://www.studioneat.com/products/marktwo); [Studio Neat: Totebook base product URL](https://www.studioneat.com/products/totebook); [Google Search Central: Product variant structured data](https://developers.google.com/search/docs/appearance/structured-data/product-variants); [Shopify Storefront API: ProductVariant](https://shopify.dev/docs/api/storefront/latest/objects/ProductVariant)

## What the evidence does not establish

The visible product information did not expose a SKU in the inspected browser path. SKU identity therefore comes from the separately captured catalog association and Product/Offer markup, checked against the visible option selection. The browser evidence is not relabelled as a visible SKU.

The matching Offers recorded InStock, the sampled catalog records had available=true, and the eight rendered Add to Cart buttons were enabled. Those are distinct observations. This study did not measure physical quantity, test checkout or verify a delivery promise. Shopify distinguishes availability for sale from inventory quantity; an enabled purchase control is not a stock count.

The source update times and edge-cache ages are unknown. No images, mobile layout, control changes after loading, every asynchronous update, signed-in prices, other markets, other merchants or all 27 variants were tested. A blocked fetch in a repeat would be a retrieval gap, not evidence that the merchant page is broken.

The original study contributes executed public observations and an extraction counterexample. It does not claim that publishing this article will recover traffic, that a provider consumed these offers, or that any live recommendation was wrong.

Next step: [Resolve whether two prices describe the same payable offer](https://www.iamgeorgekelly.com/field-guide/offer-price-reconciliation) — Customer tier, market and price roles require additional context after variant identity is established.

Sources: [Shopify Storefront API: ProductVariant](https://shopify.dev/docs/api/storefront/latest/objects/ProductVariant)

## Replay the facts, then capture a new dated version

Download the observation file, rendered evidence file and JavaScript runner into the same directory. With Node.js installed, run node product-variant-url-study.mjs to recompute the case decisions and summary. Add the saved results file and run node product-variant-url-study.mjs --check to verify observation, rendered-evidence and runner hashes alongside the saved analysis. Replay makes no network requests.

The Python capture script uses the standard library and makes 14 bounded public GET requests for the frozen IDs. Run python3 product-variant-url-study-capture.py --output new-capture.json to create a new HTTP observation record. It does not refresh browser evidence, overwrite the published capture by default or perform merchant writes. Review the returned order and any retrieval gaps before comparing a repeat.

The public package contains selected factual observations, not copied merchant pages, reviews, images or complete catalogs. Full original response bodies were retained privately outside the publication repository; their SHA-256 hashes are in the public record. The rendered evidence records the executed DOM observations. A later HTTP capture cannot reconstruct what a past browser displayed.

Automated robustness checks mutate copies of the observations to remove an exact-URL Offer, omit currency or rendering, duplicate an Offer and introduce a sibling SKU or price. Those mutations are labelled synthetic tests; they are not additional merchant findings. The next useful extension is a separately declared publisher and market sample, with a new denominator and matched capture contexts.

[Download the captured initial-response facts](https://www.iamgeorgekelly.com/downloads/product-variant-url-study-observations.json)

Next step: [Define the product facts needed for an agent’s decision](https://www.iamgeorgekelly.com/field-guide/product-data-for-agents) — Selection identity is one evidence layer; other buyer questions require their own sources.

## Download the study components

The files below preserve the executed sample, its interpretation and a bounded method for a new HTTP capture. Keep a repeat separate from the October 4 edition.

[Download the executed rendered observations](https://www.iamgeorgekelly.com/downloads/product-variant-url-study-rendered.json)

## Local analysis runner

The runner is specific to the factual extraction in this study. Its agreement verdict covers captured identity and displayed price/currency; it is not a general structured-data validator or a purchasing recommendation.

[Download the JavaScript replay runner](https://www.iamgeorgekelly.com/downloads/product-variant-url-study.mjs)

## Bounded public HTTP capture

The capture script preserves unsuccessful retrievals as gaps and prints a fresh record unless an output path is explicitly supplied. Optional full response-body storage belongs in a private directory outside a public repository.

[Download the Python public-capture script](https://www.iamgeorgekelly.com/downloads/product-variant-url-study-capture.py)

## Sources and scope

- [Google Search Central: Product variant structured data](https://developers.google.com/search/docs/appearance/structured-data/product-variants) — Supports distinct URLs that preselect variants, variant identifiers and a common canonical URL for a single-page product group. Does not establish how any AI system read this merchant. Checked 2026-10-04.

- [Shopify Storefront API: ProductVariant](https://shopify.dev/docs/api/storefront/latest/objects/ProductVariant) — Defines a variant as a specific product version and documents SKU, selected options and availableForSale. This study did not call Storefront GraphQL or inspect inventory quantities. Checked 2026-10-04.

- [Shopify Ajax API: Product API reference](https://shopify.dev/docs/api/ajax/reference/product) — Documents public product-handle JSON retrieval and presentment-currency context. The study retains raw catalog price integers and compares displayed dollar prices with JSON-LD; it does not infer currency from a dollar sign alone. Checked 2026-10-04.

- [Studio Neat: Mark One base product URL](https://www.studioneat.com/products/markone) — Observed base-page initial selection and canonical URL in the frozen public capture, October 4, 2026 at 14:22 UTC. This records the captured default; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: Mark One public product JSON](https://www.studioneat.com/products/markone.js) — Observed returned variant order, selected IDs, option values and SKUs used to freeze the convenience sample. Public download retains selected factual records, not the full catalog body. Capture time is not source update time. Checked 2026-10-04.

- [Studio Neat: Mark Two base product URL](https://www.studioneat.com/products/marktwo) — Observed base-page initial selection and canonical URL in the frozen public capture, October 4, 2026 at 14:22 UTC. This records the captured default; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: Mark Two public product JSON](https://www.studioneat.com/products/marktwo.js) — Observed returned variant order, selected IDs, option values and SKUs used to freeze the convenience sample. Public download retains selected factual records, not the full catalog body. Capture time is not source update time. Checked 2026-10-04.

- [Studio Neat: Totebook base product URL](https://www.studioneat.com/products/totebook) — Observed base-page initial selection and canonical URL in the frozen public capture, October 4, 2026 at 14:22 UTC. This records the captured default; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: Totebook public product JSON](https://www.studioneat.com/products/totebook.js) — Observed returned variant order, selected IDs, option values and SKUs used to freeze the convenience sample. Public download retains selected factual records, not the full catalog body. Capture time is not source update time. Checked 2026-10-04.

- [Studio Neat: exact variant URL for MK1-BN](https://www.studioneat.com/products/markone?variant=17522303008833) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for MK1S-BS](https://www.studioneat.com/products/markone?variant=48310475227413) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for MK1-NS](https://www.studioneat.com/products/markone?variant=48537955041557) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for MK2-BS-CL](https://www.studioneat.com/products/marktwo?variant=46227276628245) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for MK2-BS-NC](https://www.studioneat.com/products/marktwo?variant=46227345277205) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for MK2-NS-CL](https://www.studioneat.com/products/marktwo?variant=48537970868501) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for TOTE-2PK](https://www.studioneat.com/products/totebook?variant=39368591736897) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

- [Studio Neat: exact variant URL for TOTE-MINI-3PK](https://www.studioneat.com/products/totebook?variant=39388035973185) — Observed initial selection controls, Product SKU and reduced Offer array at 14:22 UTC; separately observed rendered checked options and price at 14:16 UTC on October 4, 2026. No purchase or checkout action. Captures are sequential; source update time is unknown. Checked 2026-10-04.

## Related reading

- [Does the product page match the variant you submitted?](https://www.iamgeorgekelly.com/field-guide/product-variant-acceptance-test/index.md)

- [SKU vs GTIN: differences, barcodes, and variant IDs](https://www.iamgeorgekelly.com/field-guide/product-identifiers-sku-gtin-variants/index.md)

- [Why feed price and Offer.price can differ without an error](https://www.iamgeorgekelly.com/field-guide/offer-price-reconciliation/index.md)

- [ChatGPT product feeds: sale prices, stock changes, and stale-data checks](https://www.iamgeorgekelly.com/field-guide/product-feed-freshness/index.md)

## Cite this guide

George Kelly. Product variant URLs: what eight public pages actually selected iamgeorgekelly. Updated 2026-10-17. https://www.iamgeorgekelly.com/field-guide/product-variant-url-evidence-study

Library navigation: [Choose a task](https://www.iamgeorgekelly.com/field-guide/start-here) · [Source directory](https://www.iamgeorgekelly.com/field-guide/sources) · [Editorial policy](https://www.iamgeorgekelly.com/for-agents#editorial-policy)

## Editorial note

AI-assisted research and drafting. Provider-specific claims link to primary sources. Frameworks are editorial proposals; worked examples are illustrative and are not employer performance results.
