Skip to content
ceaksan

The Decisions You Lock In Before Importing Ad Cost Into GA4

The new Meta, TikTok, Snap, Pinterest and Reddit connectors bring cost data into GA4, but three settings on the setup screen cannot be changed afterwards: source and medium matching, the 24-month backfill, and the overlap with existing manual cost import.

Aug 27, 2026 7 min read
TL;DR

Third-party ad cost enters GA4 through a single data type, campaign data import, and that type has three feeder routes (connector, manual CSV, SFTP) that Analytics does not deduplicate against each other. The new Meta, TikTok, Snap, Pinterest and Reddit connectors pull at least 24 months of history, so any manual cost import dataset covering the same period gets counted twice. Ad account, campaign source and campaign medium are locked once the connector exists; changing them means deleting it and starting over. That is why the UTM taxonomy has to be settled before the setup screen, not after.

Anyone trying to compare channels ends up in the same place: GA4 knows what happened on the site, the ad platform knows what was spent, and the two never meet in one table. On the Google Ads side linking solved this long ago. Everywhere else the answer was a manually prepared cost import file.

As of August 2026 connectors opened for Meta, TikTok, Snap, Pinterest and Reddit as well. The setup flow is nearly identical across the five. The flow is not the point. Three of the decisions made on that screen cannot be changed afterwards.

Two Mechanisms, Three Feeder Routes

Cost data reaches a GA4 property through two separate mechanisms today. The first is the Google Ads account link. The second is campaign data import, the data type third-party ad cost moves through.

Campaign data import has three feeder routes of its own: the newly opened platform connectors, manually uploaded CSV files, and scheduled SFTP uploads. All three write to the same data type, and Analytics does not deduplicate between them.

The wording in Google’s Reddit documentation is explicit: Analytics does not attempt to deduplicate information between the connector and manual cost import.1 So if the same campaign’s cost exists both in an uploaded file and in the connector, the report adds them together.

On a fresh property this is not a problem. It becomes one on setups that have been fed manually for years, because the connector reaches backwards.

What the Connector Actually Carries

The help pages lead with cross-channel attribution wording, and that can create the wrong expectation. The imported field list is the same and narrow across all five platforms: Ads cost, Ads clicks, Ads impressions.12345

The connector does not touch GA4’s attribution model, does not change channel assignment, and does not bring in the platform’s own conversion counts. What it brings is a spend column next to the channel report that already exists. That is not a small thing, ROAS and cost per channel can only be calculated once that column is there. But the gap between the platform’s conversion count and GA4’s conversion count stays exactly where it was. That gap comes from somewhere else, from the counting window and attribution model differences I covered in the Google Ads and GA4 conversion mismatch.

The Three Decisions That Lock In

Campaign Source and Campaign Medium Matching

Setup asks for two text fields: campaign source and campaign medium. These values have to be identical to the utm_source and utm_medium values on the destination URLs of the ads. Google’s instruction requires that all paid traffic from that platform is tagged with a single utm_source value and a single utm_medium value.1

In practice what I keep running into is the opposite. It is ordinary for different people to have used facebook, fb, meta and Facebook for the same platform at different times. When one of those is picked during setup, traffic tagged with the others never matches the cost and sits in the report as a channel with no spend.

The Source Group dimension added on 11 June 2026 consolidates exactly this mess on the reporting side: values like %instagram% and ig collapse into one label, and the field is populated retroactively.6 It does not solve the connector match. No document states this directly; the inference rests on the connector matching against its own stored source and medium values.1 Source Group corrects the label you see in the report, while what decides which row the connector writes cost to is the raw utm_source value entered at setup. So the report can look tidy while the cost sits on the wrong row.

So the order is: settle the UTM taxonomy and bring the ad destination URLs to a single value first, then create the connector. Done the other way around, the fix is deleting the connector and rebuilding it.

The parameter list Google gives for destination URLs, with its requirement levels, is this.2

