I tuoi dati
Regole commerciali
Ordine minimo, pagamenti, sconti, codici, extra, modifiche all'ordine.
A che cosa serve nella conversazione
L'assistente applica le tue regole mentre compone il carrello e il totale: dice al cliente quanto manca all'ordine minimo, propone solo i tuoi metodi di pagamento, applica sconti e codici amici, aggiunge l'extra per i colli pesanti e accetta modifiche a un ordine inviato solo entro la tua finestra. Ogni regola è una scelta fra quelle che GroceryAI applica già: nessun testo libero finisce nelle istruzioni dell'assistente.
Le regole hanno le versioni: ogni modifica ne fa una nuova, puoi tornare a una precedente, e l'anteprima mostra che cosa leggerà il cliente prima di salvare.
Cliente: Quanto manca per l'ordine minimo?
Assistente: Il tuo carrello è di €21,40: l'ordine minimo è €25,00, mancano €3,60. Vuoi che ti proponga qualcosa?
Ordine minimo 25,00 nel regole.json d'esempio. Esempio illustrativo, coi prodotti del modello e un negozio inventato.
Che cosa succede se manca
- Senza ordine minimo si accetta qualunque importo.
- Senza coordinate bancarie il bonifico non si può offrire.
- Senza sconti e codici amici non si applica nessuno sconto e un codice scritto dal cliente non vale.
- Senza finestra di modifica vale quella di serie: modifiche fino a 2 ore prima della consegna.
- Senza extra per i colli pesanti casse e sacchi viaggiano senza costi in più.
I campi
Obbligatorio: senza, il prodotto non si vende come il cliente se l'aspetta. Consigliato: senza, c'è un ripiego dichiarato, ma l'esperienza è più povera. Facoltativo: un miglioramento.
regole.json (PUT /v1/rules e la pagina Regole)
min_order_amountobbligatorio- Tipo
- importo o null
- Esempio
25.00- Regola
- null o 0.00 = nessun minimo.
payment_methodsobbligatorio- Tipo
- elenco
- Esempio
cash, card_pos, bank_transfer- Regola
- Almeno uno fra: cash, card_pos, prepaid_link, bank_transfer.
zonesobbligatorio- Tipo
- elenco
- Esempio
centro · 4.50 · 60.00- Regola
- Costo e soglia di gratuità per zona; soglia mai sotto il costo.
bank_transferconsigliato- Tipo
- intestatario, IBAN, BIC, banca
- Esempio
IT60 X054 …- Regola
- Obbligatorio se bank_transfer è fra i pagamenti; IBAN con le cifre di controllo.
prepaid_flowfacoltativo- Tipo
- scelta
- Esempio
none- Regola
- operator_link: i tuoi operatori mandano il link di pagamento; none.
cash_requires_own_deliveryfacoltativo- Tipo
- sì/no
- Esempio
true- Regola
- Contanti solo quando consegni coi tuoi mezzi (di serie sì).
discountsfacoltativo- Tipo
- percentuali e giorni
- Esempio
welcome 5 · comeback 8 after 45 days- Regola
- Benvenuto, bentornato dopo N giorni, gradini di fedeltà (giorni crescenti), non sulle offerte (di serie).
friend_codesfacoltativo- Tipo
- codici e percentuale
- Esempio
BENVENUTO5 · 5- Regola
- Lettere e cifre, da 3 a 40; il cliente li scrive come vuole.
heavy_extrasfacoltativo- Tipo
- termini o peso, unità gratuite, tariffa
- Esempio
cassa · 8 free · 0.40- Regola
- Almeno un termine o un peso minimo.
order_edit_window_hoursfacoltativo- Tipo
- ore
- Esempio
3- Regola
- Fino a quante ore prima della consegna il cliente cambia l'ordine (di serie 2).
checkout_upsellfacoltativo- Tipo
- termini, quanti
- Esempio
pile, sacchetti · 2- Regola
- Articoli proposti alla cassa, fino a 5.
cart_reminderfacoltativo- Tipo
- sì/no
- Esempio
true- Regola
- Promemoria della spesa lasciata a metà.
slot_on_sendfacoltativo- Tipo
- scelta
- Esempio
propose- Regola
- set_first: l'assistente mette la prima fascia; propose: la propone con la domanda.
Scarica il modello
- regole.json d'esempioregole.json
- Schema di regole.jsonregole.schema.json
Errori frequenti e il loro messaggio
SOGLIA_SOTTO_IL_COSTO«La soglia per la consegna gratuita non può essere più bassa del costo della consegna.»
Che cosa fare: Alza la soglia o lasciala vuota.
COORDINATE_BANCARIE_ASSENTI«Per offrire il bonifico servono prima le coordinate del conto del negozio.»
Che cosa fare: Compila intestatario e IBAN, poi aggiungi il bonifico.
IBAN_NON_VALIDO«Le cifre di controllo dell'IBAN non tornano.»(spiegazione di questa guida: Core restituisce il codice)
Che cosa fare: Ricopialo dalla banca: spazi e minuscole vanno bene.
GRADINI_NON_IN_ORDINE«I gradini di fedeltà vanno dal periodo più corto al più lungo.»(spiegazione di questa guida: Core restituisce il codice)
Che cosa fare: Ordinali per giorni crescenti.
VERSIONE_CAMBIATA«Qualcuno ha cambiato le regole nel frattempo. Ricarica la pagina e ripeti la modifica.»
Che cosa fare: Manda based_on_version uguale alla versione attuale.
Come mandarli
- Dal portaleIn parte
Oggi: Regole del negozio → ordine minimo, metodi di pagamento, costo e soglia per zona, versioni e anteprima. In arrivo: coordinate bancarie, sconti, codici amici, extra per i colli pesanti, finestra di modifica, avancassa, promemoria.
- Dall'APIIn arrivo
GET/PUT /v1/rules e POST /v1/rules/preview esistono; i permessi rules:read e rules:write non si possono ancora dare a una chiave dal portale.
- Documento JSONIn arrivo
regole.json: lo stesso documento, da scaricare e ricaricare (per chi gestisce più negozi).
Disponibilità misurata sul servizio vivo il 30 ottobre 2026.
Scrivi le regole (parti dalla versione attuale)
curl
curl -X PUT "https://oxjqgjbiltoviwldailg.supabase.co/functions/v1/core-api/v1/rules" \
-H "Authorization: Bearer $GAI_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: regole-2026-11-02" \
-d '{"based_on_version":3,"min_order_amount":"25.00","payment_methods":["cash","card_pos"],"zones":[{"zone_slug":"centro","delivery_cost":"4.50","free_threshold":"60.00"}],"order_edit_window_hours":3}'Node.js (18+)
const risposta = await fetch("https://oxjqgjbiltoviwldailg.supabase.co/functions/v1/core-api/v1/rules", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.GAI_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
based_on_version: 3,
min_order_amount: "25.00",
payment_methods: ["cash", "card_pos"],
zones: [{ zone_slug: "centro", delivery_cost: "4.50", free_threshold: "60.00" }],
order_edit_window_hours: 3,
}),
});
console.log(risposta.status, await risposta.json());