同じProduct schemaでも、出口は2つに分かれます。レビュー情報を中心に扱うProduct snippet(商品スニペット)と、実際に購入できる商品ページ向けのMerchant listing(マーチャントリスティング)です。求められる必須プロパティが違うため、どちらを狙うかを決めないまま書き始めると要件を満たせません。本記事は、schema.orgとGoogle公式ドキュメントにもとづき、2つの機能の違いから実装テンプレートまでを整理します。

01この記事でわかること

  • Product snippetとMerchant listingという2つの機能の違い
  • name・offers・review・aggregateRatingそれぞれの必須・推奨区分
  • Offer型のprice・priceCurrency・availabilityの正しい書き方
  • 在庫・価格が変わるページ特有の、公開後の更新運用
  • AI検索での商品ページ引用と、この実装の関係

02結論サマリー

先に決めるべきは、書き方ではなく狙う出口です。Merchant listingは「販売者が自ら直接販売していること」が前提で、Product snippetにはその制約がありません。この分岐で必須プロパティが変わります。

nameは両機能に共通の必須プロパティです。Product snippetでは、これに加えてreview・aggregateRating・offersのいずれか1つ以上が必須になります。本記事のテンプレートを使えば、この必須条件を満たす実装からすぐに着手できます。

03Product schemaとは(基礎定義)

schema.orgの定義では、Product型は「提供される商品またはサービス」を表す型です(出典: schema.org/Product)。靴やコンサートチケット、車のレンタルなど、幅広い商品・サービスが対象になります。

Google公式ドキュメントは、Product構造化データを2つの機能に分けて説明しています。Product snippetは、直接購入できないページも含めレビュー情報を中心に扱います。Merchant listingは、実際に購入できる商品ページ向けで、配送やサイズ情報にも対応します(出典: Google Search Central「商品構造化データ」)。

04必須プロパティ|2機能で異なる要件を表で比較

Product snippetの必須プロパティは、nameと「review・aggregateRating・offersのいずれか1つ以上」です。出典はGoogle Search Central「Product snippet構造化データ」です。Merchant listingでは要件が増えます。name・image・offersが必須となり、offers内のprice・priceCurrencyも必須です。

プロパティProduct snippetMerchant listing
name必須必須
review/aggregateRating/offersいずれか1つ以上必須offers(Offer型)が必須
offers.priceoffersを使う場合は必須必須(0より大きい値)
offers.priceCurrency推奨必須
image推奨必須

Merchant listingは「販売者が直接販売すること」が前提条件です。Product snippetにはこの制約がなく、レビューだけを掲載する編集記事的なページにも使えます。

05実装テンプレート|単一商品ページのJSON-LD

以下は、単一商品を販売するECサイトの商品ページを想定したテンプレートです。

{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "商品名をここに入力",
  "image": [
    "https://sample.example.com/images/product-main.jpg"
  ],
  "description": "商品説明文をここに入力",
  "sku": "SAMPLE-0001",
  "brand": {
    "@type": "Brand",
    "name": "ブランド名"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://sample.example.com/products/0001",
    "priceCurrency": "JPY",
    "price": "9800",
    "availability": "https://schema.org/InStock"
  },
  "aggregateRating": {
    "@type": "AggregateRating",
    "ratingValue": "4.5",
    "reviewCount": "120"
  }
}

offersはOffer型を入れ子にし、price・priceCurrency・availabilityを記述します。availabilityの値は、schema.orgが定義する列挙値から選ぶ必要があります。InStock・OutOfStock・PreOrderなど12種類が定義されています(出典: schema.org/ItemAvailability)。

商品の売り手情報を補強したい場合は、別記事『Organization schemaの書き方|企業情報の伝え方』のsellerプロパティ実装例もあわせて参照してください。記事ページとの実装の違いは、別記事『Article・BlogPosting schemaの書き方ガイド』で解説しています。

06在庫状況を示すavailabilityの選択肢

availabilityプロパティは、商品の在庫状況を示す項目です。schema.orgは12種類の列挙値を定義しています。以下は、そのうちECサイトで使用頻度が高い6種です。

意味
InStock在庫あり
OutOfStock在庫切れ
PreOrder予約受付中
BackOrder取り寄せ中
Discontinued販売終了
LimitedAvailability在庫が限られている

在庫状況が変わった際は、availabilityの値も忘れずに更新する必要があります。表示上は在庫切れなのに、構造化データがInStockのままというズレは、ガイドライン違反にあたります。

07AI検索での商品ページ引用との関係

