Fractal Rock

The Science

Dynamic, non-linear causal modeling

Traditional marketing mix models fit a straight line through a curved world. Advertising does not respond linearly: the tenth spot in a daypart does not earn what the first one did, and channels borrow strength from each other. Most measurement vendors are doing line-fitting or Bayesian inference underneath a modern dashboard, and many aren't properly modeling adstock — the residual awareness a placement leaves behind — or advertising's long-term effect at all.

Traditional MMM is a post-mortem. MPM is a flight controller.

A post-mortem tells you what happened, once, after the campaign is already over. A flight controller reads live, non-linear signals and adjusts continuously, before the outcome is fixed. That's the actual difference — not better statistics on the same idea, a different relationship to time.

What the model learns

Each placement gets a response curve, not a coefficient. A healthy curve is a gentle S: early spend builds, the middle pays, the tail flattens. A kinked curve means the model memorised the data rather than learning from it — which is why we hold R² between 89% and 91% rather than chasing 99%.

The advertising response curve An illustrative s-curve of incremental revenue against advertising spend. Below a response threshold the curve is almost flat and the spend returns nothing measurable. Between the response threshold and the saturation point it climbs steeply — this is where a fifth to two-fifths of the budget does most of the work. Past saturation it flattens again and each additional dollar earns less than the one before it. Response threshold Saturation point The last dollars in still cost full price. Moving them left is the entire job. Advertising spend, low to high → Incremental revenue, low to high → No measurable return about a fifth of spend, in almost every plan Where reallocation lands a fifth to two-fifths, doing most of the work Diminishing returns the last dollars earn the least
Illustrative shape, not a specific client's curve — but every plan we have modelled has one, and the thresholds move every time the mix, the competition or the market does.

Two ways to be wrong, and why the model can't be

A model earns the right to be trusted with a budget by being disciplined about what it won't do, not just what it can. Two separate mechanisms do that work here.

Training bounds

The model won’t recommend a spend level it has never seen work. Push it past your actual history and it says so, rather than guessing.

Monotonic constraints

A separate, settable control on each variable enforces the direction of a relationship — spend up can never predict revenue down — regardless of what noise in the training data might otherwise suggest.

What the model will and will not predict A response curve fitted across the range of spend actually present in the training data. Beyond the highest spend level ever observed, the region is hatched and the model declines to predict rather than extrapolating the curve onward. Fitted on spend levels you have actually run Never observed A naive model extrapolates through here. This one returns "outside training range" and stops. Advertising spend, low to high → Highest spend in your history Incremental revenue →
Illustrative. The dashed grey line is what a model without training bounds would tell you — a number nobody has any evidence for.

Together: the model won't guess outside what it's seen, and it can't violate business logic even inside what it has.

Prediction, not inference

Insights is machine learning, not Bayesian statistics, and the distinction matters more than the label. Bayesian inference is built for a static model and sparse data — it's very good at explaining a market that holds still. Advertising markets don't hold still. Machine learning does prediction: it adapts to a market that's moving while you're modeling it.

That's also why Insights isn't a generative-AI product wearing a new label. Generative AI helped build the interface you're using right now; the engine underneath is trained, tested and constrained the way any production ML system is — not prompted.

One model, or many

A single national model lets your biggest markets drown out your smallest ones — a real statistical problem called aggregation bias. Insights can split training data into smaller models by region or city size, so a market a tenth the size of your largest still gets a real answer, then reunites every sub-model under one simulator that optimises them simultaneously.

One national model

One curve fitted across everything. Los Angeles and New York carry the fit; Boise contributes about four percent as much signal and is effectively averaged away.

A model per market group

Training data split by region or market size, each group fitted on its own scale, then reunited under one simulator that optimises them simultaneously.

Bubble area is proportional to market weight. Illustrative — a market a tenth the size of your largest still gets a real answer instead of the national average.

Amnesia, and what it does not forget

Traditional marketing mix modelling is built on time. This is built on relationships, and one mechanism is responsible for the difference. We call it Amnesia.

