AI & Marketing
You just used a spreadsheet that recommends pricing and promotion decisions for PittaRosso.
Is this AI?
From Day 1 - AI is behavior emerging from:
| Concept | What it means |
|---|---|
| Perception | Raw inputs from the environment |
| Representation | Data encoded for computation |
| Model | Structure that supports prediction |
| Constraints | Rules that shape the solution |
| Algorithm | Procedure that searches for the best solution |
| Behavior | What the system does in the world |
Let’s map PittaRosso’s system onto this framework.
What does the system observe from the environment?
Perception is the raw input - everything the system could potentially see before any structure is imposed.
For PittaRosso: point-of-sale transactions across 200 stores, inventory counts by product, store visit volumes, historical discount events and their outcomes, past email and SMS campaign responses from the loyalty club.
Same concept from Day 1. The cat feeder perceived pixels. The Home Depot chatbot perceived customer messages. Here the system perceives a retail data stream.
The gap between what exists in the environment and what the system perceives defines the limits of what it can ever know.
What the system does not perceive
Perception: Everything available: sales, inventory, visits, promotions, spend, prices, costs, competitor behavior, customer identity, brand perception, regional variation.
Representation: Designer choices about what to encode and how: demand aggregated across all 200 stores; products grouped into 8 categories; spend encoded as 3 levels (None / $15K / $43K) - not continuous, not content; promotions as 4 types - not creative or channel execution; price sensitivity as one coefficient per product group per month.
Model: Given the representations, predicts revenues, margin, and unsold inventory for any combination of lever settings.
Constraints: Revenue weight vs. margin weight (sum to 1); write-off penalty on unsold inventory; any manual lever overrides imposed by user.
Algorithm: Greedy local search over the discrete grid.
Behavior: A recommendation: markdowns, spend level, promotion type by month.
Perception: Everything available: sales, inventory, visits, promotions, spend, prices, costs, competitor behavior, customer identity, brand perception, regional variation.
Representation: Designer choices about what to encode and how: demand aggregated across all 200 stores; products grouped into 8 categories; spend encoded as 3 levels (None / $15K / $43K) - not continuous, not content; promotions as 4 types - not creative or channel execution; price sensitivity as one coefficient per product group per month.
Model: Given the representations, predicts revenues, margin, and unsold inventory for any combination of lever settings.
Constraints: Revenue weight vs. margin weight (sum to 1); write-off penalty on unsold inventory; any manual lever overrides imposed by user.
Algorithm: Greedy local search over the discrete grid.
Behavior: A recommendation: markdowns, spend level, promotion type by month.
The model calculates in this order:
What did you learn?
Start with the shoes.
What did you learn about the different shoe categories?
What did you learn?
Start with the shoes.
What did you learn about the different shoe categories?
Now the promotions.
The 3x2 promotion was designed to move old inventory. Did it work?
Online marketing.
What role did online marketing play - and when?
What were you trying to do?
Before looking at numbers - what objective function did you choose, and why?
What did you set? What were you optimizing for?
The objective function
E12 = W₁ × Revenue
+ W₂ × Margin
- Penalty × Units unsold
Where:
A human sets these before the algorithm runs.
The algorithm maximizes whatever number results.
What were you trying to do?
Before looking at numbers - what objective function did you choose, and why?
What did you set? What were you optimizing for?
The objective function
E12 = W₁ × Revenue
+ W₂ × Margin
- Penalty × Units unsold
| Strategy | W₁ | W₂ | Penalty | Vol? | Revenue | Margin | Unsold |
|---|---|---|---|---|---|---|---|
| Max revenue | 100% | 0% | 0% | No | 88.0M | 18.2M | 2.0M |
| Max margin | 0% | 100% | 0% | No | 77.8M | 26.2M | 3.6M |
| Min inventory | 100% | 0% | 100% | Yes | 41.4M | -39.4M | 0.9M |
The marketing optimization algorithm took these as given:
You used them. The algorithm treated them as truth.
They are estimates - produced by a statistical model running on PittaRosso’s historical transaction data before this spreadsheet was built.
That statistical model is a second algorithm in this system. One you never saw in the spreadsheet.
The Impact tab is its output, not its process.
The analysis that produced those numbers is invisible in what you used. The coefficients were estimated, frozen into the tab, and handed to the optimization as fixed inputs.
The quality of every recommendation you generated depended entirely on whether those estimates were accurate.
Two algorithms, two jobs, one sequence
Demand estimation algorithm runs offline, before deployment, on historical transaction data. Learns the statistical relationships between marketing actions and customer behavior. Produces the Impact tab coefficients.
Marketing optimization algorithm runs every time the Strategy tab recalculates. Takes the demand estimation output as fixed input. Finds the lever combination that maximizes the objective function.
The output of demand estimation is the input to marketing optimization.
They are coupled but separate. They do not communicate after that handoff.
| Demand estimation | Marketing optimization | |
|---|---|---|
| Job | Learn customer response | Find best lever settings |
| Type | Statistical estimation | Optimization |
| Runs | Offline, before deployment | Every recalculation |
| Input | Historical transactions | Demand estimation output + objective |
| Output | Response coefficients | Recommended decisions |
| Lives in | Impact tab - frozen | Optimization tab |
| Updated by | Human, manually | Runs automatically |
Two algorithms, two jobs, one sequence
Demand estimation algorithm runs offline, before deployment, on historical transaction data. Learns the statistical relationships between marketing actions and customer behavior. Produces the Impact tab coefficients.
Marketing optimization algorithm runs every time the Strategy tab recalculates. Takes the demand estimation output as fixed input. Finds the lever combination that maximizes the objective function.
The output of demand estimation is the input to marketing optimization.
They are coupled but separate. They do not communicate after that handoff.
The demand estimation algorithm learns from historical transaction data
To estimate how customers respond to prices and promotions, the algorithm needs a structured record of what happened in the past - what discounts were applied, what promotions ran, and what customers did.
The representation compresses PittaRosso’s full transaction history into the variables the statistical model needs:
Input to demand estimation. Output becomes the Impact tab.
The demand estimation algorithm learns from historical transaction data
To estimate how customers respond to prices and promotions, the algorithm needs a structured record of what happened in the past - what discounts were applied, what promotions ran, and what customers did.
The representation compresses PittaRosso’s full transaction history into the variables the statistical model needs:
Input to demand estimation. Output becomes the Impact tab.
What this representation cannot carry
The regime problem
Every coefficient was estimated from a world of constant storewide discounting. Customers in that world had learned to wait for sales.
Price sensitivity estimates from that regime may not hold when the strategy changes.
What the algorithm learned may not be what is true now.
Input
Historical transaction records:
All from past seasons - before the spreadsheet was built.
Input
Historical transaction records:
All from past seasons - before the spreadsheet was built.
Output
The coefficients frozen into the Impact tab:
Sales volume =
baseline velocity
+ β₁ × markdown %
+ β₂ × promotion type
+ β₃ × marketing spend
+ ε
What good estimation requires
We will return to the third requirement.
Pace set the objective function to maximize sell-through rate, with a target of 85% by end of season.
“Change management was one of the most significant challenges: changing the way the team works, changing the approach, learning super quickly how to work in the new environment. The key was making sure that everyone is involved.”
What the system was asked to do
Maximize the percentage of inventory sold by end of season.
What the system did not know
The objective was valid.
The constraint set was incomplete.
What happened
Sports shoes were selling at a much higher rate than the same period in prior years - due to the additional discounting the system recommended.
The system was discounting already fast-selling products to hit its sell-through target.
“This happened because we took a uniform approach at first, and didn’t allow the system to consider different sales speed for different products. Once we learned this, we changed the inputs of the system.”
— Valentina Labate
The fix: Labate manually updated the demand estimation coefficients. Sub-category sales trajectories corrected. Model 1 edited by hand.
The mechanism
Objective: maximize sell-through
Demand estimation says: sports shoes
have high price elasticity - discounting
drives significant volume uplift
System recommends: heavy discounts
on sports shoes to hit 85% target
Reality: sports shoes were selling
anyway. The additional discounting
just burned margin.
Root cause: demand estimation was
trained on a world where sports shoes
were always discounted. It never
observed sports shoes selling without
discounts. It could not know they would.
Third requirement for good estimation: stable regime. Here is what happens when the regime is not stable.
What happened
Sell-through rates were higher than ever.
By mid-season, the average pairs per item per store had fallen from 10 to 3.
This fragmentation meant most sizes were unavailable for most items - making them effectively unsellable even with more discounts.
Sales fell. The fix (more discounts) did not work.
What they learned
The pricing and promotion system needed a companion: inventory distribution.
The system optimized what it could see.
It could not see that selling 97% of one size left a shoe no one could buy.
Representation constraint by omission: no store-level inventory field, no size- level tracking. The system was blind to fragmentation by design.
Summer 2019
| Metric | Result |
|---|---|
| Sell-through | 83% (target: 85%) |
| Revenue growth YoY | +7.5% to 35M euros |
| Margin (euros) | Same as prior year |
Unprecedented for PittaRosso - had never exceeded 70% sell-through.
Fall/Winter 2019-2020
Objective updated: revenue maximization with high sell-through constraint. Revenue and margin goals met in first months. 100,000 pairs redistributed between stores by January.
February 20, 2020
All stores closed. COVID-19.
The AI system was halted.
As of late 2022, it had not been restarted.
What this tells us about AI adoption risk
When you build operations around an AI system, the fallback capability atrophies. The buyers had been sidelined. Their manual expertise had faded.
When the system fails - for any reason, including a global pandemic outside its training distribution - the organization may not be able to return to how it operated before.
Dependency risk is real and hard to see until the system stops.
What PittaRosso has
A decision support system. Two algorithms, a human in the loop, a manual feedback path.
It produces recommendations. Humans act. Humans detect drift. Humans update the model.
The system has all the Day 1 components. But its behavior is a recommendation - not an action in the world. The perception- action loop requires a human to close it every time.
This is not AI in the Day 1 sense.
What would make it AI
Automated action - prices and promotions deployed directly within approved constraints
Closed feedback loop - actual outcomes feed back to re-estimate demand estimation coefficients automatically
Online learning - demand estimation re-runs as new data arrives, not only when a human detects a crisis
Labate’s fix after Crisis 1 was doing step 3 by hand. She updated the Impact tab manually.
In a full AI system that loop closes itself.