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.

Example

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());

API documentation