{
 "@context": "https://schema.org",
 "@type": "Dataset",
 "name": "WooCommerce agentic-commerce catalog defect census, August 2026",
 "url": "https://ironbarktech.com.au/research/woocommerce-agentic-commerce-census",
 "creator": "IRONBARKTECH",
 "license": "https://creativecommons.org/licenses/by/4.0/",
 "attribution": "IRONBARKTECH, https://ironbarktech.com.au/research/woocommerce-agentic-commerce-census",
 "contact": "hello@ironbarktech.com.au",
 "generated": "2026-08-30",
 "surface": "WooCommerce Store API v1 (/wp-json/wc/store/v1/products), public, unauthenticated",
 "method": {
  "store_discovery": "URL-footprint search on WooCommerce default taxonomy bases (/product-category/, /product-tag/) via a public scan index. 1,624 candidates, 818 answering the Store API, 50.4% hit rate.",
  "page_cap": 100,
  "first_page_only": true,
  "stores_at_page_cap": 440,
  "cost_aud": 0,
  "caveat": "First page of each catalog, capped at 100 products. Stores at the cap have an unmeasured tail, so this is a census of catalog fronts and not of whole catalogs."
 },
 "denominators": {
  "stores_attempted": 818,
  "stores_measured": 814,
  "stores_unmeasured": 4,
  "unmeasured_note": "Answered the probe, did not answer the scan. Counted as UNMEASURED, never as clean.",
  "products_measured": 56896,
  "median_products_per_store": 100
 },
 "headline": {
  "products_with_at_least_one_defect": 38249,
  "products_with_at_least_one_defect_pct": 67.2,
  "products_an_agent_would_skip": 11842,
  "products_an_agent_would_skip_pct": 20.8,
  "products_an_agent_would_skip_conservative": 9762,
  "products_an_agent_would_skip_conservative_pct": 17.2,
  "products_degraded_not_skipped": 26407,
  "products_degraded_not_skipped_pct": 46.4,
  "products_clean": 18647,
  "products_clean_pct": 32.8,
  "scoreable_defects": 59759
 },
 "stores": {
  "with_zero_defects": 53,
  "with_zero_defects_pct": 6.5,
  "defects_per_product_deciles": {
   "p10": 0.03,
   "p25": 0.39,
   "p50": 1,
   "p75": 1.65,
   "p90": 2.25
  },
  "mean_defects_per_product": 1.13
 },
 "defects_per_product": {
  "0": 18647,
  "1": 23122,
  "2": 10487,
  "3": 3250,
  "4": 1046,
  "5": 335,
  "6": 9
 },
 "per_rule": [
  {
   "id": "ID-WEAK",
   "label": "Neither brand nor MPN present",
   "products_affected": 28871,
   "share_of_products_pct": 50.7,
   "share_of_defects_pct": 48.3,
   "severity": "degrades",
   "fixability": "judgement",
   "source": "Google Merchant"
  },
  {
   "id": "PRICE-MISSING",
   "label": "No price on any variant",
   "products_affected": 10536,
   "share_of_products_pct": 18.5,
   "share_of_defects_pct": 17.6,
   "severity": "excludes",
   "fixability": "blocked",
   "source": "ACP feed"
  },
  {
   "id": "DESC-MISSING",
   "label": "No usable description",
   "products_affected": 7938,
   "share_of_products_pct": 14,
   "share_of_defects_pct": 13.3,
   "severity": "degrades",
   "fixability": "judgement",
   "source": "schema.org/Product"
  },
  {
   "id": "TITLE-SHOUT",
   "label": "Title all-caps or promotional",
   "products_affected": 5833,
   "share_of_products_pct": 10.3,
   "share_of_defects_pct": 9.8,
   "severity": "degrades",
   "fixability": "mechanical",
   "source": "Google Merchant title policy"
  },
  {
   "id": "CAT-NONE",
   "label": "No product type or category",
   "products_affected": 3572,
   "share_of_products_pct": 6.3,
   "share_of_defects_pct": 6,
   "severity": "degrades",
   "fixability": "judgement",
   "source": "Google product taxonomy"
  },
  {
   "id": "IMG-NONE",
   "label": "No product image",
   "products_affected": 1873,
   "share_of_products_pct": 3.3,
   "share_of_defects_pct": 3.1,
   "severity": "excludes",
   "fixability": "blocked",
   "source": "Google Merchant / ACP"
  },
  {
   "id": "DESC-SOUP",
   "label": "Description is markup or entities once stripped",
   "products_affected": 1134,
   "share_of_products_pct": 2,
   "share_of_defects_pct": 1.9,
   "severity": "degrades",
   "fixability": "mechanical",
   "source": "schema.org/Product"
  },
  {
   "id": "PRICE-FORMAT",
   "label": "Price present but not a clean decimal",
   "products_affected": 2,
   "share_of_products_pct": 0,
   "share_of_defects_pct": 0,
   "severity": "excludes",
   "fixability": "mechanical",
   "source": "ACP feed"
  }
 ],
 "severity_split": {
  "excludes": 12411,
  "excludes_pct_of_defects": 20.8,
  "degrades": 47348,
  "degrades_pct_of_defects": 79.2,
  "risk": 0
 },
 "fixability_split": {
  "mechanical": 6969,
  "mechanical_pct": 11.7,
  "judgement": 40381,
  "judgement_pct": 67.6,
  "blocked": 12409,
  "blocked_pct": 20.8
 },
 "price_cross_check": {
  "why": "PRICE-MISSING carries most of the skip rate and 96.6% of its hits are an explicit '0' rather than an absent value, so it is checked against the platform's own is_purchasable flag rather than left resting on our inference.",
  "products_platform_marks_not_purchasable": 9070,
  "products_platform_marks_not_purchasable_pct": 15.9,
  "price_hits_corroborated_by_platform": 8308,
  "price_hits_corroborated_pct": 78.9,
  "price_hits_buyable_at_zero": 2228,
  "price_hits_buyable_at_zero_note": "Zero-priced and still purchasable. Most plausibly free downloads and sample products, which are not defects. Removed in the conservative skip rate.",
  "platform_not_purchasable_our_rule_misses": 762,
  "platform_not_purchasable_our_rule_misses_note": "Not purchasable for a reason the price rule does not test (external and grouped types, sold-out variables). The rule under-counts here, so the conservative skip rate is a floor rather than a midpoint."
 },
 "gtin_merchant_probe": {
  "question": "Do merchants already hold a GTIN, so that publishing it would be mechanical republishing rather than authoring?",
  "surface": "product-page Product JSON-LD, which WooCommerce core emits when global_unique_id is set and passes its own 8/12/13/14-digit check",
  "pages_fetched": 3110,
  "pages_with_product_jsonld": 2176,
  "products_with_gtin": 36,
  "gtin_rate_pct": 1.7,
  "stores_with_jsonld": 576,
  "stores_with_gtin": 14,
  "store_gtin_rate_pct": 2.4,
  "other_identity_fields_pct": {
   "sku": 82.4,
   "brand": 16.2,
   "mpn": 1.6
  },
  "denominator_note": "Rates are over pages carrying Product JSON-LD, never over all pages fetched. A theme that suppresses core markup is an unmeasured page, not a missing value.",
  "floor_not_ceiling": "A merchant could hold a GTIN in a third-party plugin field that never reaches JSON-LD, so this is a floor. It does not move the conclusion: the gap between this rate and the mechanical share needed to reach GO is not closable by any plausible correction to it."
 },
 "excluded_from_every_rate": {
  "GTIN-MISSING": {
   "reason": "The Store API publishes no GTIN field, so absence here is a property of the API and not of the catalog. Core holds the value in _global_unique_id; the surface hides it.",
   "evidence": "WooCommerce trunk StoreApi/Schemas/V1/ProductSchema.php has no global_unique_id / gtin / ean / upc / isbn / barcode property (checked 2026-08-30)",
   "fixability": "judgement"
  },
  "GTIN-MALFORMED": {
   "reason": "Cannot judge the format of a value the surface never emits. Reported for symmetry so the GTIN pair is excluded together rather than one side of it quietly surviving.",
   "evidence": "same schema check as GTIN-MISSING",
   "fixability": "mechanical"
  },
  "STALE": {
   "reason": "The Store API publishes no date_created or date_modified, so catalog freshness against the ACP 15-minute window cannot be evaluated from outside the store.",
   "evidence": "no date field of any kind in ProductSchema.php (checked 2026-08-30)",
   "fixability": "mechanical"
  }
 },
 "structurally_clean_on_this_surface": {
  "AVAIL-NONE": "is_in_stock is a required boolean in the schema, so availability is always published. On Shopify this rule finds real gaps; here it structurally cannot.",
  "PRICE-FORMAT": "prices.price is emitted as an integer string in minor units with an explicit currency_minor_unit divisor, so the surface normalises SEPARATORS AND SYMBOLS for the merchant and the usual currency-formatting defects cannot arise. It does not normalise the VALUE: 2 products in 56,896 still fired, both on a negative price ([store redacted] #16778 publishes price '-1'). Corrected 2026-08-30 after a real fixture contradicted the stronger claim first written here, which was that malformed prices could not reach the rule at all."
 },
 "rules_that_never_fired": [
  "AVAIL-NONE"
 ]
}