Agency Report Template: 22 Items DTC Clients Actually Need
The monthly report structure we use on Marketing Bar client reports, copied here in full: 22 items across six required panels (led by revenue reconciliation), three conditional diagnostics, and the 8 vanity metrics the template deliberately cuts. Editable Sheet / Notion / Looker copy shared on request.

This agency report template is the structure we use on Marketing Bar client monthly reports, copied here in full so you can use it directly. The 22 items are split into six required panels and three optional diagnostics. The structure assumes a DTC client running paid media across Meta, Google, TikTok (or some subset), plus Klaviyo for email/SMS retention.
The template gets revisited as platform APIs change and as new failure modes appear in client decks we audit. The version below is the current shape. If you want the editable Sheet / Notion / Looker Studio version of the template, we share our internal copy on request — contact us and we'll send it over.
Key takeaways
- 22 items total: 17 required (6 panels), 5 optional (3 diagnostic panels), no fluff.
- The template removes 8 metrics that show up on most monthly decks but quietly mislead (impression vanity, blended ROAS without methodology, last-click email overlap, etc.).
- Editable Sheet / Notion / Looker Studio versions of our internal template are shared on request — contact us.
- Pairs with our why most agency reports lie article which explains the failure patterns this template defends against.
How to use this agency report template
The template is structured as nine panels in a single dashboard or six-page deck. Panels 1-6 are required for every client. Panels 7-9 appear only when the underlying issue is present (creative fatigue, audience saturation, promotional period flag).
The implicit rule: nothing goes on the report that the client cannot interrogate. If a metric appears, the methodology behind it must be footnoted or linked. Vanity metrics get cut because they cannot be defended in a Tuesday meeting when a CFO asks "what does this number mean."
Panel 1: Net revenue reconciliation (required)
Three numbers side by side:
- Shopify net revenue for the period (the source of truth)
- Sum of platform-reported revenue across Meta + Klaviyo + Google + TikTok (raw, before dedup)
- Deduplicated platform-attributed revenue (after removing overlap)
The gap between #2 and #3 is the platform double-count. Show it. The gap between #1 and #3 is the organic + direct + returning + email-flow revenue not attributed to paid. Show that too.
Most decks open with platform-reported ROAS. This template opens with reconciliation because it builds trust faster than any chart in the report.
Panel 2: Marginal CAC, 13-week trend (required)
New-customer acquisition spend divided by new customers acquired, weekly. Trend line. Marked with promotional events.
Do not include blended CAC (which includes returning customers in the denominator) — it makes the agency's spend look more efficient than it is. Marginal CAC is the number that tells the founder if the new-customer economics are improving or eroding.
Panel 3: Contribution margin per channel (required)
For each major paid channel: revenue (deduplicated) minus COGS minus channel spend minus fulfillment cost. Negative values shown in red.
This is the single most important panel and the one most agencies leave out because it requires knowing the client's COGS. If the agency doesn't know COGS, the agency cannot show contribution margin, and the client is flying blind on whether the channels are actually profitable.
For multi-product brands, weight COGS by product mix per channel if the data exists. If not, use blended COGS and footnote the limitation.
Panel 4: Channel mix and saturation curves (required)
Two halves to this panel:
- Spend allocation pie chart — where the money actually went, percentage by channel
- Marginal return curve — for each channel, marginal revenue per dollar at the current spend level
The saturation curve is what tells the founder whether to keep scaling a channel or to redeploy spend. If Meta's next $10K returns $4K of revenue, Meta is at saturation. The deck should say so.
Panel 5: Cohort revenue (90/365) (required)
New-customer cohorts plotted against their 90-day and 365-day revenue. Acquisition month on the X-axis, cumulative revenue per customer on the Y-axis.
This is where retention quality shows up. If the agency drove a 4.0x acquisition ROAS but the 90-day cohort spent half as much as last quarter's, the LTV trajectory is broken and the agency-blamed channel mix shift might actually be a product or retention issue. The cohort panel surfaces it. (Klaviyo's omnichannel retention benchmark data and Common Thread Collective's weekly DTC Index are useful external reference points if you want to sense-check your own cohort shapes against the broader market, via Klaviyo, Common Thread Collective.)
Panel 6: Tracking health (required)
Four indicators:
- Event Match Quality (EMQ) score on Purchase for Meta CAPI
- GA4-to-Shopify reconciliation percentage — what % of Shopify orders show up in GA4 with attribution intact
- CAPI event volume versus expected volume (% gap)
- Server-side tagging status — green/yellow/red on Meta CAPI, Google Enhanced Conversions, Klaviyo events
If any tracking indicator is degraded, every revenue number above is suspect. The tracking health panel is the report's audit trail.
Panel 7: Audience saturation diagnostic (conditional)
Appears only when a channel is at or near saturation. Shows:
- Frequency by audience segment for the last 14 days
- CPM trend week over week
- New-audience-reach percentage of total spend
Skip this panel when channels are healthy. It's a diagnostic, not a vanity slide.
Panel 8: Creative fatigue indicators (conditional)
Appears when CTR is dropping or frequency is climbing on top creatives. Shows:
- Top 5 creative units by spend with their CTR trend over 28 days
- Days since each top creative was first published
- Creative refresh rate — new variants tested per week
Use to inform the next creative sprint decision, not to fill space.
Panel 9: Promotional period flags (conditional)
Appears when the period covered includes a sale, launch, or other non-evergreen event. Flags:
- What promotional event ran (sale, launch, sweepstakes, influencer campaign)
- Dates of the event
- Estimated revenue lift attributable to the event vs. baseline
This panel prevents the YoY comparison error where last year's sale week is compared against this year's evergreen week as if they were equivalent.

