A $29/mo starter signup and a $500/mo team plan fire the exact same event on your thank-you page. Same tag, same value: nothing. If that's what you're feeding Google Ads, you're paying Smart Bidding to hunt down people who are good at filling out forms. The algorithm does exactly what it's told. Most SaaS accounts tell it the wrong thing.
| Bidding on trial signups | Bidding on trial-to-paid |
|---|---|
| $29 and $500 plans fire one event | The first real charge, at its value |
| No value, so no Target ROAS | A $500 plan counts about 17x a $29 one |
| Finds people good at filling forms | Signup kept as a secondary signal |
| Best campaign in the UI, worst in revenue | Renewals weight campaigns by durability |
Why is optimizing ads for the free-trial signup a mistake?
Because a trial signup is worth nothing until it converts to paid, and the signups that convert look different from the ones that don't. Set the trial signup as your primary conversion and Google and Meta build patterns around everyone who signed up: tire-kickers, students, competitors doing research. The platforms are very good at finding more of whatever you count. Count form-fillers, get form-fillers.
There's a second problem: value. Browser tags can't see your pricing tiers, so the $29 plan and the $500 plan fire identical events. Without values, Target ROAS bidding is off the table, and your best-performing campaign in the interface may be your worst in revenue.
None of this means you ignore the signup. It means you rank it correctly. Which brings us to the ladder.
| Layer | What sits there |
|---|---|
| Inputs | Trial signup (browser tag), Activation milestone, invoice.paid billing webhook, Renewals and expansion |
| track.yourapp.com | Joins each money event to the gclid, _fbp and _fbc stored on the user record |
| Destinations | Google Ads offline import, Enhanced Conversions for Leads, Meta CAPI, with real values, GA4 |
What events should a subscription business actually track?
A ladder, where each rung is worth more and comes from a more reliable source:
- Trial signup (browser). Fires from the web container on your confirmation page. Cheap, fast, high-volume. Keep it as a secondary conversion for early signal, not the thing you bid on.
- Activation milestone (optional). The in-product moment that predicts conversion: connected a data source, invited a teammate. If your trial-to-paid lag is long, this is your best mid-funnel proxy.
- Trial-to-paid (server, from billing). The first real money event. It never comes from a tag, because there is no page; it comes from your billing webhook — in Stripe terms,
invoice.paidorcheckout.session.completedon the first charge. Send it to Google Ads as an offline conversion and to Meta via the Conversions API, with the actual first-payment value. - Renewals and expansion (server). Second and third payments, upgrades, seat expansion. These separate a subscriber who churns in month one from one who compounds for years.
- Churn (server). A
customer.subscription.deletedevent isn't something you send to ad platforms, but you need it in your own reporting to compute real LTV per channel.
The pattern: the browser handles the cheap, early, anonymous stuff. Everything involving money comes from the server, because only your billing system knows what actually got paid.
How do I send trial-to-paid conversions back to Google and Meta?
You connect your billing webhooks to the ad platforms' server-side endpoints, attaching the identifiers each platform needs to match the payment back to the original ad click.
- Capture identifiers at signup. Grab the
gclid(Google click ID) from the URL, the_fbpand_fbccookies for Meta, plus the user's email. Write them to your database on the user record, not just in a cookie. This is where most SaaS setups fail. - Listen for the money event. When the first real invoice is paid, your billing provider's webhook hits your server (or a server-side GTM endpoint) with the customer, plan, and amount.
- Send to Google Ads. Upload the stored
gclidwith conversion time and value as an offline conversion import, or use Enhanced Conversions for Leads, which matches on the hashed email instead. Automate a daily upload so you stay inside Google's import window. - Send to Meta via the Conversions API. Fire a
PurchaseorSubscribeevent server-side with value, currency, hashed email, and the storedfbp/fbc. Those identifiers drive Event Match Quality on Meta's 0–10 scale, which decides whether the conversion attributes at all. - Send values, always. That's what lets you move to value-based bidding, where a $500/mo customer finally counts as roughly 17x a $29/mo one instead of 1x.
- Day 0: ad click — gclid lands in the URL, on an iPhone
- Day 7: ITP clears it — Safari caps JavaScript cookies at 7 days
- Day 30: card charged — MRR up, ad platform records nothing
- gclid on the user row — Stored in your database at signup
- Billing webhook fires — invoice.paid uploaded with real value
Why do click IDs die before the trial ends?
Because your trial is longer than the lifespan of the cookies holding them. This is the structural problem that makes subscription tracking harder than ecommerce, and it's the one almost every SaaS setup I audit gets wrong.
Walk the timeline. Someone clicks your Google ad on their iPhone. Safari's Intelligent Tracking Prevention caps cookies set by JavaScript at 7 days, sometimes 24 hours. Your trial is 14 or 30 days. By the time the card gets charged, the cookie holding the click ID was deleted weeks ago. If that cookie was your only copy of the gclid or _fbc, the conversion is an orphan: the payment happened, MRR went up, the ad platform recorded nothing. The campaign that produced that customer looks like a dud, so budget quietly flows toward fast, cheap signups instead. Ad blockers make it worse; a meaningful slice of a technical SaaS audience blocks browser tags outright.
The fix is to stop treating the browser as the system of record. The click ID should live in your database, attached to the user, from the moment of signup. Cookies expire; a database row doesn't.
Why does first-party server-side tracking fix this?
Plain-language version first. Server-side tracking means your tracking data flows through a server you control, on your own subdomain (something like track.yourapp.com), instead of every browser talking directly to Google's and Meta's domains. First-party means the cookies and requests belong to your domain, which browsers treat far more generously.
For subscription businesses, that changes four things:
- Click IDs survive the trial. A first-party server sets cookies via HTTP headers on your own domain, sidestepping ITP's 7-day JavaScript cap, and stores
gclid,_fbp, and_fbcagainst the user at first touch. Your 30-day trial no longer races a 7-day cookie. - The money events flow naturally. Billing webhooks already talk server-to-server. A server-side GTM container is the natural junction: Stripe-class webhook in, enriched conversions out to Google Ads, Meta CAPI, and GA4 from one place, with consistent values and proper deduplication.
- You recover blocked signal. Server events don't care about ad blockers, and SaaS audiences block aggressively.
- Match quality goes up, CPAs come down. Server events carry hashed emails and stored click IDs, which raises Meta Event Match Quality and Google's match rates. Platforms optimizing on complete payer data find more payers. That's the whole game.
What if my conversion lag is too long for the platforms?
Feed the algorithm a faster proxy, and keep the slow truth for your own reporting. Smart Bidding learns from conversions inside its click windows, and Meta's standard attribution runs on 7-day click. If your median signup-to-paid lag is 30+ days, many real conversions land too late to teach the bidding system much.
Three proxy strategies, in order of preference:
- Bid on the activation milestone. Find the in-product action whose completers convert to paid at several times the base rate, send it server-side within the first few days, and optimize toward it. A little accuracy traded for a lot of speed.
- Send a predicted value at signup. If signups from a given plan or segment convert at knowable rates, send the trial signup with an expected value (trial-to-paid rate times first-year revenue) instead of zero, and true it up against billing data.
- Use paid-tier starts where you have them. Card-required trials and direct-to-paid plans convert fast enough to use as-is.
Whatever proxy you bid on, keep sending the real trial-to-paid and renewal events too. They're the only way your channel-level LTV reporting reflects reality.
How do renewals and LTV fit into ad optimization?
Renewals turn your conversion data from a snapshot into a movie. The first payment tells the platform who pays; the third tells it who stays. Send renewal and expansion events server-side with values for the first few billing cycles, and value-based bidding starts weighting campaigns by revenue durability, not just first-touch revenue. In practice I cap ad-platform LTV feedback at 90–180 days, because attribution windows expire and stale uploads stop matching. Long-horizon LTV belongs in your warehouse, where nothing expires.
Frequently asked questions
Should I optimize Google Ads for free trial signups or paid conversions?
Paid conversions, as soon as you have enough volume for Smart Bidding to learn from. Keep the trial signup as a secondary conversion for early signal, and if paid volume is thin, bid on an activation milestone that predicts payment.
How do I track trial-to-paid conversions from Stripe in Google Ads?
Capture the gclid and email at signup and store them on the customer record. When the first invoice is paid, Stripe's webhook triggers a server-side upload: offline conversion import with the stored click ID, or Enhanced Conversions for Leads using the hashed email.
Why don't my subscription conversions show up in Google Ads?
Usually the click ID was never captured at signup, or it lived only in a browser cookie that expired before the trial ended. Safari's ITP caps JavaScript-set cookies at 7 days, shorter than most trials, so the conversion can't be tied back to the click.
What conversion value should I send for a free trial signup?
Either zero (and optimize toward the paid event) or a predicted value: your segment's trial-to-paid rate multiplied by expected first-year revenue. Never send the subscription price itself at signup, because most trials never pay it.
Do I need server-side tracking for a SaaS business?
More than almost any other vertical, yes. Your money event happens weeks after the click, on a webhook rather than a page, and your audience blocks browser tags heavily. Browser-only tracking structurally cannot capture trial-to-paid conversions reliably.
Should I send churn or refund events to ad platforms?
Send refunds where supported (Google Ads offers conversion adjustments). Churn stays in your own reporting for channel-level LTV; don't feed it to bidding algorithms.
- saas
- subscriptions
- ltv
- offline conversions

