Skip to content
  • There are no suggestions because the search field is empty.

Promotion data in Marketing Mix Modeling (MMM)

How to supply price promotions and campaign discounts as inputs to Sellforte modeling.

Sellforte uses promotion data to separate the effect of price reductions and campaign discounts from the effect of media investments. Without it, a strong sales week during a leaflet campaign can be credited to advertising when the true driver was the price cut, or the other way around. Promotion data is especially important for retailers running frequent price campaigns, weekly leaflets, or seasonal sales.

When you don't need a separate promotion feed

If your sales data already carries a granted discount value on each transaction row, Sellforte can read the promotion signal directly from sales without a separate feed. See the Sales data article for the exact field — "granted discounts" is the one to look for. If it is already present in your sales delivery, you can skip the rest of this article.

If your sales data does not carry per-transaction discount information, or if promotions apply to products or baskets in a way that isn't captured in the sales feed, deliver promotions as a separate dataset as described below.

Dataset definition

Records of price promotions and campaign discounts active during the modeling period, with the timing, scope, and depth of each promotion, used to isolate promotion effects from media effects in modeling.

Sellforte does not prescribe a fixed schema for this dataset. You provide the promotions in whatever format your promotions or merchandising system produces, and the description below covers the information each row should carry.

Grain & sample

Each row represents one promotion on one date, at the scope level your business plans promotions in (product, category, brand, or storewide) and the channel or location they run in.

Example rows (illustrative):

date promotion id promotion name promotion type scope level scope value channel discount depth discount value
2025-01-10 LFL-W02-01 Sofa week -20% percentage category Sofas all stores 20%  
2025-01-10 LFL-W02-02 Free delivery over 500€ free shipping basket 500€ threshold online    
2025-01-10 LFL-W02-03 Bedroom set bundle bundle product SKU-BED-334 all stores   149€

Dimensions

  • date
  • promotion id
  • promotion name (for readability)
  • promotion type (percentage discount, fixed discount, free shipping, bundle, BOGO, loyalty offer)
  • scope level (product, category, brand, storewide, basket)
  • scope value (the specific SKU, category, brand, or threshold the promotion applies to)
  • channel (online, all stores, a specific store cluster, or both)
  • start date and end date (if you prefer to send one row per promotion rather than one row per active date — see below)

Metrics

  • discount depth (percentage off, for example 20%)
  • discount value (absolute discount per unit, or total value granted during the period)
  • units sold under promotion (optional)
  • revenue at discounted price (optional)

Rows per active day vs. rows per promotion

Two shapes work equally well. You can send one row per date per promotion, where a promotion running for seven days produces seven rows. Or you can send one row per promotion with start date and end date columns, where the same promotion produces one row. Pick whichever your source system produces most naturally. If you use the second shape, please make sure the start and end dates are inclusive and cover only the days the promotion was actually active.

Overlap and stacking

Retailers often run several promotions in parallel — a category-wide leaflet discount, a bundle deal, and a loyalty offer can all be active on the same day. Deliver all of them. Sellforte handles overlapping promotions in modeling and does not expect a single "active promotion" per row.