← Files Marketing CouncilARCHIVED FILE

scripts/unit_economics.py

2.33 KB · Oct 2, 2026 · 00:31 UTC

↓ Download file

#!/usr/bin/env python3
"""Deterministic unit-economics calculations for marketing decisions."""
from __future__ import annotations
import argparse
import json


def _nonnegative(name: str, value: float) -> float:
    value = float(value)
    if value < 0:
        raise ValueError(f"{name} must be >= 0")
    return value


def calculate_unit_economics(
    revenue_per_order: float,
    cogs_per_order: float,
    variable_costs_per_order: float,
    cac: float,
    expected_orders_per_customer: float = 1.0,
) -> dict:
    revenue = _nonnegative("revenue_per_order", revenue_per_order)
    cogs = _nonnegative("cogs_per_order", cogs_per_order)
    variable = _nonnegative("variable_costs_per_order", variable_costs_per_order)
    acquisition = _nonnegative("cac", cac)
    orders = float(expected_orders_per_customer)
    if orders <= 0:
        raise ValueError("expected_orders_per_customer must be > 0")

    contribution = revenue - cogs - variable
    customer_contribution = contribution * orders
    net_customer_contribution = customer_contribution - acquisition
    contribution_margin_ratio = (contribution / revenue) if revenue else None
    break_even_roas = (revenue / contribution) if contribution > 0 else None

    return {
        "revenue_per_order": revenue,
        "contribution_per_order": contribution,
        "contribution_margin_ratio": contribution_margin_ratio,
        "expected_orders_per_customer": orders,
        "customer_contribution_before_acquisition": customer_contribution,
        "cac": acquisition,
        "net_customer_contribution": net_customer_contribution,
        "max_break_even_cac": customer_contribution,
        "break_even_roas": break_even_roas,
    }


def main() -> None:
    p = argparse.ArgumentParser(description="Calculate simple unit economics.")
    p.add_argument("--revenue-per-order", type=float, required=True)
    p.add_argument("--cogs-per-order", type=float, required=True)
    p.add_argument("--variable-costs-per-order", type=float, default=0)
    p.add_argument("--cac", type=float, default=0)
    p.add_argument("--expected-orders-per-customer", type=float, default=1)
    args = p.parse_args()
    try:
        result = calculate_unit_economics(**vars(args))
    except ValueError as exc:
        p.error(str(exc))
    print(json.dumps(result, indent=2, sort_keys=True))


if __name__ == "__main__":
    main()

SHA-256: 925a9806efab544ec0b95b86b61729beaa0f90138720ca28d06314ea6c3768e5