Blog

Enriching Google Ads Conversion Values with Real-Time Customer Context

By
Peter Perlepes
&
March 1, 2026
Share this post

This guide shows you how to enrich Google Ads conversion events with real-time customer context from Snowplow. It enables two capabilities in Google Ads: segmented ROAS reporting, and value-based bidding driven by Snowplow Signals attributes such as predicted LTV, churn risk, or engagement. You fetch user context at conversion time via the Signals API and pass it to Google Ads using gtag (or Google Tag Manager).

Prerequisites

  • A Google Ads account with conversion tracking already in place and value-based bidding .
  • Access to your site's Google tag (gtag.js) or Google Tag Manager setup.
  • Snowplow Signals with computed attributes configured for your users. Those could be batch computed like "LTV band" or real-time stream computed like "viewed product categories unique list".

How Custom Conversion Variables Work

Custom conversion variables let you attach business-specific dimensions to conversion events. Think of them as metadata you send alongside each conversion — not just "a purchase happened," but "a purchase happened, and this customer is in the premium LTV band with a particular interest in these product categories."

These variables appear as segmentation dimensions in Google Ads, letting you break down campaign performance by any variable you define. They don't directly feed into Google's auction-time bidding — for that, you'll use conversion values. More on that in a later section.

Step 1: Define Signals Attributes for Google Ads

Define the Snowplow Signals attributes you want to pass to Google Ads — either for segmenting reports or for adjusting conversion values.

💡 If you haven't created Signals attributes before, you can follow one of our tutorials for Signals that have step-by-step examples on how to do so.

To define a Signals attribute, you would start by creating a structure called Attribute Group which holds attributes coming from a specific source type. You can create as many Attribute Groups as you want, and a common pattern is that each Attribute Group shares a common meaning and source type. For example a "web_ecom_product_features" Attribute Group will include attributes related to an ecommerce website and specifically attributes that have to do with product behaviour. For the following showcase we will use an example last_product_category attribute that could fit an attribute group like that.

To connect attributes to an identifier, you would use an attribute key, which for our example use case would be a Snowplow identifier, domain_userid. domain_userid is identifying a unique user in a specific browser.

The example attributes we will pass on to Google Ads are the following:

Attribute Name Source Attribute Group Type Description Example Values
ltv_band External Batch The band of lifetime value calculated for domain_userid, connected from a warehouse table external to Signals. "premium", "standard", "low"
last_product_category Stream A real-time stream calculated value of the product category viewed. "trainers", "boots", "hoodies"

These attributes even coming from different attribute groups can be connected through a Signals Service so that they can be fetched together in the same API call.

Step 2: Pass Signals Attributes at Conversion Time

When a conversion event fires on your site, you fetch the user's current attributes from Signals and include them in the gtag event.

Using the Google tag (gtag.js)

// On your backend using one of our SDKs
await signals.getServiceAttributes({
  attribute_key: "domain_sessionid",
  identifier: "e24d3aaa-160e-40de-a569-1580fb3ad6d7", // Retrieved from site
  name: "ads_attributes",
})

// On the frontend fetch the user's real-time attributes from the endpoint
const response = await fetch('/api/signal/attributes');
const signals = await response.json();

// Fire the conversion event with Signals-enriched custom variables
gtag('event', 'conversion', {
  'send_to': 'AW-XXXXX/YYYYY',
  'value': orderValue,
  'currency': 'USD',
  // Signals custom variables
  'ltv_band': signals.ltv_band,
  'last_product_category': signals.last_product_category,
});

A similar setup can be achieved using Google Tag Manager.

After you add these variables to your conversion tag (next step), they'll appear with an "Activation needed" status back on the custom variables page. Click Activate to start recording data.

For the full walkthrough on conversion tracking setup, see the official Google Ads documentation.


Feature 1: Segmented ROAS Reporting

Once custom variables are flowing, Google Ads reports can be segmented by any Signals attribute — surfacing insights that are invisible in standard reporting.

Without Signals attributes, a campaign report might say:

Campaign A: 200 conversions, $10,000 revenue, 500% ROAS.

With Signals attributes, the same report can be broken down:

Campaign A by LTV Band:

  • premium: 40 conversions, $7,200 revenue, 900% ROAS
  • standard: 120 conversions, $2,400 revenue, 300% ROAS
  • low: 40 conversions, $400 revenue, 100% ROAS

