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 · textPromotion name. Each campaign/product combination must be unique.
product
Required · textProduct name or SKU.
baseline_units
Required · numberExpected units without the promotion, for the baseline window. Supply a forecast or a defensible comparison period.
Minimum: 0.
promo_units
Required · numberGross units sold during the promotion, before the separately recorded returns.
Minimum: 0.
regular_price
Required · numberRealized unit price without the promotion, excluding recoverable taxes.
Minimum: 0.
promo_price
Required · numberRealized promotional unit price after discounts, excluding recoverable taxes.
Minimum: 0.
unit_cost
Required · numberProduct cost plus variable fulfilment and payment costs per gross unit. Fixed overhead is excluded.
Minimum: 0.
promo_spend
Optional · numberIncremental 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 · numberIncremental 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 · numberPositive 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 · numberPositive whole-day length of the source baseline window. Baseline units are multiplied by promotion days / baseline days.
Minimum: 1. Whole days only.
returns
Optional · numberFull-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 · numberExpected 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 · textOptional 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 · textInformational 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.