# Illustrative UGC ad budget: inputs and reproducible calculations

Prepared 29 October 2026. No campaign was run. These are assumed USD inputs, not market rates or predicted outcomes. The CSV contains 16 combinations of media spend (1000, 3000, 10000, 30000) and production/rights cost (300, 600, 900, 1500). Neither parameter is a recommendation.

Control: media 3000, production/rights 300, attributed orders 100.
Creator: media 3000, production/rights 1500, attributed orders 125.
Contribution before advertising: 25 per order for both; assumed net of product, fulfillment, payment and expected return costs.
All attributed orders are assumed incremental solely for the arithmetic illustration. A real campaign needs a holdout/lift design to establish incremental orders. Attribution alone cannot do that. No uncertainty intervals are implied by this deterministic table.

Media CPA = media / orders.
Total CPA = (media + production/rights) / orders.
Contribution after advertising = orders * contribution_before_ads - media - production/rights.
With target total CPA T, media spend M and production cost P, required media CPA = T*M/(M+P). This follows by substituting orders=M/media_CPA into total_CPA=(M+P)/orders.

To match the control, T=33. To break even on assumed contribution, T=25. These are different thresholds because the control loses money. Production is charged wholly to this comparison; define an appropriate usage period before reusing the calculation in practice. If the asset is amortized over more spend, use only its allocated production cost and the corresponding orders/spend. Keep attribution and customer definitions the same across arms.

The chart compares media CPA 30 versus 24, and total CPA 33 versus 36. Media CPA improves 20%; total CPA worsens 9.0909%. Contribution after advertising is -800 versus -1375. At M=3000 and P=1500, the media CPA thresholds are 22 to match the control and 16.6667 to break even.

## Reproduce the sensitivity CSV with Python 3 (standard library only)

```python
import csv
rows = []
for media in [1000, 3000, 10000, 30000]:
    for production in [300, 600, 900, 1500]:
        rows.append(dict(
            scenario='illustrative_not_observed',
            media_usd=media,
            production_rights_usd=production,
            control_total_cpa_usd=33,
            contribution_before_ads_usd=25,
            media_cpa_to_match_control_usd=round(33*media/(media+production), 6),
            media_cpa_to_break_even_usd=round(25*media/(media+production), 6),
        ))
with open('budget-sensitivity.csv', 'w', newline='') as f:
    writer = csv.DictWriter(f, fieldnames=rows[0].keys())
    writer.writeheader()
    writer.writerows(rows)
```

Creator accepted-asset example: 1500/6=250 if all six pass; 1500/3=500 if only three pass. This assumes the same total production/rights charge and no additional remake payment. Add further remake costs when incurred.
