Auditoria grátis
Dados estruturados

Erro "offers", "review" ou "aggregateRating" no Product: o que é crítico, o que é aviso e como corrigir

As mensagens de dados estruturados de produto explicadas uma a uma, com o JSON-LD completo, a correção na Shopify, no WooCommerce e no Next.js e o passo a passo da validação.

Equipe VarridaAtualizado em 14 min de leitura

Peça pra sua IA ler este artigo por você.

Janela de navegador translúcida com o símbolo de código em âmbar
Neste artigo
  1. As mensagens, uma por uma
  2. Erro crítico x aviso: o que muda na prática
  3. Snippet de produto x listagem do comerciante
  4. Por que o erro aparece
  5. Quando a página não deveria ter Product
  6. JSON-LD completo e válido
  7. Frete e devolução sem repetir em cada produto
  8. Correção por plataforma
  9. Como validar e pedir a validação
  10. Checklist
  11. Perguntas frequentes

Resposta curta

A mensagem sobre offers, review ou aggregateRating é um erro crítico: o Google exige que todo Product tenha pelo menos um desses três campos pra virar snippet de produto. Na loja, a correção quase sempre é colocar um offers com price e priceCurrency. Se a página não vende nem avalia um produto específico (categoria, serviço, página institucional), o certo é tirar o Product dali. Já shippingDetails, hasMerchantReturnPolicy, priceValidUntil, brand e gtin são recomendados: geram aviso, não tiram o resultado aprimorado. A exceção é image, que é obrigatório nas listagens do comerciante.

As mensagens, uma por uma

A lista oficial de mensagens do Google traz os problemas em forma de modelo, com o nome da propriedade entre aspas. No relatório do Search Console e no Teste de pesquisa aprimorada, as que você provavelmente colou aparecem assim:

A mensagem aparece comoEm inglêsGravidadeO que falta
Especifique "offers", "review" ou "aggregateRating"Either "offers", "review", or "aggregateRating" should be specifiedCríticoNenhum dos três campos está no Product
Falta o campo "image"Missing field "image"Crítico nas listagens do comercianteFoto do produto
Falta o campo "shippingDetails"Missing field "shippingDetails"Não críticoFrete da oferta
Falta o campo "hasMerchantReturnPolicy"Missing field "hasMerchantReturnPolicy"Não críticoPolítica de devolução
Falta o campo "priceValidUntil"Missing field "priceValidUntil"Não críticoData final do preço
Falta o campo "brand"Missing field "brand"Não críticoMarca
Nenhum identificador global informado (por exemplo, GTIN, MPN ou ISBN)No global identifier provided (e.g., gtin, mpn, isbn)Não críticoCódigo de barras ou código do fabricante

A mesma mensagem de campo ausente também aparece quando o campo existe mas está vazio (""), como explica a página de mensagens de erro do Search Console. Repare se o campo que falta é do Product ou do Offer: shippingDetails, hasMerchantReturnPolicy e priceValidUntil ficam dentro de offers.

Erro crítico x aviso: o que muda na prática

Os relatórios de pesquisa aprimorada separam os problemas em duas tabelas:

  • Por que os itens são inválidos: problemas críticos. Um item inválido "tem pelo menos um problema crítico que impede a exibição dele como uma pesquisa aprimorada". O Google não usa esses dados estruturados.
  • Melhorar o aspecto de itens: problemas não críticos. O item continua válido e pode aparecer como resultado aprimorado. Falta informação que deixaria o resultado mais completo.

A regra por trás é simples: as diretrizes gerais dizem que itens sem alguma propriedade obrigatória não se qualificam para pesquisa aprimorada. Propriedade recomendada ausente vira aviso. Por isso a ordem de trabalho é: zere primeiro a tabela de inválidos, depois decida quais avisos valem o esforço.

