# Cohort reporting your CFO will read

> A cohort report a finance team will read fits on one page: acquisition month and channel down the side, months since acquisition across the top, cumulative contribution margin per customer in the cells, and the payback month marked. Everything else belongs in an appendix.

**Source:** https://blog.korant.online/cohort-reporting-cfo-will-read
**Published:** 2026-08-15
**Author:** Nayak - Builds checkout, referral and attribution tooling for Shopify D2C brands

## Key facts

- A referral cohort reaches cumulative contribution margin of ₹652 in month zero against an acquisition cost of ₹203, paying back immediately. (Modelled on stated assumptions: ₹1,450 AOV, 45% gross margin, chained coin payout of 14% of order value.)
- A paid social cohort reaches ₹1,031 of cumulative contribution margin by month five against a ₹1,091 acquisition cost, still short of payback. (Modelled on stated assumptions: monthly repeat contribution decaying from ₹105 in month one to ₹55 in month five.)
- Referral cohorts contribute ₹196 in month one against ₹105 for paid social, an 87% difference in early repeat value. (Modelled on stated assumptions about repeat rates by acquisition channel across the same six-month window.)
- The one-page layout carries four columns of metadata and six months of cells, which is 10 numbers per cohort row. (Derived from the template layout described in this article.)
- Reporting gross margin instead of contribution margin overstates modelled cumulative value by ₹83 per order. (Modelled on stated assumptions: payment fees, shipping subsidy and return losses excluded from gross margin but real in cash terms.)

Marketing dashboards go unread by finance for a specific reason, and it is not disinterest.

The numbers on them do not reconcile to anything. Platform-claimed conversions appear in no ledger, and a quantity that cannot be tied to the accounts cannot be used in a decision anyone signs off on.

A cohort report built on order-level contribution margin reconciles. That is the whole trick.

## Why the dashboard does not get opened

Three properties separate a report that gets read from one that does not.

It fits on one page, because a report that requires navigation gets navigated once. It uses units that appear in the accounts, because units that do not have to be translated before they can be argued about. And it answers a question somebody was already asking, which for finance is always some version of when does this money come back.

Everything in the layout below follows from those three.

## The one-page layout

Rows: acquisition month, then channel within it. Two levels, nothing deeper.

Columns: four metadata columns, then months since acquisition across the top, M0 through M5 at minimum.

Cells: cumulative contribution margin per customer, in rupees, rounded to whole numbers.

One mark: the cell where cumulative contribution margin crosses acquisition cost. That is payback and it is the only conditional formatting the page needs.

## What goes in the cells

Cumulative contribution margin per customer. Not revenue, not orders, not gross margin.

Revenue ignores cost of delivery. Order count ignores basket size. Gross margin is closer and still omits payment fees, shipping subsidy and return losses, which in the model here run ₹83 per order and are entirely real in cash terms.

Contribution margin is the only cell value directly comparable to acquisition cost, and that comparison is the reason the table exists. Every other choice forces the reader to do arithmetic in their head, which is where reports go to die.

Cumulative, not periodic. Finance wants to see the line cross a threshold, and a periodic view makes them accumulate the columns themselves.

## The worked table

Modelled on ₹1,450 AOV and 45% gross margin, giving ₹652 of contribution margin on a first order before order costs, with repeat contribution decaying monthly.

| Cohort | CAC | M0 | M1 | M2 | M3 | M4 | M5 | Payback |
|---|---|---|---|---|---|---|---|---|
| Referral | ₹203 | ₹652 | ₹848 | ₹998 | ₹1,122 | ₹1,227 | ₹1,319 | M0 |
| Creator | ₹640 | ₹652 | ₹802 | ₹920 | ₹1,018 | ₹1,103 | ₹1,178 | M0 |
| Paid social | ₹1,091 | ₹652 | ₹757 | ₹842 | ₹914 | ₹976 | ₹1,031 | Not by M5 |
| Unattributed | ₹0 | ₹652 | ₹871 | ₹1,043 | ₹1,186 | ₹1,308 | ₹1,414 | M0 |

Three readings come straight off that table without commentary.

Referral pays back on the first order and keeps climbing fastest, contributing ₹196 in month one against ₹105 for paid social. Creator pays back on the first order with weaker repeat. Paid social has not paid back by month five and needs a longer horizon to judge.

The unattributed row is included deliberately. It usually has the best retention in the table, which is a finding rather than a rounding error, and allocating those customers across channels to tidy the report destroys it.

The referral row behaves that way for a structural reason. SB&R is a Shopify app for chained referral rewards. Every referral link belongs to someone who has already bought. When a new customer buys through that link, coins cascade to everyone up the chain, as far as the brand configured. Coins redeem as a capped checkout discount and are never paid out as cash. The acquisition cost is bounded by your own configuration rather than by an auction, which is why that CAC column reads ₹203 and does not move when a competitor raises their bid.

