Most SaaS Google Ads accounts I audit have broken conversion tracking. Not subtly broken — completely broken. Same event firing twice. Trial signups and demo requests counted as the same conversion. Form submissions tracked, but only on the desktop variant of the landing page. The kind of broken where the bidder has been steering toward the wrong target for six months and nobody noticed because the chart was going up.
This post is the no-Tag-Manager, no-snake-oil version of how to set conversion tracking up correctly for a SaaS account. Four events, about an hour of work, and a verification checklist at the end.
The four events that matter
Forget every other event you might be tempted to track for a moment. For Google Ads bid strategies to work on a SaaS account, you need these four — no more, no less:
- Trial signup — someone created an account or started a free trial. High volume, low intent. Useful as a secondary conversion to give the algorithm volume signal. Never the primary bid target unless trial-to-paid is >15%.
- Demo request — someone asked to talk to sales. Lower volume, much higher intent. Usually closes 4-6× better than a trial signup. This is your primary conversion for mid-market and above.
- Paid conversion — they bought. Lowest volume, highest fidelity. Critical to track because it's what lets you set a real conversion value (more on that below) and feed Maximize Conversion Value bidding.
- Qualified lead (optional) — sales has reviewed and marked the deal as qualified. Adds 24-72 hours of lag, but the highest-quality bid signal you can give Google. Use this if your sales cycle >30 days and trial signups are too noisy.
Volume of trial signups will be 10-50× the volume of demo requests. That's why you treat them differently in bidding: more volume = more algorithm noise = worse decisions. Trial signups inform the bidder; demo requests direct it.
Wiring it up without GTM
The Google Ads conversion tag (gtag.js) is a single script tag plus one function call per conversion event. If you're using Next.js or React Router, load the base tag in your root layout once:
<Script
src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXXXX"
strategy="afterInteractive"
/>
<Script id="gads-init" strategy="afterInteractive">
{`window.dataLayer = window.dataLayer || [];
function gtag(){ dataLayer.push(arguments); }
gtag('js', new Date());
gtag('config', 'AW-XXXXXXXXX');`}
</Script>Then fire a conversion event from whatever code path corresponds to the actual event — a server-confirmed signup, a successful demo request submission, a Stripe webhook handler. For a trial signup:
gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXX/AbC-DeFgHiJ_KlMnOpQ', // unique per event
value: 0, // trial = no immediate revenue
currency: 'USD',
transaction_id: signupId, // dedupe key
});For a paid conversion, pass the actual MRR or ARR value (whatever you want the algorithm to optimise toward — usually first-year ARR or annualised MRR):
gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXX/XyZ-AbCdEfGhIjKlMnO',
value: subscription.annualValue, // not monthly
currency: 'USD',
transaction_id: subscription.id,
});The transaction_id field is your dedupe key. Without it, if your code paths can fire the conversion twice (browser back button, page refresh, double submit), Google will count it twice. With it, Google's deduplication kicks in.
Enhanced conversions: turn this on
Once the base events are firing, enable enhanced conversions in the Google Ads UI (Goals → Settings → Customer data → Turn on enhanced conversions). Then pass hashed email/phone on every conversion:
gtag('event', 'conversion', {
send_to: 'AW-XXXXXXXXX/XyZ-AbCdEfGhIjKlMnO',
value: subscription.annualValue,
currency: 'USD',
transaction_id: subscription.id,
user_data: {
email_address: subscription.email, // gtag.js hashes client-side
phone_number: subscription.phone,
},
});gtag.js SHA-256 hashes these client-side before transmission, so you aren't actually sending plaintext PII. Match rates typically improve by 5-20%, which directly improves bid strategy quality on your existing spend.
Server-side: when to bother
Browser-side gtag is fine for 90% of SaaS conversion events. The cases where you want server-side measurement:
- Paid conversions confirmed via a webhook (Stripe, Paddle, Chargebee). The user's browser closed long before the webhook fired, so client-side tracking is unreliable.
- Long sales cycles where the deal closes offline. Use Google Ads' Offline Conversion Imports — upload a CSV mapping your GCLID (captured at signup) to the close-date and value.
- iOS / Safari ITP-affected attribution. Server-side measurement bypasses the cookie-storage limitations that have eaten client-side attribution for years.
For everything else, browser-side is good enough. Don't over-engineer until you have measurable attribution loss.
The five-minute verification checklist
Once everything is wired, verify before you trust the data. Spending on broken tracking is more expensive than spending nothing.
- Tag Assistant. Open Tag Assistant in Chrome (it's free), load the page that triggers each conversion, perform the action. Confirm each event fires exactly once and the value is what you expect.
- Conversion diagnostics. Google Ads → Goals → Diagnostics. Anything red gets fixed first. Common red flag: "Conversion tag not detected" — means your gtag isn't loading on the conversion page.
- Match rate. Enhanced conversions → Diagnostics → Match rate. Anything under 70% means you're not passing the email field cleanly. Investigate.
- Cross-check with backend. Pull yesterday's signup count from your DB. Compare to Google Ads' reported "All conversions" for that event. If they disagree by >15%, you have a problem.
- Run our AI search-term reviewer on the last 30 days of search terms once you trust the data. The combination of clean tracking + clean search terms is where margin lives.
When this pays off
Clean conversion tracking is the unsexy prerequisite for every other Google Ads optimisation. Without it, every bid strategy decision is guesswork — see our HR-tech SaaS case study for what happens when the four-events model is implemented after years of single-event tracking. The CAC delta isn't from spending more or smarter, it's from the algorithm finally seeing the right signal.
If you'd like a second pair of eyes on your current conversion setup, an audit includes a line-by-line tag verification as the first step.