> ## Documentation Index
> Fetch the complete documentation index at: https://api-docs.erp.olist.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhook - Envio de Preço de Produtos

> Receba notificações quando preços de produtos forem alterados.

## Descrição

Este webhook é acionado automaticamente sempre que houver alteração nos preços de produtos cadastrados no Olist ERP.

## Quando é Acionado

* Alteração de preço de venda
* Alteração de preço promocional
* Ativação/desativação de promoção
* Alteração em massa de preços
* Atualização de lista de preços
* Alteração de preço por regra automática

## Estrutura da Notificação

```json theme={null}
{
  "evento": "envio_preco_produtos",
  "data_hora": "20/05/2024 19:15:30",
  "produtos": [
    {
      "id": 123456,
      "sku": "PROD-001",
      "nome": "Produto Exemplo",
      "preco_anterior": 99.90,
      "preco_atual": 89.90,
      "preco_promocional_anterior": null,
      "preco_promocional_atual": 79.90,
      "data_inicio_promocao": "20/05/2024",
      "data_fim_promocao": "31/05/2024",
      "margem_lucro": 35.5,
      "preco_custo": 52.00,
      "lista_preco_id": 5,
      "lista_preco_nome": "Promoção Maio"
    }
  ]
}
```

## Campos da Notificação

| Campo                                    | Tipo    | Descrição                                      |
| ---------------------------------------- | ------- | ---------------------------------------------- |
| evento                                   | string  | Sempre "envio\_preco\_produtos"                |
| data\_hora                               | string  | Data e hora do evento (dd/mm/yyyy hh:mm:ss)    |
| produtos\[]                              | array   | Lista de produtos com preços alterados         |
| produtos\[].id                           | int     | ID do produto no Olist ERP                     |
| produtos\[].sku                          | string  | Código SKU do produto                          |
| produtos\[].nome                         | string  | Nome do produto                                |
| produtos\[].preco\_anterior              | decimal | Preço de venda anterior                        |
| produtos\[].preco\_atual                 | decimal | Preço de venda atual                           |
| produtos\[].preco\_promocional\_anterior | decimal | Preço promocional anterior (null se não havia) |
| produtos\[].preco\_promocional\_atual    | decimal | Preço promocional atual (null se não há)       |
| produtos\[].data\_inicio\_promocao       | string  | Data de início da promoção (dd/mm/yyyy)        |
| produtos\[].data\_fim\_promocao          | string  | Data de fim da promoção (dd/mm/yyyy)           |
| produtos\[].margem\_lucro                | decimal | Margem de lucro percentual                     |
| produtos\[].preco\_custo                 | decimal | Preço de custo                                 |
| produtos\[].lista\_preco\_id             | int     | ID da lista de preço aplicada                  |
| produtos\[].lista\_preco\_nome           | string  | Nome da lista de preço                         |

## Exemplo de Implementação

### PHP

```php theme={null}
<?php
$json = file_get_contents('php://input');
$data = json_decode($json, true);

if ($data['evento'] === 'envio_preco_produtos') {
    foreach ($data['produtos'] as $produto) {
        $sku = $produto['sku'];
        $preco_novo = $produto['preco_atual'];
        $preco_promo = $produto['preco_promocional_atual'];

        // Atualiza preço no e-commerce
        atualizarPrecoEcommerce($sku, $preco_novo, $preco_promo);

        // Atualiza marketplaces
        sincronizarMarketplaces($sku, [
            'preco' => $preco_novo,
            'preco_promocional' => $preco_promo
        ]);

        // Verifica competitividade
        if ($preco_novo < $produto['preco_anterior']) {
            // Preço reduzido - pode aumentar anúncios
            aumentarInvestimentoMarketing($sku);
        }

        // Notifica time comercial sobre mudanças significativas
        $variacao = (($preco_novo / $produto['preco_anterior']) - 1) * 100;
        if (abs($variacao) > 10) {
            notificarEquipeComercial($produto['nome'], $variacao);
        }

        echo "Preço de {$produto['nome']} atualizado\n";
    }

    http_response_code(200);
    echo json_encode(['status' => 'processado']);
}
?>
```

### Python

```python theme={null}
from flask import Flask, request, jsonify
from decimal import Decimal

app = Flask(__name__)

@app.route('/webhook/precos', methods=['POST'])
def webhook_precos():
    data = request.get_json()

    if data.get('evento') == 'envio_preco_produtos':
        for produto in data.get('produtos', []):
            sku = produto['sku']
            preco_atual = Decimal(str(produto['preco_atual']))
            preco_anterior = Decimal(str(produto['preco_anterior']))

            # Atualiza preço no sistema
            atualizar_preco_local(sku, preco_atual)

            # Sincroniza com plataformas externas
            sincronizar_preco_externo(
                sku=sku,
                preco=preco_atual,
                preco_promocional=produto.get('preco_promocional_atual')
            )

            # Calcula variação percentual
            variacao = ((preco_atual / preco_anterior) - 1) * 100

            # Análise de competitividade
            if variacao < -5:
                # Preço reduzido significativamente
                notificar_oportunidade_venda(sku, abs(variacao))

            # Atualiza cache de preços
            atualizar_cache_preco(sku, {
                'preco': float(preco_atual),
                'margem': produto['margem_lucro'],
                'em_promocao': produto['preco_promocional_atual'] is not None
            })

        return jsonify({'status': 'processado'}), 200

    return jsonify({'status': 'erro'}), 400
```