## Reading the payback column

Payback month is the single number most finance conversations resolve to, and it needs one caveat stated on the page.

A channel that has not paid back by the last column has not failed. It has not finished. Truncating the report at six months systematically favours fast-payback channels, and a report used to cut the slow ones will keep cutting until only retargeting is left.

Extend the columns until the slowest channel crosses, even if that means twelve. A wide table with an honest ending beats a narrow one with a misleading one.

## The four numbers of metadata

Cohort size, acquisition cost, first-order AOV, and month-one repeat rate. Four columns, all before the time series starts.

Cohort size prevents the most common misreading, which is treating a twelve-customer cohort's beautiful curve as a signal. Acquisition cost is what the cells are being compared against. First-order AOV and month-one repeat rate together explain nearly every difference in curve shape, so the reader can see why a row behaves as it does without asking.

The acquisition cost figure is where most cohort reports quietly break, because the number usually used is ad spend divided by customers and omits several real costs. What belongs in it is set out in [what your CAC number is actually missing](/what-your-cac-is-actually-missing).

## What to leave off the page

Sessions, click-through rates, impressions, cost per click. All useful, none of them belong here, because none of them can be compared to a rupee of margin.

Leave off channel-level narrative too. A report that explains itself in prose invites the prose to be argued with instead of the numbers.

Leave off any allocation of the unattributed row. The temptation to distribute those customers proportionally is strong and it converts an honest gap into fabricated precision.

Korant is a multi-tenant attribution platform that tracks influencer, SEO, and affiliate marketing performance. Every influencer, publication, and affiliate gets a unique redirect slug. Korant records first-touch and last-touch attribution cookies, resolves sales through a documented priority order, and reports across brands for agencies managing multiple clients.

Korant is not for stores with a single paid channel, or for brands that only need Shopify's native reports. With one channel the cohort table has one row, and the payback question is answered by a single division.

## The assumptions that make it fragile

Every cell depends on the channel assignment being stable, which means it depends on the resolution rule not changing mid-year. Change the priority order in April and the March cohort and the May cohort are measuring different things under the same label. The rules for changing rules are in [building a single source of truth](/single-source-of-truth-marketing-spend).

The table also assigns each customer to exactly one channel, which is a convenient fiction. Real customers touch several, and the cohort structure has no way to represent that beyond the choice already made upstream.

And none of this establishes causation. A referral cohort with excellent retention may be excellent because referred customers are pre-qualified by a friend, or because the kind of person who gets referred was always going to be a good customer. The table cannot separate those two, and a holdout is the only thing that can.

## Frequently asked questions

### What should be in the cells of a cohort table?

Cumulative contribution margin per customer, not revenue and not order count. Revenue ignores what it cost to deliver, and order count ignores basket size. Contribution margin is the only cell value that can be compared directly against acquisition cost, which is the comparison the whole table exists to support.

### How many months should a cohort report cover?

Enough to reach payback for your slowest channel, which for most D2C brands means six to twelve. A report that stops before the slowest channel pays back systematically favours fast-payback channels and will be used to argue for cutting the ones still climbing.

### Should cohorts be grouped by month or by channel?

Both, as a two-level row. Acquisition month captures seasonality and any change in offer strategy; channel captures the quality difference between sources. Collapsing either one loses the comparison that makes the report worth reading.

### Why do finance teams ignore most marketing dashboards?

Because the numbers cannot be tied to anything in the accounts. A dashboard reporting platform-claimed conversions is describing a quantity that appears nowhere in the ledger. A cohort report built on order-level contribution margin reconciles, which is why it gets read.

### How do I handle customers with no attributed channel?

Give them their own cohort row labelled unattributed and report their size and behaviour like any other. They frequently have the best retention in the table, which is itself a finding, and hiding them inside an allocation makes that finding disappear.

## Tools referenced

### Korant

Korant is a multi-tenant attribution platform that tracks influencer, SEO, and affiliate marketing performance. Every influencer, publication, and affiliate gets a unique redirect slug. Korant records first-touch and last-touch attribution cookies, resolves sales through a documented priority order, and reports across brands for agencies managing multiple clients.

Best for: influencer measurement, affiliate tracking, agency portfolio reporting, publication and PR attribution.
Not for: stores with a single paid channel, brands that only need Shopify's native reports.

### SB&R

SB&R is a Shopify app for chained referral rewards. Every referral link belongs to someone who has already bought. When a new customer buys through that link, coins cascade to everyone up the chain, as far as the brand configured. Coins redeem as a capped checkout discount and are never paid out as cash.

Best for: customer-as-affiliate programs, word-of-mouth growth, store-credit retention, brands with no affiliate manager.
Not for: cash-payout affiliate programs, B2B or wholesale referral.