Um detalhe da documentação de snippets de produto: mesmo com offers preenchido, o Teste de pesquisa aprimorada pode mostrar um aviso na seção de snippets de produto se não houver review nem aggregateRating. Esse aviso não é erro. Se a sua loja não tem avaliações reais de clientes, deixe ele lá: inventar avaliação é contra as diretrizes.

Snippet de produto x listagem do comerciante

O mesmo Product é lido por duas experiências diferentes, com regras diferentes. É isso que explica por que um campo é obrigatório num relatório e opcional no outro.

Snippets de produtoInformações de produtos do comerciante
Pra que páginaPáginas de produto sem venda direta, como avaliação de produto e agregador de comprasOnde o comprador adquire o produto no próprio site
Obrigatórioname + um de review, aggregateRating ou offersname, image, offers (com price e priceCurrency)
Tipo de ofertaOffer ou AggregateOfferSó Offer, porque você precisa ser o vendedor
PreçoPode ser zeroPrecisa ser maior que zero
RecomendadoaggregateRating, review, offers, priceValidUntil, availabilitybrand, gtin, availability, itemCondition, priceValidUntil, shippingDetails, hasMerchantReturnPolicy e outros
Relatório no Search ConsoleSnippets de produtoInformações de produtos do comerciante

No Search Console, os dois relatórios ficam em Compras, no menu lateral. A documentação explica que o relatório de informações de produtos do comerciante já inclui as verificações de snippet de produto pras páginas com Offer. Então, numa loja, o relatório de snippets só precisa ser olhado pras páginas que não são de venda.

A regra que derruba muita página: só páginas onde o comprador pode adquirir o produto entram nas listagens do comerciante. Página que só leva pra outra loja não se qualifica.

Por que o erro aparece

O erro de offers, review ou aggregateRating quase sempre tem uma destas causas:

  1. O tema ou plugin gera Product sem oferta. Acontece em produto "sob consulta", sem preço cadastrado, ou quando o preço vem por JavaScript depois da página carregar e o bloco JSON-LD sai do servidor sem ele.
  2. Exemplo copiado pela metade. O guia de JSON-LD do Next.js, por exemplo, mostra um Product só com name, image e description. É um exemplo de como inserir o script, não de marcação completa: publicado assim, ele gera exatamente esse erro.
  3. Product numa página que não é de produto. Categoria, vitrine, página de serviço, landing page de campanha. Aqui a correção não é completar o bloco, é removê-lo.
  4. Variação mal montada. Produto com tamanhos ou cores em que a oferta ficou só em algumas variações. O Google tem uma documentação própria pra variantes de produto (ProductGroup).

Quando a página não deveria ter Product

As diretrizes técnicas de produto dizem que a pesquisa aprimorada de produtos é compatível só com páginas que se concentram em um único produto (ou nas variantes dele). O exemplo do próprio Google: "sapatos da nossa loja" não é um produto específico. A recomendação é priorizar a marcação nas páginas de produto, não nas que listam produtos ou uma categoria.

  • Página de categoria ou de busca interna. Não marque a lista inteira como um Product, nem coloque dezenas de Product sem oferta. Quem deve ter Product é a página de cada item.
  • Página de serviço (consultoria, curso presencial, conserto). A documentação de produto não trata de serviço, e as diretrizes gerais pedem que os dados estruturados sejam "uma representação verdadeira do conteúdo da página". Se não existe um produto com preço à venda nem avaliações reais de usuários, não há o que colocar em offers ou review sem forçar. Tire o Product.
  • Avaliação da própria empresa. Páginas com LocalBusiness ou Organization não se qualificam pras estrelas quando a empresa controla as avaliações sobre si mesma, inclusive via widget de terceiros. Trocar o tipo pra Product pra ganhar estrela não resolve e fere a regra de relevância.

Remover a marcação errada é uma correção válida. Depois, peça a validação no relatório, como mostrado no fim deste artigo.

JSON-LD completo e válido

