top of page

If Your Agency Reports Don't Show Profit, They're Theater

  • Writer: Matthew Slaymaker
    Matthew Slaymaker
  • Jun 9
  • 8 min read

Quick Answer


Revenue is not the goal. Revenue minus cost is the goal. Most agency reports stop at revenue and ROAS, which means they show you whether the campaigns generated sales without telling you whether the business made money. A weekly report that does not include contribution margin or, at minimum, ad spend relative to gross profit is a performance, not a business document. If your dashboard cannot answer "are we more profitable than last month?" your agency is reporting on the wrong thing.


The Difference Between Selling and Earning


A brand we audited last year was running $50K/month in ad spend and reporting $300K in attributed revenue. 6x ROAS. Everyone felt good.


Then we asked the founder for the COGS, the platform fees, the shipping costs, and the return rate. After we plugged those in, the $300K of revenue was producing about $35K of contribution margin. The agency was costing $7K/month. So the actual return on $57K of total marketing investment was $35K. The business was losing money on every cycle the ads ran.


Nothing the agency reported was technically false. They were just answering a question the founder had not asked: "did your campaigns generate sales?" The question that mattered was "did your campaigns generate profit?" Those are not the same question, and the report did not reflect that.


The founder we were auditing was about to renew the agency for another year. The 6x ROAS slide had carried the renewal conversation. Once we showed them the contribution margin view, the renewal conversation got harder for everyone. The agency was doing technically competent work. They were just not measuring against the right question, and the founder had no way to tell from the reports they were getting.


What a Profit-Aware Report Looks Like


The minimum viable version is one page with four numbers:

  1. Ad spend

  2. Attributed revenue

  3. Contribution margin (revenue minus COGS minus ad spend minus shipping/returns)

  4. Blended CAC vs new-customer LTV


That is it. Everything else (CTR, CPM, frequency, audience metrics) belongs on page two as the diagnostic layer that explains why the four numbers moved.

The stretch version adds incremental revenue and a running 90-day contribution margin trend. The point is that the headline of the report should answer the business question, not the platform question.


Here is what a real one-page weekly looks like in practice. The top line shows total ad spend for the week, broken down by channel. The second line shows attributed revenue for the same period, anchored to Shopify (not summed across platforms). The third line shows contribution margin per channel, calculated as attributed revenue minus COGS percentage minus ad spend minus shipping cost per order minus refund rate impact.


The fourth line shows blended CAC for the week, calculated as total marketing spend divided by net new customers, with the new-customer LTV underneath as a fixed reference point.


That entire view fits on a single 8.5x11 page. The diagnostic layer (CTRs, CPMs, frequencies, audience metrics, creative performance, landing page conversion rates) lives on the next three pages, organized by channel. The founder reads the first page and knows whether the business made money. They read the next three pages only when the first page tells them something needs explaining.


Why Most Agencies Do Not Report This Way


Three reasons.


The data lives in different places. Ad spend is in the platforms. Revenue is in Shopify or Stripe. COGS, returns, and shipping costs live in spreadsheets or back-office systems.


Most agencies do not want to do the integration work to pull them together. So they report on the data they already have, which is platform data, which does not include margin. Tools like Triple Whale, Northbeam, and Polar Analytics have dramatically lowered the bar on this integration work in the last two years, but the agency still has to wire it up, agree on a methodology, and maintain it as the brand's product mix and cost structure evolve. That ongoing maintenance is the part most agencies skip.


The numbers can get uncomfortable. When you start reporting contribution margin, you sometimes find that the ad spend is not profitable. That is a hard conversation. Easier to keep reporting ROAS and let the founder figure out the margin math on their own.


There is a structural incentive problem here: the agency that reports honest contribution margin is the agency that has to defend its own value when the numbers go sideways. The agency that reports ROAS can hide behind "the platform numbers look great" even when the business is losing money.


They were never trained to. Most performance marketers were taught to optimize for the platform metrics. CAC and LTV come up in training. COGS and contribution margin usually do not. The agency reports what its strategists know how to talk about. A strategist who has never had to defend a contribution margin number will report ROAS because that is the language they have. Retraining the strategist (or hiring one who already speaks the language) is a real organizational investment that most agencies will not make until a client forces it.


None of these are good reasons. All of them are common.


How to Push for Profit-Aware Reporting


The fastest path is to give your agency the inputs they cannot pull themselves. Send them:

  • Your average COGS as a percentage of revenue, by major product category

  • Your average shipping and fulfillment cost per order

  • Your return rate by product category

  • Your new-customer 12-month LTV, or the closest estimate you have


Then ask for a report that uses those inputs to produce a weekly contribution margin by channel. A competent agency can build this inside two weeks. A great one will already have asked you for these inputs in the onboarding.

If the agency cannot build it after you provide the inputs, that tells you something about the agency.


A 30/60/90 Implementation Plan