Product schemaを実装すればAI検索に引用されやすくなる、という因果関係は現時点で証明されていません。SSRNで公開された検証論文では、構造化データの有無とAI引用の関連が交絡要因の補正後に統計的に消えています。詳細は別記事『Schema markupとAI引用の相関|SSRN論文検証』で解説しています。

ただし商品ページには、他ジャンルにない事情があります。価格・在庫という、時間とともに変わる情報を扱う点です。古い価格や在庫がAIに引かれる事故は、引用されるかどうか以前の実害になります。

EC事業者が引用条件そのものを整理したい場合は、別記事『EC事業者のPerplexity対策|商品ページ引用の条件整理』をあわせてご覧ください。

08実装後の検証と、価格・在庫の更新運用

商品ページの構造化データは、1回書いて終わりにならない点が記事ページとの最大の違いです。まず公開前にリッチリザルトテスト(search.google.com/test/rich-results)へURLまたはコードを入力し、検出された型とエラー・警告を確認します。検証ツールの詳しい使い方は、別記事『構造化データのテスト・検証ツールの使い方|旧ツールとの違いも解説』で解説しています。

検証を通過したあと、実務で崩れるのは次の3か所です。

崩れる箇所起きること確認方法
priceセール価格が表示だけ変わり、構造化データは通常価格のままセール中の商品ページで表示価格とJSON-LDの値を突合する
availability在庫切れ表示なのにInStockが残る在庫切れ商品を1点選び、JSON-LDのavailabilityを確認する
aggregateRatingレビュー削除後も件数・評点が更新されないレビュー数が変動した商品で値の追随を確認する

在庫と価格は、商品マスタから構造化データを自動生成する設計にしておくのが基本です。手作業で構造化データだけを更新する運用は、商品点数が増えた時点で更新漏れが避けられなくなります。

なお、JavaScriptで動的にマークアップを生成している場合、Google公式ドキュメントは「Shoppingのクロール頻度と信頼性が下がる可能性がある」と注意を促しています。自動生成にする場合も、サーバー側で出力する方式を優先してください。

09チェックリスト

  • nameと、review・aggregateRating・offersのいずれか1つ以上を実装している
  • offers.price・offers.priceCurrencyを正しい形式で記述している
  • availabilityの値をschema.orgの列挙値から選び、在庫の実態と一致させている
  • Merchant listingを狙う場合、priceが0より大きい値になっている
  • マークアップの内容がページの表示情報と一致している
  • price・availabilityを商品マスタから自動生成する設計になっている
  • リッチリザルトテストでエラー・警告がないことを確認している

10よくある失敗

在庫切れなのにavailabilityを更新し忘れる。構造化データの一般ガイドラインは、マークアップの内容をページの実際の表示情報と一致させることを求めています。在庫切れページにはOutOfStockを反映させる必要があります。

priceCurrencyを省略してしまう。Product snippetでは推奨にとどまりますが、Merchant listingでは必須です。海外向け販売がなくても、明記しておくことをおすすめします。

JavaScriptだけでマークアップを生成してしまう。Google公式ドキュメントは、動的生成がShoppingのクロール頻度・信頼性を下げる可能性があると注意しています。

11FAQ

Q. Product snippetとMerchant listingは、両方実装する必要がありますか?

Google公式ドキュメントは「両方の機能を確認してから選ぶ」ことを推奨しています。実際に商品を販売しているページなら、Merchant listingの要件を満たす実装を優先することをおすすめします。

Q. offersを複数の販売者ぶん記述したい場合はどうすればいいですか?

単一のOffer型ではなく、AggregateOffer型を使います。lowPrice・highPrice・offerCountなど、複数オファーの集計値を記述できます。

Q. availabilityに独自の文言を書いてもいいですか?

推奨されません。schema.orgが定義するInStock・OutOfStockなどの列挙値から選ぶ必要があります。

Q. レビューがまだ1件もない商品ページはどうすればいいですか?

review・aggregateRatingが無い場合でも、offersを実装していれば必須条件は満たせます。存在しないレビューを作成することは避けてください。

12まとめ

Product schemaとは、商品名・価格・在庫状況を伝える構造化データです。nameを基本に、review・aggregateRating・offersのいずれかを組み合わせる必須条件を押さえておきましょう。

Merchant listingを狙う場合は、priceCurrencyや0より大きいpriceなど、追加の要件も満たす必要があります。そして商品ページの構造化データは、実装した瞬間から実態とずれ始めます。まずは在庫切れの商品を1点開き、JSON-LDのavailabilityがOutOfStockになっているかを確認してみてください。