### Node.js

```javascript theme={null}
const express = require('express');
const app = express();

app.use(express.json());

app.post('/webhook/precos', async (req, res) => {
    const data = req.body;

    if (data.evento === 'envio_preco_produtos') {
        for (const produto of data.produtos) {
            const { sku, preco_atual, preco_anterior, preco_promocional_atual } = produto;

            // Atualiza banco de dados
            await atualizarPrecoBanco(sku, preco_atual);

            // Sincroniza com e-commerce
            await sincronizarEcommerce({
                sku: sku,
                preco: preco_atual,
                precoPromocional: preco_promocional_atual
            });

            // Atualiza marketplaces (paralelo)
            await Promise.all([
                atualizarMercadoLivre(sku, preco_atual),
                atualizarB2W(sku, preco_atual),
                atualizarMagalu(sku, preco_atual)
            ]);

            // Análise de margem
            if (produto.margem_lucro < 15) {
                await alertarMargemBaixa(sku, produto.margem_lucro);
            }

            // Histórico de preços
            await salvarHistoricoPreco({
                sku: sku,
                precoAnterior: preco_anterior,
                precoAtual: preco_atual,
                dataAlteracao: new Date()
            });

            console.log(`Preço de ${produto.nome} atualizado para R$ ${preco_atual}`);
        }

        res.status(200).json({ status: 'processado' });
    } else {
        res.status(400).json({ status: 'erro' });
    }
});

app.listen(3000);
```

## Configuração

Para ativar este webhook:

1. Acesse **Configurações > Integrações > Webhooks**
2. Clique em **Novo Webhook**
3. Selecione o evento **Envio de Preço de Produtos**
4. Informe a URL do seu endpoint
5. Salve as configurações

## Casos de Uso

* **Sincronização com e-commerce**: Mantenha preços atualizados em tempo real
* **Marketplaces**: Atualize preços em múltiplos canais automaticamente
* **Análise de competitividade**: Compare preços com concorrentes
* **Gestão de margem**: Monitore margens de lucro em tempo real
* **Histórico de preços**: Mantenha registro completo de alterações
* **Alertas inteligentes**: Notifique equipe sobre variações significativas
* **Pricing dinâmico**: Integre com ferramentas de precificação automática

## Boas Práticas

* **Validação de preços**: Sempre valide se o preço é maior que zero
* **Histórico completo**: Mantenha log de todas as alterações de preço
* **Sincronização em lote**: Agrupe múltiplas atualizações quando possível
* **Cache inteligente**: Use cache para reduzir carga no banco
* **Monitoramento de margem**: Alerte quando margem ficar abaixo do mínimo
* **Análise de impacto**: Calcule impacto de alterações nas vendas

## Estratégias de Preço

### Preço Promocional Ativo

Quando `preco_promocional_atual` não é null:

* Use o preço promocional como preço de venda
* Destaque o desconto em relação ao preço normal
* Mostre a economia para o cliente
* Adicione contador regressivo se houver data de fim

### Preço Normal

Quando `preco_promocional_atual` é null:

* Use o `preco_atual` como preço de venda
* Remova badges de promoção
* Atualize estratégias de marketing

## Cálculos Úteis

### Variação Percentual

```javascript theme={null}
const variacao = ((preco_atual / preco_anterior) - 1) * 100;
// Resultado positivo = aumento
// Resultado negativo = redução
```

### Validação de Margem Mínima

```javascript theme={null}
const margem_minima = 20; // 20%
if (produto.margem_lucro < margem_minima) {
    alertarGestor('Margem abaixo do mínimo: ' + produto.nome);
}
```

### Preço Efetivo de Venda

```javascript theme={null}
const precoVenda = produto.preco_promocional_atual || produto.preco_atual;
```

## Observações

* Alterações em massa podem gerar uma única notificação com múltiplos produtos
* O webhook não é enviado se o preço for alterado e depois restaurado antes da sincronização
* Preços com margem negativa também geram notificação
* O campo `preco_custo` pode ser omitido por questões de confidencialidade (configurável)
* Datas de promoção podem ser null se a promoção não tiver prazo definido
* A `lista_preco_id` é null se o preço não pertence a nenhuma lista específica
