Quick answer: track post-purchase upsell revenue in Shopify orders and your upsell app, not in GA4. When a buyer accepts a one-click offer, Shopify edits the same order and adds a line item — that line is your upsell revenue. GA4 and Meta usually report only the initial purchase value, so treat ad pixels as campaign reporting and never fire a second purchase event with a new transaction ID.
Shopify + app: extra line revenue and offer views. Take rate: accepts ÷ views (not ÷ all orders). Ads pixels: Settings → Customer events, via the Google & YouTube and Facebook & Instagram channels. Shopify's developer docs say Pixel API analytics report the value of the initial purchase. Treat ads as campaign reporting. Treat the admin as money. Profit math: true profit worksheet.
If you cannot say these four numbers by Friday, you are not tracking the upsell. You are watching store AOV and hoping.
| Metric | Definition | Where it lives |
|---|---|---|
| Accepted revenue | Extra amount charged when they tap yes (the discounted price they paid) | Upsell app; Shopify order line |
| Eligible checkouts (views) | Times the one-click page or thank-you offer actually showed | App analytics — not total orders |
| Take rate | Accepts ÷ views | You divide. Do not use all orders as the base. |
| Profit per view | Incremental profit ÷ views | Worksheet, not GA4 |
AOV still matters for the business. It is a blunt instrument for this feature, because skipped wallets never saw the offer. The skip list lives in Shopify's product-offer limitations.
When a buyer accepts a one-click offer, Shopify does not create a new order. It edits the existing one. You will see a new line item, a new payment capture, same order number. That line is your accepted revenue, and it is the only number you should fully trust.
Three easy ways to read it:
One split to keep clean: thank-you-page add-ons that require a second checkout create a second order. That is a different funnel with different fees. Do not mix those with one-click accepts in the same take rate. Two funnels, two rows. Customer tags help you also split first-time vs returning: that guide.
Pixels are sandboxed JavaScript that subscribe to customer events like checkout_completed. You manage them in Settings → Customer events. Shopify's overview: Pixels. Migration away from theme snippets and Additional Scripts: Migrating pixels.
Two flavors: app pixels (installed by sales channels and apps) and custom pixels (you paste sandboxed code). Prefer the official channel when one exists. Custom pixels run in a sandbox, and Google Tag Manager inside a custom pixel inherits those sandbox limits.
The old Additional Scripts box for the thank-you and order status pages went view-only on 28 August 2025 and does not run on upgraded pages. Non-Plus stores hit the final upgrade deadline on 26 August 2026 — four days from this update. If you still have scripts there, they are already dead weight: Shopify's upgrade guide.
The post-purchase page has its own scripts field under Settings → Checkout, which some tracking vendors use to catch the CheckoutAmended event when an upsell is accepted. It only allows <script> tags, runs sandboxed, and cannot touch storefront cookies. If a vendor asks you to paste code there, that is what they are doing. Blocks for the visible page come from the editor: customize the thank-you page.
Install and connect the Google & YouTube channel so GA4 receives Shopify's standard events, including checkout completion mapped to purchase. Shopify recommends that path over leftover theme tags.
Then set your expectation: the purchase value will usually match the first charge. Shopify's product-offer docs state that third-party analytics using the Pixel API — Google Analytics is named — "report only the purchase event and value for the initial purchase."
So use GA4 for what it is good at: sessions, traffic sources, ad campaigns, and the checkout funnel. Use Shopify plus the app for "how much did the upsell add." When the two disagree on the add-on, believe Shopify.
Do not build a custom pixel that fires purchase again with a new transaction ID when the offer is accepted. GA4 will count two purchases for one order, your conversion rate inflates, and your A/B tests start lying to you.
Use the Facebook & Instagram channel. It creates or connects your pixel and passes events, including the Conversions API, from Shopify's customer-event stream. Help hub: Facebook and Instagram by Meta.
Same warning as GA4. Purchase usually equals the checkout total before the upsell. If you add a second Purchase for the increment with a different event ID, Ads Manager inflates. If you send the same event ID, Meta may drop it as a duplicate. Neither gives you a clean "upsell revenue" column.
Practical approach: optimize ads on the initial Shopify purchase, and report upsell profit internally from the admin. If your margins depend on the increment reaching Meta, use a tracking vendor rather than pasting a pixel into a thank-you HTML block.
Search this topic and you will find three families of workaround. Knowing how they work keeps you from mixing them.
purchase to GA4 with the same transaction ID and the added product. GA4 appends the new items to the first purchase instead of counting a second one. Clean when it works, but it depends on the vendor's server-side connection, not on a pasted snippet.-US1, using the post-purchase scripts field and the CheckoutAmended event. You can then filter upsell "orders" in reports. Trade-off: your platform order counts no longer match Shopify's.upsell_purchase through your own tagging server, restore attribution cookies there, and forward the increment to GA4, Google Ads, and Meta. Most accurate, most infrastructure. Guides on this warn that cookies are not always sent from the post-purchase page, so attribution can still leak.If you run a small store, skip all three. Shopify admin plus the app report answers the business question for free. Add vendor tracking when ad-spend decisions genuinely depend on the increment.
One Shopify order should appear as one purchase in each ads platform, with one ID. The upsell is an edit to that order, not a new checkout. Here is the audit.
Open Settings → Customer events and list everything: Google channel, Meta channel, custom pixels, plus any leftover theme gtag. One owner per destination.
Use a real card for a cheap item, watch GA4 DebugView and Meta Test Events, then refund. Note which value arrived: original total, combined total, or two purchases.
If checkout_completed already sent the original total, stop there. Do not send original + upsell as a second full purchase event.
App dashboard or a saved order view. That is accepted revenue. Convert it to profit with the profit worksheet.
A custom event such as post_purchase_accept with value = add-on only is cleaner than a second purchase. Mark it as a key event only if you are sure the same money is not already inside Purchase.
Eligible views are the times Shopify actually rendered the offer surface. For one-click, that is the post-purchase page. For blocks, that is the Thank you page — and Order status, if you show the offer there too. Count those separately.
Never use "paid orders this week" as the denominator. The skip bucket is big: Apple Pay, Google Pay, and other wallets, Klarna and the installment providers, gift cards, COD and non-card methods, orders with duties or multiple currencies, local delivery and pickup, subscription checkouts, and orders under $0.50. Shopify lists all of these in the product-offers doc. Your payments report in admin shows how large your own skip bucket is in one glance.
If the app shows impressions, use that. If it only shows accepts, you cannot compute a take rate — export accepts, then sample 50 random paid orders and mark each one shown / skipped / not configured. Ugly, but honest, until the app logs views.
Thank-you blocks do show to wallet buyers. If you only track one-click accepts, mobile will look "broken" when it is really Apple Pay skipping the page. Split the two funnels in the sheet. When each surface appears: post-purchase timing.
Staff and test orders: tag them and exclude them. Ten founder checkouts with a 100% accept rate will make a bad offer look like a miracle for a day.
Oxify Cart Drawer & Upsell runs one-click post-purchase offers and thank-you blocks and reports accepts alongside your Shopify orders, from $9.99/mo. It is not an analytics suite — GA4 and Meta still connect through Settings → Customer events. Keep the app report for the add-on and the pixels for campaigns.
Our app. One-click post-purchase, thank-you blocks, and a cart drawer with gifts, BOGO, and volume discounts. From $9.99/mo, 14-day trial. 5.0 from 36 reviews (small sample). Built for Shopify, so offers ride Checkout Extensibility, not scripts.
App list: best post-purchase upsell apps.
Treat the add-on as a line item on the same order. Use your upsell app's accepted-revenue report plus Shopify orders. Take rate is accepts divided by eligible offer views, not by all orders, because wallet and COD checkouts never see the offer.
Usually not. Shopify's developer docs say analytics services on the Pixel API, including Google Analytics, report the purchase event and value for the initial purchase. Vendors can append the upsell with the same transaction ID, but out of the box GA4 sees the first charge.
Settings → Customer events. Use the Google & YouTube channel for GA4 and the Facebook & Instagram channel for Meta. The thank-you and order status Additional Scripts box has been view-only since 28 August 2025, and non-Plus stores are auto-upgraded by 26 August 2026.
One purchase event per Shopify order ID. If checkout_completed already fired with the original total, do not send another full-order purchase when the upsell is accepted. Report the increment from Shopify and the app, or send it as a separate custom event with the add-on value only.
By default, no — the pixel typically receives the checkout total before the upsell. A second Purchase with a new event ID inflates ROAS, and one with the same ID may be deduplicated away. If the increment must reach Meta, use a server-side tracking vendor.
Eligible views, accepts, accepted revenue, and profit per view. Store-wide AOV mixes original lines with add-ons and hides skipped traffic, so it is a poor scoreboard for this feature.
No. The thank-you and order status box is view-only and does not run on upgraded pages. Migrate to web pixels under Settings → Customer events. The separate post-purchase page scripts field is sandboxed and only used by some tracking vendors for the CheckoutAmended event.
If GA4 and Shopify disagree on the add-on, Shopify wins. Fix pixels so Purchase happens once per order, then let Oxify's accept report feed the sheet.