Skip to main content

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

{
  "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

CampoTipoDescrição
eventostringSempre “envio_preco_produtos”
data_horastringData e hora do evento (dd/mm/yyyy hh:mm:ss)
produtos[]arrayLista de produtos com preços alterados
produtos[].idintID do produto no Olist ERP
produtos[].skustringCódigo SKU do produto
produtos[].nomestringNome do produto
produtos[].preco_anteriordecimalPreço de venda anterior
produtos[].preco_atualdecimalPreço de venda atual
produtos[].preco_promocional_anteriordecimalPreço promocional anterior (null se não havia)
produtos[].preco_promocional_atualdecimalPreço promocional atual (null se não há)
produtos[].data_inicio_promocaostringData de início da promoção (dd/mm/yyyy)
produtos[].data_fim_promocaostringData de fim da promoção (dd/mm/yyyy)
produtos[].margem_lucrodecimalMargem de lucro percentual
produtos[].preco_custodecimalPreço de custo
produtos[].lista_preco_idintID da lista de preço aplicada
produtos[].lista_preco_nomestringNome da lista de preço

Exemplo de Implementação

PHP

<?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

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

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

const variacao = ((preco_atual / preco_anterior) - 1) * 100;
// Resultado positivo = aumento
// Resultado negativo = redução

Validação de Margem Mínima

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

Preço Efetivo de Venda

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