Este bloco segue os campos da documentação de listagens do comerciante, adaptado pra uma loja brasileira (valores em reais, país BR). Ele resolve todas as mensagens da tabela do começo de uma vez:

JSON
{
  "@context": "https://schema.org",
  "@type": "Product",
  "name": "Tênis de corrida Leve 2, azul",
  "description": "Tênis de corrida com cabedal em malha e solado de borracha.",
  "image": [
    "https://www.sualoja.com.br/img/leve-2-azul-1x1.jpg",
    "https://www.sualoja.com.br/img/leve-2-azul-4x3.jpg",
    "https://www.sualoja.com.br/img/leve-2-azul-16x9.jpg"
  ],
  "sku": "LEVE2-AZ-42",
  "gtin13": "7890000000000",
  "brand": {
    "@type": "Brand",
    "name": "Sua Marca"
  },
  "offers": {
    "@type": "Offer",
    "url": "https://www.sualoja.com.br/tenis-leve-2-azul",
    "price": 299.90,
    "priceCurrency": "BRL",
    "priceValidUntil": "2026-12-31",
    "availability": "https://schema.org/InStock",
    "itemCondition": "https://schema.org/NewCondition",
    "shippingDetails": {
      "@type": "OfferShippingDetails",
      "shippingRate": {
        "@type": "MonetaryAmount",
        "value": 19.90,
        "currency": "BRL"
      },
      "shippingDestination": {
        "@type": "DefinedRegion",
        "addressCountry": "BR"
      },
      "deliveryTime": {
        "@type": "ShippingDeliveryTime",
        "handlingTime": {
          "@type": "QuantitativeValue",
          "minValue": 0,
          "maxValue": 1,
          "unitCode": "DAY"
        },
        "transitTime": {
          "@type": "QuantitativeValue",
          "minValue": 2,
          "maxValue": 7,
          "unitCode": "DAY"
        }
      }
    },
    "hasMerchantReturnPolicy": {
      "@type": "MerchantReturnPolicy",
      "applicableCountry": "BR",
      "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
      "merchantReturnDays": 30,
      "returnMethod": "https://schema.org/ReturnByMail",
      "returnFees": "https://schema.org/FreeReturn"
    }
  }
}

Ponha esse JSON dentro de um <script type="application/ld+json"> na página do produto. O GTIN do exemplo é fictício: use o código de barras real, só com números (o Google não aceita GTIN em forma de URL) e, se puder, a propriedade mais específica (gtin13 pro código de 13 dígitos) em vez da genérica gtin.

O que cada campo exige

  • image: URLs rastreáveis e indexáveis, que representem o produto marcado. Pra melhores resultados, o Google recomenda várias imagens de alta resolução, com pelo menos 50 mil pixels (largura vezes altura), nas proporções 16x9, 4x3 e 1x1. Pra conferir se o Google acessa a URL da foto, use a Inspeção de URL.
  • price e priceCurrency: preço como número e moeda no formato ISO 4217 de três letras (BRL). Nas listagens do comerciante, maior que zero.
  • priceValidUntil: a data em que o preço deixa de valer, em ISO 8601. A doc define como "se aplicável", e avisa que as informações do produto podem não aparecer se a data já passou. Se o seu preço não tem data pra acabar, esse aviso pode ficar. Se você colocar, mantenha a data no futuro.
  • brand.name: no máximo um nome de marca, dentro de um objeto Brand.
  • shippingDetails: opcional, mas se você incluir, três propriedades viram obrigatórias pra ele valer: shippingRate (com value ou maxValue, mais currency igual à da oferta; frete grátis é 0), shippingDestination (com addressCountry de duas letras) e deliveryTime. Os prazos em handlingTime e transitTime levam minValue, maxValue e unitCode igual a DAY (ou d).
  • hasMerchantReturnPolicy: obrigatórios applicableCountry e returnPolicyCategory. Com MerchantReturnFiniteReturnWindow, merchantReturnDays também passa a ser obrigatório. Se a devolução tem custo pro cliente pago à loja, use returnFees igual a ReturnShippingFees com returnShippingFeesAmount. Com FreeReturn, não inclua returnShippingFeesAmount.