The reporting cadence vs depth trade-off (the rule every account manager should hold to)
Most agency reports get worse over time for one structural reason: cadence and depth get traded against each other in the wrong direction. The unsaid expectation is "more cadence = more value," so weekly reports grow to monthly-report depth and monthly reports grow to quarterly-business-review depth. The result is reports nobody reads at any cadence, because the depth has overshot what the decision frequency actually requires.
The depth of a report should be capped by the decisions it drives. The cadence should be capped by the speed those decisions can move at.
- Weekly report → tactical layer only — pacing against monthly budget, account-health flags (tracking degradation, policy enforcement, audience saturation triggers), top-3 changes shipped this week, top-3 changes planned next week. No reconciliation, no contribution margin, no cohort math. The weekly's only job is to keep the account alive between deeper reads. If the weekly is taking more than 30-45 minutes to assemble, it has grown into a monthly.
- Monthly report → strategy + reconciliation layer — the full 22-item template above. Reconciled revenue, marginal CAC trend, contribution margin per channel, cohort signals, tracking health. This is the only cadence at which big spend-shift decisions should be made. Monthly is also the cadence at which channel-mix arguments get adjudicated against actual data.
- Quarterly business review → policy + bet-layer — what the brand is committing to over the next 90 days, what is being retired, what new channels or programs are being tested, what success criteria have been set in advance. The QBR is the only cadence at which the brand should revisit its CAC ceiling, its channel-saturation thresholds, and its retention investment priorities. Monthly reports answer "what happened"; QBRs answer "what are we going to commit to."
- Hot-incident report → triggered, not scheduled — when tracking breaks, when a platform enforces against the account, when CPM spikes more than ~50% on a primary channel for over a week, a same-day or next-day incident note goes to the founder. Independent of the cadence above. Most agencies bury these in the next monthly, by which point trust has already eroded.
- The depth ratchet — once a panel is added to a cadence, it almost never gets removed. Account managers add slides in response to founder questions ("can we also see X?") and the report grows by 20-40% over 12-18 months without anyone removing what is no longer load-bearing. The discipline: at every QBR, prune at least one panel from the monthly. If a panel has not driven a documented decision in two quarters, it is theater.
The pattern we see consistently: agencies that hold this cadence discipline keep client relationships longer because founders actually read the reports. Agencies that bloat every cadence to monthly-depth produce decks that get glanced at and then ignored, which then gets read as "the agency isn't communicating," which then gets fixed by adding more slides. The escape from that loop is structural — name what each cadence is for, cap the depth, and prune quarterly.
What this template removes from typical agency reports
The 22 items above are the structure. The template also explicitly removes:
- Impression count as a headline metric. Cost-free to inflate, low correlation with revenue.
- Engagement rate as a business KPI. Platform-internal score, not a business outcome.
- Blended ROAS without methodology. Meaningless without attribution-window and channel-pool disclosure.
- Last-click revenue summed across platforms. Inflates total by the dedup gap.
- "Top performing ad" callouts without spend context. A $50/day ad with 12x ROAS is not the same business event as a $5K/day ad with 4x.
- YoY comparisons without promotional event flags. Calendar artifacts framed as performance changes.
- "Industry benchmark" comparisons without source citations. Half of these benchmarks are aggregated by the vendor selling the data. If you cite a benchmark, link to the source so the client can interrogate the methodology (see Klaviyo, Common Thread Collective, or whatever it actually is).
- Agency-self-promotion slides. A monthly deck is the client's data, not the agency's trophy case.

