Your data
Offers
Offer price, strikethrough price, start and end date, label.
What it does in the conversation
When a customer asks «what's on offer?» or searches a product that is discounted, the assistant shows the offers first, ordered by discount, with the strikethrough price. The cart charges the offer price only between the start and the end date, in your store's time zone: on the day after the end, the offer is gone by itself, with no new file.
The offers file only touches the offer fields of products that already exist: load the catalog first. An offer with a minimum quantity above 1 shows its label («Take 3, pay 2») and does not change the price.
Customer: Any offers on pasta?
Assistant: Yes, this week: • Pasta Spaghetti n.5 500g [Barilla] – €0.99 instead of €1.29 Shall I add it to the cart?
The offer row: offer price 0.99, strikethrough 1.29, from 2 to 15 November. Illustrative example, with the products of the template and an invented store.
If it is missing
- Without offers, the customer always pays the full price and the assistant has nothing to answer to «what's on offer?».
- Without dates, the offer starts at once and lasts until the next file: you have to remember to remove it.
- Without the strikethrough price, the full selling price is shown as the strikethrough.
- An offer price equal to or above the selling price is not an offer: the row is stopped or flagged.
The fields
Required: without it the product is not sold the way the customer expects. Recommended: without it there is a declared fallback, but the experience is poorer. Optional: an improvement.
skurequired- Column in the file
- SKU
- Type
- text
- Example
000201111 · 000301555 · 000405020- Rule
- required, unique in the file, max 128 characters, stable over time
offer_pricerequired- Column in the file
- Offer price
- Type
- number (¤)
- Example
0.99 · 2.90 · 1.99- Rule
- VAT included, of the sales unit, > 0 and lower than the selling price
list_pricerecommended- Column in the file
- Was price
- Type
- number (¤)
- Example
1.29 · 3.30- Rule
- ≥ offer price; empty = the selling price
offer_startrecommended- Column in the file
- Offer start
- Type
- date
- Example
2026-11-02 · 02/11/2026- Rule
- YYYY-MM-DD or DD/MM/YYYY; empty = from now
offer_endrecommended- Column in the file
- Offer end
- Type
- date
- Example
2026-11-15 · 15/11/2026- Rule
- ≥ start; last day included, in the store time zone; empty = until a new file
offer_min_qtyoptional- Column in the file
- Offer minimum quantity
- Type
- integer
- Example
3- Rule
- integer ≥ 1; above 1 the label is shown and the price does not change
offer_labeloptional- Column in the file
- Offer label
- Type
- text
- Example
Sottocosto · Prendi 3, paghi 2- Rule
- max 60 characters, in the store language
Download the template
The first row is the header; the second row (starting with #) describes each column; the three example rows also start with # and are not imported. Column names are recognised in all six languages and by their field name.
Frequent errors and their message
SKU_SCONOSCIUTO«This code is not in your catalog.»(explanation of this guide: Core returns the code)
What to do: Load the product first, then its offer.
OFFERTA_SUPERIORE_AL_PREZZO«The offer price is higher than the price: check the two columns.»
What to do: The offer price must be below the selling price of the product.
OFFERTA_NON_SCONTATA«Warning: the offer does not discount anything and will not be shown.»(explanation of this guide: Core returns the code)
What to do: Check the offer price against the selling price.
DATA_NON_VALIDA«The date cannot be read.»(explanation of this guide: Core returns the code)
What to do: Write YYYY-MM-DD or DD/MM/YYYY.
DATE_INVERTITE«The end date comes before the start date.»(explanation of this guide: Core returns the code)
What to do: The end date is the last day included.
How to send it
- From the portalComing
Coming: the «offers» sheet and file in Products.
- From the APIAvailable
PUT /v1/inventory (catalog:write) touches only price, stock and offer: offer_price, list_price, offer_start, offer_end, offer_min_qty, offer_label. The same fields work in PUT /v1/products.
- Scheduled feedAvailable
In the Google Merchant / Meta feed, sale_price and sale_price_effective_date become the offer and its dates.
Availability as measured on the live service on 30 October 2026.
Put a product on offer for two weeks
curl
curl -X PUT "https://oxjqgjbiltoviwldailg.supabase.co/functions/v1/core-api/v1/inventory" \
-H "Authorization: Bearer $GAI_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: offerta-pasta-2026-11" \
-d '{"inventory":[{"sku":"000201111","offer_price":0.99,"list_price":1.29,"offer_start":"2026-11-02","offer_end":"2026-11-15"}]}'Node.js (18+)
const risposta = await fetch("https://oxjqgjbiltoviwldailg.supabase.co/functions/v1/core-api/v1/inventory", {
method: "PUT",
headers: {
Authorization: `Bearer ${process.env.GAI_KEY}`,
"Content-Type": "application/json",
"Idempotency-Key": crypto.randomUUID(),
},
body: JSON.stringify({
inventory: [
{ sku: "000201111", offer_price: 0.99, list_price: 1.29, offer_start: "2026-11-02", offer_end: "2026-11-15" },
],
}),
});
console.log(risposta.status, await risposta.json());