Procedure operative quotidiane, gestione anomalie e troubleshooting — Ultimo aggiornamento: 19/08/2026
Il sistema funziona in autonomia. Ogni giorno vengono eseguite automaticamente queste operazioni:
| Orario | Operazione | Workflow n8n | Cosa fa |
|---|---|---|---|
| Notte | Import listini fornitori | Vari import schedulati | Aggiorna dati raw in tabella prodotti |
| 01:00 | Tassi di cambio BCE | Tassi Cambio - Aggiorna da BCE | Scarica il feed ufficiale della Banca Centrale Europea (29 valute) in tassi_cambio: serve al tool ordini per gli ordini in valuta estera (vedi §5.7) |
| 04:00 | Algoritmo Pricing | Algoritmo Pricing Giornaliero | Snapshot prezzi → controlli anti-errore → refresh vista → alert Telegram |
| 04:30 | Aggiornamento prezzi e categorie Amazon | Keepa - Aggiorna Prezzi Amazon | 100 EAN ogni 4 min, continuo, per priorità (vedi §5.6) |
| 05:00 | Sync Shopify | Shopify - Sync Prezzi e Stock | Aggiorna prezzi/stock, importa nuovi, gestisce orfani |
| 06:00 | Import fatture magazzino | TS Digital - Import Fatture Magazzino | Carichi acquisti nel ledger magazzino_movimenti (giacenze sede Monos) |
| 06:15 | Import fatture di vendita | TS Digital - Import Fatture Vendita | Scarichi delle vendite nel ledger: la giacenza della sede scende. Le righe il cui prodotto non è riconosciuto con certezza restano in coda di revisione |
| Ogni 6h | Sync conto deposito Esprinet | Esprinet - Sync Conto Deposito | Giacenze deposito → carichi FIFO in esprinet_depot_carichi |
| 06:30 | Sync scarichi deposito | Esprinet - Sync Scarichi Deposito | Spedizioni in uscita dal deposito (DDT Esprinet degli ultimi 14 giorni) → esprinet_depot_scarichi |
| 07:00 | Riconciliazione valorizzazione deposito | Deposito - Riconciliazione Valorizzazione | Propone match fattura↔prodotto deposito con quadratura entrate/uscite (conferma umana in NocoDB) |
| 16:00 | Algoritmo Pricing (2ª) | Algoritmo Pricing Giornaliero | Stessa pipeline delle 04:00 |
| 17:00 | Sync Shopify (2ª) | Shopify - Sync Prezzi e Stock | Stessa sync delle 05:00 |
Quando arriva un alert dal bot Telegram, ecco come interpretarlo e agire:
| Codice | Significato | Azione richiesta |
|---|---|---|
| PS-01 WARNING | Prezzo fuori range (troppo basso o alto) | Nessuna. Fornitore escluso automaticamente per quel prodotto. |
| PS-03 WARNING | Prezzo troppo diverso dagli altri fornitori | Nessuna. Se il prodotto è in promo, il sistema genera solo un alert INFO (non esclude). Altrimenti verificare se il fornitore ha un listino aggiornato. |
| PS-05 WARNING | Prezzo Shopify cambiato >10% rispetto al giorno prima | Verificare che il cambio sia legittimo (promo, aggiornamento listino). |
| Codice | Significato | Azione richiesta |
|---|---|---|
| PS-02 HOLD | Prezzo cambiato >25% rispetto alla media 30 giorni | Il prezzo Shopify è congelato. Verificare se il cambio è reale o errore fornitore. |
| PS-05 HOLD | Prezzo Shopify cambierebbe >20% | Il prezzo è congelato. Verificare la causa. |
fornitori_esclusi per quell’EAN.fn_auto_risolvi_hold() risolve automaticamente gli HOLD dopo 3 giorni.
Quando il sito sarà operativo e ci sarà un operatore, rimuovere la chiamata dal workflow e tornare a risoluzione manuale.
| Codice | Significato | Azione richiesta |
|---|---|---|
| PS-01 CRITICAL | Prezzo a €0 o fuori range assoluto | Fornitore escluso. Verificare il feed del fornitore. |
| PS-02 CRITICAL | Prezzo cambiato >40% rispetto alla media | Fornitore escluso. Probabilmente errore nel listino. |
| PS-03 CRITICAL | Deviazione estrema dalla mediana fornitori (solo se non in promo) | Fornitore escluso. Se è una promo legittima, aggiungere a promo_whitelist (il report Telegram include un link NocoDB per farlo rapidamente). Riammissione automatica quando il prezzo rientra o il prodotto entra in promo. |
| PS-04 CRITICAL | Margine <9% sul landed cost | Prodotto in DRAFT (non visibile su Shopify). |
pricing_alerts (NocoDB) per i dettagli.fornitori_esclusi per vedere quali fornitori sono stati esclusi.prodotti per tutti i fornitori di quell’EAN.Se serve aggiornare i prezzi fuori dagli orari schedulati:
Se serve sincronizzare Shopify fuori dagli orari schedulati:
Se un listino non si è aggiornato:
prodotti che i dati siano aggiornati (colonna data_aggiornamento)ean_bloccati (via NocoDB o Supabase)ean, motivo, data_inserimentopromo_whitelist (via NocoDB)ean, fornitore, sconto_max_pct, data_inizio, data_finePagina web per analizzare gli ordini Amazon e scegliere da dove evadere ogni riga: ordini-amazon.html.
Il bottone «Scarica ordini da Amazon» sopra l’area di caricamento chiede il report via Amazon SP-API e lo carica nel tool. Compare solo se l’interruttore spapi_import_report (NocoDB, tool_amazon_soglie) è acceso; con l’interruttore spento si usa il caricamento del file (§4.1).
La finestra “dall’ultimo scarico” si sovrappone di un’ora con la precedente apposta: un ordine già visto non costa nulla (il tool lo segnala come già visto/gestito), mentre un ordine aggiornato fra due scarichi altrimenti sfuggirebbe. Stato e cronologia degli scarichi in amazon_report_scarichi.
Ogni opzione indica da dove proviene la merce e chi spedisce al cliente — due informazioni separate:
| Fonte merce | Cosa significa | Modalità possibili |
|---|---|---|
| Fornitore | Acquisto dal distributore (IMA, TD Synnex, Xpress, Focelda, V-Valley). Il canale Esprinet rifornisce solo deposito e sede: la spedizione diretta dal suo catalogo è etichettata V-Valley | Diretta fornitore, oppure contratto nostro (Focelda sempre; Xpress per l’estero: ritiro presso la loro sede + corriere nostro) |
| CONTO DEPOSITO | Merce già nostra presso il deposito Esprinet — il prezzo mostrato è il costo d’acquisto reale, non il listino | Due opzioni a confronto: spedizione gestita Esprinet oppure ritiro con contratto corriere nostro |
| SEDE MONOS | Merce in magazzino fisico (giacenze ricostruite dalle fatture) | Contratto corriere nostro (BRT/GLS) |
Le combinazioni ammesse e le tariffe si modificano da NocoDB senza toccare codice: tabella regole_fonte_spedizione (quali combinazioni esistono) e fornitori_spedizione (le tariffe).
Spedizioni Italia: il confronto a contratto nostro include BRT, GLS e FedEx, con le tariffe del contratto BC420 (zone FX_IT e FX_IT_CSS in corrieri_tariffe). FedEx risulta il più conveniente nella fascia 3–20 kg. Per Calabria, Sicilia e Sardegna vale un listino dedicato più caro, selezionato dal CAP del destinatario tramite il token IT_CSS. Fino al 20/08/2026 la sede di Catania lo usava sempre, a prescindere dalla destinazione (parametro fedex_zona_forzata in fornitori_spedizione.config_extra); rimosso dopo la conferma della cliente che conta solo la destinazione — oggi la zona FedEx dipende solo dal CAP del cliente, come per le altre fonti. Il supplemento carburante FedEx Italia è 18,92% (indice mensile scontato del 25% come da contratto) e va ricalcolato a ogni cambio di mese in corrieri_supplemento_carburante, chiudendo la riga precedente con valido_al e inserendone una nuova — mai modificando quella esistente.
Spedizioni estero: il trasporto a contratto nostro usa le tariffe reali per paese (GLS/BRT/FedEx, corriere più conveniente scelto in automatico); le isole (Canarie, Baleari, Madera, Azzorre, Corsica…) sono riconosciute dal CAP e costano più del continente (un costo reale, non un errore). Se nessun corriere copre la spedizione — peso oltre i massimi (GLS 40 kg, FedEx ~70 kg, BRT 150 kg) o paese/CAP non a tariffario — l’opzione segna “fuori copertura corriere”, non viene mai raccomandata e la riga passa in In verifica: verificare il costo a mano. Le fonti solo-Italia (V-Valley, conto deposito a gestione Esprinet) restano non disponibili per l’estero.
Contratto BRT estero: i listini esteri BRT sono quelli del contratto firmato il 22/07/2026 (validità 16/03–31/12/2026), con supplemento carburante è passato dal 16%/14,5% all’8%, quindi BRT vince molto più spesso il confronto con GLS e FedEx sulle tratte estere: sui prodotti Focelda verso la Germania, per esempio, il trasporto scende da €12,92 a €11,33. In più, BRT ora copre fino a 150 kg (prima si fermava a 100) e ha tariffe proprie per Norvegia, Andorra, Gibilterra, Ceuta/Melilla e per i territori insulari, dove prima era disponibile solo GLS. L’Italia non è stata rinnovata: il listino nazionale BRT resta quello del 2023 (vedi domande aperte). L’8% resta valido finché il gasolio non supera ~2,30 €/lt; quando cambierà, vale la stessa regola già in uso per FedEx — chiudere la riga in corrieri_supplemento_carburante con valido_al e inserirne una nuova, mai modificare quella esistente (a parità di validità la funzione sceglie la percentuale più alta, non la più recente).
| Stato | Significato | Cosa fare |
|---|---|---|
| Confermato (verde) | Abbinamento affidabile, nessun segnale | Si può procedere con la raccomandazione |
| Avviso (giallo) | Dato da evidenziare, non bloccante (es. categoria Amazon insolita, merce in conto deposito, prezzo/disponibilità non aggiornati di recente, tempi di consegna oltre soglia, quantità sotto il minimo ordinabile, prezzo BID TD Synnex che richiede nota d’ordine — vedi §4.8; merce a deposito ferma oltre la soglia di aging; il caso “la fonte più rapida rende molto meno di un’alternativa”). La merce in sede Monos viene segnalata solo quando la sede è la fonte raccomandata | Leggere il motivo nel tooltip, procedere con consapevolezza |
| In verifica (arancio) | Margine o scelta da controllare (margine ≤ 0, scelta deposito-vs-fornitore, costo deposito non certificato, dati oltre la soglia critica di aggiornamento, spedizione estero fuori copertura corriere — vedi §4.2) | Aprire il confronto e decidere manualmente |
| Nessuna fonte con merce | Una fonte a giacenza zero non è mai raccomandata: se nessuna ha merce, la riga resta senza raccomandazione e lo dichiara nel motivo | Guardare le giacenze e l’eventuale “+N arr.” nel confronto; se il riassortimento è imminente, scegliere la fonte a mano |
| Blocco (rosso) | Abbinamento non affidabile: la raccomandazione automatica è soppressa | Valutare manualmente i candidati elencati, verificare il prodotto |
| Non trovato (grigio) | Nessun fornitore nel database | Ricerca manuale del prodotto |
Le opzioni conto deposito mostrano un badge sul costo:
Per certificare i costi: confermare le proposte di riconciliazione in NocoDB, tabella esprinet_depot_valorizzazione (filtrare stato = proposto, confermare o rifiutare ogni match fattura↔prodotto).
Il sistema non abbina più le fatture solo per codice EAN e quantità: confronta le fatture di acquisto con le spedizioni reali in uscita dal deposito (i DDT Esprinet, scaricati ogni mattina) e con la giacenza attuale. Vengono proposte solo le fatture la cui combinazione fa quadrare i conti: pezzi entrati − pezzi usciti = pezzi in giacenza, con date coerenti.
note — scrivere una nota è quindi il modo per “bloccare” una proposta in valutazione.Per una panoramica per prodotto (giacenza, pezzi usciti, copertura delle proposte) è consultabile in NocoDB la vista v_depot_quadratura_prodotto.
Il tool chiede ad Amazon la commissione reale di ogni riga (per prodotto, marketplace e prezzo di vendita) e la conserva in amazon_fee_cache per riusarla nelle analisi successive (validità spapi_fee_ttl_gg giorni, in tool_amazon_soglie). Non esiste una tabella di ripiego: una riga senza commissione resta In verifica, non viene raccomandata e va rianalizzata.
Ogni analisi scrive una riga in tool_amazon_analisi_log: se righe_fee_mancante o fee_fallite_permanenti crescono da un giorno all’altro, Amazon sta rifiutando le richieste e la colonna nota dice quali chiavi e con che errore.
Si può scegliere operativamente una fonte diversa da quella raccomandata, lasciando traccia del perché:
La scelta è salvata nel database: ricaricando lo stesso report nei giorni successivi riappare automaticamente. Per cambiarla basta scegliere un’altra opzione (la precedente resta in archivio); per rimuoverla usare Annulla scelta. Lo storico completo è consultabile in NocoDB, tabella tool_amazon_scelte.
Ogni opzione del confronto mostra quando sono stati aggiornati prezzo e disponibilità della fonte (riga “🕐 dato al gg/mm/aaaa hh:mm”):
Le soglie si regolano da NocoDB, tabella tool_amazon_soglie (effetto immediato senza interventi tecnici). La stessa tabella contiene le soglie di aging conto deposito (merce ferma da segnalare, default 90 giorni), dell’avviso perdita (differenza minima in euro e in percentuale), del margine sulla consegna promessa (promise_margine_gg, §4.7b) e gli interruttori delle funzioni Amazon SP-API (spapi_*). La colonna unita dice come leggere il valore: ore, giorni, euro, percentuale o flag. Ogni opzione mostra anche il lead time (“🚚 lead time X gg”): per le opzioni Esprinet è lo SLA del corriere dai report Esprinet, mostrato per corriere (es. “GLS 2 gg · BRT 3 gg”) e sovrascritto a ogni report giornaliero; per gli altri fornitori resta provvisorio “(da confermare)”. Non blocca mai la raccomandazione. Riferimento SLA in lead_time_esprinet (NocoDB).
La colonna Consegna prom. riporta la data entro cui l’ordine è stato promesso al cliente, chiesta ad Amazon per ogni ordine del report e conservata in cache per 12 ore. È vuota quando Amazon non la comunica (ordini non gestiti da noi, o ancora in attesa).
Se la fonte raccomandata arriverebbe a ridosso o oltre quella data, la riga passa in Avviso con badge RITARDO e il motivo indica il margine in giorni. Il margine di preavviso è la soglia promise_margine_gg in tool_amazon_soglie (1 giorno di serie); l’interruttore è spapi_promise_date.
La colonna Spedire entro riporta la data limite di partenza dell’ordine (LatestShipDate), quella che su Seller Central sta nell’elenco degli ordini da spedire. Arriva dalla stessa chiamata getOrders della consegna promessa (§4.7b): stesso interruttore spapi_promise_date, stessa cache di 12 ore, nessuna richiesta aggiuntiva ad Amazon. Non serve caricare il report degli ordini non spediti.
I badge SCADUTA, OGGI e DOMANI compaiono in base ai giorni interi che restano, e negli stessi tre casi la riga porta un avviso in chiaro nel pannello di dettaglio. La card Da spedire entro oggi somma le righe scadute e quelle in scadenza; mostra “—” (non zero) quando nessuna riga del report ha quella data, per non far leggere “nessuna urgenza” dove il dato manca.
Con l’interruttore spento la colonna resta vuota e le righe tornano nell’ordine del report. In cache le date stanno su amazon_ordine_righe, colonne ship_earliest e ship_latest accanto a promise_earliest/promise_latest (visibili da NocoDB). Sono vuote per gli ordini che Amazon non gestisce come seller-fulfilled e per quelli in stato Pending/PendingAvailability/Canceled.
Il prezzo d’acquisto di ogni opzione è il migliore tra listino, promozione e prezzo bid validi per quella riga (quantità e date comprese). Un badge indica quale prezzo è stato usato; passando il mouse sulla cella Prezzo Acq. si vede la composizione (base + eco-contributi).
| Badge | Significato |
|---|---|
| (nessun badge) | Prezzo di listino riservato. Per Esprinet include gli eco-contributi RAEE/SIAE; per TD Synnex include il surcharge (stessi contributi) |
| PROMO fino al gg/mm | Prezzo da campagna speciale del fornitore (Esprinet SpecialCampaigns), applicato solo se la promozione è in corso e la quantità della riga rientra nella fascia prevista. Le promozioni scadute non vengono più usate |
| PREZZO BID fino al gg/mm | Prezzo riservato concordato col fornitore (tabella prezzi_bid). Nel tooltip: numero accordo e validità. Applicato solo se valido per date, fascia quantità e quota residua dell’accordo |
| MOQ n? | La quantità della riga è sotto la quantità minima ordinabile del fornitore (n pezzi): valutare se ordinare di più. Solo segnalazione, il costo resta sulla quantità della riga |
Da dove arrivano i bid: quelli TD Synnex sono importati automaticamente dal file ShipAndDebit_EndCust.txt insieme agli altri file TD (a ogni import vengono sostituiti con la versione aggiornata del file). È possibile inserire bid a mano da NocoDB nella tabella prezzi_bid per qualsiasi fornitore (es. accordi IMA comunicati via email): impostare origine = manuale — le righe manuali non vengono mai toccate dagli import. Compilare almeno fornitore, sku (codice articolo del fornitore), prezzo e, se nota, la scadenza.
Pagina https://docs.srv1203683.hstgr.cloud/ordini-fornitore.html (nessun link dal tool ordini): dalle righe gestite compone un ordine per ordine Amazon e fornitore, lo controlla e lo tiene in attesa di conferma. Alla conferma il file XLS di TD Synnex viene scritto sul VPS in /local-files/ordini-fornitore/; email e richieste API Esprinet restano composte nel database. Nessun invio parte da qui. Guida: guida-ordini-fornitori.html.
fornitori_ordine_config (NocoDB), riga MONOS × Tdsynnex.fn_tool_verifica_riga_ordine, tolleranze in tool_amazon_soglie) non riconosce il prezzo atteso fra bid, riservato, standard e promo del catalogo; controllare il listino del fornitore in prodotti.tool_ordini_fornitore, _righe, _verifiche, amazon_ordini, fornitori_ordine_config, tool_ordini_fornitore_esclusioni. Le tabelle ordini_fornitore* senza prefisso sono del foglio Google di Viviana: non toccarle.ordini_fornitore_attivo = 0 in tool_amazon_soglie. Email di riepilogo alle 08:30 solo se ci sono ordini bloccati da >24 h o pronti da >48 h.WOBqOAuLxArohHrN, Prepara Mjp29uOIvhkHc7GV, Conferma PzhvGuyCabo8zjKJ, File vdDPxTaGVEn6LLAM, Stato oSmd3plCp9gXV7Tw, Guardia PcVQGgX3ubCyYS8T.Sintomo: errori “Unauthorized” o “401” nei workflow Shopify.
shopify_token che il nuovo token sia presente con scadenza futuraSintomo: workflow con stato “Error” nella lista esecuzioni n8n.
Diagnosi:
Cause comuni:
| Errore | Causa | Soluzione |
|---|---|---|
ECONNREFUSED | Problema di rete VPS | Verificare connessione, riprovare |
timeout | DB o API non risponde | Riprovare dopo qualche minuto |
rate limit | Troppe richieste API | Attendere e riprovare |
relation does not exist | Tabella mancante in Supabase | Verificare schema DB |
Sintomo: https://n8n.srv1203683.hstgr.cloud non risponde.
# Connettersi alla VPS ssh root@srv1203683.hstgr.cloud # Verificare stato container cd /docker/n8n docker compose ps # Se container down, riavviare docker compose restart # Se non si riavvia, controllare log docker logs n8n-n8n-1 --tail 100
Sintomo: workflow impiegano molto più del solito, timeout frequenti.
REFRESH MATERIALIZED VIEW (non CONCURRENTLY) perché PgBouncer in modalità transaction non lo supporta. Durante il refresh (~2-3 secondi) le query sulla vista possono fallire.
Sintomo: i dati di un fornitore nella tabella prodotti hanno data_aggiornamento vecchia.
Sintomo: la tabella amazon_prezzi ha date vecchie, oppure il tool ordini segnala molti prodotti senza categoria Amazon.
https://api.keepa.com/token?key=...; sotto 500 arriva una mail automatica a report@monostech.com. Non ridurre l’intervallo del workflow sotto i 4 minuti: a 2 minuti il consumo supera la ricarica e i token si esauriscono in circa un’ora e mezza (verificato il 20/07/2026).keepa_coda: se vuota, fn_popola_keepa_coda() non è stata eseguita (gira dentro l’Algoritmo Pricing delle 04:00 e 16:00)Cosa viene messo in coda: tutto il catalogo utilizzabile — prodotti non fuori produzione, con un prezzo d’acquisto e un EAN valido — a prescindere dal fatto che vadano su Shopify, perché gli stessi dati servono sia al prezzo del negozio sia alle commissioni del tool ordini. Sono ~112.000 prodotti, lavorati per priorità: 1 riaggiornamento prezzi dei prodotti già in vendita, 2 prodotti disponibili del resto del catalogo, 3 tutti gli altri. Una coda con molte righe di priorità 2 o 3 non è un’anomalia: è il recupero in corso, che alla prima passata richiede circa 4 giorni.
I prodotti per cui Keepa non restituisce la categoria (codice sconosciuto o scheda senza categoria) sono elencati in NocoDB nella vista v_categoria_da_mappare, da correggere a mano.
Sintomo: nel tool ordini compare l’avviso “Tassi di cambio non disponibili” o “non aggiornati” sopra i risultati, e le righe in valuta estera restano in In verifica senza essere convertite.
Tl0H891mq6CpGjUe, gira ogni notte all’01:00) sia attivo e che l’ultima esecuzione sia andata a buon fine. Se ha fallito arriva anche una mail d’erroretassi_cambio: SELECT max(data_riferimento) FROM tassi_cambio;. Se il dato è più vecchio della soglia tassi_cambio_stantio_giorni (NocoDB, tool_amazon_soglie), il tool tratta i tassi come non disponibili anche se la tabella non è vuotaIl backup viene gestito automaticamente da Supabase. Per un backup manuale:
Per dump manuale via CLI:
pg_dump "postgresql://postgres.ffcrmgkbhxjcvxidjmns:[PASSWORD]@aws-1-eu-west-1.pooler.supabase.com:6543/postgres" > backup_YYYYMMDD.sql
I workflow n8n sono sincronizzati automaticamente nella cartella workflows/ del repository Git. In caso di problema:
workflows/ del progettossh root@srv1203683.hstgr.cloud → docker compose restart| Problema | Chi contattare | Come |
|---|---|---|
| Errore listino fornitore | Referente commerciale del fornitore | Email / telefono |
| Problema Supabase | Dashboard Supabase / supporto | supabase.com/dashboard |
| Problema VPS / Hostinger | Supporto Hostinger | Pannello Hostinger |
| Problema Shopify | Supporto Shopify Partner | help.shopify.com |
| Problema Keepa API | Supporto Keepa | keepa.com |
| Problema tecnico sistema | Sviluppatore (Alberto Cabas Vidani) | Telegram |
MonosTech — Runbook Operativo — Ultimo aggiornamento: 19/08/2026