Docs

GA4 Cost Import Currency Field Tracking

GA4 now requires a currency field on every cost data import — track import success and currency mismatches or ROAS silently breaks.

Revenue

Google Analytics updated campaign data import this month so that any upload containing cost data must now include a currency field — either mapped from the source feed in ISO 4217 format or hardcoded as a static value. Google’s stated reason is sound: without an explicit currency, a property that later changes its reporting currency would silently misstate historical spend. But the practical effect for most teams is a scheduled import job that worked fine for months suddenly failing, or worse, partially succeeding with rows silently dropped, the day this requirement started being enforced.

The failure mode here is quiet by design. Cost import jobs usually run unattended — a nightly cron pulling spend from ad platform APIs and pushing it into GA4 — and nobody watches them succeed. What gets watched is the output: blended ROAS, CAC by channel, cost-per-conversion. When a currency-less import starts failing, those numbers don’t error out, they just go stale or drop to zero cost with revenue still flowing in, which makes a channel look wildly profitable right before someone increases its budget on bad data. Without instrumentation on the import pipeline itself, the first sign of a problem is a spend decision made on numbers nobody realised were broken.

Data Points to Track

  • Import job success/failure status per source feed, logged on every scheduled run, not just checked when someone happens to look
  • Currency field presence per row before upload — a pre-flight validation check, not a post-hoc audit
  • Property base currency vs. imported currency, flagged whenever they diverge, since GA4 expects the imported cost to match the property’s configured currency
  • Cost data completion rate — the percentage of expected days per week with a successfully imported cost row, per channel
  • Import freshness lag — the time between a given spend date and that row successfully landing in GA4

Setup Steps

  1. Audit every existing cost data import job today for whether it currently sends a currency field at all — many legacy integrations built before this requirement don’t.
  2. Add currency mapping to each feed, either pulling the ISO 4217 code directly from the ad platform’s export or hardcoding a static value if the source is single-currency.
  3. Build a pre-upload validation step that rejects or flags any row missing a currency code before it reaches the GA4 import API, rather than discovering the failure after the fact.
  4. Instrument the import job itself — success/failure, row counts, and rejected-row counts — as a monitored metric, not just application logs nobody reads.
  5. Add an alert on completion rate dropping below 100% for two consecutive days, so a broken feed surfaces before a full reporting cycle passes.

Actionable Insights

A sudden drop in cost data completion rate for one channel, with clicks and conversions still arriving normally, is close to a guaranteed sign that a currency field is missing or malformed on that feed’s import — check the pre-flight validation logs first rather than assuming the ad platform itself changed something. A currency mismatch between the property setting and an imported row is worth treating as a hard stop rather than a warning, since GA4’s handling of mismatched currency is inconsistent enough that the safer assumption is the row didn’t import the way anyone expected. And tracking import freshness lag matters even when everything is technically working, because a job that’s quietly falling two or three days behind schedule produces cost-based metrics that look current but are actually describing last week’s spend.

Expert help

Need help tracking this in your app?

Our team sets up analytics pipelines for mobile and web teams every day. Talk to us and get your first events flowing in under an hour.

Talk to an expert