ParameterStatusRole in matching
utm_sourceRequiredMust match the campaign source value entered at setup exactly
utm_mediumRequiredMust match the campaign medium value entered at setup exactly
utm_campaignOptional, highly recommendedLets cost be read at campaign level
utm_idOptional, highly recommendedThe only field that keeps reporting continuous through a rename

The 24-Month Backfill and the Dataset Already Sitting There

Each of the five connectors tries to pull at least 24 months of history on creation.12345 For a reporting setup being built from scratch that is an advantage: channel comparison starts on day one with two years behind it.

The same behaviour produces double counting on a manually fed setup. Google’s instruction is direct: delete the prior datasets covering the overlapping period before proceeding.3

The practical difficulty here is that the deletion is not reversible either. Without a copy of the uploaded files, there is no way afterwards to audit the difference between the connector’s data and the old data. Exporting the existing dataset before deleting it is the only ground the post-setup verification has to stand on.

Currency Conversion

Financial data pulled from the platform is converted automatically, and aggregation is said to stay consistent even if the property currency setting changes later.1

On the manual side, campaign data import has required a currency field for every cost upload since 28 July 2026. The value is either mapped from a column in the data source or applied as a single fixed currency across the dataset. Imports created before that date keep reporting on the assumption that the cost matches the current property currency.6 That assumption matters when an old dataset is compared against connector data, because rows uploaded in a different currency are counted as if they were in the property currency.

Automatic conversion makes life easier on multi-market accounts, but it needs one expectation corrected: the cost figure in GA4 is not a copy of the ad platform invoice. Exchange rates and collection timing produce small differences. When a reconciliation is needed, the reference is always the platform’s own invoice, never the GA4 report.

Where the Platforms Differ

The flow is four steps and follows the same order on all five. These are the points where they separate.

PlatformPlatform-side accessAnalytics roleSupported use case
MetaBusiness and ad account accessEditorCampaign data import
TikTokAnalyst role on TikTok AdsEditorCampaign data import
SnapAnalyst role on Snap AdsEditorCampaign data import
PinterestBusiness and ad account accessEditorCampaign data import
RedditAnalyst role on Reddit AdsEditorCampaign data import

Reddit, TikTok and Snap spelling out their role requirement is a practical detail for anyone working agency side.345 If the access level is insufficient, setup stops at the second step, on the account selection screen.

Before You Open the Setup Screen

Four things should be ready before the setup screen is open.

  • All paid traffic from the platform carries a single utm_source and a single utm_medium value, written down and settled.
  • Existing manual cost import datasets are listed, the overlapping period identified, copies exported.
  • Editor access on the Analytics property, and the relevant access on the ad platform.
  • The ad account to connect is decided. Setups where more than one account feeds the same property need a separate connector per account.

Verifying After Setup

The import takes up to 30 minutes, and the data can take up to 24 hours to show in reports.1 An empty report on the first day is expected behaviour, not a fault signal.

The first stop is the campaign data import validation report, launched on 10 August 2026.6 It gives two fields: import join status and coverage rate. Join status takes three values, joined, no campaign data and no Analytics data, and the middle one covers two cases in the documentation at once: data was not imported for that dimension, or it did not join correctly.7 An unmatched utm_source is the most common form of the second, not its only explanation. Coverage rate is the ratio of successfully joined rows to rows with collected Analytics data.7

One detail about that report: it is session scoped and ships with a filter that looks only at manually tagged paid campaigns, excluding Google sources and search mediums. The filter can be removed, but until it is, the report is not showing the full picture.7

The rest runs in three steps. First, check that cost, clicks and impressions are populated on the relevant source and medium row in the Reports > Acquisition > Non Google campaign report; Google documents that imported campaign data lands there and in the All channels screen of the Advertising workspace.8 Then compare a one-week total against the same period in the platform’s own reporting; a small gap from exchange rates is normal, a gap approaching double is most likely a double counting signal. Finally, put the earliest month covered by the backfill next to the period covered by the old dataset you kept.

What This Setup Does Not Solve

