GapFill Help

Source / medium

The source and medium of a recovered purchase depend on the kind of order. Start with the table, then read the section for the kind you care about.

By kind of order

Kind of orderUser in GA4Source / medium
Store order, visit capturedSame person as the visitThe source of the original visit. GA4 works it out itself
Store order, visit not capturedA separate userThe source of the last visit Shopify recorded. If there is none, (direct) / (none)
In-app checkout in an AI assistant or social appA separate userThe name of that assistant or app / ai-assistant or referral
Other channelsA separate userThe source / medium you entered in Settings
Renewal, sent as the same customerSame person as the first orderThe source of the first order
Renewal, sent as a separate userA separate usershopify_subscription / renewal
Refund or cancellationSame person as the purchaseDepends on the report (see below)

A “separate user” is created for that one order. It isn’t tied to any visit.

Rules that apply to all of them

  1. Hour 0OrderGA4 counts the revenue on this day
  2. Waiting for late hits from your GA4 tag26 hours
  3. About 26 hours after the orderGapFill sends itOnly orders still missing from GA4
  4. Source shows as (direct) / (none)24 to 48 hours after sending
  5. 2 to 3 days after the orderSource is finalFrom here the right source shows
Example: an order placed on Monday at 10:00 is sent on Tuesday at about 12:00, and gets its source between Wednesday 12:00 and Thursday 12:00. The revenue is counted on Monday.
Date
Events are sent with the time of the order, so they are counted on the day of the order, not the day they were sent.
When the source appears
For 24 to 48 hours after sending, the source shows as (direct) / (none). Check again after two days.
When events are sent
An order is sent when it is still missing from GA4 26 hours after it was placed. That leaves time for late hits from your GA4 tag. GapFill checks every hour, so an order is normally sent 26 to 27 hours after it was placed. If GA4 has no data yet from after the hour of the order, GapFill waits up to 50 hours. Orders older than 70 hours are not sent, because GA4 no longer accepts them.

Which GA4 reports show it

GA4 keeps three kinds of source, and each report uses one of them. The source GapFill attaches shows in some reports and not in others.

Kind of source in GA4Main reportsPurchases sent by GapFill
Source of the purchase (attribution)Advertising reports, and Explorations with “Source / medium”As in the table above
First user sourceAcquisition → User acquisitionOrders sent as a separate user get the source in the table above
Session sourceAcquisition → Traffic acquisitionOnly orders with a captured visit. The rest show (not set)

This is why revenue under (not set) can grow in Traffic acquisition: an order with no visit has no session at all. To see revenue by source, use an Exploration with “Source / medium”.

Store orders

Orders placed through your online store checkout. At checkout GapFill keeps the GA4 ID from the buyer’s browser.

  • When the ID was captured, the purchase is sent with it. GA4 tracks it as part of the original visit, with that visit’s source and campaign.
  • When it wasn’t, GapFill uses the last visit Shopify recorded for the order. It looks at UTM parameters, then the Google Ads click ID, then the referrer, and uses the first one it finds.
  • If none of them exist, the purchase is sent without a source and GA4 shows (direct) / (none).

In-app checkouts in AI assistants and social apps

These orders have no visit. GapFill sends them with the assistant or app as the source. The medium is ai-assistant for AI assistants and referral for social apps. In GA4’s channel grouping, AI assistant orders fall under “AI Assistant” and social app orders under “Organic Social”.

An in-app checkout in a social app is sent as referral even when it came from an ad. The Shopify order only records which app it was bought in, not whether an ad led to it. For revenue by ad, use Meta Ads Manager.

Other channels

Draft orders, orders created by other apps, POS and so on. The source and medium are the values you entered for each channel in Settings. The campaign is (other).

Subscription renewals

  • With Send as the same customer, every renewal carries the source of the first order. You can see subscription revenue by the source that brought the customer in.
  • The trade-off: a renewal keeps the first source even if the buyer has since clicked another ad. If the same customer later starts a second subscription, renewals still use the source recorded first.
  • If the first order was a direct visit, no source is attached, and GA4 decides from that person’s earlier visits.
  • With Send as a separate user, the source is shopify_subscription / renewal. Choose this to keep subscription revenue apart from your acquisition analysis.
  • Customers who started a subscription before you installed GapFill have no first-order record. Their renewals are sent as a separate user even if you chose “Send as the same customer”.

Refunds and cancellations

Which source a refund is taken off depends on the GA4 report. GapFill sends a refund as the same person as the purchase (the same browser ID). So in User acquisition (first user source) it is taken off the source / medium of the original purchase. In Traffic acquisition (session source) it shows under (not set). Unless refund is a key event, advertising reports and Explorations with “Source / medium” (the source of each purchase) don’t take refunds off (see the box below to change that). We tested sending refunds with a source of their own and it showed in no report, so GapFill doesn’t add one. For a refund more than 30 days after the order, the browser ID of the purchase may no longer be known. It is then sent as a separate user, and User acquisition takes it off (direct) / (none).

To take refunds off revenue by source

Mark refund as a key event in GA4 Admin. Advertising reports and Explorations with “Source / medium” then attach both the number and the amount of refunds to the source of the original purchase, and take them off that source’s revenue. This applies only to refunds received after you mark it; earlier refunds are not taken off retroactively. You don’t need to change anything in GapFill. Refunds are then counted in key events and the key event rate, so don’t import them into Google Ads as conversions. Traffic acquisition (session source) still shows them under (not set).

Effect on user counts

Each order sent as a separate user adds one user in GA4. Revenue and purchase counts match, but user metrics can look higher than they are. How much depends on the kind of order.

Kind of orderEffect on user counts
Renewal, sent as a separate userLarge. The same person is counted as a new user every time. To avoid it, choose “Send as the same customer”
Other channelsOne more user per order sent, even when the same person buys again
In-app checkout in an AI assistant or social appOne more user per order sent. These buyers never visited your site, so for a first purchase this is close to reality
Store order, visit not capturedSmall. If the tag was blocked and the visit wasn’t tracked either, one more user is the right count. If only the visit was tracked, that person is counted twice

Store orders with a captured visit, and renewals sent as the same customer, do not add users.

Telling GapFill’s purchases apart

Every purchase GapFill sends carries a gapfill marker. Troubleshooting shows how to filter by it in GA4.

Still stuck?

Email us with your store address (example.myshopify.com). We reply within two business days (Japan time). [email protected]