Skip to main content

Descrição

Este webhook é acionado automaticamente sempre que um produto for cadastrado ou tiver suas informações alteradas no Olist ERP.

Quando é Acionado

O webhook de envio de produtos é disparado nas seguintes situações:
  • Cadastro de novo produto
  • Alteração de dados do produto (nome, descrição, preço, etc.)
  • Alteração de imagens
  • Alteração de categoria
  • Ativação/desativação de produto
  • Alteração de variações

Estrutura da Notificação

{
  "evento": "envio_produtos",
  "data_hora": "20/05/2024 16:45:30",
  "acao": "incluir",
  "produtos": [
    {
      "id": 123456,
      "sku": "PROD-001",
      "nome": "Produto Exemplo",
      "preco": 99.90,
      "preco_promocional": 79.90,
      "unidade": "UN",
      "peso_bruto": 0.5,
      "peso_liquido": 0.45,
      "altura": 10,
      "largura": 15,
      "comprimento": 20,
      "ncm": "12345678",
      "origem": 0,
      "gtin": "7891234567890",
      "categoria": "Eletrônicos > Smartphones",
      "estoque": 50,
      "situacao": "A",
      "tipo": "P",
      "classe_ipi": "Classe A",
      "codigo_beneficio_fiscal": "PR123456",
      "anexos": [
        {
          "url": "https://cdn.tiny.com.br/images/123456_1.jpg"
        }
      ]
    }
  ]
}

Campos da Notificação

CampoTipoDescrição
eventostringSempre “envio_produtos”
data_horastringData e hora do evento (dd/mm/yyyy hh:mm:ss)
acaostring”incluir” ou “alterar”
produtos[]arrayLista de produtos afetados
produtos[].idintID do produto no Olist ERP
produtos[].skustringCódigo SKU do produto
produtos[].nomestringNome do produto
produtos[].precodecimalPreço de venda
produtos[].preco_promocionaldecimalPreço promocional (se houver)
produtos[].unidadestringUnidade de medida
produtos[].peso_brutodecimalPeso bruto em kg
produtos[].peso_liquidodecimalPeso líquido em kg
produtos[].alturadecimalAltura em cm
produtos[].larguradecimalLargura em cm
produtos[].comprimentodecimalComprimento em cm
produtos[].ncmstringCódigo NCM
produtos[].origemintCódigo de origem (0-8)
produtos[].gtinstringCódigo de barras (GTIN/EAN)
produtos[].categoriastringCaminho da categoria
produtos[].estoquedecimalSaldo em estoque
produtos[].situacaostringA=Ativo, I=Inativo
produtos[].tipostringP=Produto, S=Serviço
produtos[].classe_ipistringClasse de IPI
produtos[].codigo_beneficio_fiscalstringCódigo de benefício fiscal
produtos[].anexos[]arrayLista de imagens do produto

Exemplo de Implementação

PHP

<?php
$json = file_get_contents('php://input');
$data = json_decode($json, true);

if ($data['evento'] === 'envio_produtos') {
    $acao = $data['acao'];

    foreach ($data['produtos'] as $produto) {
        if ($acao === 'incluir') {
            // Cria produto no sistema local
            criarProdutoLocal($produto);
        } else if ($acao === 'alterar') {
            // Atualiza produto no sistema local
            atualizarProdutoLocal($produto);
        }

        // Sincroniza com outros sistemas
        sincronizarProduto($produto['sku'], $produto);
    }

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

Python

from flask import Flask, request, jsonify

app = Flask(__name__)

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

    if data.get('evento') == 'envio_produtos':
        acao = data.get('acao')

        for produto in data.get('produtos', []):
            if acao == 'incluir':
                criar_produto_local(produto)
            elif acao == 'alterar':
                atualizar_produto_local(produto)

            # Sincroniza com marketplace
            sincronizar_marketplace(produto['sku'], produto)

        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/produtos', async (req, res) => {
    const data = req.body;

    if (data.evento === 'envio_produtos') {
        const acao = data.acao;

        for (const produto of data.produtos) {
            if (acao === 'incluir') {
                await criarProdutoLocal(produto);
            } else if (acao === 'alterar') {
                await atualizarProdutoLocal(produto);
            }

            // Sincroniza com e-commerce
            await sincronizarEcommerce(produto.sku, produto);
        }

        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 Produtos
  4. Informe a URL do seu endpoint
  5. Salve as configurações

Casos de Uso

  • Sincronização com e-commerce: Mantenha seu site atualizado automaticamente
  • Integração com marketplace: Envie produtos para múltiplos canais de venda
  • Sistema de precificação: Atualize preços em sistemas externos
  • Catálogo unificado: Centralize informações de produtos
  • Notificações: Avise sua equipe sobre novos produtos

Boas Práticas

  • Valide os dados: Sempre verifique se os campos obrigatórios estão presentes
  • Trate duplicatas: Use o campo id ou sku para evitar duplicação
  • Baixe imagens: Salve as imagens localmente para melhor performance
  • Processe assincronamente: Use filas para não bloquear o webhook
  • Log completo: Registre todas as alterações para auditoria

Observações

  • O webhook inclui apenas produtos com situação “Ativo” por padrão
  • Alterações de estoque não acionam este webhook (use o webhook de atualização de estoque)
  • Produtos com múltiplas variações podem gerar notificações separadas
  • Imagens grandes podem atrasar o processamento - implemente cache
  • O campo categoria retorna o caminho completo separado por ” > ”