Practical promotion economics

A clear row definition prevents a misleading promotion review.

Before mapping columns, decide what one row represents. MarginTrial's campaign input is a product within one campaign, with a supplied no-promotion benchmark. It is not a raw order export, a daily demand panel or an automatic forecasting dataset.

Respect the analytical grain

Each campaign/product combination must be unique. If a source contains daily or transaction rows, aggregate them deliberately before import: sum compatible unit counts and costs, calculate realized weighted unit prices, and preserve the campaign and SKU boundary.

A mean of daily prices can differ from revenue divided by units. If two days sell 10 and 100 units, their price contributions should not receive equal weight merely because there are two dates. Check the aggregation against source revenue and quantity totals.

The seven required fields

The public data dictionary lists the full contract. These seven columns define the minimum input. Numeric zeros are permitted where meaningful, but missing required numbers are not silently treated as zero.

FieldMeaningExample
campaignEvent nameSummer margin review
productProduct name or SKUSKU-100
baseline_unitsExpected no-promotion units for the stated baseline window100
promo_unitsGross promotion units before separately recorded refunds160
regular_priceRelevant realized no-promotion unit price50
promo_priceRealized discounted unit price40
unit_costProduct and relevant variable cost per gross unit25

Optional fields carry assumptions too

promo_spend and supplier_funding are allocated row amounts, not repeated campaign totals. returns is full-refund units under the conservative unrecovered-cost model. post_promo_dip_units values supplied later units at regular unit contribution; a blank means unmeasured, not a measured zero.

Supply both period_days and baseline_days, or neither. The paired fields are positive whole-day window lengths. If absent, baseline units are assumed already aligned. A currency column, when provided, must agree with the project's selected currency on every row.

Worked reconciliation before import

A row with baseline 100, promotion units 160, regular price €50, promotion price €40, cost €25 and spending €30 contributes €2,370 versus a €2,500 baseline: a −€130 difference. The clean-import-example template contains this case.

  • Verify 160 × €40 = €6,400 realized promotion revenue before separately recorded refunds.
  • Verify fixed spending appears once, not on every transaction before aggregation.
  • Check returned units do not exceed the gross promotion cohort.
  • Keep source dates, exclusions and baseline construction in an accompanying evidence note.

Use a portable text file

Export UTF-8 with one header row and consistent columns. The importer accepts comma, semicolon, tab or pipe delimiters and supports explicit decimal conventions. Avoid merged cells, subtotals and formatted currency symbols in numeric fields.

RFC 4180 documents common CSV quoting conventions: fields containing commas, quotes or line breaks need quoting, and an embedded quote is doubled. A correctly quoted product name should not create an extra column. The importer validates the whole dataset so an invalid row cannot silently disappear from the result.

Frequently asked questions

Can I upload several currencies together? Not into one monetary project. Convert values consistently before import or analyze separate currency projects; changing a label does not exchange money.

Can I map a raw Shopify sales export directly? Only after reconciling its definitions and grain to this contract. The workbench does not infer the missing no-promotion baseline or allocate shared campaign costs for you.

Put it to work

Source context

Guide text and examples were prepared independently for MarginTrial. Sources provide the stated methodological or product context. They do not validate the hypothetical commercial outcomes.

Open the worked case