River
Y CombinatorBacked by Y Combinator
FREE TEMPLATE

Monthly Marketing Report Template

Five documents and five sheets that carry a pull date and a data age on every row, so two periods can be compared honestly.

Free download  ·  No account needed

Report Narrative

Marketing performance, period ending

Report date  ·  Data age of this period  ·  System of record

1. Restatements in this report

What changed in the numbers you were already given, before any new ones. One row per figure that moved since it was published, with the cause.

MetricPeriodAs publishedAs nowCause

2. The number

One figure, with its data age beside it, the prior period measured at that same age, and the change between those two.

MetricThis periodAgePrior, age-matchedChange

3. By channel

Spend, sessions, demand and attributed pipeline per channel, every row carrying the date it was pulled. No column totalled across rows measured differently.

4. Why the comparison is what it is

The section that stops the numbers being re-litigated. Three ages, two comparisons, and the difference between them:

The load-bearing sentence

Demand reads down ______ against the prior period as it stands today, and down ______ against the prior period as it stood at this age. The difference is ______ points and it belongs to the calendar.

5. Pipeline contribution

The attributable ceiling first, then the shares. Records with no marketing source are reported as a figure and never folded into a channel.

6. What this means

Two or three decisions, each with the figure behind it, that figure’s age, an owner and a date.

Appendix A: what this report cannot see. Appendix B: pull dates.

Brantham's March report said demo requests were down 11.0%, and the meeting spent forty minutes on it. March had closed six days before the pull and held 431 requests. February, sitting in the next column, held 484. February's own report had published 445, because by March's report date February had had five more weeks to finish arriving. Compare the two periods at the same age and March was down 3.1%. When March itself settled, five weeks later, it was down 3.1%. Nothing in either export was wrong.

The gap is not a tracking fault. Google's own documentation says analytics data processing can take 24 to 48 hours, and that reports may change while it runs. An ad platform records a conversion against the interaction that earned it, inside a window that defaults to thirty days, so a late-March click converting in April still counts for March. And sales attaches a source to a record days after that record exists. Three mechanisms, all working correctly, all pushing the newest period down.

So every row here carries a pull date and a data age, and the previous six periods get pulled again in the same pass. On Brantham's history, 14 of the 20 metric-months that had been published and re-pulled had moved by more than 2%, and not one had been written down. Statistical agencies assume this: the BEA publishes a second estimate of GDP and keeps the vintage history. The pack installs into the marketing workspace, next to the channel mix and CAC review, the funnel and conversion analysis and the template library.

The sheets that date every number, filled in for one month

The Channel Performance table, the Metric Maturation curves, and the Restatement Log.

Channel Performance

March and February rows for a fictional company, Brantham.

PeriodChannelAgeSpendSessionsDemo req.Cost per req.Attr. pipeline
MarOrganic search6d74,200118342,000
MarPaid search6d68,40021,48096712.50268,000
MarPaid social6d31,20018,64047663.8396,000
MarEmail6d9,31062174,000
MarReferral and partner6d6,05038148,000
MarDirect6d22,7604198,000
MarEvents6d42,0001,240291,448.2870,000
MarTotal6d141,600153,680431328.541,196,000
FebTotal37d163,300160,410484337.401,742,000

The two total rows are 31 days apart in age, not in quality. March closed six days before the pull and February closed 37 days before it. Reading 431 against 484 and calling it an 11.0% fall is the mistake this whole pack exists to stop.

Paid search is the clean illustration. Cost per demo request reads 712.50 in March against 665.74 in February, up 7.0%. Age-matched, the March figure is 657.69, which is 1.2% cheaper than February rather than dearer.

Cost per demo request divides paid spend by demand from every source, so the total row is blended by construction and says so.

Metric Maturation

How far short of its settled figure each metric comes in, by the age of the pull. Measured over six months, not assumed.

MetricDay 6Day 13Day 37Day 68SettlesAt day 6
Sessions+0.1%+0.0%+0.0%+0.0%day 6as stated
Demo requests+9.4%+4.8%+0.6%+0.0%day 37age-matched
Paid conversions+13.2%+5.1%+0.3%+0.0%day 37age-matched
Qualified+22.6%+11.0%+2.1%+0.2%day 68age-matched
Opportunities+33.9%+20.4%+6.2%+0.8%day 68age-matched
Attributed pipeline+44.9%+31.1%+6.8%+0.9%day 68age-matched
Closed won+209.1%+112.0%+31.4%+6.2%after 157not at all

One of the four headline metrics is settled on the day the report goes out. Sessions. The other three come in short by 9.4%, 13.2% and 44.9%, in the same direction, every period.

Drift rises at every step down the funnel. The figures a budget decision actually rests on are the least settled ones in the report, which is the opposite of how the page gets read.

Settled means drift under one percentage point. Closed won does not get there inside a quarter, so it is reported as a direction.

Restatement Log

One row per metric per period: what was published, what it says now, and the mechanism in between.

