Tracking Subscription Revenue from Google Ads Campaign Users
Hey everyone,
I’m running into some issues with tracking revenue from users acquired through a specific Google Ads campaign, and I’m hoping someone here can help me figure out what’s going wrong.
I have an app that generates revenue through weekly subscriptions, which come with a 3-day free trial. I’m trying to determine how much money a user who came through a particular Google Ads campaign has generated for me, including all their subscription renewals.
In my analytics platform, I’m attempting to filter revenue by users whose sessions match my campaign parameters. However, the data doesn’t add up. While the “purchase revenue” is correct, the revenue attributed to these users is almost zero on most days, which doesn’t make sense given the number of subscriptions.
What could I be doing wrong? Is there a better way to accurately track the revenue generated by users from a specific Google Ads campaign, including their renewals?
Any insights or suggestions would be greatly appreciated!
Thanks in advance!
https://imgur.com/EP7M7Xh
The short answer is:
Your issue is almost certainly due to how your analytics platform attributes subscription renewals, which often defaults to direct or organic traffic, or simply fails to link the recurring revenue back to the original acquisition campaign because the initial purchase event (the trial sign-up) is the only one tied to the campaign parameters.
To accurately track lifetime revenue including all renewals, you need a system that persistently links the user’s ID to the Google Ads campaign ID or parameters upon initial acquisition and then attributes every subsequent subscription renewal event (which should be tracked as a Standard Event like purchase or in_app_purchase
) to that same original campaign ID.
A robust, scalable, and cost-effective solution involves using a dedicated Mobile Measurement Partner (MMP) like AppsFlyer or an integrated stack like the Firebase SDK and Google Analytics for Firebase, combined with Google Tag Manager, and a server-side tagging solution like Stape or Google Cloud Platform to send enhanced conversion data back to Google Ads, effectively closing the attribution loop.
The long answer is:
The reason your “purchase revenue” is correct but the attributed revenue is near zero is a classic attribution problem, specifically with deferred or recurring revenue.
When a user converts on your Google Ads campaign, the analytics platform correctly attributes the initial event – the 3-day free trial sign-up or the first subscription purchase – to the campaign parameters like gclid
.
This is why the initial purchase revenue may look correct.
However, when the subscription renews a week later, the user is likely returning to the app without clicking on a new Google Ad.
Your analytics platform’s standard attribution window or logic sees this renewal event as a “direct” or “organic” conversion because it can no longer find the original Google Ads campaign parameters in the current session.
The core solution requires creating a persistent connection between the user and the original campaign.
This is where an integrated architecture shines.
Using the Firebase SDK ensures you have a unique user ID and can track all their in-app events, including renewal events, within Google Analytics for Firebase (GA4).
GA4 offers better cross-platform and user-centric tracking, making it easier to see a user’s entire journey.
Integrating a Mobile Measurement Partner like AppsFlyer is an excellent choice because MMPs are specifically designed to handle this complexity by persistently linking the user’s device ID and/or user ID to the original acquisition source (the specific Google Ads campaign) and accurately attributing all subsequent revenue, including renewals, back to that initial source.
This is their primary function, and they are generally more reliable for subscription revenue tracking than raw analytics platforms alone.
You can then use Google Tag Manager to manage and transform this renewal data.
For example, when a renewal happens, your app/server sends a signal.
GTM can be configured to take this renewal event, look up the persistently stored original Google Ads gclid
or campaign ID (which you saved on first install), and send this enhanced conversion data back to Google Ads via the Google Ads API.
Stape or Google Cloud Platform with server-side GTM is an excellent and cheap solution for this because it allows you to bypass browser and privacy restrictions, ensuring reliable, persistent tracking and giving you full control over the data payload sent back to Google Ads.
This complete loop means Google Ads sees the lifetime value of the user, including renewals, which dramatically improves campaign optimization and bidding strategies.