Campaign A's aggregate ROAS is being carried by a small group of premium users; the bulk of conversions barely break even. That distinction is only visible with segmentation.

To access this in Google Ads:

  1. Navigate to any campaign, ad group, or keyword report.
  2. Click the Segment dropdown.
  3. Select Conversions → Custom variable and choose the Signals attribute you want to slice by.

Some questions this makes answerable:

  • Which keywords attract high-LTV users vs. low-LTV users?
  • Do branded campaigns bring in a different engagement profile than generic campaigns?
  • Is a specific ad group driving volume but attracting at-risk segments?
  • How does ROAS differ across user segments for the same spend level?


Feature 2: Smarter Bid Optimization with Conversion Values

Custom conversion variables enrich your reporting. But Google's Smart Bidding algorithms — Target ROAS, Maximize Conversion Value — optimize on conversion values, not custom variable labels. To make bidding smarter, you need to pass better values.

Instead of passing the raw transaction amount as the conversion value, pass a Signals-informed value that better reflects what the conversion is worth to the business.


The Concept

A $50 purchase from a user whose ltv_band is "premium" is worth far more than $50 — that user is predicted to spend significantly more over their lifetime. Conversely, a $50 purchase from an at-risk user with low engagement may never repeat.

Replace (or adjust) the raw transaction value with a Signals-informed value:

// Instead of passing raw order value...
// 'value': orderValue,

// ...pass a Signals-adjusted value
const adjustedValue = computeSignalsAdjustedValue(orderValue, signals);

gtag('event', 'conversion', {
  'send_to': 'AW-XXXXX/YYYYY',
  'value': adjustedValue,
  'currency': 'USD',
});

Example Value Adjustment Logic

The simplest approach is a multiplier based on LTV band:

function computeSignalsAdjustedValue(orderValue, signals) {
  const multipliers = {
    'premium': 3.0,    // High predicted LTV — weight heavily
    'standard': 1.0,   // Baseline
    'low': 0.5,        // Low predicted LTV — discount
  };

  const multiplier = multipliers[signals.ltv_band] || 1.0;
  return orderValue * multiplier;
}

A more sophisticated version might factor in product categories that our Signals-enriched reports show bring the most value:

function computeSignalsAdjustedValue(orderValue, signals) {
  let value = orderValue;

  // LTV band multiplier
  const ltvMultipliers = { 'premium': 3.0, 'standard': 1.0, 'low': 0.5 };
  value *= ltvMultipliers[signals.ltv_band] || 1.0;

  // Last category boost
  const lastCategoryMultiplier = { 'shoes': 1.2, 'trainers': 1.5, 'boots': 1.8 };
  value *= lastCategoryMultiplier[signals.last_product_category] || 1;

  return Math.round(value * 100) / 100;
}

The exact formula depends on your business model. The point is that Signals provides the inputs, and the conversion value becomes a richer signal to Google's bidding algorithm.


How This Affects Bidding

When you use Target ROAS or Maximize Conversion Value as your bidding strategy, Google uses these adjusted values at auction time to decide how aggressively to bid. A conversion worth $150 (premium LTV user) gets a more aggressive bid than one worth $25 (low LTV user), even if the raw order amounts were identical.

Over time, the algorithm learns to bid for users who resemble high-value converters rather than users who are merely likely to convert.

Important: When switching to value-based bidding, start with a conservative Target ROAS — around 20% below your historical average — and let the algorithm learn for 2–4 weeks before adjusting. Avoid making bid or creative changes during this learning period.For more see the official Google Ads documentation.


Putting It All Together - The Full Flow

Here's what the complete conversion flow looks like with Signals enrichment:

  1. User browses your site creating behavioral data points that are fed to Signals.
  2. User does a conversion event.
  3. Your application calls the Signals API to fetch the user's current computed attributes.
  4. The conversion tag fires with both custom variables (for reporting) and an adjusted conversion value (for bidding).
  5. In Google Ads, reports are segmented by Signals attributes, revealing which campaigns attract high-value users.
  6. Smart Bidding uses the Signals adjusted values to optimize towards users it predicts are most valuable.


Next steps

Subscribe to our newsletter

Get the latest content to your inbox monthly.

Get Started

See how Snowplow gives companies the real-time user data foundation and context layer to make better business decisions while powering the AI initiatives that will define the next era of media.