Frete e devolução sem repetir em cada produto

A documentação do Google recomenda declarar a política global de frete e de devolução da empresa uma vez só, no Organization, e usar shippingDetails e hasMerchantReturnPolicy na oferta apenas quando algum produto tem regra diferente. Há três caminhos:

  1. Search Console. Em Configurações > Shopping > Entregas e devoluções, você cadastra uma versão simplificada: tempo de entrega, custo de envio, período e custo da devolução. Precisa ser proprietário ou usuário pleno da propriedade, e não precisa de conta no Merchant Center. Frete é aprovado automaticamente; a política de devolução passa por verificação manual, que pode levar de 10 a 13 dias.
  2. Merchant Center. Se você já tem conta, dá pra definir frete e devolução lá, com mais opções.
  3. Marcação no Organization. Numa página da empresa, com hasShippingService (tipo ShippingService) e hasMerchantReturnPolicy. A oferta pode apontar pra essa política só com o @id:
JSON
{
  "@context": "https://schema.org",
  "@type": "OnlineStore",
  "name": "Sua Loja",
  "url": "https://www.sualoja.com.br",
  "hasMerchantReturnPolicy": {
    "@type": "MerchantReturnPolicy",
    "@id": "https://www.sualoja.com.br/trocas#politica",
    "applicableCountry": "BR",
    "returnPolicyCategory": "https://schema.org/MerchantReturnFiniteReturnWindow",
    "merchantReturnDays": 30,
    "returnMethod": "https://schema.org/ReturnByMail",
    "returnFees": "https://schema.org/FreeReturn"
  }
}

E, no produto: "hasMerchantReturnPolicy": { "@id": "https://www.sualoja.com.br/trocas#politica" }. Pro frete, a referência é "shippingDetails": { "@type": "OfferShippingDetails", "hasShippingService": { "@id": "..." } }.

Quando há mais de uma fonte, vale a mais forte. Pela documentação de frete e de devolução, a ordem é: API Content for Shopping, depois configurações no Merchant Center ou no Search Console, depois marcação no produto, por último marcação no Organization. Se você tem marcação no site e configuração no Search Console, o Google usa só a do Search Console. A documentação não diz se o aviso de campo ausente some do relatório quando a política está configurada fora da marcação; o que ela garante é que o Google usa essas configurações.

Correção por plataforma

Shopify

O JSON-LD de produto vem do tema. O Liquid tem o filtro structured_data, que transforma o objeto product em Product (ou ProductGroup, quando há variações), com offers:

HTML
<script type="application/ld+json">
  {{ product | structured_data }}
</script>
  1. No admin, abra Online Store (Loja virtual), clique no ícone de menu do tema e escolha Edit code (Editar código). A Shopify recomenda duplicar o tema antes de mexer.
  2. Procure por application/ld+json nos arquivos de seção e snippet do produto.
  3. Se o tema monta o JSON à mão e não tem offers, troque pelo filtro acima ou complete o bloco. Se houver dois blocos Product (um do tema, outro de app de avaliações), deixe um.
  4. Pra frete e devolução, o caminho mais simples é cadastrar as políticas no Search Console ou no Merchant Center, em vez de editar o Liquid.

WooCommerce com Yoast ou Rank Math

  • Produto sem preço: sem preço cadastrado, não há o que colocar em offers. Cadastre o preço ou, se o item não é vendido online, não deixe a página marcada como produto à venda.
  • Yoast: a própria Yoast diz que o aviso de hasMerchantReturnPolicy não é erro do site, que o campo é opcional e que, por enquanto, o plugin não gera essa marcação porque o WooCommerce não tem campos estruturados de devolução. Quem quiser adicionar pode usar a Schema API da Yoast. Ou cadastrar a política no Search Console.
  • Rank Math: no PRO, a política no nível da organização se monta em Rank Math SEO > Schema Templates, com o Custom Schema Builder, inserindo no schema da organização. No nível do produto, a base de conhecimento do Rank Math usa o filtro rank_math/snippet/rich_snippet_product_entity no arquivo rank-math.php do tema (e rank_math/json_ld pra produtos variáveis). A marcação no produto prevalece sobre a da organização.
