BACK TO BLOG
USE CASESNovember 11, 20269 min read

AgencyAnalytics With Causality Engine: Check the Blended ROAS

JH

By Joris van Huët

Enterprise Interim CMO & Marketing Leader · 15+ years · 50+ orgs

Published

2026-11-11

The short answer: if the ROAS widget on your AgencyAnalytics client report says the ads returned more than the Shopify widget beside it says the store sold, both widgets are working. AgencyAnalytics, the client reporting platform agencies use for branded dashboards and scheduled reports, displays what each platform's API hands it, and its help centre says plainly that it reports only the data third-party tools send through their APIs (data discrepancies article). Meta's purchases arrive under Meta's attribution setting, Google's conversions under Google's, and the custom metric that adds them can use up to 25 metrics in one formula (custom metrics article). To see what each channel caused instead, export the store's GA4 Attribution paths file and drop it on the start page of Causality Engine, a causal attribution tool that reads that one file. The first finding is free.

Disclosure: I founded Causality Engine and own it, and this page recommends it. Every claim about it links to Causality Engine's own pages.

Before the next report goes out:

  1. Run the sum the widget hides. For example, 640 Meta purchases plus 590 Google Ads conversions is 640 + 590 = 1,230 claimed sales. If Shopify's Net Orders widget reads 1,050 for the same dates, the platforms claim 180 orders the store never took.
  2. Open the formula you already copied. The help centre's ROAS example divides Meta's Website Purchases Conversion Value plus Google's Value Conv. by the two spends (custom metrics article). Every input on top of that line is a platform's own claim.
  3. Turn on one column. Enable the attribution setting metric on the Meta Ads dashboard and the table names the window behind every campaign's conversions (Meta Ads article).

The report and the read, row by row

QuestionAgencyAnalyticsCausality Engine
What it isClient reporting with dashboards, reports and a branded portal (entry)Causal estimates from the store's GA4 paths file (entry)
Where its numbers come fromEach integration's API, checked against the native platform first (discrepancies article)The Attribution paths CSV from GA4 (how it works)
Rule behind a conversionThe platform's: Meta's attribution setting, Unified by default, filterable by window (Meta Ads article)Caused share per channel beside a last-click rebuild, with data health from 0 to 100 (how it works)
Totals across platformsCustom metrics add any metrics you pick, ROAS included (custom metrics article)Sums nothing that a platform claimed
GA4 channelsShown by the Channel Type filter you choose (GA4 article), grouped by Google's rules (default channel group)Every channel the export records (integrations)
Integration between the twoNoneNone
What checking costsInside the subscriptionFree first finding, then €99 per read, excluding VAT (pricing, checked on 11 November 2026)

Whose rule each widget carries

AgencyAnalytics adds no attribution of its own. It fetches, and the discrepancies article tells you to check the native platform first: if Ads Manager shows the same figure, nothing more can be fixed on the AgencyAnalytics side. That makes each widget a faithful copy of a claim.

The Meta claim has two settings worth knowing, both in the Meta Ads article:

  • Unified attribution setting, on by default. It includes iOS users. Switch to the Account type and conversion metrics fall, because Apple users drop out.
  • The attribution window filter. When campaigns use different windows, Meta refuses sum totals, and a stat widget can disagree with a table widget. Pick one window and the totals return. The article's advice is to report each window separately.

Google Ads arrives the same way. A conversion action shows only if Google's API returns a value for it, and the cost per conversion metric disappeared when Google stopped sending it (Google Ads article).

GA4 is the subtle one. The Channel Type filter switches between Traffic Acquisition, which is session based, User Acquisition, which credits the first visit, and Default Acquisition, which applies the property's attribution model, data-driven by default (GA4 article). Three settings, three different Paid Social rows for the same month. The article calls none of them wrong.

Where the store's own number sits

The Shopify integration is the one widget on the report that no ad platform scored. It pulls orders and sales, with filters for refunds, voided orders and which date an order is counted on (Shopify article). Total Orders includes voided and refunded ones; Net Orders removes both. For checking claims, Net Orders is the figure to use.

Put it next to the platform widgets and the report holds both sides of the argument on one page. The custom metric builder will then happily add the claims together, which is where reading starts to go wrong.

Worked example: a client report that sums to more than the store

For example, with figures invented to show the arithmetic and drawn from no store: a March report for a skincare client.

Widget on the reportFigureWhose rule
Meta Website Purchases731Meta, 7-day click and 1-day view
Google Ads Conversions658Google Ads conversion settings
Microsoft Advertising conversions97Microsoft's
Shopify Net Orders1,184The store's ledger