MetricPeriodPublishedNowDriftNamed causeStatus
SessionsFeb160,250160,410+0.1%Processing settled inside 48 hourssettled
Demo requestsFeb445484+8.8%Source field populated after the recordopen
Paid conversionsFeb180203+12.8%Credited back to clicks inside the periodopen
Attributed pipelineFeb1,284,0001,742,000+35.7%Opportunities created weeks after the inquiryopen
Paid conversionsDec142144+1.4%Seven-day windows for the holiday promotionsettled
Attributed pipelineDec831,0001,193,000+43.6%Opportunities created weeks after the inquirysettled
Totals6 periods14 of 20Published and re-pulled, moved over 2%70.0%

December’s paid conversions are the exception that proves the mechanism. Seven-day conversion windows were in force for the holiday promotion, so almost nothing could credit back, and that month drifted 1.4% against 12.8% in February.

Sessions never move. Which is worth knowing precisely, because it is the one figure in the report that can be quoted at any age without a caveat attached to it.

A definition or window change is logged here too, marked as a restatement rather than as drift, so nobody hunts for a data cause.

What's in the pack

01

Report Narrative

Six sections in the order the questions arrive, restatements first, and every figure carrying the age of the pull behind it.

02

Methodology Note

System of record, period boundary and time zone, pull dates, the windows in force, and the maturation table, so a challenge is answered by pointing at a section.

03

Metric Definitions

Every metric in four parts: the source field, the arithmetic, what it is not, and the data age at which it can be reported. The third part settles the arguments.

04

Monthly Assembly Checklist

Seven steps in the order that stops a rebuild, including the re-pull most people skip. Pairs with the UTM taxonomy and tracking pack upstream.

05

Leadership Readout

One page cut from the narrative rather than rewritten, so the two documents cannot drift: the number, what moved, what is being decided, what is being waited on.

06

Channel Performance

One row per period per channel with a Pull Date and a Data Age column, and no total across rows that were measured differently. Paid-only detail lives in the multi-channel paid media report.

07

Funnel Conversion

Every stage carries the drift remaining at this age, which is what tells a reader that the bottom of the funnel is the least finished part of the report.

08

Pipeline Contribution

Reports an attributable ceiling, not a total. Records with no marketing source are counted and priced, and never split across channels to make the shares tidy.

09

Metric Maturation

The measured drift curve per metric at day 6, 13, 37 and 68, and the age each one settles at. Built from your own re-pulls rather than from an assumption.

10

Restatement Log

As first published against as it stands now, with the mechanism named, so a reader who says that is not the number you gave me gets a row instead of an argument.

How to use it

  1. 1

    Open in River, or take it blank

    Open the pack in River and send the exports you already pull, or download the Word documents and CSV sheets and fill them in yourself.

  2. 2

    Name the system of record, and the pull dates

    Two answers decide the rest: which system wins when two of them disagree, and when each file was pulled. Until the first is answered every efficiency figure in the space is undefined.

  3. 3

    Send this period, and the last six

    The current period, then the previous six pulled again in the same pass. That second half costs almost nothing extra and it is what produces the maturation curves and the restatements.

  4. 4

    Read the age-matched comparison first

    This period against the prior one measured at the same age, and the difference between that and the raw comparison. On the worked example the difference was 7.8 points on demand and 24.5 on pipeline.

Frequently asked questions

Is this template free?

Yes, and the download is not a cut-down version. The zip holds all ten template files in Word and CSV, with no signup and no card. Edit with AI is the other branch: send the exports you already pull and the agent dates every row, re-pulls the prior periods, and writes the restatements. More packs in the template library.

What format are the downloaded files?

Word (.docx) for the five documents and CSV (.csv) for the five sheets, in one zip. The sheets open in Excel, Numbers or Google Sheets and the documents open in Word or Pages, so nothing needs converting. Add ?format=pdf to the download if you want to read them rather than fill them in.

Why does last month's number keep changing?

Because last month was not finished when you published it. Records get a source attached after they are created, conversions credit back to clicks inside the period, and opportunities appear weeks after the inquiry. On the worked example, 14 of 20 published metric-months had moved by more than 2% by the time anybody looked again.

Can I just wait until the data settles instead?

For one metric, yes. Sessions settle inside two days and demo requests inside five weeks. Attributed pipeline takes about ten, which is past the next two reports, so waiting means never reporting it. Age-matching gets a defensible comparison on day six, and on the worked example it landed 0.05 points from the settled answer.

Which exports do I need?

Whatever you already pull. Analytics sessions and channel data, one report per ad platform, a CRM list of records created in the period with their source, and email and social numbers if you report them. The one thing worth adding is last month's report, because it is the baseline every restatement is measured against.

Does this replace a reporting dashboard?

No, and the two want opposite things. A dashboard changes under the reader, which is what makes it current. A report is a dated statement quoted back weeks later, so it needs a pull date, a stated method, and a written restatement when a figure moves. Run both. These same trailing rates are also what next year's marketing plan and budget works backward from.

What does Edit with AI actually do?

It creates a free account, installs these ten files as a private workspace, and opens by asking which system is authoritative and when each file was pulled. Then send whatever you have: mismatched date ranges, a partial export, last quarter's deck. It re-pulls the prior periods itself.

Find out what your last six months actually say now

Download the ten files and date the rows yourself, or install the pack and let River re-pull the last six periods for you.

Edit with AI