📥 GA4 Now Grades Your Imported Ad Cost: What the New Validation Report Checks, the Currency Rule, and Why Meta Rows Say “No Analytics Data”
GA4's new validation report tells you, per campaign, whether imported Meta or TikTok cost joined to sessions. The three keys, the currency rule, the fix.
🚀 THE EXECUTIVE SUMMARY
The Definition: Campaign data import (Google's current name for cost data import) uploads cost, clicks and impressions from non-Google ad platforms into a GA4 property. Analytics joins each row to its own sessions at query time on three required keys: utm_source, utm_medium and date. Since 10 August 2026 a Campaign data import validation report, under Reports > Data import, grades every paid non-Google campaign as Joined, No campaign data or No Analytics data, and reports a coverage rate.
The Core Insight: The report changes nothing about the join; it makes the join visible. Most "cost in GA4 is wrong" complaints are one of three literal mismatches: a source spelled differently in the file than in the landing-page URL, a medium the platform never sent, or a date on the wrong side of a time-zone boundary. Since 28 July 2026 there is a fourth: an upload carrying cost without a currency now fails instead of loading silently. Fix the keys at the ad platform, not in the file.
How the join actually works
Google's help article is explicit. Required fields are utm_source, utm_medium and an ISO 8601 date; utm_id and utm_campaign are recommended; at least one of clicks, cost or impressions per row; currency, as an ISO 4217 code, is "required only if cost metric is included." The join is a "reporting/query time join" that does not rewrite processed data, and "it can take up to 24 hours for Analytics to make that data available." Limits: 120 uploads per property per day, 1 GB per import source, SFTP scheduling daily, weekly or monthly.
Three details do the damage. The match is literal: facebook and Facebook are two sources. The join is session scoped: a cost row only meets traffic that arrived with those exact parameters, so a landing page that strips query strings yields perfect cost files and zero joined rows. And the date is the property's time zone on one side and the ad platform's on the other; a Meta account on Pacific time and a property on Seoul time disagree about which day an evening click belongs to.
The June 2026 Source group dimension, which Google describes as "a new dimension concept that consolidates source values for common online platforms - Facebook, Instagram, and TikTok," does not rescue a bad key: the import's join keys are unchanged, so consolidation happens in the report, not in the join.

What the validation report tells you, and what it cannot
The report "is session scoped and will have a filter applied by default to only look at PAID manual campaigns, excluding all google sources and search mediums." Joined means "your campaign data was successfully joined to Google Analytics." No campaign data means sessions exist but no imported row matched them. No Analytics data is the expensive one: the cost row exists, no session carried its keys, and, as PPC Land notes, such rows still add cost to blended totals, so cost per key event is inflated by campaigns that, as far as Analytics can tell, sent nobody.
Coverage rate is the summary: "the ratio of your data from ad campaigns that have associated campaign performance data," cut by Source/Medium, Campaign ID, Campaign name, Source platform or Channel group. The report says which row failed, never why. Pair it with the 30 July 2026 diagnostic that flags landing pages missing Google's aggregate identifiers (gbraid, gad_): a redirect or CMP that strips parameters breaks both features at once.
The compliance angle: no consent needed for the file, but consent still shapes the number
A cost file holds no personal data: campaign, day, spend, clicks. Under GDPR it is the rare marketing flow with no lawful-basis question. The join, however, is against sessions, and sessions exist only for visitors whose consent state let the tag fire. Where many decline, the report shows more No Analytics data and a lower coverage rate for reasons unrelated to your UTMs. Read it by market before campaign, and never treat a low coverage rate as a reason to loosen the banner; the previous issue covers why the banner governs the signal even on your own server.
The related trap is expecting the joined number to agree with Meta's. Since 3 March 2026 Meta counts a click-through conversion only after a link click; likes, shares and saves moved to a separate engage-through bucket with a one-day window, and the video engaged-view threshold fell from 10 to 5 seconds. Analytics counts a session that arrived with your parameters and later fired a key event. Two definitions, two numbers, both correct. The import gives you cost per Analytics-measured key event, comparable across platforms; it does not put Meta's number in Google's interface.
Import, build, or buy
| Route | What you get | Cost | Where it breaks |
|---|---|---|---|
| Import into GA4 (file, SFTP or the native Meta connection) | Cost, clicks, impressions beside GA4 sessions and key events; the validation report | No licence fee; someone owns the file | Literal keys; 24-hour lag; no currency conversion; nothing before the day you started |
| Build in BigQuery | Your own join on any key, retroactive; GA4 export and Google Ads transfer are on Google's no-charge connector list (Ads: daily, 7-day refresh window by default, up to 30) | First 10 GiB storage and 1 TiB of queries a month free, then $6.25 per TiB on demand; Meta is not on the free list, so you write or buy that feed | Engineering time; the Meta feed is yours when the API changes |
| Buy a connector (Supermetrics, for example) | Managed feeds from many platforms into Sheets, Looker Studio or Power BI; BigQuery on the enterprise tier | Published tiers $49, $199 and $499 a month; warehouse destinations by quote | Pays for plumbing, not keys; if UTMs disagree with the file, the connector delivers the disagreement faster |
The house view: start with the GA4 import if you run two or three non-Google platforms; the validation report is now a free weekly audit of tagging discipline. Move to the warehouse when you need a join key other than source and medium, or history that predates the import. Buy when the bottleneck is the number of platforms, not the correctness of the join.
The Expert Perspective
Google's native Meta connection obeys the same rules as a spreadsheet: its help page requires utm_source and utm_medium in every Meta destination link and states that "all of your paid Meta traffic should be tagged with a single unique value for utm_medium." It imports at least 24 months of history, but account, source and medium cannot be changed afterwards without recreating the connector. Automation removed the file; it did not remove the contract between the ad's URL and the property. That contract is the real product: coverage rate is a statement about URL discipline, and the cheapest data-quality metric in your stack because Google computes it for you.
Conclusion & Next Steps
The installable artefact for this issue is a one-page UTM contract plus a weekly check:
- Naming rule: lowercase everything at the link builder; one
utm_sourceper platform; oneutm_mediumfor all paid social;utm_idset to the platform's campaign ID so the report's Campaign ID cut works. - File rule: one row per campaign per day; ISO date; currency populated with the billing currency or fixed at upload; export time zone aligned to the property's.
- Weekly check: open the validation report, sort by No Analytics data, and inspect each live ad's landing URL, not the file. Then sort by No campaign data to find campaigns launched without being added to the export.
- Reconciliation rule: compare joined cost per key event inside the conversion window you configured, and file the Meta-versus-Analytics gap under definitions, not bugs; our issue on platform under-reporting covers which gaps are worth closing.
FAQ
Does the validation report fix mismatched rows?
No. It labels them. Correct the ad's URL or the export and upload again; the join runs at query time, so the corrected file applies to new queries.
Is currency required for clicks-only or impressions-only files?
No. Google's article says currency is required only if the cost metric is included; every file with a cost column needs one, mapped from a column or fixed for the data source.
Why does Meta report more conversions than the joined GA4 number?
Different definitions. Meta's click-through counts link clicks in its own window, plus a separate engage-through count; GA4 counts key events in sessions that arrived with your parameters, inside the window you set.
References & Sources Cited
- Google Analytics Help, What's new in Google Analytics (11 June, 28 July, 30 July, 10 August 2026).
- Google Analytics Help, Campaign data import; Campaign data import validation report; About Data Import.
- Google Analytics Help, Aggregate identifiers; Connect Meta to Google Analytics.
- PPC Land, New Google Analytics report shows which non-Google campaigns lack cost data (10 August 2026).
- Meta for Business, Simplifying Ad Measurement for a Social-First World (3 March 2026).
- Google Cloud, BigQuery pricing; Schedule Google Ads transfers.
- Supermetrics, Pricing (fetched 27 August 2026).
- Kissmetrics, How to import cost data from multiple ad platforms into GA4 (and why it breaks).
Forwarded this by a friend? Subscribe here. Found it useful? Forward it to one person who'd want it.
See you soon,
Team Data Measured
Data Measured is researched and fact-checked by our Editorial Team. We explain measurement; nothing here is legal advice.