Editable formats we share on request
The template exists in three formats internally:
- Google Sheet version with formulas pre-built for the math in panels 1-6
- Notion version structured as a database with weekly snapshots
- Looker Studio version built around the paid-channel data layer (with dedup logic in calculated fields)
If you want the editable copy of any of these for your own use, contact us and we'll share the current internal version. We don't gate it behind a form; we share it directly because it's more useful when paired with a short conversation about your specific channel mix.
The Looker Studio version is the one most operators end up using if they're not on our agency dashboard directly. It includes the dedup logic in calculated fields, which is the part most templates skip.
Where this template fits in the broader Marketing Bar approach
The template is the artifact. The deeper article is why most agency reports lie, which explains the five failure patterns this template is built to defend against. The product version of paid-channel reporting — a live dashboard with hourly data sync across Meta, Google Ads, and TikTok — is Level. Klaviyo and Shopify dedup is on the Level roadmap; today that piece of the math lives in the template's Sheets/Looker layer.
If you're building your own version of this template and want help customizing it for your specific channel mix, our custom reporting service covers scoped implementations.
Six warning signs your current report is misleading the founder
Before adopting any template, check whether the existing report is actively producing bad decisions. Pattern recognition:
- The headline metric is impressions or reach. These cost nothing to inflate and don't correlate with revenue at any meaningful DTC scale.
- Blended ROAS appears without a methodology footnote. No methodology = no defense in front of a CFO.
- The deck has grown by 30%+ in 18 months. Selection bias compounded. Each uncomfortable question added a slide rather than replacing one.
- No channel ever appears in negative contribution margin. Real DTC programs always have at least one. If every panel is green, the agency is filtering.
- The "next month plan" is generic ("test new audiences, refresh creative"). Working reports drive specific decisions; theater reports describe activity.
- Year-over-year comparisons don't flag promotional differences. Calendar artifacts presented as performance changes.
Two of these = the report is broken. Four = the reporting structure is incentivized away from honesty regardless of agency talent.
How long it takes to migrate to this template
For an in-house team or agency adopting the template against an existing reporting setup:
Week 1 — Data layer review
Confirm Shopify net revenue is accessible, COGS data is current, channel-level spend feeds are working.
Week 2 — Build the trust panels first
Panel 1 (reconciliation) and Panel 6 (tracking health) built first. These are the trust-building panels; everything else gets read with skepticism until these work.
Week 3 — Build on the reconciled foundation
Panels 2-5 (marginal CAC, contribution margin, channel mix, cohort revenue) built on top.
Week 4 — Ship the first monthly
First full monthly report ships against the template, with the prior format archived for comparison.
The migration is the project. The template is the artifact. Brands that copy the template without doing the migration work end up with a prettier version of the same broken numbers.

