arrow_back Torna al blog

I totali di Odoo e Shopify non coincidono: 8 cause reali

Shopify dice che l'ordine è 128,45. L'ordine di vendita in Odoo dice 106,16. Nessuno ha toccato niente, il connettore non segnala errori, eppure i due numeri non concordano. Nella pratica quasi ogni scostamento di importo tra Odoo e Shopify si riduce a una di otto cause, e ognuna lascia un'impronta diversa. Questa guida le percorre tutte e otto, indica il sintomo che identifica ciascuna e punta al campo esatto da controllare su entrambi i lati.

Vale per qualsiasi ordine Shopify che vive in Odoo, qualunque sia il connettore che l'ha importato: lo Shopify Odoo Connector di Emipro, Webkul, un modulo OCA o un ponte sviluppato in casa. I nomi dei campi qui sotto sono quelli dei modelli standard di Odoo più, dove serve, le impostazioni che un connettore espone di solito sul suo record di istanza.

Prima di tutto: assicurati di confrontare numeri confrontabili

Prima di dare la caccia a un bug, verifica che cosa stai confrontando davvero. Entrambi i sistemi mostrano più «totali», e non significano la stessa cosa.

  • Totale attuale Shopify: quanto deve il cliente oggi, dopo rimborsi e modifiche. Nella Admin API: currentTotalPriceSet.
  • Totale originale Shopify: quanto è stato concordato al checkout, prima di qualsiasi cambiamento successivo: originalTotalPriceSet.
  • Totale dell'ordine in Odoo: amount_total su sale.order, cioè quanto ha importato il connettore più quanto ha risincronizzato dopo.
  • Fatturato netto in Odoo: fatture cliente confermate meno note di credito confermate (account.move, move_type out_invoice e out_refund).

Che questi quattro numeri siano diversi non è, di per sé, un problema. L'unica domanda vera è quale coppia dovrebbe coincidere, e dipende da quanta strada ha fatto l'ordine: un ordine non ancora fatturato richiede un confronto diverso da uno fatturato, rimborsato e modificato.

info Regola pratica: una volta che l'ordine è fatturato in Odoo, confronta il totale attuale di Shopify con il fatturato netto di Odoo. Prima di allora, confrontalo con il totale dell'ordine di vendita e considera la risposta provvisoria.

1 Causa 1: prezzi IVA inclusa

È il falso allarme più comune e il più facile da escludere. Se i prezzi di Shopify includono l'imposta e le imposte in Odoo sono configurate come «Inclusa nel prezzo», il subtotale di Shopify e l'imponibile di Odoo misurano due cose diverse: il primo è lordo d'imposta, il secondo è netto.

Il sintomo è inconfondibile: la differenza è esattamente l'aliquota. 128,45 contro 106,16 non è un problema di arrotondamento, è il 21 % di IVA.

La soluzione è scegliere un confronto che sopravviva a quell'impostazione. Confronta i totali con imposta — totale attuale di Shopify contro amount_total di Odoo — oppure i netti da entrambi i lati, sottraendo amount_tax da amount_total in Odoo. Quello che non devi mai fare è confrontare il subtotale di Shopify con amount_untaxed di Odoo, a meno di essere certo che i due lati siano configurati allo stesso modo.

warning Uno scostamento da prezzi IVA inclusa è invisibile sugli ordini senza imposta — esportazioni, inversione contabile intracomunitaria, clienti esenti — quindi la configurazione può sembrare corretta per settimane e rompersi al primo ordine nazionale.

2 Causa 2: l'ordine è congelato, la fattura va avanti

I connettori importano un ordine Shopify in un sale.order. Appena quell'ordine viene fatturato, la maggior parte smette di riversarvi i cambiamenti successivi, e giustamente: un ordine fatturato è un documento contabile, non uno specchio. Da quel momento l'ordine registra ciò che è stato ordinato e le fatture registrano ciò che è stato davvero addebitato.

Perciò, quando un rimborso arriva dopo la fatturazione, il totale attuale di Shopify scende e l'ordine di Odoo non si muove. Il denaro in Odoo si è mosso eccome, solo altrove: in una nota di credito, un account.move con move_type = out_refund.

Dove guardare: sale.order.invoice_ids restituisce tutte le fatture e le note di credito collegate all'ordine. Somma le out_invoice confermate, sottrai le out_refund confermate, e quel netto è ciò che deve coincidere con il totale attuale di Shopify. Per riga, la quantità che fa fede è qty_invoiced, non product_uom_qty.

È anche il motivo per cui confrontare l'ordine di vendita con Shopify produce sempre più falsi allarmi man mano che l'ordine invecchia: stai confrontando una fotografia scattata al momento dell'import con un documento vivo.

