Practical promotion economics

The campaign CSV data dictionary

The exact input contract used by MarginTrial’s campaign workbench.

One row, one product–campaign

Use a unique campaign and product combination. Share a single currency and a consistent tax basis. Allocate fixed campaign costs and support across product rows, rather than repeating the whole campaign amount on each row.

campaign

Required · text

Promotion name. Each campaign/product combination must be unique.

product

Required · text

Product name or SKU.

baseline_units

Required · number

Expected units without the promotion, for the baseline window. Supply a forecast or a defensible comparison period.

Minimum: 0.

promo_units

Required · number

Gross units sold during the promotion, before the separately recorded returns.

Minimum: 0.

regular_price

Required · number

Realized unit price without the promotion, excluding recoverable taxes.

Minimum: 0.

promo_price

Required · number

Realized promotional unit price after discounts, excluding recoverable taxes.

Minimum: 0.

unit_cost

Required · number

Product cost plus variable fulfilment and payment costs per gross unit. Fixed overhead is excluded.

Minimum: 0.

promo_spend

Optional · number

Incremental fixed campaign costs allocated to this row. Enter each cost only once; exclude costs already in unit cost.

Blank input defaults to 0. The importer records that the amount was not supplied.

Minimum: 0.

supplier_funding

Optional · number

Incremental supplier support allocated to this row. Exclude support already netted from unit cost.

Blank input defaults to 0. The importer records that the amount was not supplied.

Minimum: 0.

period_days

Optional · number

Positive whole-day length of the promotion window. Supply together with baseline window days to normalize baseline units.

Minimum: 1. Whole days only.

baseline_days

Optional · number

Positive whole-day length of the source baseline window. Baseline units are multiplied by promotion days / baseline days.

Minimum: 1. Whole days only.

returns

Optional · number

Full-refund units. Revenue is refunded and product cost is conservatively treated as unrecovered.

Blank input defaults to 0. The importer records that the amount was not supplied.

Minimum: 0.

post_promo_dip_units

Optional · number

Expected units lost after the promotion through forward pull or stockpiling. Valued at the regular contribution per unit. Blank means unmeasured, not observed zero.

Minimum: 0.

currency

Optional · text

Optional three-letter ISO currency code. All rows in a project must use the same currency; labels do not perform exchange-rate conversion.

margintrial_contains_synthetic

Optional · text

Informational provenance metadata. true, yes or 1 marks a row as containing fictional inputs. Any marked campaign row labels the imported project as containing synthetic data. Unmarked data remains supplied and unverified; this field does not prove authenticity.

Validation and exports

CSV files are parsed as UTF-8 with comma, semicolon, tab or pipe delimiters. Quoted fields and embedded newlines are supported. Choose the correct decimal convention. Duplicate row keys, inconsistent currencies, non-finite values, invalid quantities, and malformed rows block the full import. No partial file is silently reported.

The offline edition accepts up to 25,000 campaign rows. Exported CSV text is guarded against spreadsheet formula execution for untrusted text fields. Project backups preserve the input contract and scenario settings.