Every level, expandable
Revenue → channel → campaign → ad set → ad → product. Open only the branch you care about; the rest stays folded.
Profit Tree
“What exactly creates my profit?”
Totals hide everything interesting. A channel at break-even is usually one campaign paying for another, and a profitable campaign usually contains an ad set quietly losing money. Profit Tree lets you open the number: every level shows revenue, spend and profit after advertising, and you keep opening until you reach the thing you can actually change.
Revenue → channel → campaign → ad set → ad → product. Open only the branch you care about; the rest stays folded.
Not revenue, not ROAS. What each branch leaves behind once its own advertising and cost of goods are subtracted.
A node that costs more than it returns is flagged in place, so a losing ad inside a winning campaign cannot hide behind the total.
Orders we could not match sit in their own branch rather than being distributed across the others to make the tree look complete.
Roll up from the order, not down from the total
Every node is the sum of the real orders beneath it, so a number you can see is a number you can open.
Attribute at the leaf
Matching happens at the individual order, then aggregates upward. Aggregate-level modelling cannot be opened, so we do not use it.
Subtract at every level
Advertising cost attaches to the branch that spent it, so profit is meaningful wherever you stop.
Because some orders cannot be traced to a source, and we show them as unattributed instead of spreading them across the branches. The gap is information, not an error.
To the individual ad, and to product level where your platform reports product cost.
Yes. Exports are not gated behind a plan — your numbers are yours.
The module next to it
All six modules run on sample data in the open demo — no signup. Open Kepra →