Regras de vitrine
Como reordenar produtos na busca e nas categorias com regras de fixar, impulsionar e rebaixar.
Por padrão a ordem dos produtos numa busca ou numa categoria vem da relevância. Regras de vitrine (merchandising) deixam a loja intervir nessa ordem sem mexer em preço nem em catálogo: fixar produtos no topo, impulsionar os que estão em oferta ou são novos, rebaixar os sem estoque. Uma regra pode valer para um termo de busca específico ("tênis"), para uma categoria, ou para a loja inteira, e pode ter data de início e de fim (uma campanha).
Como funciona
status | Significado |
|---|---|
draft | Rascunho. Padrão. Não atua e não passa pelas validações de ativação. |
active | Em uso, dentro da janela de datas. |
archived | Guardada, sem atuar. |
Como a ordem final é montada
Para cada busca ou listagem a plataforma reúne todas as regras ativas que se aplicam (as global, a regra do termo exato, as da categoria e das categorias-mãe com include_children), dentro da janela, em ordem de priority. Então:
- Os fixados (
pins) vão primeiro, na ordem em que foram escritos. Se o mesmo produto é fixado por duas regras, vale a primeira. - O restante é ordenado pela soma dos pesos dos boosts que cada produto cumpre (maior primeiro). Empates mantêm a ordem original da busca.
- Se alguma regra tem
bury_out_of_stock, produtos sem estoque vão para o fim. Produtos fixados nunca são rebaixados.
Boosts (boosts[].field)
field | value | O produto ganha o peso quando |
|---|---|---|
on_sale | qualquer (ignorado) | Está em promoção. |
created_days_lte | inteiro (dias) | Foi criado há no máximo N dias. |
margin_pct_gte | inteiro (percentual) | A margem calculada é de pelo menos N%. |
vendor_id | UUID do seller | É vendido por esse seller. |
brand_variant_id | UUID da marca | Tem essa marca. |
tag_slug | texto | Tem essa etiqueta. |
Um field fora desta lista é aceito, não gera erro e simplesmente nunca casa.
Conceitos importantes
Termo de busca
Em context search a regra vale quando o termo digitado é igual ao search_term, comparando sem acento e sem diferenciar maiúsculas ("Tênis" = "tenis"). Não é busca por trecho: "tenis" não casa com "tenis esportivo".
Escopo e campos descartados
Os campos que não pertencem ao context são zerados: em category o search_term é descartado; em search o category_id; em global os dois.
Rascunho não é validado
Uma regra em draft pode estar incompleta (sem termo, sem categoria). As validações de search_term, category_id, limite de 200 e termo duplicado só rodam quando status é active.
Quando a mudança aparece
A vitrine guarda as regras ativas em cache por até 1 minuto; mudanças feitas por estas rotas limpam o cache, então costumam aparecer em segundos.
Endpoints
| Método e caminho | Para que serve | Auth | Página |
|---|---|---|---|
GET /api/v1/admin/merch-rules | Lista as regras | admin | Consultar regras |
GET /api/v1/admin/merch-rules/{id} | Detalha uma regra | admin | Consultar regras |
POST /api/v1/admin/merch-rules | Cria uma regra | admin | Criar, alterar e excluir regra |
PUT /api/v1/admin/merch-rules/{id} | Substitui uma regra | admin | Criar, alterar e excluir regra |
DELETE /api/v1/admin/merch-rules/{id} | Exclui (lógica) uma regra | admin | Criar, alterar e excluir regra |
POST /api/v1/admin/merch-rules/preview | Mostra a vitrine com a regra aplicada | admin | Pré-visualizar |
Erros comuns
- Mandar
PUTparcial. OPUTregrava tudo: omitirstatusvolta a regra paradraft, omitirinclude_childrenvirafalse, omitirpins/boostsesvazia as listas. Leia a regra, mude o campo e reenvie o objeto inteiro. - Ativar sem alvo. Regra
searchativa semsearch_term, oucategoryativa semcategory_id, é recusada com422. - Duas regras ativas para o mesmo termo. A segunda leva
422 duplicate search term. - Fixar um produto e não vê-lo. Se ele não passa pelas regras de visibilidade da loja (inativo, oculto, sem estoque onde a loja esconde esgotados), a regra não o traz.
fieldcom erro de digitação.on-saleouonsalenão dão erro, só não fazem nada.- Esperar
404.PUTnum id inexistente responde500;DELETEnum id inexistente responde200. - Status inventado. Fora de
draft,activeearchivedo banco recusa e a resposta é500.