Product가 상품 그 자체라면 Offer는 그 상품을 사는 조건. 같은 가죽 지갑이라도 — 본사 쇼핑몰 89,000원 / 마켓플레이스 95,000원 / 중고 50,000원 — 각각 별개의 Offer다. 한 상품이 같은 채널에서 가격이 하나면 단일 Offer로, 여럿이면 AggregateOffer로 묶는다.
리치 결과 관점에서 Offer 단독으로는 노출되지 않고 — 반드시 Product·Service·Event 등 상위 타입의 offers 필드에 들어가야 효과가 난다. SERP에서 가격이 빨간 글자로 강조되는 효과나, 재고 없음/매진 임박 표시는 Offer의 availability 값에서 온다.
AI 인용 관점에서 ChatGPT·Perplexity의 쇼핑 답변에서 Offer는 가격·통화·재고의 단일 출처. AI는 본문에서 "89,000원" 같은 텍스트를 추측하지 않고 — Offer 마크업의 price·priceCurrency를 직접 읽는다. 마크업이 최신 가격을 반영하지 않으면 — AI가 옛 가격을 답하고, 사용자가 잘못된 정보로 구매를 결정한다.
가장 흔한 함정: price에 통화 기호·쉼표 포함. "price": "₩89,000"은 Google 파싱에 실패한다. 숫자만 ("price": "89000") + 통화는 priceCurrency로 분리 ("priceCurrency": "KRW"). ISO 4217 통화 코드를 정확히 — KRW·USD·JPY·EUR.
priceValidUntil은 할인 표시의 수명을 결정한다. 할인 가격을 등록할 때 종료일이 없으면 — Google은 영구 가격으로 인식하고, 할인 강조 효과가 사라진다. 반대로 상시가에 priceValidUntil을 넣어두면, 그 날짜가 지난 후에 Google이 가격을 오래된 정보로 무시할 수 있다. 할인일 때만 priceValidUntil을 넣는다.
availability는 반드시 schema.org URL 형식. "InStock" 같은 단순 문자열이 아니라 "https://schema.org/InStock". 자주 쓰는 값: InStock·OutOfStock·PreOrder·Discontinued·LimitedAvailability. 재고가 바뀔 때마다 이 값을 동기화해야 SERP의 재고 없음 표시가 정확하다.