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.
| Field | Meaning | Example |
|---|---|---|
| campaign | Event name | Summer margin review |
| product | Product name or SKU | SKU-100 |
| baseline_units | Expected no-promotion units for the stated baseline window | 100 |
| promo_units | Gross promotion units before separately recorded refunds | 160 |
| regular_price | Relevant realized no-promotion unit price | 50 |
| promo_price | Realized discounted unit price | 40 |
| unit_cost | Product and relevant variable cost per gross unit | 25 |
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.