GA4 Cost Data Import: Mandatory Currency, New Diagnostic, Validation Report
Contents
Google changed three things about campaign data import between 28 July and 10 August 2026. A currency field became mandatory for cost uploads. A diagnostic appeared for landing page URLs missing GBRAID and gad_ identifiers. And a validation report arrived for assessing the quality of non-Google campaign data.
Three changes in fourteen days, all aimed at the same place. That place is the only number in a GA4 property that GA4 did not measure: the cost of the advertising.

Why imported cost is different from everything else
Sessions, events and conversions are observed. The tag fires, something is recorded, and if the recording is wrong there is usually a way to see that it is wrong. Cost is not observed. It arrives in a file, and GA4 accepts it because it has no independent way to know what an advertising click was worth.
Everything downstream inherits that. Cost per click, return on ad spend, any comparison of channels by efficiency – all of them are a measured number divided by an asserted one. The measured half gets scrutinised constantly. The asserted half, until this summer, went in unexamined.
The currency field
Before 28 July, an upload could omit the currency, and a property receiving files from several markets would sum them as though the numbers shared a unit. The result was not obviously broken, which is the problem: a total in mixed currencies looks exactly like a total.
The field can now be mapped from a column in the file or set once for the whole dataset. The second option is the safer default for a single-market account and a trap for anyone who later adds a second market to the same import, because the fixed value stays fixed and nothing complains.
The identifier diagnostic
GBRAID and the gad_ family are the parameters that let a click be traced back to the campaign that paid for it. When they are stripped – by a redirect, by a link shortener, by a consent gate that rebuilds the URL, or by a marketing tool that rewrites landing pages – the click still arrives and the session is still recorded. It simply no longer carries the thread back to its campaign.
landing page as clicked
/offer?utm_source=partner&utm_medium=cpc&gbraid=AAA...&gad_source=1
after a redirect that keeps only what it recognises
/offer?utm_source=partner&utm_medium=cpc
session still recorded
source still partner / cpc
campaign still attributed by UTM
cost join still works, because the join runs on UTM values
Google-side identifiers gone, so anything relying on them
no longer lines up
The diagnostic is worth reading precisely because this failure is silent. Nothing errors, no report empties out, and the loss shows up only as a slow divergence between what the ad platform reports and what GA4 reports.
What the validation report can and cannot see
The report examines the data that arrived. It can tell whether rows are well formed, whether dates fall in a plausible range, whether required fields are present. That is genuinely useful and it is not the same as telling whether the data is right.
The check that would catch the most common failure is still absent, and it concerns the join key. Cost rows are matched to sessions by source, medium and campaign as strings. If the file says Facebook and the tag recorded facebook, or the file says paid_social and the tag recorded paidsocial, the row joins to nothing.
A row that joins to nothing does not raise an error. It produces no cost, which means the campaign appears to have run for free, which means its return on ad spend is infinite, which means it looks like the best-performing campaign in the account. The failure mode of a broken join is not a gap; it is a flattering number.
A short list worth running once
Four things settle most of it, and none of them takes long. Confirm the currency is set the way the account actually spends, and set a reminder to revisit it when a market is added. Read the identifier diagnostic once and find out whether any redirect in the click path is stripping parameters. Open the validation report after the next upload rather than after the next quarterly review.
And check the join by hand: take one campaign that definitely spent money, look at its cost in the report, and confirm the figure is neither zero nor suspiciously round. The cheapest audit of an import is a campaign whose true cost is already known.