The claims add up to 731 + 658 + 97 = 1,486, which is 1,486 - 1,184 = 302 orders more than the store booked, before email or organic search have said anything.

The ROAS custom metric has the same shape. Meta's conversion value €52,630 plus Google's €47,915 is €100,545, over spend of €14,200 + €12,650 = €26,850, a blended ROAS of 100,545 ÷ 26,850 = 3.74. Shopify net sales for March were €83,410, so revenue over the same ad spend is 83,410 ÷ 26,850 = 3.11, and that figure includes every sale no ad touched.

A causal read does not pick between 3.74 and 3.11. Its how-it-works page describes setting each channel's caused share beside a last-click rebuild from the same GA4 file, graded for data health on a scale of 0 to 100, and closing on a raise, cut or hold verdict meant to be tried in a single region before anywhere else. When the read and the report disagree about Paid Social, run the regional test before the client's budget moves.

The free check inside AgencyAnalytics

The tool already holds everything a first check needs. Build one more custom metric, scoped to the client:

  1. Add Facebook Ads Conversions filtered to the purchase event, the narrowing the custom metrics article describes in step 7.
  2. Add Google Ads conversions, then divide the sum by Shopify Net Orders.
  3. Set the data type to Float and choose Decrease is positive.

Call it the claim ratio. Above 1.0, the platforms claim more orders than exist. Then duplicate the Meta widget, filter one copy to a 1-day click window, and the gap between the two copies shows how much of Meta's figure rests on the longer window and on views. Neither step costs anything or touches the client's ad accounts.

What the read adds, and where it stops

The ratio says the claims overlap. It cannot say which channel would be missed. For that, Causality Engine works from a file GA4 already holds: export 12 months or more (how it works) and the read splits Direct back to the channels that sent those buyers. Its pricing page for agents says dashboards keep reporting what they observed while the read answers what each channel caused, and that platform-reported ROAS is never an input.

Three limits apply. The read is per channel, so it cannot judge a campaign, an ad set or the Microsoft Ads account on its own if GA4 folds it into Paid Search. When a channel earns less than 1% of the credit under both the causal method and last-click, the read labels it too small to act on rather than ruling on it (how it works). And nothing connects AgencyAnalytics to it: the integrations page describes reading whatever channels the GA4 export records, so the export is downloaded from GA4 itself.

The ROAS example in the help centre adds two platforms' claimed values and stops there. A report built on it shows the client a healthy multiple every month, and a client who reads a healthy multiple keeps the agency, which keeps paying AgencyAnalytics for that client's slot.

The paid path, after the free ratio: the start page computes a first finding from the export on your own machine at no charge, and Causality Engine, which I founded, then charges a single €99, excluding VAT, for the full read, with the money back on request for 30 days (pricing, checked on 11 November 2026), and a link to that read can sit beside the monthly report.

See also

FAQ

Can AgencyAnalytics send client data to Causality Engine?

No. There is no connector between them, and none is needed: the read takes the Attribution paths CSV you export from the client's GA4 property, and AgencyAnalytics' own GA4 widgets are not that file.

Why do my Meta totals differ between a stat widget and a table?

Meta refuses sum totals for some metrics when campaigns use different attribution windows, so a stat widget can show less than the rows. Filter to one window and the totals return (Meta Ads article).

Which GA4 Channel Type should a client report use?

My recommendation: Traffic Acquisition for visits, and say so on the page. Default Acquisition applies the property's data-driven model, and the GA4 article lists metrics, Transactions among them, that return no data under it.

TAGS
Causality EngineAgencyAnalyticsPaid Media AttributionGA4Worked Example

ABOUT THE AUTHOR

I am Joris van Huët, an enterprise interim CMO. 15+ years, 50+ organizations, including ING, P&G, Nestlé, BNP Paribas, WeTransfer and Vinted. I take on innovation projects (venture building, design sprints), agentic marketing (setting up and running AI agents) and hands-on multi-channel work. See the track record.

I wrote and published this with AI assistance, and I answer for it. Claims about my own experience are limited to the track record above, and a statistic links to its source or is labelled as an example. I sell interim and fractional CMO work, which is why this site exists. How this site is written.

Agentic marketing, built for your team

The agents in this article, built into your workflows and handed over to your team: the first one within two weeks.

With Joris van Huët, interim and fractional CMO in Utrecht. From EUR 5,000 a month, monthly cycles, a 30-day exit.