A Shopify diz que a encomenda são 128,45. A ordem de venda no Odoo diz 106,16. Ninguém tocou em nada, o conector não reporta erros e mesmo assim os dois números não batem certo. Na prática, quase todas as divergências de valores entre Odoo e Shopify se resumem a uma de oito causas, e cada uma deixa uma impressão digital diferente. Este guia percorre as oito, indica o sintoma que identifica cada uma e aponta o campo exato a verificar de cada lado.
Aplica-se a qualquer encomenda da Shopify que viva no Odoo, seja qual for o conector que a importou: o Shopify Odoo Connector da Emipro, o da Webkul, um módulo da OCA ou uma ponte feita em casa. Os nomes de campo abaixo são os dos modelos padrão do Odoo, mais — quando relevante — as definições que um conector costuma expor no seu registo de instância.
Primeiro: garanta que compara números comparáveis
Antes de caçar um erro, veja o que está realmente a comparar. Ambos os sistemas mostram vários «totais», e não significam a mesma coisa.
- Total atual da Shopify: o que o cliente deve hoje, depois de reembolsos e edições. Na Admin API: currentTotalPriceSet.
- Total original da Shopify: o que ficou acordado no checkout, antes de qualquer alteração posterior: originalTotalPriceSet.
- Total da ordem de venda no Odoo: amount_total em sale.order, ou seja, o que o conector importou mais o que voltou a sincronizar depois.
- Faturado líquido no Odoo: faturas de cliente lançadas menos notas de crédito lançadas (account.move, move_type out_invoice e out_refund).
Esses quatro números serem diferentes não é, por si só, um problema. A única pergunta que interessa é qual o par que deveria coincidir, e isso depende de quão longe foi a encomenda: uma encomenda ainda não faturada pede uma comparação diferente de uma faturada, reembolsada e editada.
1 Causa 1: preços com imposto incluído
É o falso alarme mais comum e o mais fácil de excluir. Se os seus preços na Shopify incluem imposto e os impostos no Odoo estão configurados como «Incluído no preço», então o subtotal da Shopify e o valor sem impostos do Odoo medem coisas diferentes: o primeiro é bruto de imposto, o segundo é líquido.
O sintoma é inconfundível: a diferença é exatamente a taxa de imposto. 128,45 contra 106,16 não é arredondamento, são 21 % de IVA.
A solução passa por escolher uma comparação que sobreviva a essa definição. Compare totais com imposto — total atual da Shopify contra amount_total do Odoo — ou compare líquidos dos dois lados, subtraindo amount_tax a amount_total no Odoo. O que nunca deve fazer é comparar o subtotal da Shopify com o amount_untaxed do Odoo sem ter a certeza de que ambos os lados estão configurados da mesma maneira.
2 Causa 2: a encomenda congela, a fatura segue viagem
Os conectores importam uma encomenda da Shopify para um sale.order. Assim que essa ordem é faturada, a maioria deixa de lhe empurrar alterações posteriores — e bem: uma ordem faturada é um documento contabilístico, não um espelho. A partir daí, a ordem regista o que foi encomendado e as faturas registam o que foi efetivamente cobrado.
Por isso, quando chega um reembolso depois da faturação, o total atual da Shopify desce e a ordem no Odoo não se mexe. O dinheiro mexeu-se no Odoo, apenas noutro sítio: numa nota de crédito, um account.move com move_type = out_refund.
Onde olhar: sale.order.invoice_ids dá-lhe todas as faturas e notas de crédito ligadas à encomenda. Some as out_invoice lançadas, subtraia as out_refund lançadas, e esse valor líquido é o que deve coincidir com o total atual da Shopify. Por linha, a quantidade que manda é qty_invoiced, não product_uom_qty.
É também por isto que comparar a ordem de venda com a Shopify dá cada vez mais falsos alarmes à medida que a encomenda envelhece: está a comparar uma fotografia tirada no momento da importação com um documento vivo.
3 Causa 3: reembolsos — o dinheiro bate sempre, as quantidades talvez não
Os reembolsos da Shopify vêm em dois sabores e só um mexe no inventário. Um reembolso pode devolver o dinheiro e repor as unidades, ou devolver o dinheiro e deixar as unidades onde estão: produto danificado, gesto comercial, ajuste parcial de preço.
Na Admin API a distinção vive em cada linha de reembolso, em restockType: NO_RESTOCK, CANCEL, RETURN ou LEGACY_RESTOCK. A consequência para a reconciliação é que um reembolso NO_RESTOCK baixa o valor sem mudar a quantidade viva da linha, pelo que uma verificação de quantidades linha a linha pode parecer errada enquanto o dinheiro está perfeito.
É a divergência mais mal lida de todas, porque o instinto manda confiar nas quantidades e não nos valores. Aqui os valores têm razão e as quantidades estão a contar outra coisa: o que foi faturado versus o que voltou fisicamente.
4 Causa 4: a encomenda foi editada na Shopify depois do facto
A edição de encomendas da Shopify altera a encomenda no lugar: linhas adicionadas, removidas ou requantificadas depois de o cliente ter pago. A Shopify guarda os dois números — originalTotalPriceSet para o checkout, currentTotalPriceSet para a encomenda editada — e a maioria dos conectores volta a sincronizar a ordem de venda, pelo que o amount_total no Odoo segue a edição e deixa de corresponder ao que foi encomendado.
Isso, por si só, é inofensivo. A variante perigosa é a edição que chega depois da faturação: uma linha já faturada no Odoo é removida na Shopify. Agora o Odoo faturou mais do que a Shopify alguma vez vai cobrar. Não é um artefacto visual, é uma sobrefaturação real e precisa de uma nota de crédito.
Sintoma: o faturado líquido do Odoo é superior ao total atual da Shopify, a encomenda não tem reembolsos e o total original da Shopify é superior ao atual. Quando as três condições se verificam ao mesmo tempo, a encomenda foi editada depois de faturada.
5 Causa 5: cartões-presente, vendidos e gastos
Os cartões-presente produzem duas divergências completamente diferentes consoante o lado da transação em que estão, e vale a pena separá-las com cuidado.
Vender um cartão-presente. Na Shopify a linha traz a marca isGiftCard e normalmente não tem SKU nenhum. Os conectores não a emparelham por SKU: detetam a marca na importação e encaminham a linha para um produto dedicado configurado na instância do conector (na Emipro, gift_card_product_id). Se a sua reconciliação emparelha linhas por SKU, o mesmo cartão aparece como duas linhas a meio: uma do lado da Shopify com nome e sem SKU, outra do lado do Odoo com a referência interna do produto sintético. O cartão está bem; a chave de emparelhamento é que está errada.
Pagar com um cartão-presente. Aqui a Shopify não tem linha nenhuma: um cartão-presente usado como pagamento é um meio de pagamento e só aparece entre os gateways da encomenda. Os conectores que precisam de equilibrar o recebimento no Odoo acrescentam uma linha negativa — «Gift card for …» — a apontar para esse mesmo produto sintético. O Odoo passa a ter mais uma linha do que a Shopify e qualquer vista linha a linha ingénua mostra uma linha sem contraparte.
6 Causa 6: descontos, ofertas e produtos artefacto
A Shopify e o Odoo modelam o mesmo gesto comercial de formas diferentes. Uma oferta na Shopify é uma segunda linha a 0,00. Um desconto é um valor levado pela própria linha. Os conectores do Odoo exprimem muitas vezes ambos como uma linha extra que aponta para um produto sintético configurado na instância: tipicamente um produto de desconto, um de ajuste de reembolso, um de direitos aduaneiros, um de gorjeta e um de envio.
Essas linhas artefacto não têm contraparte nos lineItems da Shopify. Linha a linha parecem fantasmas; no total são exatamente o que faz os dois valores baterem certo. Apagá-las partiria a encomenda em vez de a arranjar.
Como comparar como deve ser: agregue as linhas por SKU antes de as emparelhar e exclua os produtos configurados como artefactos na instância do conector. Com essas duas regras no sítio, as diferenças que sobram são reais.
7 Causa 7: envio, direitos aduaneiros e taxas
O envio é um conceito próprio na Shopify — uma linha de envio com preço e imposto próprios — enquanto no Odoo costuma chegar como uma linha de encomenda normal marcada com is_delivery, valorizada a partir do produto de envio do conector. Direitos aduaneiros, gorjetas e sobretaxas de pagamento seguem o mesmo padrão.
A consequência prática é que o número de linhas quase nunca coincide, mesmo numa encomenda perfeitamente sincronizada, e qualquer comparação de subtotais herda essa diferença. Compare primeiro totais; compare linhas só depois de excluir as de envio e taxas do lado do Odoo.
O mesmo se aplica ao eixo da entrega: uma linha de serviço não tem movimento de stock por trás, por isso a sua quantidade entregue fica a zero para sempre. É o comportamento correto, não um envio pendente.
8 Causa 8: moeda, presentment money e arredondamento
A Shopify devolve cada campo monetário em duplicado: shopMoney, na moeda da sua loja, e presentmentMoney, na moeda que o cliente viu de facto. Se vende em várias moedas, o conector importou uma delas e é bem possível que esteja a ler a outra.
O Odoo acrescenta uma segunda conversão própria: a encomenda é guardada na sua moeda e convertida para a da empresa ao câmbio do dia. Uma taxa de câmbio desatualizada produz uma diferença pequena sempre inclinada para o mesmo lado — uma pista fiável, porque os erros verdadeiros raramente são tão consistentes.
Depois há o arredondamento puro. Diferenças de um a três cêntimos em encomendas com várias linhas e descontos percentuais por linha são arredondamento, e persegui-las é deitar uma tarde fora. Qualquer coisa maior tem uma das causas acima por trás.
Referência rápida: do sintoma à causa
| O que vê | Causa mais provável | Onde verificar |
|---|---|---|
| A diferença é exatamente a taxa de imposto | Preços com imposto incluído | Imposto do Odoo «Incluído no preço»; comparar totais com imposto |
| Odoo acima da Shopify e a encomenda tem reembolso | Reembolso lançado depois da faturação | account.move out_refund; qty_invoiced por linha |
| Odoo acima, sem reembolso, Shopify original > atual | Encomenda editada depois de faturada (sobrefaturação) | originalTotalPriceSet contra currentTotalPriceSet |
| Os valores batem certo, a quantidade de uma linha não | Reembolso sem reposição de stock | refundLineItems.restockType; currentQuantity |
| Uma linha a mais no Odoo e uma diferença redonda | Cartão-presente usado como pagamento | Gateways de pagamento da encomenda; linha negativa no Odoo |
| Um cartão-presente aparece como duas linhas a meio | Emparelhado por SKU em vez da marca de cartão-presente | isGiftCard; produto de cartão-presente da instância |
| Linhas extra no Odoo com nome de desconto ou direitos | Produtos artefacto do conector | Produto de desconto / direitos / gorjeta / envio da instância |
| Uma diferença de alguns cêntimos | Arredondamento ou taxa de câmbio | shopMoney contra presentmentMoney; câmbio do dia no Odoo |
Uma verificação de cinco minutos que pode repetir
Quando uma divergência lhe cai na secretária, esta sequência resolve-a mais depressa do que olhar fixamente para os dois ecrãs:
- Abra a encomenda na Shopify. Aponte o total atual e veja se traz reembolsos ou se foi editada.
- Abra a ordem de venda no Odoo. Aponte amount_total e veja invoice_status.
- Se estiver faturada: some as faturas lançadas, subtraia as notas de crédito lançadas e compare esse valor — não o total da ordem — com o total atual da Shopify.
- Se ainda não estiver faturada: compare com amount_total e trate o resultado como provisório. Vai mudar assim que a fatura for lançada.
- Se mesmo assim não coincidirem, percorra as oito causas por ordem: impostos primeiro, depois faturação, reembolsos, edições, cartões-presente, artefactos, envio, moeda. A primeira que encaixa é quase sempre a resposta.
Cinco minutos por encomenda está bem quando acontece duas vezes por mês. Deixa de estar quando um agente de apoio ao cliente tem de o fazer antes de responder a cada e-mail «cobraram-me o valor errado», ou quando alguém tem de verificar por amostragem as encomendas de um dia antes do fecho contabilístico.
Continuar a ler
Ou verifique num clique
O Odoo–Shopify Order Check faz esta comparação toda por si, dentro da própria página da encomenda que já tem aberta: totais, impostos, quantidades, linhas, moradas e entrega, com reembolsos e cartões-presente tratados como contexto e não como erros. É apenas de leitura — nunca escreve no Odoo nem na Shopify — e não exige chaves de API.
Experimente grátis 14 dias