If you want to operationalize this transition, here is the cadence we use when we onboard a client to profit-aware reporting:


Days 1-30: Wire up the inputs. Pull COGS data from the brand's accounting system or have the founder estimate by product category. Get a single shipping-cost-per-order number from the fulfillment partner. Pull return rate by product category from Shopify or the returns platform. Get the new-customer LTV from the customer database, calculated over a rolling 12-month cohort. None of this is hard work individually. The work is in collecting it all in one place and agreeing on a methodology that will hold up over time.


Days 31-60: Build the report and reconcile. First version of the one-page weekly report goes live. Spend this period reconciling the numbers against the brand's actual P&L at the end of each month. The first few months almost always reveal small errors (COGS that was off by 2-3%, return rate that was understated, a fulfillment surcharge that was not included). Fix each error as it surfaces and rerun the historical reports so the trend is clean.


Days 61-90: Operationalize the decisions. The report is reliable enough now that it drives weekly budget decisions. Channel rebalancing happens off contribution margin, not ROAS. Creative refreshes are prioritized by contribution margin impact, not by CTR. The weekly client call is anchored to the one-page report instead of to platform metrics.


By day 90, the platform metrics have moved fully to the diagnostic layer and the contribution margin view is the operating reality of the engagement.

That is the standard timeline. Some accounts move faster, some slower, depending on the cleanliness of the underlying data and the founder's willingness to engage with the new framework.


What Happens When You Get the Right Report


The first time you see contribution margin by channel, two or three things usually become obvious.


One channel is doing more work than it gets credit for. Usually email or organic search. Your paid channels look great on ROAS but earn most of their margin on top of a free baseline. Once you see this in numbers, the question of how much to invest in organic and email versus paid changes. We have had clients shift 15-25% of their marketing budget from paid to retention or organic infrastructure on the back of this realization, and the contribution margin impact in the next quarter is usually meaningful.


Another channel is doing less work than the platform claims. Often Meta retargeting or branded search. High ROAS, low or zero incremental contribution. Cutting or restructuring these line items is one of the cleanest profit unlocks available, and it almost always shows up in the contribution margin view before it shows up in any other metric.


And the budget mix you thought was right turns out to be off by 20-40%. That mix shift is usually the single biggest profit lever the brand has all year, and it was sitting inside data the agency could have surfaced months earlier.


What to Do When the Report Shows Ad Spend Is Unprofitable


This is the hardest conversation in agency-client work, and it is the conversation that profit-aware reporting forces. Sometimes the report shows that a channel, or the entire ad spend, is contribution-margin negative.


The instinct is to panic and cut. That is sometimes right. More often, the right move is to pause and diagnose. Three questions:


First, is the unprofitability driven by the channel itself, or by a few specific campaigns within the channel? Often 80% of the loss is concentrated in 20% of the campaigns. Killing those campaigns can flip the channel back to profitable without sacrificing the parts that were working.


Second, is the unprofitability seasonal? Some brands have channels that run negative for two months and positive for ten, and the annual contribution margin is still strong.


Cutting in the wrong month can destroy a perfectly healthy annual contribution.

Third, is the unprofitability incremental or accounting? A channel that looks unprofitable on attributed revenue might still be incremental, if it is driving customers who then convert through other channels. This is where incrementality testing earns its keep.


Without it, you can cut a channel that was actually pulling its weight in ways the attribution model could not see.


The point is to use the report as the start of the conversation, not the end. A good agency walks the client through these three questions before recommending action. A bad agency either ignores the unprofitable signal or panic-cuts based on it.


The One Question to Ask This Week


Send this to your agency:


Can you build me a one-page weekly report that shows ad spend, attributed revenue, contribution margin, and blended CAC vs new-customer LTV, by channel? I will provide COGS, shipping, and return rate inputs. I want the platform metrics underneath as a diagnostic layer, not as the headline.


If they say yes and ship it inside two weeks, you have a partner. If they hedge, you have an answer.


FAQ


My agency says contribution margin is too complex to calculate weekly. Is that true? No. Once the inputs are wired in (COGS, shipping, returns), the calculation is automated. The complexity is in the setup, which takes a week or two of work and then runs forever.


What if I do not know my COGS precisely? Start with an estimate. Even a rough number gets you 80% of the value of a precise one, and you can refine it over time.


Is contribution margin the same as profit? Close, but not identical. Contribution margin is revenue minus variable costs (COGS, shipping, ad spend). It excludes fixed costs like rent and salaries. For agency reporting, contribution margin is the right level of detail. True profit lives in your full P&L.


Should I cut a channel as soon as it shows negative contribution margin? Not necessarily. Pause, diagnose whether the loss is concentrated in specific campaigns, check seasonality, and run an incrementality test before cutting. The report is the start of the conversation, not the end of it.

 
 
 

Comments


bottom of page