PricingOpen the demo

Profit Tree

Follow the money down to the ad that made it.

“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.

Open Profit Tree in the demo →Sample data · no signup

What you actually see

Every level, expandable

Revenue → channel → campaign → ad set → ad → product. Open only the branch you care about; the rest stays folded.

Profit at every node

Not revenue, not ROAS. What each branch leaves behind once its own advertising and cost of goods are subtracted.

Leaks marked where they are

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.

An honest unattributed branch

Orders we could not match sit in their own branch rather than being distributed across the others to make the tree look complete.

How it gets there

  1. 1

    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.

  2. 2

    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.

  3. 3

    Subtract at every level

    Advertising cost attaches to the branch that spent it, so profit is meaningful wherever you stop.

Where it stops

What Profit Tree will not tell you

  • The unattributed branch is real and it will not be empty. Any tree that reconciles perfectly is hiding an assumption.
  • Product-level profit needs product-level cost. Without it, the deepest level uses your blended margin and is directionally right rather than exact.
  • It shows what happened, not what would have happened. Causation is the incrementality question, and a tree cannot answer it.
Why do the branches not add up to my total revenue?

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.

How deep does it go?

To the individual ad, and to product level where your platform reports product cost.

Can I export it?

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