Most Matomo marketers we talk to have a second browser tab open during a paid-media review. Matomo on one side. Meta Ads Manager and Google Ads on the other. The blended ROAS number that ends up in the client deck lives in a spreadsheet that both tabs feed into separately.
That's the frustrating thing. Matomo's side of the review is fine on its own. When campaign parameters reach the tracker, Matomo attributes goals and ecommerce revenue back to the campaign that drove them. Core tracking captures campaign name and keyword; the Marketing Campaigns Reporting plugin adds the full UTM breakdown for source, medium, content, and campaign ID. Matomo's Multi Channel Conversion Attribution plugin (MCCA) gives you last-interaction, last-non-direct, first-interaction, linear, position-based, and time-decay models per goal in the UI, plus ecommerce orders once ecommerce is enabled. The Reporting API exposes those reports for whatever BI tool you've standardised on. For anything involving traffic Matomo actually saw, the reporting is honest and complete.
What's missing is the other tab. There's no place in native Matomo that knows a campaign cost money. No ROAS field in any report. That one missing input is why every paid-media review needs a spreadsheet to finish.
Why it stops where it stops
Two structural things, mostly.
The first is the data model. Matomo doesn't have a concept of ad cost. The Campaigns report shows 412 visits and 12 goal conversions from spring_sale and stays silent on the €380 you spent on Meta and Google to produce those clicks. You can try to push spend into a Custom Report through Custom Dimensions, but Custom Dimensions are visit- or action-scoped labels, not a campaign-date spend table. Attach €380 to every visit from spring_sale and a sum duplicates the cost across all 412 of them; store €380 as a label and Matomo just groups traffic by that value instead of dividing it into revenue. Either way you don't get a spend join you can trust. Nothing in the default reports returns CPC, CPA, or ROAS, because nothing in the schema can.
The second is what MCCA can see. Its models run on the acquisition touchpoints Matomo captured through standard tracking: channels, referrers, campaigns, and visits. Anything the JavaScript tracker didn't witness is invisible to it. Meta and YouTube impressions that didn't end in a click. View-through conversions on display and video. Cross-device journeys before login. Offline conversions. If you're running click-based paid search and direct response, and your campaign parameters, consent, and redirects are clean, MCCA is directionally reliable. If you're running upper-funnel display, video, or awareness, MCCA gives those unseen touchpoints little or no conversion credit, because the touchpoint never hit the tracker. The more budget you move into brand and upper funnel, the more the attribution undercounts what's actually working.
How teams close the gap today
We've talked to a lot of Matomo-heavy teams about this, and the workarounds settle into a few shapes. None are clean.
Most start with a spreadsheet. Pull campaign data from Matomo, cost data from Meta and Google, paste it all into a sheet, compute ROAS in a formula column. Works fine for one client with three campaigns. At ten clients or thirty campaigns each, it becomes someone's actual job, and the numbers are stale by the time the deck ships.
A lot of agencies graduate to Looker Studio, Metabase, or whatever BI tool the team standardised on. Connect Meta Ads, Google Ads, and Matomo through the Reporting API or scheduled CSV exports, and put a blended ROAS dashboard in front of the client. This is the best honest answer short of a real pipeline, and a lot of teams stop there. What it doesn't fully solve is the attribution side. Most of these setups stop at the standard campaign and referrer export, so the cost join lands on last-non-direct-style metrics, not on an MCCA model. You can get MCCA-weighted ROAS this way, but only if you deliberately pull the MCCA attribution report through its own export or API and decide how spend should be allocated across the channels and campaigns it credits. Most teams don't, so blended ROAS is what ships.
A few teams build a real pipeline. A data person syncs Matomo, Meta, and Google to a warehouse, joins spend to conversions on date and campaign, and exposes the result as a dashboard. This is the most flexible answer, but it's only as complete as the platform data and attribution rules you import. View-through, offline conversions, and timezone alignment don't come for free. It's also the one that requires hiring a data person, which is a bigger commitment than most marketing teams can make.
There are connector plugins that push ad cost straight into Matomo custom reports. The ones we've looked at tend to solve spend ingestion or a single reporting slice, not spend, cross-channel attribution, and CLV under one schema. They handle the ingestion half without touching the half MCCA can't see.
Our attempt to solve it
Martez is the data platform for Matomo a data person would build, without the hire. Connect Meta Ads and Google Ads once, and it pulls spend on each platform's native cadence, joins it to Matomo's conversion data on the campaign keys Matomo already uses, and exposes the result as reports: ROAS by campaign and channel, CLV, and multi-touch attribution that folds in view-through wherever the ad platform shares impressions. Matomo stays authoritative for traffic, events, and conversions. Martez fills in what the tracker was never going to see, and keeps the numbers honest as the ad platforms restate them.
It's in private beta. Join the waitlist if this is the part of your month that currently lives in a spreadsheet. We're building it because we ran into it ourselves.