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 order | User in GA4 | Source / medium |
|---|---|---|
| Store order, visit captured | Same person as the visit | The source of the original visit. GA4 works it out itself |
| Store order, visit not captured | A separate user | The source of the last visit Shopify recorded. If there is none, (direct) / (none) |
| In-app checkout in an AI assistant or social app | A separate user | The name of that assistant or app / ai-assistant or referral |
| Other channels | A separate user | The source / medium you entered in Settings |
| Renewal, sent as the same customer | Same person as the first order | The source of the first order |
| Renewal, sent as a separate user | A separate user | shopify_subscription / renewal |
| Refund or cancellation | Same person as the purchase | Depends 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
- Hour 0OrderGA4 counts the revenue on this day
- Waiting for late hits from your GA4 tag26 hours
- About 26 hours after the orderGapFill sends itOnly orders still missing from GA4
- Source shows as (direct) / (none)24 to 48 hours after sending
- 2 to 3 days after the orderSource is finalFrom here the right source shows
- 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 GA4 | Main reports | Purchases sent by GapFill |
|---|---|---|
| Source of the purchase (attribution) | Advertising reports, and Explorations with “Source / medium” | As in the table above |
| First user source | Acquisition → User acquisition | Orders sent as a separate user get the source in the table above |
| Session source | Acquisition → Traffic acquisition | Only 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).
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 order | Effect on user counts |
|---|---|
| Renewal, sent as a separate user | Large. The same person is counted as a new user every time. To avoid it, choose “Send as the same customer” |
| Other channels | One more user per order sent, even when the same person buys again |
| In-app checkout in an AI assistant or social app | One 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 captured | Small. 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.
Email us with your store address (example.myshopify.com). We reply within two business days (Japan time). [email protected]