Gelson's weekly ad, complex deals, in the deals row format. Prepared by 248.ai (Ora), 2026-09-21.

Ad week: 2026-09-16 to 2026-09-22.
Scope: All 26 Gelson's stores. The ad is the same at every store. Each multi-buy family card (Chobani Greek Yogurt, 4 for $5) is one promo_group_id; the family card's own item and every variant card listed under it on the site are one row each, all at the family price, with the variant rows saying so in mapping_note (85 items at each store: 15 family cards plus 70 variants with their own code).

Files:
  gelsons-complex-deals-2026-09-16.csv   one row per store and participating sku_id, 19 columns
  README.txt   this file

Rules applied to every row:
  1. Complex deals only: N for $X, buy X get Y free or Z percent off, and buy X save $Y. Plain single-item sale prices are not in this file.
  2. Digital coupons are excluded. A price that needs a coupon clipped online is not honored at the shelf, so those tiles are left out and counted below.
  3. Delivery is CSV: UTF-8, comma separated, one header row, a blank cell is null, dates are UTC.

Columns, in this order (the 12 deal columns first, then 7 provenance columns):
  store_id                           the retailer's own store number
  sku_id                             the item code under this merchant's convention (see below); digits only
  promotion_type                     BUY_X_FOR_Y, BUY_X_GET_Y_Z_PERCENT_OFF, or BUY_X_SAVE_Y
  promotion_purchase_quantity        X: how many the shopper must buy
  promotion_total_price              BUY_X_FOR_Y only: the price for X; blank otherwise
  promotion_quantity                 BUY_X_GET_Y_Z_PERCENT_OFF only: Y, how many are discounted; blank otherwise
  promotion_percentage               BUY_X_GET_Y_Z_PERCENT_OFF only: Z, 100 when the Y items are free; blank otherwise
  promotion_price_off                BUY_X_SAVE_Y only: the amount off in dollars; blank otherwise
  promotion_quantity_limit_per_cart  the limit printed in the ad; 0 when the ad states none
  promotion_start_time               UTC, ISO-8601 ending in Z
  promotion_end_time                 UTC, ISO-8601 ending in Z
  promo_group_id                     one id per offer; rows that share it are one mix-and-match group
  loyalty_offer_required             True when the price needs a loyalty offer loaded to the shopper's account
  mapping_note                       how the row was derived, when there is something to say; blank otherwise
  item_name                          the item as the retailer names it
  source_deal_text                   the ad copy the row was parsed from
  sku_source                         which field and rule produced sku_id (values listed below)
  flyer_id                           the retailer's circular id; blank when the retailer publishes none
  ad_version                         the regional version of the ad the store receives

sku_id for Gelson's is the site's ecommerceReferenceId verbatim, as the merchant's delivery catalog maps it. It is usually the 12-digit UPC with a leading zero (13 digits); one item this week (No Worries GLP-1 Tart Cherry Pineapple) carries a 10-digit value on the site and is kept as published.
sku_source values in this file:
  ecommerce_reference_id     2210 rows   the site's ecommerceReferenceId verbatim

Buy one get one is BUY_X_GET_Y_Z_PERCENT_OFF with X=1, Y=1, Z=100; the ad's save-up-to amount, where printed, is in mapping_note.
Each price when you buy N or more is BUY_X_FOR_Y with X=N and the total = N x the unit price; mapping_note says so.

Counts:
  rows                                   2210
  offers (distinct promo_group_id)       15
  stores                                 26
  BUY_X_FOR_Y                            2210
  loyalty_offer_required = True          0
  digital coupon tiles excluded          0

Each file is a dated read of the retailer's public website; 248 reports what was published.
