{
  "name": "Specoria Commerce Readiness Specification",
  "version": "1.0",
  "published": "2026-10-08",
  "scoreModel": "v2.4",
  "author": "Specoria",
  "scoredBy": "Specoria",
  "conflictOfInterest": "Conflict of interest: Specoria wrote this specification and Specoria also scores stores against it, in its own free test and in its paid product. Nobody else reviews or certifies the scores. Read it as the published rule book of one vendor’s test, not as an independent standard. Every rule, weight and test is public so anyone can check our work; corrections are welcome at contact@specoria.com.",
  "url": {
    "en": "https://specoria.com/spec/",
    "tr": "https://specoria.com/tr/sartname/"
  },
  "json": "https://specoria.com/spec/sc-1.0.json",
  "mapping": {
    "agentReady": {
      "en": "https://specoria.com/spec/agentready-mapping/",
      "tr": "https://specoria.com/tr/sartname/agentready-eslemesi/"
    }
  },
  "idPattern": "^SC-(ACCESS|DATA|POLICY|CONSISTENCY|CART|CHECKOUT|HOTEL|SERVICE)-\\d{2}$",
  "levels": {
    "MUST": "Critical blocker in the score model: a failure that counts as a blocker caps the score (one blocker: 59, two or more: 39). The test text says which failures count.",
    "SHOULD": "If it fails, it costs only its own weight."
  },
  "scoring": {
    "scale": "0-100, weighted share of passed checks; a partial result earns partial credit; a check that could not be verified or does not apply leaves both numerator and denominator.",
    "criticalCap": {
      "one": 59,
      "twoOrMore": 39
    },
    "readyAt": 80,
    "readyRule": "Agent-ready needs at least 80 points, no critical blocker and a simulated agent that recommends the store.",
    "lowBelow": 40,
    "weights": "Store checks sum to 100. On hotel and service sites the common access checks plus that site type’s checks sum to 100; store-only checks do not apply there."
  },
  "areas": [
    "ACCESS",
    "DATA",
    "POLICY",
    "CONSISTENCY",
    "CART",
    "CHECKOUT",
    "HOTEL",
    "SERVICE"
  ],
  "reservedAreas": {
    "PROTOCOL": "Reserved. Protocol signals (UCP, MCP, A2A, AI Catalog, Web Bot Auth, WebMCP) are information rows in the test today and are not scored."
  },
  "requirements": [
    {
      "id": "SC-ACCESS-01",
      "check": "bots_search",
      "area": "ACCESS",
      "level": "MUST",
      "weight": 8,
      "critical": true,
      "category": "access",
      "appliesTo": [
        "ecommerce",
        "lodging",
        "service"
      ],
      "title": {
        "en": "Search and user agents allowed (robots.txt)",
        "tr": "Arama ve kullanıcı ajanlarına izin (robots.txt)"
      },
      "requirement": {
        "en": "Search and user agents are explicitly allowed. You can still block training bots (GPTBot, ClaudeBot, Google-Extended); that doesn’t cut visibility.",
        "tr": "Arama ve kullanıcı ajanlarına açıkça izin verilir; eğitim botlarını (GPTBot, ClaudeBot, Google-Extended) isterseniz ayrıca engelleyebilirsiniz, bu görünürlüğü kesmez."
      },
      "test": {
        "en": "We read robots.txt and test the root and the product page’s path for search bots (OAI-SearchBot, Claude-SearchBot, PerplexityBot, Googlebot, Bingbot, Applebot) and user agents (ChatGPT-User, Claude-User, Perplexity-User, Google-Agent). Blocking any of them fails the check; blocking OAI-SearchBot or Googlebot is a critical blocker. No robots.txt passes; an unreadable one (server error, timeout) is not verifiable. Training bots (GPTBot, ClaudeBot, Google-Extended, CCBot) and other AI bots (Applebot-Extended, Meta-ExternalAgent, Amazonbot, MistralAI-User, Bytespider) don’t count and are shown as information rows; so are agent-specific groups that override the general (*) rules and any Content-Signal declaration.",
        "tr": "robots.txt okunur ve kök adres ile bulunan ürün sayfasının yolu şu ajanlar için denenir: arama botları (OAI-SearchBot, Claude-SearchBot, PerplexityBot, Googlebot, Bingbot, Applebot) ve kullanıcı ajanları (ChatGPT-User, Claude-User, Perplexity-User, Google-Agent). Herhangi birinin engellenmesi kontrolü düşürür; OAI-SearchBot ya da Googlebot engeli kritik engeldir. robots.txt yoksa geçer, okunamıyorsa (sunucu hatası, zaman aşımı) doğrulanamadı olur. Eğitim botları (GPTBot, ClaudeBot, Google-Extended, CCBot) ve diğer AI botları (Applebot-Extended, Meta-ExternalAgent, Amazonbot, MistralAI-User, Bytespider) puana girmez, bilgi satırında gösterilir; ajana özel bir grubun genel (*) kuralları gölgelemesi ve Content-Signal beyanı da bilgi olarak yazılır."
      },
      "references": [
        {
          "label": "RFC 9309: Robots Exclusion Protocol",
          "url": "https://www.rfc-editor.org/rfc/rfc9309"
        },
        {
          "label": "OpenAI: crawlers and user agents",
          "url": "https://platform.openai.com/docs/bots"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/bots-search/",
        "tr": "https://specoria.com/tr/yontem/kontroller/bots-search/"
      }
    },
    {
      "id": "SC-ACCESS-02",
      "check": "waf_access",
      "area": "ACCESS",
      "level": "MUST",
      "weight": 8,
      "critical": true,
      "category": "access",
      "appliesTo": [
        "ecommerce",
        "lodging",
        "service"
      ],
      "title": {
        "en": "Is bot protection open to agents?",
        "tr": "Bot koruması ajanlara açık mı?"
      },
      "requirement": {
        "en": "Bot protection stops only malicious traffic; verified search and user agents get the normal page (HTTP 200). Risk-based checks and rate limits (HTTP 429 + Retry-After) replace a CAPTCHA at every step.",
        "tr": "Bot koruması yalnızca kötü niyetli trafiği durdurur; doğrulanmış arama ve kullanıcı ajanları normal sayfayı (HTTP 200) görür. Her adımda CAPTCHA yerine risk bazlı doğrulama ve hız sınırı (HTTP 429 + Retry-After) kullanılır."
      },
      "test": {
        "en": "We request the homepage and the product page with ordinary browser headers. A hard refusal (e.g. HTTP 403) fails the check and is a critical blocker. A challenge page or CAPTCHA is a “possible block”: a partial pass, not a critical blocker, since we can’t see from outside what verified agents get. A rate limit (HTTP 429) isn’t counted as a block: we retry after the Retry-After wait; if the page opens it passes, if it’s still limited the check is not verifiable and doesn’t count. If the homepage is blocked from Cloudflare’s network but opens from a second network, it’s a partial pass. If only the one request that identifies itself as SpecoriaBot is refused, that’s also a “possible block” (partial pass): we can’t send requests from verified bot IPs.",
        "tr": "Ana sayfa ve ürün sayfası sıradan bir tarayıcı başlığıyla istenir. Kesin ret (ör. HTTP 403) kontrolü düşürür ve kritik engel sayılır. Doğrulama (challenge) sayfası ya da CAPTCHA “olası engel”dir: kısmen geçer, kritik engel sayılmaz; doğrulanmış ajanların ne gördüğünü dışarıdan bilemeyiz. Hız sınırı (HTTP 429) engel sayılmaz: Retry-After’a uyularak yeniden denenir; açılırsa geçer, hâlâ sınırdaysa doğrulanamadı olur ve puana girmez. Ana sayfa Cloudflare ağından engellenip ikinci bir ağdan açılırsa kısmen geçer. Kendini SpecoriaBot olarak tanıtan tek isteğin reddedilmesi de “olası engel”dir (kısmen geçer): doğrulanmış bot IP’lerinden istek gönderemeyiz."
      },
      "references": [
        {
          "label": "OpenAI: crawlers and user agents",
          "url": "https://platform.openai.com/docs/bots"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/waf-access/",
        "tr": "https://specoria.com/tr/yontem/kontroller/waf-access/"
      }
    },
    {
      "id": "SC-ACCESS-03",
      "check": "no_js",
      "area": "ACCESS",
      "level": "MUST",
      "weight": 5,
      "critical": true,
      "category": "access",
      "appliesTo": [
        "ecommerce",
        "lodging",
        "service"
      ],
      "title": {
        "en": "Product name and price readable without JavaScript",
        "tr": "Ürün adı ve fiyat JavaScript olmadan okunuyor mu?"
      },
      "requirement": {
        "en": "Product name, price, currency and stock are in the initial HTML (server-side rendering or static generation).",
        "tr": "Ürün adı, fiyat, para birimi ve stok ilk HTML’de bulunur (sunucu tarafı render ya da statik üretim)."
      },
      "requirementHomepage": {
        "en": "The business name, headings and main content are in the initial HTML (server-side rendering or static generation).",
        "tr": "İşletme adı, başlıklar ve ana içerik ilk HTML’de bulunur (sunucu tarafı render ya da statik üretim)."
      },
      "test": {
        "en": "We read the product page’s initial HTML, without running JavaScript: are the product name (structured data, og:title or h1) and the price in it? If either is missing the check fails and is a critical blocker. On hotel and service sites we look for the business name and at least 200 characters of readable text on the homepage.",
        "tr": "Ürün sayfasının ilk HTML’i (JavaScript çalıştırılmadan) okunur: ürün adı (yapısal veri, og:title ya da h1) ve fiyat bu HTML’de var mı? Biri yoksa kontrol düşer ve kritik engel sayılır. Otel ve hizmet sitelerinde ana sayfada işletme adı ve en az 200 karakter okunur metin aranır."
      },
      "references": [
        {
          "label": "Google: JavaScript SEO basics",
          "url": "https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/no-js/",
        "tr": "https://specoria.com/tr/yontem/kontroller/no-js/"
      }
    },
    {
      "id": "SC-ACCESS-04",
      "check": "sitemap",
      "area": "ACCESS",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "access",
      "appliesTo": [
        "ecommerce",
        "lodging",
        "service"
      ],
      "title": {
        "en": "Sitemap",
        "tr": "Site haritası"
      },
      "requirement": {
        "en": "An up-to-date sitemap lists your product pages and is referenced from robots.txt.",
        "tr": "Ürün sayfalarını listeleyen güncel bir site haritası vardır ve robots.txt’den gösterilir."
      },
      "requirementHomepage": {
        "en": "An up-to-date sitemap lists your important pages and is referenced from robots.txt.",
        "tr": "Önemli sayfalarınızı listeleyen güncel bir site haritası vardır ve robots.txt’den gösterilir."
      },
      "test": {
        "en": "We look for a “Sitemap:” line in robots.txt or for /sitemap.xml. Found passes, neither fails; if the file can’t be read, it’s not verifiable.",
        "tr": "robots.txt’deki “Sitemap:” satırı ya da /sitemap.xml aranır. Bulunursa geçer, hiçbiri yoksa düşer; dosya okunamazsa doğrulanamadı olur."
      },
      "references": [
        {
          "label": "sitemaps.org protocol",
          "url": "https://www.sitemaps.org/protocol.html"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/sitemap/",
        "tr": "https://specoria.com/tr/yontem/kontroller/sitemap/"
      }
    },
    {
      "id": "SC-ACCESS-05",
      "check": "indexable",
      "area": "ACCESS",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "access",
      "appliesTo": [
        "ecommerce",
        "lodging",
        "service"
      ],
      "title": {
        "en": "Can the product page be indexed?",
        "tr": "Ürün sayfası dizinlenebilir mi?"
      },
      "requirement": {
        "en": "Product pages are indexable and their canonical points to themselves.",
        "tr": "Ürün sayfaları dizinlenebilir; canonical kendi adresini gösterir."
      },
      "requirementHomepage": {
        "en": "The homepage and important pages are indexable and each canonical points to the page itself.",
        "tr": "Ana sayfa ve önemli sayfalar dizinlenebilir; canonical her sayfanın kendi adresini gösterir."
      },
      "test": {
        "en": "On the product page (or the homepage if there’s none) we look for “noindex” in meta robots and the X-Robots-Tag header; if present the check fails. A canonical URL pointing to another domain is a partial pass.",
        "tr": "Ürün sayfasında (yoksa ana sayfada) meta robots ve X-Robots-Tag başlığında “noindex” aranır; varsa kontrol düşer. Kanonik adres başka bir alan adını gösteriyorsa kısmen geçer."
      },
      "references": [
        {
          "label": "Google: block indexing with noindex",
          "url": "https://developers.google.com/search/docs/crawling-indexing/block-indexing"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/indexable/",
        "tr": "https://specoria.com/tr/yontem/kontroller/indexable/"
      }
    },
    {
      "id": "SC-DATA-01",
      "check": "product_schema",
      "area": "DATA",
      "level": "MUST",
      "weight": 7,
      "critical": true,
      "category": "product",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Product structured data (schema.org)",
        "tr": "Ürün yapısal verisi (schema.org)"
      },
      "requirement": {
        "en": "Every product page carries Product data as JSON-LD; products with variants use ProductGroup + hasVariant.",
        "tr": "Her ürün sayfasında JSON-LD olarak Product verisi bulunur; varyantlı ürünlerde ProductGroup + hasVariant kullanılır."
      },
      "test": {
        "en": "We look for JSON-LD Product (or ProductGroup) on the product page. Only microdata or Open Graph product tags is a partial pass; none fails and is a critical blocker.",
        "tr": "Ürün sayfasında JSON-LD Product (ya da ProductGroup) aranır. Yalnızca microdata veya Open Graph ürün işaretleri varsa kısmen geçer; hiçbiri yoksa düşer ve kritik engel sayılır."
      },
      "references": [
        {
          "label": "schema.org/Product",
          "url": "https://schema.org/Product"
        },
        {
          "label": "Google: merchant listing structured data",
          "url": "https://developers.google.com/search/docs/appearance/structured-data/merchant-listing"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/product-schema/",
        "tr": "https://specoria.com/tr/yontem/kontroller/product-schema/"
      }
    },
    {
      "id": "SC-DATA-02",
      "check": "offer_complete",
      "area": "DATA",
      "level": "SHOULD",
      "weight": 6,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Price, currency, availability and URL",
        "tr": "Fiyat, para birimi, stok ve adres"
      },
      "requirement": {
        "en": "The offer carries price, an ISO currency code, availability and the product URL together.",
        "tr": "Teklif verisinde fiyat, ISO para birimi kodu, stok durumu ve ürün adresi birlikte bulunur."
      },
      "test": {
        "en": "We count four fields in the product’s offer: price, a valid ISO 4217 currency, availability and the offer URL. All four pass, none fails; anything in between earns points in proportion.",
        "tr": "Ürünün teklifinde dört alan sayılır: fiyat, geçerli ISO 4217 para birimi, stok durumu ve teklif adresi. Dördü de varsa geçer, hiçbiri yoksa düşer; arada kalan doluluk oranı kadar puan alır."
      },
      "references": [
        {
          "label": "schema.org/Offer",
          "url": "https://schema.org/Offer"
        },
        {
          "label": "Google: merchant listing structured data",
          "url": "https://developers.google.com/search/docs/appearance/structured-data/merchant-listing"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/offer-complete/",
        "tr": "https://specoria.com/tr/yontem/kontroller/offer-complete/"
      }
    },
    {
      "id": "SC-DATA-03",
      "check": "product_identity",
      "area": "DATA",
      "level": "SHOULD",
      "weight": 5,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Product identity (GTIN/MPN, brand, SKU)",
        "tr": "Ürün kimliği (GTIN/MPN, marka, SKU)"
      },
      "requirement": {
        "en": "Brand and a valid GTIN (barcode) or MPN are defined; the SKU is there too.",
        "tr": "Marka ve geçerli bir GTIN (barkod) ya da MPN tanımlıdır; SKU da bulunur."
      },
      "test": {
        "en": "We read product identity from structured data: a valid GTIN (correct check digit) or an MPN, the brand and the SKU. An identifier plus the brand passes; none fails; partial credit weighs the identifier 50%, the brand 35% and the SKU 15%. The result also states identity confidence (no effect on score): a valid GTIN is “strong”, an MPN with the brand and no GTIN is “medium”, the product name alone is “weak”.",
        "tr": "Ürün kimliği yapısal veriden okunur: geçerli GTIN (kontrol hanesi doğru) ya da MPN, marka ve SKU. Kimlik ve marka varsa geçer; hiçbiri yoksa düşer; kısmi kredi kimlik %50, marka %35, SKU %15 ağırlıkla hesaplanır. Sonuçta kimlik güveni de yazılır (puanı etkilemez): geçerli GTIN “kesin”, GTIN yokken MPN ile marka “orta”, yalnızca ürün adı “zayıf”."
      },
      "references": [
        {
          "label": "GS1: GTIN",
          "url": "https://www.gs1.org/standards/id-keys/gtin"
        },
        {
          "label": "schema.org/gtin",
          "url": "https://schema.org/gtin"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/product-identity/",
        "tr": "https://specoria.com/tr/yontem/kontroller/product-identity/"
      }
    },
    {
      "id": "SC-DATA-04",
      "check": "product_media",
      "area": "DATA",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Images and description",
        "tr": "Görsel ve açıklama"
      },
      "requirement": {
        "en": "JSON-LD carries a stable https image URL and an original description; og:image is set as well.",
        "tr": "JSON-LD’de sabit https adresli görsel ve özgün bir açıklama vardır; og:image da tanımlıdır."
      },
      "test": {
        "en": "We read the product image (structured data or og:image) and the description in the product’s structured data. A description of at least 20 words or 120 characters is enough; 10-19 words is short; fewer doesn’t count as a description. An image plus an adequate description passes; an image with a short description is a mostly partial pass; only one of the two is a half partial pass; neither fails.",
        "tr": "Ürün görseli (yapısal veri ya da og:image) ve ürünün yapısal verisindeki açıklama okunur. Açıklama en az 20 kelime ya da 120 karakterse yeterlidir; 10-19 kelime kısadır; daha azı açıklama sayılmaz. Görsel ve yeterli açıklama geçer; görsel ve kısa açıklama büyük ölçüde kısmen geçer; yalnızca biri varsa yarı yarıya kısmen geçer; ikisi de yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/Product",
          "url": "https://schema.org/Product"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/product-media/",
        "tr": "https://specoria.com/tr/yontem/kontroller/product-media/"
      }
    },
    {
      "id": "SC-DATA-05",
      "check": "reviews",
      "area": "DATA",
      "level": "SHOULD",
      "weight": 3,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Reviews and rating",
        "tr": "Yorum ve puan"
      },
      "requirement": {
        "en": "The stars and review count on the page are marked up as AggregateRating too.",
        "tr": "Sayfadaki yıldız ve yorum sayısı AggregateRating olarak da işaretlidir."
      },
      "test": {
        "en": "We look for a rating (AggregateRating) in the product’s structured data. A rating above zero with a review or rating count above zero passes; only individual reviews (Review), or a missing or zero count, is a partial pass; nothing fails.",
        "tr": "Ürünün yapısal verisinde puan (AggregateRating) aranır. Puan sıfırdan büyük ve yorum ya da puan sayısı sıfırdan büyükse geçer; yalnızca tek tek yorumlar (Review) varsa ya da sayı eksik veya sıfırsa kısmen geçer; hiçbiri yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/AggregateRating",
          "url": "https://schema.org/AggregateRating"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/reviews/",
        "tr": "https://specoria.com/tr/yontem/kontroller/reviews/"
      }
    },
    {
      "id": "SC-DATA-06",
      "check": "variants",
      "area": "DATA",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Can variants (size, color) be addressed?",
        "tr": "Varyantlar (beden, renk) adreslenebilir mi?"
      },
      "requirement": {
        "en": "Every variant opens at its own URL; structured data uses ProductGroup + hasVariant and variesBy.",
        "tr": "Her varyant kendi adresiyle açılır; yapısal veride ProductGroup + hasVariant ve variesBy kullanılır."
      },
      "test": {
        "en": "Variants described as ProductGroup + hasVariant in structured data pass; if there are at least two colour variants, each colour needs its own distinct image, otherwise it’s a partial pass (size-only variants aren’t checked for images). If the page has a size/colour selector but no such data: options with their own URLs are a partial pass, options without fail. Products without a selector are not applicable.",
        "tr": "Varyantlar yapısal veride ProductGroup + hasVariant olarak tanımlıysa geçer; en az iki renk varyantı varsa her rengin kendine ait, farklı bir görseli olmalıdır, yoksa kısmen geçer (yalnızca beden varyantında görsel aranmaz). Sayfada beden/renk seçici var ama yapısal veri yoksa: seçenekler kendi adresiyle açılıyorsa kısmen geçer, açılmıyorsa düşer. Seçici olmayan üründe geçerli değildir."
      },
      "references": [
        {
          "label": "schema.org/ProductGroup",
          "url": "https://schema.org/ProductGroup"
        },
        {
          "label": "Google: product variants",
          "url": "https://developers.google.com/search/docs/appearance/structured-data/product-variants"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/variants/",
        "tr": "https://specoria.com/tr/yontem/kontroller/variants/"
      }
    },
    {
      "id": "SC-POLICY-01",
      "check": "returns_machine",
      "area": "POLICY",
      "level": "SHOULD",
      "weight": 5,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Machine-readable return policy",
        "tr": "Makine okunur iade politikası"
      },
      "requirement": {
        "en": "The return policy is defined once at organization level (OnlineStore → hasMerchantReturnPolicy) or on the product offer, with the same values as your returns page.",
        "tr": "İade politikası kurum seviyesinde bir kez (OnlineStore → hasMerchantReturnPolicy) ya da ürün teklifinde tanımlıdır; değerler iade sayfanızla aynıdır."
      },
      "test": {
        "en": "We look for a machine-readable return policy (MerchantReturnPolicy) at product, offer or Organization level, resolving @id references. We check three fields: the window type (returnPolicyCategory), a whole number of days for a finite window (merchantReturnDays; “30 days” or 14.5 don’t count) and the country (applicableCountry). All complete passes; a policy with missing fields is a partial pass (one missing 0.75, two 0.6, all three 0.5 points); no policy fails.",
        "tr": "Ürün, teklif ya da kurum (Organization) düzeyinde makine okunur iade politikası (MerchantReturnPolicy) aranır; @id başvuruları çözülür. Üç alana bakılır: iade penceresi türü (returnPolicyCategory), sınırlı pencerede tam sayı gün (merchantReturnDays; “30 gün” ya da 14,5 geçersiz) ve ülke (applicableCountry). Hepsi tamsa geçer; politika var ama alan eksikse kısmen geçer (bir eksik 0,75, iki eksik 0,6, üçü de eksikse 0,5 puan); politika yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/MerchantReturnPolicy",
          "url": "https://schema.org/MerchantReturnPolicy"
        },
        {
          "label": "Google: merchant listing structured data",
          "url": "https://developers.google.com/search/docs/appearance/structured-data/merchant-listing"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/returns-machine/",
        "tr": "https://specoria.com/tr/yontem/kontroller/returns-machine/"
      }
    },
    {
      "id": "SC-POLICY-02",
      "check": "returns_human",
      "area": "POLICY",
      "level": "SHOULD",
      "weight": 4,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Returns page and window",
        "tr": "İade sayfası ve süresi"
      },
      "requirement": {
        "en": "The homepage links to an HTML returns page that states the window, fees and method clearly.",
        "tr": "Ana sayfadan HTML bir iade sayfasına bağlantı vardır; sayfada süre, masraf ve yöntem açıkça yazar."
      },
      "test": {
        "en": "We find the returns page from links on the homepage and product page, open it and look for the return window (days). Days found passes; a page without days, or a PDF-only policy, is a partial pass; no page fails.",
        "tr": "Ana sayfa ve ürün sayfasındaki bağlantılardan iade sayfası bulunur ve açılır; metinde iade süresi (gün) aranır. Süre bulunursa geçer; sayfa var ama süre yoksa ya da politika yalnızca PDF ise kısmen geçer; sayfa yoksa düşer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/returns-human/",
        "tr": "https://specoria.com/tr/yontem/kontroller/returns-human/"
      }
    },
    {
      "id": "SC-POLICY-03",
      "check": "shipping_machine",
      "area": "POLICY",
      "level": "SHOULD",
      "weight": 4,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Machine-readable shipping information",
        "tr": "Makine okunur kargo bilgisi"
      },
      "requirement": {
        "en": "Shipping rate, handling and transit times are defined with OfferShippingDetails.",
        "tr": "Kargo ücreti, hazırlık ve teslim süresi OfferShippingDetails ile tanımlıdır."
      },
      "test": {
        "en": "We look for machine-readable shipping details (OfferShippingDetails or ShippingService) in the offer or at Organization level and count four fields: shipping cost (shippingRate), delivery region (shippingDestination), handling time (handlingTime) and transit time (transitTime); the times may sit under deliveryTime or shippingConditions. All four pass; a definition with missing fields is a partial pass (one missing 0.75, two 0.6, more 0.5 points); no definition fails.",
        "tr": "Teklifte ya da kurum düzeyinde makine okunur kargo bilgisi (OfferShippingDetails ya da ShippingService) aranır ve dört alan sayılır: kargo ücreti (shippingRate), teslimat bölgesi (shippingDestination), hazırlık süresi (handlingTime) ve kargoda geçen süre (transitTime); süreler deliveryTime ya da shippingConditions altında da olabilir. Dördü de varsa geçer; tanım var ama alan eksikse kısmen geçer (bir eksik 0,75, iki eksik 0,6, daha fazlası 0,5 puan); tanım yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/OfferShippingDetails",
          "url": "https://schema.org/OfferShippingDetails"
        },
        {
          "label": "Google: merchant listing structured data",
          "url": "https://developers.google.com/search/docs/appearance/structured-data/merchant-listing"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/shipping-machine/",
        "tr": "https://specoria.com/tr/yontem/kontroller/shipping-machine/"
      }
    },
    {
      "id": "SC-POLICY-04",
      "check": "shipping_human",
      "area": "POLICY",
      "level": "SHOULD",
      "weight": 3,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Shipping cost and time on the page",
        "tr": "Kargo ücreti ve süresi sayfada"
      },
      "requirement": {
        "en": "The product page shows shipping cost, the free-shipping threshold and delivery time before the cart.",
        "tr": "Ürün sayfasında sepetten önce kargo ücreti, ücretsiz kargo eşiği ve teslim süresi yazar."
      },
      "test": {
        "en": "We look for a free-shipping threshold or a delivery time in the product page, the shipping page and the homepage text. Either found passes; a vague mention of shipping is a partial pass; nothing fails.",
        "tr": "Ürün sayfası, kargo sayfası ve ana sayfa metninde ücretsiz kargo eşiği ya da teslim süresi aranır. Biri bulunursa geçer; kargodan yalnızca genel olarak söz ediliyorsa kısmen geçer; hiç yoksa düşer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/shipping-human/",
        "tr": "https://specoria.com/tr/yontem/kontroller/shipping-human/"
      }
    },
    {
      "id": "SC-POLICY-05",
      "check": "org_identity",
      "area": "POLICY",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Business identity",
        "tr": "İşletme kimliği"
      },
      "requirement": {
        "en": "The homepage carries OnlineStore data with name, address, contact details and social profiles.",
        "tr": "Ana sayfada ad, adres, iletişim ve sosyal profilleri içeren OnlineStore verisi vardır."
      },
      "test": {
        "en": "We look for the business (Organization) in the structured data of the pages we read: contact details and social profile links (sameAs). Both pass, one missing is a partial pass, no business data fails.",
        "tr": "Okunan sayfaların yapısal verisinde işletme (Organization) aranır: iletişim bilgisi ve sosyal profil bağlantıları (sameAs). İkisi de varsa geçer, biri eksikse kısmen geçer, işletme verisi yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/Organization",
          "url": "https://schema.org/Organization"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/org-identity/",
        "tr": "https://specoria.com/tr/yontem/kontroller/org-identity/"
      }
    },
    {
      "id": "SC-POLICY-06",
      "check": "legal_pages",
      "area": "POLICY",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Legal pages (distance selling, Türkiye)",
        "tr": "Yasal sayfalar (mesafeli satış)"
      },
      "requirement": {
        "en": "The footer links to the distance sales contract, the pre-information form and the privacy notice.",
        "tr": "Alt bilgide mesafeli satış sözleşmesi, ön bilgilendirme formu ve KVKK aydınlatma metni bağlantıları bulunur."
      },
      "test": {
        "en": "Measured only for the Turkish market: we look for a distance sales contract, a pre-information form and a privacy notice among the homepage and product page links. All three pass, none fails, anything in between is scored in proportion. Not applicable in other markets.",
        "tr": "Yalnızca Türkiye pazarında ölçülür: ana sayfa ve ürün sayfası bağlantılarında mesafeli satış sözleşmesi, ön bilgilendirme formu ve gizlilik/KVKK metni aranır. Üçü de varsa geçer, hiçbiri yoksa düşer, arada kalan oranla puanlanır. Diğer pazarlarda geçerli değildir."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/legal-pages/",
        "tr": "https://specoria.com/tr/yontem/kontroller/legal-pages/"
      }
    },
    {
      "id": "SC-CONSISTENCY-01",
      "check": "price_match",
      "area": "CONSISTENCY",
      "level": "MUST",
      "weight": 6,
      "critical": true,
      "category": "consistency",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Price consistency",
        "tr": "Fiyat tutarlılığı"
      },
      "requirement": {
        "en": "Visible price = structured-data price = feed price (taxes included, same currency).",
        "tr": "Görünen fiyat = yapısal veri fiyatı = feed fiyatı (KDV dahil, aynı para birimi)."
      },
      "test": {
        "en": "We compare the structured-data price with the product price meta tag and the visible page text. A meta tag with a different price fails the check and is a critical blocker; a price that isn’t visible on the page is a partial pass.",
        "tr": "Yapısal verideki fiyat, ürün fiyatı meta etiketiyle ve sayfada görünen metinle karşılaştırılır. Meta etiketi farklı bir fiyat söylüyorsa kontrol düşer ve kritik engel sayılır; fiyat sayfada görünmüyorsa kısmen geçer."
      },
      "references": [
        {
          "label": "schema.org/Offer",
          "url": "https://schema.org/Offer"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/price-match/",
        "tr": "https://specoria.com/tr/yontem/kontroller/price-match/"
      }
    },
    {
      "id": "SC-CONSISTENCY-02",
      "check": "stock_match",
      "area": "CONSISTENCY",
      "level": "SHOULD",
      "weight": 3,
      "critical": false,
      "category": "consistency",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Stock consistency",
        "tr": "Stok tutarlılığı"
      },
      "requirement": {
        "en": "Availability is real-time and machine-readable (InStock, OutOfStock, PreOrder).",
        "tr": "Stok durumu gerçek zamanlı ve makine okunurdur (InStock, OutOfStock, PreOrder)."
      },
      "test": {
        "en": "We compare the structured-data availability with the page: data saying “in stock” while the page says “sold out” with no add-to-cart fails; data saying “out of stock” while the page is buyable is a partial pass.",
        "tr": "Yapısal verideki stok durumu sayfayla karşılaştırılır: veri “stokta” derken sayfa “tükendi” diyor ve sepete ekleme yoksa düşer; veri “yok” derken sayfa satın alınabiliyorsa kısmen geçer."
      },
      "references": [
        {
          "label": "schema.org/ItemAvailability",
          "url": "https://schema.org/ItemAvailability"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/stock-match/",
        "tr": "https://specoria.com/tr/yontem/kontroller/stock-match/"
      }
    },
    {
      "id": "SC-CONSISTENCY-03",
      "check": "market_match",
      "area": "CONSISTENCY",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "consistency",
      "appliesTo": [
        "ecommerce",
        "lodging",
        "service"
      ],
      "title": {
        "en": "Currency and language",
        "tr": "Para birimi ve dil"
      },
      "requirement": {
        "en": "priceCurrency is an ISO 4217 code (e.g. USD) and <html lang> matches the page language.",
        "tr": "priceCurrency ISO 4217 kodudur (ör. TRY) ve <html lang> sayfanın diliyle aynıdır."
      },
      "requirementHomepage": {
        "en": "<html lang> matches the page language; where prices are shown, the currency is an ISO 4217 code (e.g. USD).",
        "tr": "<html lang> sayfanın diliyle aynıdır; fiyat gösteriliyorsa para birimi ISO 4217 kodudur (ör. TRY)."
      },
      "test": {
        "en": "We compare the price currency with the domain’s market (e.g. .com.tr → TRY) and the page language (<html lang>) with the market’s language. A mismatched currency fails; a missing or different language tag is a partial pass.",
        "tr": "Fiyatın para birimi alan adının pazarıyla (ör. .com.tr → TRY) ve sayfa dili (<html lang>) pazarın diliyle karşılaştırılır. Para birimi uyuşmazsa düşer; dil etiketi yoksa ya da farklıysa kısmen geçer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/market-match/",
        "tr": "https://specoria.com/tr/yontem/kontroller/market-match/"
      }
    },
    {
      "id": "SC-CONSISTENCY-04",
      "check": "policy_match",
      "area": "CONSISTENCY",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "consistency",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Return window consistency",
        "tr": "İade süresi tutarlılığı"
      },
      "requirement": {
        "en": "The return window in structured data equals the one on the returns page.",
        "tr": "Yapısal verideki iade süresi iade sayfasındaki süreyle aynıdır."
      },
      "test": {
        "en": "We compare the return window in structured data with the one on the returns page. Equal passes, different fails; if either is missing there’s nothing to compare and it isn’t counted.",
        "tr": "Yapısal verideki iade süresi ile iade sayfasındaki süre karşılaştırılır. Eşitse geçer, farklıysa düşer; ikisinden biri yoksa karşılaştırılacak veri olmadığı için hesaba girmez."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/policy-match/",
        "tr": "https://specoria.com/tr/yontem/kontroller/policy-match/"
      }
    },
    {
      "id": "SC-CONSISTENCY-05",
      "check": "price_transparency",
      "area": "CONSISTENCY",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "consistency",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Taxes-included wording",
        "tr": "Vergi dahil fiyat ibaresi"
      },
      "requirement": {
        "en": "The price states that taxes are included, and shipping cost is visible before the cart.",
        "tr": "Fiyatın vergiler dahil olduğu fiyatın yanında yazar; kargo ücreti sepetten önce görünür."
      },
      "test": {
        "en": "For Türkiye, EU countries, the UK, Switzerland, Australia and New Zealand we look for a “VAT included” style phrase in the product page and homepage text. Present passes, absent fails; other markets are not applicable.",
        "tr": "Türkiye, AB ülkeleri, Birleşik Krallık, İsviçre, Avustralya ve Yeni Zelanda pazarlarında ürün sayfası ve ana sayfa metninde “KDV dahil” / “incl. VAT” benzeri ifade aranır. Varsa geçer, yoksa düşer; diğer pazarlarda geçerli değildir."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/price-transparency/",
        "tr": "https://specoria.com/tr/yontem/kontroller/price-transparency/"
      }
    },
    {
      "id": "SC-CART-02",
      "check": "add_to_cart",
      "area": "CART",
      "level": "SHOULD",
      "weight": 5,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Add-to-cart button in the initial HTML",
        "tr": "Sepete ekle düğmesi ilk HTML’de"
      },
      "requirement": {
        "en": "Add to cart is a real <button> or form in the initial HTML.",
        "tr": "Sepete ekleme gerçek bir <button> ya da form ile ilk HTML’de bulunur."
      },
      "test": {
        "en": "We look for an add-to-cart signal in the product page’s initial HTML: a cart form, cart attributes or “Add to cart” text. Present passes, absent fails.",
        "tr": "Ürün sayfasının ilk HTML’inde sepete ekleme işareti aranır: sepet formu, sepet öznitelikleri ya da “Sepete ekle” / “Add to cart” metni. Varsa geçer, yoksa düşer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/add-to-cart/",
        "tr": "https://specoria.com/tr/yontem/kontroller/add-to-cart/"
      }
    },
    {
      "id": "SC-CART-03",
      "check": "cart_accessible",
      "area": "CART",
      "level": "SHOULD",
      "weight": 3,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Is the cart button accessible?",
        "tr": "Sepet düğmesi erişilebilir mi?"
      },
      "requirement": {
        "en": "The button is a <button> or form submit with visible text or an aria-label.",
        "tr": "Düğme <button> ya da form gönderimidir ve görünür metni ya da aria-label’ı vardır."
      },
      "test": {
        "en": "If add-to-cart was found, we check whether it’s a real button or form and whether it has a readable name (text or aria-label). Both pass, one is a partial pass, neither fails.",
        "tr": "Sepete ekleme bulunduysa gerçek bir düğme ya da form mu ve okunabilir bir adı (metin ya da aria-label) var mı diye bakılır. İkisi varsa geçer, biri varsa kısmen geçer, ikisi de yoksa düşer."
      },
      "references": [
        {
          "label": "WAI-ARIA: button pattern",
          "url": "https://www.w3.org/WAI/ARIA/apg/patterns/button/"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/cart-accessible/",
        "tr": "https://specoria.com/tr/yontem/kontroller/cart-accessible/"
      }
    },
    {
      "id": "SC-CHECKOUT-01",
      "check": "guest_checkout",
      "area": "CHECKOUT",
      "level": "SHOULD",
      "weight": 4,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Buying without an account",
        "tr": "Üye olmadan satın alma"
      },
      "requirement": {
        "en": "Guest checkout is on; few steps, no pop-ups or forced newsletter sign-ups.",
        "tr": "Hesap açmadan satın alma (misafir checkout) açıktır; adım sayısı az, pop-up ve zorunlu bülten kaydı yoktur."
      },
      "test": {
        "en": "Guest checkout can’t be seen from outside without a browser; in the free test it’s always not verifiable and doesn’t count. The deep audit report measures it with a real browser.",
        "tr": "Misafir ödeme dışarıdan, tarayıcı olmadan görülemez; ücretsiz testte her zaman doğrulanamadı olur ve puana girmez. Derin denetim raporu bunu gerçek bir tarayıcıyla ölçer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/guest-checkout/",
        "tr": "https://specoria.com/tr/yontem/kontroller/guest-checkout/"
      }
    },
    {
      "id": "SC-CHECKOUT-02",
      "check": "order_tracking",
      "area": "CHECKOUT",
      "level": "SHOULD",
      "weight": 2,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Order tracking",
        "tr": "Sipariş takibi"
      },
      "requirement": {
        "en": "A guest order tracking page (order number + email) and a carrier tracking link are available.",
        "tr": "Girişsiz sipariş takip sayfası (sipariş no + e-posta) ve kargo takip bağlantısı vardır."
      },
      "test": {
        "en": "We look for an order-tracking link that works without signing in (e.g. “Track order”) among the homepage and product page links. Present passes, absent fails.",
        "tr": "Ana sayfa ve ürün sayfası bağlantılarında girişsiz sipariş takibi (ör. “Sipariş takibi”, “Track order”) aranır. Varsa geçer, yoksa düşer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/order-tracking/",
        "tr": "https://specoria.com/tr/yontem/kontroller/order-tracking/"
      }
    },
    {
      "id": "SC-CART-01",
      "check": "site_search",
      "area": "CART",
      "level": "SHOULD",
      "weight": 1,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "ecommerce"
      ],
      "title": {
        "en": "Site search that works by URL",
        "tr": "Adresle çalışan site içi arama"
      },
      "requirement": {
        "en": "Search submits a GET form to a URL parameter; WebSite data declares a SearchAction.",
        "tr": "Arama GET formuyla adres parametresine yazılır; WebSite verisinde SearchAction tanımlıdır."
      },
      "test": {
        "en": "We look for search that works through a URL parameter on the homepage: a SearchAction in structured data or a search form sent with GET (q, s, search…). A script-only search box is a partial pass; no search fails.",
        "tr": "Ana sayfada adres parametresiyle çalışan arama aranır: yapısal veride SearchAction ya da GET ile gönderilen bir arama formu (q, s, search…). Yalnızca betikle çalışan bir arama kutusu kısmen geçer; arama yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/SearchAction",
          "url": "https://schema.org/SearchAction"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/site-search/",
        "tr": "https://specoria.com/tr/yontem/kontroller/site-search/"
      }
    },
    {
      "id": "SC-HOTEL-01",
      "check": "lodging_schema",
      "area": "HOTEL",
      "level": "SHOULD",
      "weight": 18,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "lodging"
      ],
      "title": {
        "en": "Hotel structured data (Hotel / LodgingBusiness)",
        "tr": "Otel yapısal verisi (Hotel / LodgingBusiness)"
      },
      "requirement": {
        "en": "The homepage carries one Hotel (or Resort, BedAndBreakfast…) node with name, address, geo coordinates, phone, star rating and check-in/check-out times.",
        "tr": "Ana sayfada ad, adres, koordinat, telefon, yıldız ve giriş/çıkış saatlerini taşıyan tek bir Hotel (ya da Resort, BedAndBreakfast…) düğümü vardır."
      },
      "test": {
        "en": "We look for Hotel / LodgingBusiness structured data on the homepage and count seven fields: name, address, location, phone, star rating, check-in and check-out time. All pass, no data fails, anything in between is scored in proportion.",
        "tr": "Ana sayfada Hotel / LodgingBusiness yapısal verisi aranır ve yedi alan sayılır: ad, adres, konum, telefon, yıldız, giriş ve çıkış saati. Hepsi varsa geçer, veri yoksa düşer, arada kalan oranla puanlanır."
      },
      "references": [
        {
          "label": "schema.org/Hotel",
          "url": "https://schema.org/Hotel"
        },
        {
          "label": "schema.org/LodgingBusiness",
          "url": "https://schema.org/LodgingBusiness"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/lodging-schema/",
        "tr": "https://specoria.com/tr/yontem/kontroller/lodging-schema/"
      }
    },
    {
      "id": "SC-HOTEL-02",
      "check": "lodging_amenities",
      "area": "HOTEL",
      "level": "SHOULD",
      "weight": 8,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "lodging"
      ],
      "title": {
        "en": "Amenities in structured data",
        "tr": "Olanaklar yapısal veride"
      },
      "requirement": {
        "en": "Every amenity a guest might filter on is listed as a LocationFeatureSpecification (name + value: true).",
        "tr": "Misafirin süzebileceği her olanak LocationFeatureSpecification (name + value: true) olarak listelenir."
      },
      "test": {
        "en": "We look for amenities (amenityFeature) in the hotel or room data. Present passes; amenities mentioned only in text (pool, breakfast, parking…) are a partial pass; nothing fails.",
        "tr": "Otel ya da oda verisinde olanaklar (amenityFeature) aranır. Varsa geçer; olanaklar yalnızca metinde geçiyorsa (havuz, kahvaltı, otopark…) kısmen geçer; hiç yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/LocationFeatureSpecification",
          "url": "https://schema.org/LocationFeatureSpecification"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/lodging-amenities/",
        "tr": "https://specoria.com/tr/yontem/kontroller/lodging-amenities/"
      }
    },
    {
      "id": "SC-HOTEL-03",
      "check": "room_offers",
      "area": "HOTEL",
      "level": "SHOULD",
      "weight": 15,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "lodging"
      ],
      "title": {
        "en": "Rooms and prices readable",
        "tr": "Odalar ve fiyatlar okunuyor mu?"
      },
      "requirement": {
        "en": "Each room type is a HotelRoom with occupancy and bed details, offered through an Offer with a “from” price and currency.",
        "tr": "Her oda tipi kapasite ve yatak bilgisiyle bir HotelRoom’dur ve “başlayan fiyat” ile para birimi taşıyan bir Offer’la sunulur."
      },
      "test": {
        "en": "We look for room types (HotelRoom, Suite…) and priced offers in the homepage structured data. Both pass, one is a partial pass, neither fails.",
        "tr": "Ana sayfa yapısal verisinde oda tipleri (HotelRoom, Suite…) ve fiyatlı teklif aranır. İkisi varsa geçer, biri varsa kısmen geçer, ikisi de yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/HotelRoom",
          "url": "https://schema.org/HotelRoom"
        },
        {
          "label": "schema.org/Offer",
          "url": "https://schema.org/Offer"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/room-offers/",
        "tr": "https://specoria.com/tr/yontem/kontroller/room-offers/"
      }
    },
    {
      "id": "SC-HOTEL-04",
      "check": "cancellation_policy",
      "area": "HOTEL",
      "level": "SHOULD",
      "weight": 12,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "lodging"
      ],
      "title": {
        "en": "Cancellation policy discoverable",
        "tr": "İptal koşulları bulunabiliyor mu?"
      },
      "requirement": {
        "en": "A plain-text cancellation policy page (deadline, fees, no-show) linked from every page.",
        "tr": "Her sayfadan bağlanan, düz metin bir iptal koşulları sayfası (son iptal tarihi, ücret, gelmeme durumu)."
      },
      "test": {
        "en": "We look for a link to the cancellation or booking terms on the homepage; found passes. Terms mentioned only in text are a partial pass, nothing fails. The linked page isn’t opened.",
        "tr": "Ana sayfada iptal ya da rezervasyon koşullarına giden bir bağlantı aranır; bulunursa geçer. Koşullar yalnızca metinde geçiyorsa kısmen geçer, hiç yoksa düşer. Bağlantı verilen sayfa açılmaz."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/cancellation-policy/",
        "tr": "https://specoria.com/tr/yontem/kontroller/cancellation-policy/"
      }
    },
    {
      "id": "SC-HOTEL-05",
      "check": "booking_entry",
      "area": "HOTEL",
      "level": "SHOULD",
      "weight": 20,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "lodging"
      ],
      "title": {
        "en": "Booking entry point reachable",
        "tr": "Rezervasyon girişine ulaşılıyor mu?"
      },
      "requirement": {
        "en": "A plain <a href> to the booking engine (with dates as URL parameters if possible) or a GET form with check-in/check-out fields.",
        "tr": "Rezervasyon motoruna giden düz bir <a href> (mümkünse tarihler adres parametresi olarak) ya da giriş/çıkış alanlı bir GET formu."
      },
      "test": {
        "en": "We look for a real form with check-in/check-out dates, or a link to booking, on the homepage; found passes. A booking engine that only shows up in scripts is a partial pass; neither fails.",
        "tr": "Ana sayfada giriş/çıkış tarihli gerçek bir form ya da rezervasyona giden bir bağlantı aranır; bulunursa geçer. Rezervasyon motoru yalnızca betikte görünüyorsa kısmen geçer, hiçbiri yoksa düşer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/booking-entry/",
        "tr": "https://specoria.com/tr/yontem/kontroller/booking-entry/"
      }
    },
    {
      "id": "SC-SERVICE-01",
      "check": "service_org",
      "area": "SERVICE",
      "level": "SHOULD",
      "weight": 18,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "service"
      ],
      "title": {
        "en": "Business structured data (Organization / ProfessionalService)",
        "tr": "İşletme yapısal verisi (Organization / ProfessionalService)"
      },
      "requirement": {
        "en": "One ProfessionalService (or Organization / LocalBusiness) node with name, contact details, address and the area served.",
        "tr": "Ad, iletişim bilgisi, adres ve hizmet bölgesini taşıyan tek bir ProfessionalService (ya da Organization / LocalBusiness) düğümü."
      },
      "test": {
        "en": "We look for business structured data (Organization, LocalBusiness, ProfessionalService…) on the homepage and count three fields: name, contact (phone or email) and area served (areaServed). All pass, no data fails, anything in between is scored in proportion.",
        "tr": "Ana sayfada işletme yapısal verisi (Organization, LocalBusiness, ProfessionalService…) aranır ve üç alan sayılır: ad, iletişim (telefon ya da e-posta) ve hizmet bölgesi (areaServed). Hepsi varsa geçer, veri yoksa düşer, arada kalan oranla puanlanır."
      },
      "references": [
        {
          "label": "schema.org/LocalBusiness",
          "url": "https://schema.org/LocalBusiness"
        },
        {
          "label": "schema.org/ProfessionalService",
          "url": "https://schema.org/ProfessionalService"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/service-org/",
        "tr": "https://specoria.com/tr/yontem/kontroller/service-org/"
      }
    },
    {
      "id": "SC-SERVICE-02",
      "check": "service_pages",
      "area": "SERVICE",
      "level": "SHOULD",
      "weight": 15,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "service"
      ],
      "title": {
        "en": "Services described",
        "tr": "Hizmetler tanımlı mı?"
      },
      "requirement": {
        "en": "One page per service, linked from the homepage, each with Service data pointing to your organization.",
        "tr": "Her hizmet için ana sayfadan bağlanan bir sayfa ve kurumunuza bağlanan Service verisi."
      },
      "test": {
        "en": "We look for Service definitions in structured data or links to service pages on the homepage (“Our services”, /services…). Either passes, neither fails.",
        "tr": "Yapısal veride Service tanımı ya da ana sayfada hizmet sayfalarına giden bağlantılar (“Hizmetlerimiz”, /services…) aranır. Biri varsa geçer, yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/Service",
          "url": "https://schema.org/Service"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/service-pages/",
        "tr": "https://specoria.com/tr/yontem/kontroller/service-pages/"
      }
    },
    {
      "id": "SC-SERVICE-03",
      "check": "pricing_info",
      "area": "SERVICE",
      "level": "SHOULD",
      "weight": 10,
      "critical": false,
      "category": "product",
      "appliesTo": [
        "service"
      ],
      "title": {
        "en": "Pricing or “how it works” discoverable",
        "tr": "Fiyat ya da “nasıl çalışır” bilgisi bulunabiliyor mu?"
      },
      "requirement": {
        "en": "A pricing or packages page (starting prices are enough) and a short “how it works” section, both linked from the homepage.",
        "tr": "Ana sayfadan bağlanan bir fiyat ya da paket sayfası (başlangıç fiyatı yeterli) ve kısa bir “nasıl çalışır” bölümü."
      },
      "test": {
        "en": "We look for pricing or “how it works” information: a link to a pricing page, a price in structured data or an amount in the homepage text. Any of them passes, none fails.",
        "tr": "Fiyat ya da “nasıl çalışır” bilgisi aranır: sitedeki fiyat sayfasına bağlantı, yapısal veride fiyat ya da ana sayfa metninde tutar. Biri varsa geçer, yoksa düşer."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/pricing-info/",
        "tr": "https://specoria.com/tr/yontem/kontroller/pricing-info/"
      }
    },
    {
      "id": "SC-SERVICE-04",
      "check": "contact_details",
      "area": "SERVICE",
      "level": "SHOULD",
      "weight": 12,
      "critical": false,
      "category": "policy",
      "appliesTo": [
        "service"
      ],
      "title": {
        "en": "Contact details readable",
        "tr": "İletişim bilgisi okunuyor mu?"
      },
      "requirement": {
        "en": "Email and phone are plain text with mailto:/tel: links in the header or footer of every page.",
        "tr": "E-posta ve telefon her sayfanın üst ya da alt bölümünde düz metin ve mailto:/tel: bağlantısı olarak bulunur."
      },
      "test": {
        "en": "We look for an email address and a phone number on the homepage (link, text or structured data). Both pass, one is a partial pass, neither fails.",
        "tr": "Ana sayfada e-posta ve telefon aranır (bağlantı, metin ya da yapısal veri). İkisi varsa geçer, biri varsa kısmen geçer, ikisi de yoksa düşer."
      },
      "references": [
        {
          "label": "schema.org/ContactPoint",
          "url": "https://schema.org/ContactPoint"
        }
      ],
      "checkPage": {
        "en": "https://specoria.com/method/checks/contact-details/",
        "tr": "https://specoria.com/tr/yontem/kontroller/contact-details/"
      }
    },
    {
      "id": "SC-SERVICE-05",
      "check": "contact_form",
      "area": "SERVICE",
      "level": "SHOULD",
      "weight": 18,
      "critical": false,
      "category": "action",
      "appliesTo": [
        "service"
      ],
      "title": {
        "en": "Contact or quote form within one click",
        "tr": "İletişim ya da teklif formu bir tık uzakta mı?"
      },
      "requirement": {
        "en": "A plain HTML form (name, email, message) reachable in one click from the homepage, with clearly labelled fields.",
        "tr": "Ana sayfadan bir tıkla ulaşılan, alanları açıkça etiketli düz bir HTML formu (ad, e-posta, mesaj)."
      },
      "test": {
        "en": "We look for a real contact or quote form (with a text area or an email/phone field) or a link to a contact/quote page on the homepage; found passes. Only an email link is a partial pass; nothing fails. Nothing is ever typed into the form.",
        "tr": "Ana sayfada gerçek bir iletişim ya da teklif formu (metin alanı ya da e-posta/telefon alanı olan) veya iletişim/teklif sayfasına bağlantı aranır; bulunursa geçer. Yalnızca e-posta bağlantısı varsa kısmen geçer, hiçbiri yoksa düşer. Forma hiçbir şey yazılmaz."
      },
      "references": [],
      "checkPage": {
        "en": "https://specoria.com/method/checks/contact-form/",
        "tr": "https://specoria.com/tr/yontem/kontroller/contact-form/"
      }
    }
  ],
  "retired": [],
  "changelog": [
    {
      "version": "1.0",
      "date": "2026-10-08",
      "model": "v2.4",
      "en": "First publication. Every scored check of score model v2.4 gets a stable ID: 27 store checks and 10 hotel and service checks. Requirement levels, weights and tests are those of model v2.4; no rule changed for publication.",
      "tr": "İlk yayın. Skor modeli v2.4’ün puana giren her kontrolü kalıcı bir kimlik aldı: 27 mağaza kontrolü ve 10 otel ve hizmet kontrolü. Güç seviyeleri, ağırlıklar ve testler model v2.4’ünkilerdir; yayın için hiçbir kural değişmedi."
    }
  ]
}