3 Causa 3: rimborsi — il denaro coincide sempre, le quantità forse no

I rimborsi di Shopify esistono in due varianti e solo una tocca il magazzino. Un rimborso può restituire il denaro e rimettere a scorta le unità, oppure restituire il denaro lasciando le unità dove sono: prodotto danneggiato, gesto commerciale, aggiustamento parziale di prezzo.

Nella Admin API la distinzione vive su ogni riga di rimborso, in restockType: NO_RESTOCK, CANCEL, RETURN o LEGACY_RESTOCK. La conseguenza per la riconciliazione è che un rimborso NO_RESTOCK abbassa l'importo senza cambiare la quantità viva della riga, quindi un controllo delle quantità riga per riga può sembrare sbagliato mentre il denaro è perfetto.

È lo scostamento più frainteso di tutti, perché l'istinto è fidarsi delle quantità più che degli importi. Qui gli importi hanno ragione e le quantità stanno raccontando altro: quanto è stato fatturato rispetto a quanto è tornato fisicamente.

info Quando ti serve sapere «cosa è ancora vivo su questa riga», leggi currentQuantity, non quantity. Il secondo è quanto è stato ordinato al checkout e non cambia mai.

4 Causa 4: l'ordine è stato modificato in Shopify a posteriori

La modifica degli ordini di Shopify cambia l'ordine sul posto: righe aggiunte, rimosse o riquantificate dopo che il cliente ha pagato. Shopify conserva entrambe le cifre — originalTotalPriceSet per il checkout, currentTotalPriceSet per l'ordine modificato — e la maggior parte dei connettori risincronizza l'ordine di vendita, così amount_total in Odoo segue la modifica e smette di corrispondere a quanto era stato ordinato.

Di per sé è innocuo. La variante pericolosa è la modifica che arriva dopo la fatturazione: una riga già fatturata in Odoo viene rimossa in Shopify. Ora Odoo ha fatturato più di quanto Shopify incasserà mai. Non è un artefatto grafico, è una sovrafatturazione reale e serve una nota di credito.

Sintomo: il fatturato netto di Odoo è superiore al totale attuale di Shopify, l'ordine non ha rimborsi e il totale originale di Shopify è superiore a quello attuale. Quando queste tre condizioni valgono insieme, l'ordine è stato modificato dopo la fatturazione.

5 Causa 5: gift card, vendute e spese

Le gift card producono due scostamenti completamente diversi a seconda del lato della transazione in cui si trovano, e vale la pena separarli con cura.

Vendere una gift card. In Shopify la riga porta il flag isGiftCard e di solito non ha alcuno SKU. I connettori non la abbinano per SKU: rilevano il flag all'import e instradano la riga verso un prodotto dedicato configurato sull'istanza del connettore (in Emipro, gift_card_product_id). Se la tua riconciliazione abbina le righe per SKU, la stessa card compare come due righe a metà: una sul lato Shopify con un nome e senza SKU, una sul lato Odoo con il riferimento interno del prodotto sintetico. La card sta bene; è la chiave di abbinamento a essere sbagliata.

Pagare con una gift card. Qui Shopify non ha alcuna riga: una gift card usata come pagamento è un mezzo di pagamento e compare solo tra i gateway dell'ordine. I connettori che devono far quadrare l'incasso in Odoo aggiungono una riga negativa — «Gift card for …» — che punta allo stesso prodotto sintetico. Odoo si ritrova con una riga in più rispetto a Shopify e qualsiasi vista riga per riga ingenua mostra una riga senza controparte.

info Se la differenza è una cifra sospettosamente tonda che compare anche tra i metodi di pagamento dell'ordine, cerca una gift card prima di cercare un errore di prezzo.

6 Causa 6: sconti, omaggi e prodotti artefatto

Shopify e Odoo modellano lo stesso gesto commerciale in forme diverse. Un omaggio in Shopify è una seconda riga a 0,00. Uno sconto è un importo portato dalla riga stessa. I connettori Odoo esprimono spesso entrambi come una riga aggiuntiva che punta a un prodotto sintetico configurato sull'istanza: tipicamente un prodotto sconto, un prodotto di rettifica rimborsi, un prodotto dazi, un prodotto mancia e un prodotto spedizione.

Quelle righe artefatto non hanno controparte nei lineItems di Shopify. Riga per riga sembrano fantasmi; sul totale sono esattamente ciò che fa combaciare i due importi. Cancellarle romperebbe l'ordine, non lo sistemerebbe.

Come confrontare bene: aggrega le righe per SKU prima di abbinarle ed escludi i prodotti configurati come artefatti sull'istanza del connettore. Con queste due regole in piedi, le differenze che restano sono reali.

7 Causa 7: spedizione, dazi e commissioni

