TL;DR
The first charge of a subscription goes through your checkout like any order, and your pixels see it. Every renewal after that is created in the background by the subscription system: Recharge, Bold, Loop, or Shopify's native subscription contracts. No page loads, no cookies, no pixel fires. If your tracking is browser-only, renewal revenue is invisible to GA4 and your ad platforms, and your reports drift further from Shopify's with every billing cycle. Server-side tracking closes the gap, with one structural caveat about attribution and one strategic question about whether ad platforms should see renewals at all.
Key Takeaways
- Renewal orders never touch your storefront. They are created via the Admin API, so browser pixels, including Shopify's own Web Pixels API events, do not fire for them [1].
- Renewals carry no tracking cookies or click IDs. There is no
_ga,_fbp, orgclidon an order the buyer's browser never saw. - In October 2025 Shopify quietly renamed the
source_namevalue on native subscription renewals, breaking setups that filtered on the old string [2]. Tracking that classifies orders by how they were created, rather than by app-specific labels, kept working. - WeltPixel Conversion Tracking Plus sends renewal orders server-side to GA4, Meta, TikTok, Google Ads, and Reddit, with a stable server-generated identity when no browser data exists.
- Attribution on renewals is structurally limited: GA4 shows (direct)/(none) for source and (not set) for session dimensions because no session existed. Every tracking vendor has this constraint.
- A per-channel toggle lets you keep renewals in GA4 for revenue reconciliation while excluding them from Meta or TikTok so ad optimization stays focused on acquisition.
Why are subscription renewals invisible to browser tracking?
Because browser tracking requires a browser, and a renewal is a server-to-server transaction.
When a customer first subscribes, they walk through your checkout. The Web Pixels API fires checkout_completed, cookies and click IDs are present, and the purchase tracks like any other. From the second charge onward, the subscription engine wakes up on the billing date, charges the stored payment method, and creates the order through the Admin API [1]. The customer might be asleep when it happens. There is no page, no pixel sandbox, no event.
This is the same mechanical category as draft orders and POS sales, which we covered in admin and POS order tracking. Subscriptions just make the problem compounding: a successful subscription business generates a growing share of its revenue through exactly the channel browser pixels cannot see. A store doing 30% of revenue on subscriptions with browser-only tracking is permanently under-reporting by roughly that share, and the gap widens as the subscriber base grows.
The two order types differ on every dimension tracking cares about:
| First subscription order | Renewal order | |
|---|---|---|
| Created via | Storefront checkout | Admin API, on the billing date [1] |
| Browser pixel fires | Yes, checkout_completed
|
Never |
| Cookies and click IDs | Present (_ga, _fbp, gclid) |
None exist |
| GA4 attribution | Full source/medium | (direct)/(none) by design |
| Reaches platforms via | Browser + server | Server-side only |
Verify the gap on your own store in ten minutes:
- In Shopify, go to Analytics → Reports and note total sales for last month, then filter orders by your subscription app to estimate renewal share.
- In GA4, go to Reports → Monetization → Ecommerce purchases and note purchase revenue for the same date range.
- If GA4 sits below Shopify by roughly your renewal share, browser-only tracking is the cause. Spot-check by opening a known renewal order in Shopify and searching its order number as
transaction_idin Explore → Free form: with browser-only tracking, it will not be there.
The October 2025 rename that broke subscription filters
Shopify changed the source_name value that native subscription renewals carry: orders that used to arrive labeled subscription_contract started arriving as subscription_contract_checkout_one [2]. The value is an unversioned, undocumented string, so there was no changelog entry and no migration window. Shopify staff confirmed the change was intentional and recommended identifying subscription orders by the selling plan on line items rather than by source_name at all [2].
Any custom webhook integration, sGTM transformation, or reporting filter that matched the literal old string silently stopped recognizing renewals on that date. Silent is the operative word: events did not error, they just got classified as something else.
There is a design lesson in that incident. Order classification that depends on app-specific labels inherits the churn of those labels. Recharge's legacy checkout, Bold, Loop, and native contracts each label orders their own way, and as October 2025 showed, the labels move. WeltPixel Conversion Tracking classifies orders by how they were created, storefront checkout or not, without matching specific subscription-app names. The rename changed nothing about how renewals were handled. If you run a custom setup instead of an app, take the same advice Shopify gives: key off the selling plan, not the source string [2].
How does server-side tracking handle renewals?
Through the order webhook, which fires for every order regardless of origin. On WeltPixel Conversion Tracking Plus, renewal orders go out server-side to all five channels: GA4, Meta, TikTok, Google Ads, and Reddit. The plan distinction matters here: admin-created and API-created orders, which include subscription renewals, are a Plus-tier capability. On the free Explorer plan these orders are deliberately not sent, so a subscription-heavy store should be on Plus for the tracking to be complete.
Two pieces of engineering make a renewal event well-formed even though no browser data exists:
Identity. With no cookies to read, the event carries a stable server-generated identity derived from the customer and order, so GA4 accepts the purchase, revenue lands on the right customer, and repeat renewals stay consistent over time.
Deduplication. Renewals get a deterministic event ID derived from the order, the same discipline applied to every server-side purchase, so if any other integration reports the same order, platforms can collapse the duplicates. The full mechanics are in event deduplication on Shopify.
Timing is webhook-speed: the renewal event reaches your platforms within seconds of the order existing, the same day your finance reports see it.
What are the attribution limits?
Real ones, and worth stating plainly: the conversion counts, the revenue registers, the traffic source does not.
GA4 attributes sessions, and a renewal has no session. Source/medium reports show (direct)/(none); session-scoped dimensions show (not set). That is not a bug in any tracking tool, it is what attribution means when no visit occurred. We mapped which (not set) categories are structural versus fixable in GA4 (not set) on Shopify, and subscription renewals sit firmly in the structural column.
What this means in practice: judge your acquisition channels on first purchases, and judge your subscription program on renewal revenue and retention. Asking "which campaign drove this renewal" is asking the data for something it cannot contain. The campaign drove the original subscription; the renewal is a product of retention, not traffic.
Set expectations accordingly when you reconcile: GA4 total purchase revenue should now match Shopify closely, while GA4 attributed revenue still reflects storefront behavior only. Both numbers are correct. They answer different questions.
Should renewals go to Meta and TikTok at all?
Usually not, and this is a strategy question rather than a technical one.
Meta and TikTok optimize delivery toward whatever conversions you feed them. A renewal is a conversion that no ad influenced: it would have happened with your ad account paused. Feed renewals into the optimization signal and the algorithm learns from purchases that have nothing to do with its targeting, while your reported ROAS inflates with revenue ads did not earn. For a subscription business doing meaningful renewal volume, that distortion compounds monthly.
GA4 is the opposite case. Your analytics property should reflect total business revenue, renewals included, or every reconciliation against Shopify and your P&L runs a permanent deficit.
The clean setup is therefore split: renewals on for GA4, off for ad platforms. WeltPixel Conversion Tracking exposes this as a per-channel setting, so each pixel decides independently whether admin and API orders are included. Merchants running monthly subscription products typically send renewals to GA4 for reconciliation and withhold them from Meta so prospecting campaigns optimize on genuine acquisition. If you also send offline conversions to Google Ads, apply the same logic there.
There is no single right answer for every store: a brand using Meta retargeting to reduce churn might deliberately include renewals for one pixel. The point is that it should be a decision, not a default you never saw.
FAQ
Why don't my Recharge renewal orders show up in GA4?
Renewal orders are created through the Admin API with no browser session, so no browser pixel can fire for them. They only reach GA4 through server-side tracking from the order webhook. If your GA4 setup is browser-only, renewals will never appear, no matter which subscription app generates them.
Do subscription renewals work with browser pixel tracking on any app?
No. This is a Shopify platform constraint, not a vendor limitation: the Web Pixels API fires on storefront and checkout surfaces, and renewals never touch either [1]. Any tool claiming to track renewals is doing it server-side.
Can I track Recharge renewals separately from first-time subscription purchases?
The first purchase happens through checkout with full attribution, so it tracks like a normal order. Renewals arrive server-side without a session. In GA4 you can approximate the split by comparing attributed purchases (first orders) with (direct)/(none) purchase revenue, or use Shopify's own reports keyed on selling plans for the precise version [2].
Should subscription renewal revenue be sent to Meta?
For most stores, no. Renewals happen regardless of ads, so including them inflates ROAS and trains delivery on non-ad-driven conversions. Keep renewals in GA4 for financial completeness and exclude them per-channel from ad platforms unless you have a specific retargeting strategy that needs them.
Track the revenue your pixels never see
WeltPixel Conversion Tracking Plus sends subscription renewals, draft orders, and POS sales server-side to GA4, Meta, TikTok, Google Ads, and Reddit, with deterministic deduplication and honest attribution behavior. The per-channel admin-order toggle keeps renewals in your analytics and out of your ad optimization, which is where most subscription stores want them.
Install WeltPixel Conversion Tracking on the Shopify App Store