Once the cost column arrives, channel comparison becomes possible, but the accuracy of channel assignment stays where it was. The connector adds cost to the traffic GA4 can see; it does nothing about the traffic GA4 cannot see. Sessions missing because of consent rejections, browser restrictions and tagging gaps stay missing at the same rate. Both the numerator and the denominator of the ROAS calculation carry the same measurement error.

The real value of this setup shows up elsewhere. Spend per channel being regular, backwards-looking and readable from one place prepares half the input table that marketing mix modelling needs. What an MMM wants is not session-level attribution but a spend and outcome series broken down by channel and week, and the continuity of that series is the first thing that determines model quality.

So creating the connector looks like a reporting decision, while its actual payoff sits on the data supply side.

Footnotes

  1. Google, Connect Meta to Google Analytics, Analytics Help. 2 3 4 5 6 7
  2. Google, Connect Pinterest to Google Analytics, Analytics Help. 2 3
  3. Google, Connect Reddit to Google Analytics, Analytics Help. 2 3 4
  4. Google, Connect TikTok to Google Analytics, Analytics Help. 2 3
  5. Google, Connect Snap to Google Analytics, Analytics Help. 2 3
  6. Google, What’s new in Google Analytics, Analytics Help. The entries relevant to campaign data import are dated 11 June, 28 July and 10 August 2026. 2 3
  7. Google, Campaign data import validation report, Analytics Help. 2 3
  8. Google, Campaign data import, Analytics Help.
Key Takeaways
  • 01 The connectors carry three metrics only: Ads cost, Ads clicks, Ads impressions. Despite the attribution wording in Google's own summaries, what moves across is campaign cost, not an attribution model.
  • 02 The campaign source and campaign medium values entered during setup must match the utm_source and utm_medium values on the ad destination URLs exactly. If one platform is tagged with two different utm_source values, the connector will only pick up one of them.
  • 03 All five connectors pull at least 24 months of history, and Analytics does not deduplicate between the connector and manual cost import. Any older dataset covering the overlapping period has to be deleted before setup or cost is counted twice.
  • 04 Ad account, source and medium are locked after creation. A wrong value is not edited, the connector is deleted and rebuilt.
  • 05 The Source Group dimension consolidates scattered utm_source values on the reporting side, but the connector still decides which row cost lands on from the raw value entered at setup. Conflating the two leaves a tidy-looking report with cost on the wrong row.
Frequently Asked Questions (FAQ)
+ Do the connectors carry attribution data?

No. For all five platforms the imported fields are limited to the Ads cost, Ads clicks and Ads impressions metrics. Google's help pages use cross-channel attribution wording, but that describes seeing cost next to the channel reports GA4 already produces. The attribution itself is still calculated by GA4's own model on the interaction data collected on the site.

+ What happens to my existing manual cost import files?

The connector and a manual upload feed the same data type, and Analytics does not deduplicate between those two feeder routes. Since the connector tries to pull at least 24 months of history, any manual dataset covering that period will report cost twice. Google's own instruction is to delete the overlapping datasets before proceeding. Deletion is not reversible either, so exporting a copy first is the sensible order.

+ Can I change the utm_source value later?

Not on the connector side. Ad account, source and medium cannot be modified after the connector is created; moving to new values means deleting it and creating a new one. Changing the URLs on the ad platform alone is not enough either, because the connector matches against its own stored source and medium values.

+ How are accounts spending in a different currency handled?

Google states that financial data pulled from the platform is converted automatically so aggregation stays consistent even if the property currency setting changes later. The conversion rate does not need managing, but the reported cost should not be expected to match the ad platform invoice to the cent.

+ Which roles are required?

On the Analytics side all five connectors require at least an Editor role at property level. On the platform side Reddit, TikTok and Snap explicitly ask for the Analyst role, while Meta and Pinterest require business and ad account access. The person running the setup needs authority on both sides, which is usually the first blocking point when access is split between an agency and a client.

Feedback

Share your thoughts on the selected paragraphs. Email is required so I can reply.

Type