La spedizione è un concetto a sé in Shopify — una riga di spedizione con prezzo e imposta propri — mentre in Odoo arriva di solito come una normale riga d'ordine marcata is_delivery, valorizzata dal prodotto di spedizione del connettore. Dazi, mance e maggiorazioni di pagamento seguono lo stesso schema.

La conseguenza pratica è che il numero di righe non coincide quasi mai, nemmeno su un ordine sincronizzato alla perfezione, e ogni confronto di subtotali eredita quella differenza. Confronta prima i totali; confronta le righe solo dopo aver escluso quelle di spedizione e commissioni sul lato Odoo.

Lo stesso vale per l'asse della consegna: una riga di servizio non ha alcun movimento di magazzino dietro, quindi la sua quantità consegnata resta a zero per sempre. È il comportamento corretto, non una spedizione in sospeso.

8 Causa 8: valuta, presentment money e arrotondamenti

Shopify restituisce ogni campo monetario due volte: shopMoney, nella valuta del tuo negozio, e presentmentMoney, nella valuta che il cliente ha effettivamente visto. Se vendi in più valute, il connettore ne ha importata una e potresti benissimo starne leggendo l'altra.

Odoo aggiunge una seconda conversione sua: l'ordine è memorizzato nella propria valuta e convertito in quella dell'azienda al cambio del giorno. Un tasso di cambio non aggiornato produce una piccola differenza sempre nella stessa direzione, ed è un indizio affidabile, perché gli errori veri raramente sono così costanti.

Poi c'è il puro arrotondamento. Differenze da uno a tre centesimi su ordini multi-riga con sconti percentuali per riga sono arrotondamento, e inseguirle è un pomeriggio buttato. Qualsiasi cosa più grande ha dietro una delle cause qui sopra.

Riferimento rapido: dal sintomo alla causa

Cosa vedi Causa più probabile Dove controllare
La differenza è esattamente l'aliquota d'imposta Prezzi IVA inclusa Imposta Odoo «Inclusa nel prezzo»; confrontare i totali con imposta
Odoo più alto di Shopify, l'ordine ha un rimborso Rimborso registrato dopo la fatturazione account.move out_refund; qty_invoiced per riga
Odoo più alto, nessun rimborso, Shopify originale > attuale Ordine modificato dopo la fatturazione (sovrafatturazione) originalTotalPriceSet contro currentTotalPriceSet
Gli importi coincidono, la quantità di una riga no Rimborso senza rientro a magazzino refundLineItems.restockType; currentQuantity
Una riga in più in Odoo, differenza tonda Gift card usata come pagamento Gateway di pagamento dell'ordine; riga negativa in Odoo
Una gift card mostrata come due righe a metà Abbinata per SKU invece che per il flag gift card isGiftCard; prodotto gift card dell'istanza
Righe Odoo in più con nome di sconto o dazio Prodotti artefatto del connettore Prodotto sconto / dazi / mancia / spedizione dell'istanza
Una differenza di pochi centesimi Arrotondamento o tasso di cambio shopMoney contro presentmentMoney; cambio del giorno in Odoo

Un controllo di cinque minuti da ripetere

Quando ti arriva uno scostamento sulla scrivania, questa sequenza lo risolve più in fretta che fissare i due schermi:

  1. Apri l'ordine su Shopify. Annota il totale attuale e guarda se ha rimborsi o se è stato modificato.
  2. Apri l'ordine di vendita in Odoo. Annota amount_total e guarda invoice_status.
  3. Se è fatturato: somma le fatture confermate, sottrai le note di credito confermate e confronta quella cifra — non il totale dell'ordine — con il totale attuale di Shopify.
  4. Se non è ancora fatturato: confronta con amount_total e considera il risultato provvisorio. Cambierà nel momento in cui la fattura verrà confermata.
  5. Se ancora non tornano, percorri le otto cause in ordine: prima le imposte, poi fatturazione, rimborsi, modifiche, gift card, artefatti, spedizione, valuta. La prima che calza è quasi sempre la risposta.

Cinque minuti per ordine vanno bene quando capita due volte al mese. Smettono di andare bene quando un addetto all'assistenza deve farlo prima di rispondere a ogni e-mail «mi avete addebitato l'importo sbagliato», o quando qualcuno deve controllare a campione gli ordini di una giornata prima della chiusura contabile.

Continua a leggere

Oppure controllalo con un clic

Odoo–Shopify Order Check esegue tutto questo confronto al posto tuo, dentro la pagina dell'ordine che hai già aperta: totali, imposte, quantità, righe, indirizzi e consegna, con rimborsi e gift card trattati come contesto invece che come errori. È di sola lettura — non scrive mai su Odoo né su Shopify — e non richiede alcuna chiave API.

Provala gratis per 14 giorni