LW IT Solutions
« Blog Overview /Digital Analytics / GA4 Cost Data Import: Mandatory Currency, New...
This post in other languages:

GA4 Cost Data Import: Mandatory Currency, New Diagnostic, Validation Report

Contents
  1. Why imported cost is different from everything else
  2. The currency field
  3. The identifier diagnostic
  4. What the validation report can and cannot see
  5. A short list worth running once

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.

A horizontal track from an ad platform export to cost and ROAS in reports, with three numbered checkpoints hanging beneath it: currency, aggregate identifiers and import validation, each with its date and what it catches
Three checks were added between 28 July and 10 August. The one that would matter most is still missing, and it is described below the track.

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.

Lukas Wojcik

Lukas Wojcik

Systems architect and technology enthusiast specializing in scalable tracking solutions, GMP Stack (GA4 & GTM), and robust backend architectures. Advocate for clean code and privacy-first design.

Get in Touch

Briefly describe your project or inquiry for a tailored response. This site is protected by reCAPTCHA.

ALL ARTICLES & CATEGORIES

CCTV

Follow this category by RSS

Cloud & AI

Follow this category by RSS

Data Privacy

Follow this category by RSS

Digital Analytics

All 33 articles in this category Follow this category by RSS

Digital Marketing

All 18 articles in this category Follow this category by RSS

IT & Networks

All 11 articles in this category Follow this category by RSS

Raspberry PI

Follow this category by RSS

Smart Home

Follow this category by RSS

Web Development

Follow this category by RSS

Wordpress Hacks

Follow this category by RSS