The network wakes up at the start of every row with no memory of the row before it. It sees a set of input values, sees the revenue they should account for, notices the gap, and nudges its weights to close it — in small steps, inside geometric constraints. Every week is a state of the world to be explained on its own terms, not a point on a line inherited from the week before.

The precision matters here, because this is where the idea is usually misread: the amnesia applies to the weights, not to the inputs. Adstock has already folded the time-echo of previous weeks into the independent variables — the residual awareness a placement leaves behind is sitting right there in the row. So the model keeps the benefit of time without inheriting the constraint of chronology.

Which is also why the training data is walked in order from a random starting point rather than shuffled outright. The rows are not strictly independent: adstock decay links each one to the ones before it.

Then what happens to seasonality?

It is the first question anyone asks once they understand the above, and it is the right one. December doesn't behave like July. If the model has no memory of what came before, how can it possibly know that?

The answer is that seasonality is not being ignored. It is being codified as a relationship instead of a date. A traditional model learns that sales rise in December and carries that forward because the calendar says it's due. Insights doesn't learn "it's December, so sales go up." It learns "search intent is at this level, competitor spend is at that level, promotional depth is here — so sales go up." December is simply the month those conditions usually coincide.

That distinction pays off the moment you ask a real planning question. What would it take to create a December-level event in July? A time-based model has no answer — July is not December, and that is the end of it. A relationship-based model can simulate it, because it knows which conditions produced the result rather than which month did.

It also means a March that happened to perform like a November is treated as evidence rather than noise. Time-series models tend to smooth that week away as an outlier. Here it's a genuine observation about how the levers respond.

A hurricane is not an outlier

Florida is the clearest example. A hurricane week wrecks retail sales, and a traditional model treats that week as an outlier — thrown out, or dummy-coded to zero out the error. The event that most needs explaining becomes the one thing the model refuses to look at.

Here it becomes an input variable instead. Tag each geography and week none, minor or major, and the model learns that certain contexts decouple spend from return entirely. Most weeks are "none" and carry almost no explanatory weight. "Major" carries a great deal — and it is often the single tag that keeps a response curve from collapsing into a squiggle.

The practical payoff is a recommendation that doesn't embarrass you: the optimiser will not push budget into a market that is boarding up its windows just because the return looked strong the week before.

Cracking the black box

A model you can't interrogate is a model a CFO shouldn't trust. Every trained model exposes which inputs actually moved the outcome, not just how well it fit — permutation-based, not a guess — plus interactive sensitivity, so you can test a "what if" against the same math driving the recommendation, live.

Why speed is a feature

The engine is written from the ground up in native C++ with no heavy dependencies. A full multi-market reallocation returns in milliseconds, which means an executive can ask "what if we cut that channel 30%?" in a live meeting and see the answer before the next slide.

Budget efficiency, current versus optimised An illustrative curve comparing cumulative revenue captured against cumulative spend for a current media plan and an optimised one. The optimised curve sits above the current curve for every point along the spend axis; the shaded gap between them represents revenue gained on the same budget. even split More revenue, same budget Cumulative spend → Cumulative revenue → Current plan Optimised plan
Illustrative shape. The gap between the two curves is the reallocation gain — moving dollars from the flat zone of the response curve into the steep one.

How certain is certain

Every forecast carries an interval, and you choose which end of it to optimise against: the lower bound if the number has to be defensible, the expected value for planning, the upper bound when you are hunting upside.

Every forecast carries an interval A revenue line runs through observed history with no uncertainty, then continues as a forecast inside a widening confidence band. Three targets are marked at the end of the forecast: the lower bound for defensible numbers, the expected value for planning, and the upper bound when pursuing upside. Observed Forecast Upper bound when you are hunting upside Expected value for planning Lower bound when it has to be defensible Revenue → Time →
Illustrative. The band is the answer, not an error bar attached to one — you pick the edge of it you are willing to defend, and the optimiser targets that.