rank-math.php
add_filter( 'rank_math/snippet/rich_snippet_product_entity', function( $entity ) {
    $entity['offers']['hasMerchantReturnPolicy'] = [
        '@type'                => 'MerchantReturnPolicy',
        'applicableCountry'    => 'BR',
        'returnPolicyCategory' => 'https://schema.org/MerchantReturnFiniteReturnWindow',
        'merchantReturnDays'   => 30,
        'returnMethod'         => 'https://schema.org/ReturnByMail',
        'returnFees'           => 'https://schema.org/FreeReturn',
    ];
    return $entity;
} );

Next.js

A recomendação do Next.js é renderizar o JSON-LD como <script> no page.js ou layout.js, trocando < por \u003c pra evitar injeção de HTML. Monte o objeto com os mesmos dados que a página mostra, incluindo a oferta que falta no exemplo da documentação:

app/produtos/[id]/page.tsx
export default async function Page({ params }) {
  const { id } = await params
  const p = await getProduct(id)

  const jsonLd = {
    '@context': 'https://schema.org',
    '@type': 'Product',
    name: p.name,
    image: p.images,
    description: p.description,
    sku: p.sku,
    gtin13: p.gtin,
    brand: { '@type': 'Brand', name: p.brand },
    offers: {
      '@type': 'Offer',
      url: `https://www.sualoja.com.br/produtos/${id}`,
      price: p.price,
      priceCurrency: 'BRL',
      availability: p.inStock ? 'https://schema.org/InStock' : 'https://schema.org/OutOfStock',
      hasMerchantReturnPolicy: { '@id': 'https://www.sualoja.com.br/trocas#politica' },
    },
  }

  return (
    <section>
      <script
        type="application/ld+json"
        dangerouslySetInnerHTML={{ __html: JSON.stringify(jsonLd).replace(/</g, '\\u003c') }}
      />
      {/* ... */}
    </section>
  )
}

Renderize no servidor. A documentação de listagens do comerciante recomenda o Product no HTML inicial e avisa que marcação gerada por JavaScript pode diminuir a quantidade e a qualidade dos rastreamentos do Shopping, um problema pra preço e estoque, que mudam rápido.

Como validar e pedir a validação

1. No Teste de pesquisa aprimorada

  1. Abra search.google.com/test/rich-results. Pra testar antes de publicar, escolha Código em vez de URL, cole o HTML com o bloco e clique em Testar código.
  2. Com a página no ar, teste a URL. O user agent padrão é smartphone. A página precisa estar acessível sem senha nem firewall.
  3. Leia o status: "N itens válidos detectados" ou "N itens válidos com avisos detectados" significa que não há erro crítico. "N itens inválidos detectados" ou "N itens detectados: alguns são inválidos" significa que ainda há problema crítico, como campo obrigatório ausente.
  4. Expanda cada tipo detectado (snippets de produto, listagens do comerciante) e clique na descrição de cada erro ou aviso: a ferramenta abre o código na linha correspondente.

A ferramenta ignora comentários dentro do JSON-LD, mas isso não é padrão: tire os comentários antes de publicar.

2. No terminal

Confira se o bloco sai no HTML do servidor e se tem os campos certos:

Terminal
curl -s https://www.sualoja.com.br/tenis-leve-2-azul \
  | grep -o '"@type": *"[A-Za-z]*"' | sort | uniq -c

curl -s https://www.sualoja.com.br/tenis-leve-2-azul \
  | grep -oE '"(offers|price|priceCurrency|image|shippingDetails|hasMerchantReturnPolicy)"' | sort -u

