同じ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 snippet | Merchant listing |
|---|---|---|
| name | 必須 | 必須 |
| review/aggregateRating/offers | いずれか1つ以上必須 | offers(Offer型)が必須 |
| offers.price | offersを使う場合は必須 | 必須(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になっているかを確認してみてください。