Você tem 200 unidades de um SKU que vende. Manda 100 pro Full, deixa 100 no seu galpão pra Flex. Resultado esperado: anúncio fica disponível em mais regiões, frete grátis em mais CEPs, ML mistura os dois pra entregar mais rápido.

Resultado real (na maioria dos casos): anúncio aparece com estoque dobrado, ML vende 200 unidades em uma semana, você só tinha 100 no Full e 100 no Flex separadas — agora tem 50 vendas em ruptura.

Esse texto explica por que isso acontece, qual atributo é o certo (não é o que parece) e como o EVA Pro resolve sem precisar de planilha.

O conceito de estoque distribuído

Em 2024 o ML lançou oficialmente o estoque distribuído: um único anúncio pode ter estoque em múltiplos endereços (depósitos), e o ML escolhe de onde despachar baseado em:

  • CEP do comprador (mais próximo entrega mais rápido)
  • Disponibilidade do depósito (Full vs seu galpão)
  • Tarifa de envio mais baixa (calculado em tempo real)

Em teoria você deveria mandar 100 pra cada e o sistema gerenciar. Na prática, depende de qual atributo seu integrador está enviando.

O atributo certo: seller_warehouse (não selling_address)

Aqui mora o erro mais comum. A API do ML tem dois campos parecidos:

AtributoO que éQuando usar
selling_addressEndereço de venda do anúncioAnúncio sem estoque distribuído (legado)
seller_warehouseDepósito específico de origemEstoque distribuído (Full + Flex)

Se seu sistema atualiza estoque via selling_address, ele sobrescreve o estoque do depósito anterior — em vez de manter 100 no Full e 100 no Flex, vira 100 em um lugar só.

A documentação oficial do ML mistura os dois termos em vários lugares. O atributo válido pra estoque distribuído em 2026 é `seller_warehouse` — verificável via GET /items/{id}/stock.

A função de update certa

No EVA Pro, a função updateMeliDepotStock() em src/lib/mercadolivre/stock.ts resolve assim:

  1. Busca o item via API
  2. Lista os warehouses cadastrados (/users/{user_id}/warehouses)
  3. Identifica qual é Full e qual é Flex (via flag type=fulfillment)
  4. Aplica o estoque correto em cada com PUT individual
  5. Faz retry em 401 (token expirado) automaticamente

A diferença prática: você nunca tem ruptura por sobrescrita.

70%
dos integradores que vimos em diagnóstico confundem selling_address com seller_warehouse

Estratégia: o que vai pra Full, o que fica no Flex

Não é "metade aqui, metade lá". É decisão por SKU:

Vai pra Full (peso da estratégia)

  • Giro mensal alto (>15 unidades)
  • Margem confortável (>30% pós-tarifa)
  • Embalagem padrão (cabe na caixa do ML)
  • Sem sazonalidade extrema

Fica no Flex próprio

  • Giro baixo (<5 unidades/mês)
  • Frágil ou customizado
  • Alto valor unitário (>R$ 500)
  • Sazonal puro (Natal, Black Friday)

Mistura (estoque distribuído de verdade)

  • Giro médio (5-15 unidades)
  • Cliente regional concentrado (vende muito em SP, mas tem tráfego em outros estados)
  • Tem estoque > 100 unidades

A regra do anúncio amarelo

Quando você opera estoque distribuído errado, o ML pode marcar o anúncio amarelo por inconsistência. Os 3 motivos mais comuns:

  1. Estoque negativo no warehouse — vendeu 5 e o sistema só atualizou 3
  2. Variação sem estoque em pelo menos 1 warehouse — ML exige presença em todos os warehouses ativos
  3. Atualização lenta (>1h após venda) — webhook do ML não foi processado a tempo
1h
é o SLA máximo entre venda no ML e atualização do estoque na API. Acima disso, anúncio fica amarelo.

Como saber se está funcionando

3 verificações simples:

-- 1. Ver qual atributo está sendo usado
SELECT meli_listing_id, last_stock_update_attribute
FROM ml_listings
WHERE company_id = 'sua_empresa_id'
LIMIT 50;

-- 2. Detectar inconsistência (Flex + Full somam diferente do total real)
SELECT meli_listing_id, total_stock, warehouse_breakdown
FROM ml_listings
WHERE total_stock != (SELECT SUM(qty) FROM jsonb_array_elements(warehouse_breakdown));

-- 3. Anúncios amarelos
SELECT meli_listing_id, health_status, health_actions
FROM ml_listings
WHERE health_status = 'with_issues';

No EVA Pro tem dashboard pronto: /mercado-livre/saude-anuncios mostra todos os anúncios amarelos com motivo e botão de "corrigir agora".

Webhooks que importam

3 eventos do ML que afetam estoque distribuído:

  • items — mudança de qualquer atributo do anúncio (incluindo estoque)
  • shipments — quando ML pega um produto pro Full ou marca como entregue
  • orders_v2 — venda fechada (precisa decrementar estoque na hora)

Se algum não está sendo processado, estoque fica defasado. A regra é: nunca usar rate limiting longo em webhook do ML/Shopee. Eles esperam resposta em <5s, senão re-disparam, e você vira refém de fila.

Resumo

Estoque distribuído é coisa fina. Erra o atributo, perde semana inteira de venda.

Pra implementar bem:

  1. Use seller_warehouse, não selling_address
  2. Liste warehouses ativamente (não confia em cache)
  3. Webhook em <5s, sem rate limit longo
  4. Monitora anúncio amarelo — mostra quando algo deu errado

Próximos passos: sua integração já usa seller_warehouse? Conecta o EVA Pro grátis — em 2 min ele audita seus anúncios e mostra quais estão com risco de ruptura por update errado.