Se o primeiro comando não mostra Product e Offer, o JSON-LD está sendo criado por JavaScript no navegador. Se mostra Product numa URL de categoria, você achou a causa do erro. A ferramenta grátis Verificar dados estruturados faz essa leitura pra você e lista os blocos de cada página.

3. No Search Console: Validar a correção

  1. Em Compras, abra Informações de produtos do comerciante ou Snippets de produto.
  2. Na tabela Por que os itens são inválidos, clique no problema. Corrija um problema em todas as URLs antes de passar pro próximo; se a causa é o modelo da página, corrigir o modelo resolve todas.
  3. Confirme numa URL de exemplo com Testar URL ativo na Inspeção de URL.
  4. Clique em Validar a correção na página de detalhes do problema.

O Google confere primeiro uma amostra de páginas. Se o erro continua, a validação para; se passou, as outras URLs entram na fila de rastreamento. Os estados são Não iniciado, Iniciado, Tudo certo até agora, Aprovado, Reprovado e N/A. A validação pode levar duas semanas ou mais, dependendo da frequência de rastreamento. Se for reprovada, corrija as URLs que falharam e reinicie depois que o ciclo atual terminar. Mesmo sem pedir validação, o Google pode notar a correção no rastreamento normal.

Checklist

  1. Só páginas de um produto à venda (ou de avaliação de um produto) têm Product. Categoria e serviço, não.
  2. Todo Product tem name e pelo menos offers, review ou aggregateRating.
  3. Na loja: image rastreável, Offer (não AggregateOffer) com price maior que zero e priceCurrency.
  4. Preço, estoque, frete e avaliação no JSON-LD batem com o que a página mostra.
  5. priceValidUntil, se existir, está no futuro.
  6. Frete e devolução definidos uma vez: Search Console, Merchant Center ou Organization.
  7. O bloco sai no HTML do servidor e o Teste de pesquisa aprimorada não mostra itens inválidos.
  8. Correção publicada, Validar a correção clicado.

Perguntas frequentes

O erro de offers, review ou aggregateRating tira meu produto do Google?

Ele deixa o item inválido: é um problema crítico, e sem um desses três campos o Product não pode ser exibido como pesquisa aprimorada. Corrija com um offers com preço ou tire o Product se a página não é de um produto.

Preciso corrigir os avisos de shippingDetails e hasMerchantReturnPolicy?

Não é obrigatório. São propriedades recomendadas, e o item continua válido sem elas. Se quiser informar frete e devolução, a forma mais simples é cadastrar as políticas no Search Console, em Configurações > Shopping > Entregas e devoluções, ou no Merchant Center.

Posso colocar uma data bem distante em priceValidUntil só para o aviso sumir?

A documentação define o campo como a data em que o preço deixa de valer, se aplicável. Se o seu preço não tem data para acabar, o aviso pode ficar; se tiver, informe a data real e mantenha no futuro, porque data passada pode impedir a exibição.

Página de categoria pode ter Product?

Não deveria. O Google diz que a pesquisa aprimorada de produtos só é compatível com páginas focadas em um único produto e recomenda marcar as páginas de produto, não as que listam vários ou uma categoria.

Quanto tempo leva o Validar a correção?

Pode levar duas semanas ou mais, dependendo da frequência de rastreamento. O Google confere primeiro uma amostra de páginas e, se ela passar, continua pelas demais URLs afetadas.

Fontes

Publicado em 16 de outubro de 2026. Viu algo desatualizado? Escreve pra contato@varrida.com.

Varredura grátis

Veja o que o Google enxerga no seu site.

Cole o endereço e, em menos de 1 minuto, veja a nota e os problemas mais graves, cada um com a correção. Sem cadastro.

  • Grátis
  • Sem cadastro
  • Menos de 1 minuto
Continue lendo

Outros guias do blog