The promise
Google Enhanced Conversions (EC) is a mechanism that sends hashed user data (email, phone, address) to Google Ads at the moment of conversion. Google uses this data to connect ad clicks to conversions, even when cookies are blocked or expired.
The official promise: up to 30% more conversions recovered. On a site with 1,000 conversions a month, that's 300 conversions feeding Smart Bidding instead of disappearing. The impact on bidding quality is direct.
The problem: when the implementation is botched, nothing visibly breaks. Standard conversions keep being tracked. EC fails silently. And the promised 30% is never recovered.
The 6 silent errors
Here are the implementation errors we come across most often. None of them throws an error in the console. None triggers an alert in Google Ads.
| Error | Visible symptom | Real impact | Detection difficulty |
|---|---|---|---|
| EC tag fires before the conversion | None (the tag runs) | User data sent with no associated conversion | Very hard |
| CSS selector broken after a redesign | None (the tag runs) | Email/phone not captured, empty hash sent | Very hard |
| Email field not filled when the tag fires | None (the tag runs) | Hash of an empty string, unusable | Hard |
| Email format not normalized | None (the tag runs) | Hash differs from Google's hash, no match | Hard |
| EC enabled without Enhanced Conversions turned on in Google Ads | None (the tag runs) | Data sent but ignored by Google | Easy (manual check) |
| Insufficient consent to send PII | None (the tag runs) | Potential GDPR breach, data rejected | Moderate |
What they have in common: the tag always runs. In Google Tag Assistant, it shows up green. In GTM, the trigger fires. Everything seems to work. But the data sent is empty, badly formatted or sent at the wrong time.
Error 1: timing
The most widespread and most expensive error. The Enhanced Conversions tag must fire at the same moment as the Google Ads conversion tag, on the purchase event.
What often happens: the EC tag is set on the confirmation page's "Page View" trigger, while the conversion tag is on the dataLayer purchase event. The EC tag fires 200-500 ms before the conversion. Google receives the user data but can't link it to the conversion that arrives just after.
Result: the Enhanced Conversions report in Google Ads shows a match rate close to zero, but that report is buried in the conversion settings and almost nobody looks at it.
Error 2: the CSS selector
To capture the user's email, the CSS selector implementation (the most common one) uses a selector such as #billing_email or .checkout-email input. When the front-end team changes the checkout (new design, framework migration, plugin change), the selector stops matching.
The tag keeps running. It sends a hash of an empty string ("") to Google. That hash is technically valid but matches no user. The match rate drops to zero without triggering any error.
On a WooCommerce site that redesigns its checkout once or twice a year, that means weeks of inactive EC after every deployment.
Error 3: email format
Google requires the email to be normalized before hashing: lowercase, no spaces, valid format. Implementations that capture the raw email field from the form sometimes send emails with leading/trailing spaces, capital letters or stray characters (a tab after a copy-paste).
The resulting hash doesn't match the one Google has on file. No match, no conversion recovered. The impact is hard to quantify but can represent 5 to 15% of EC sent.
The financial impact
For a site with a €50,000 monthly Google Ads budget and 800 conversions a month:
- EC implemented correctly: +240 conversions recovered a month (30%)
- EC implemented badly (timing or selector): +0 to +50 conversions (0-6%)
The 190 to 240 missing conversions aren't "lost" in themselves: the purchases happened. But they're invisible to Smart Bidding. The algorithm optimizes on 800 conversions instead of 1,040. Its ability to find the right profiles is reduced. CPA gradually rises.
Estimated impact on the paid budget: €3,000 to €8,000 a month in excess spend due to Smart Bidding being starved of data.
How to check your implementation
Step 1: the Enhanced Conversions report. In Google Ads, go to Settings > Conversions > Enhanced Conversions. The match rate should be above 60%. Below 40%, the implementation has a problem.
Step 2: Google Tag Assistant in debug mode. Trigger a test conversion. Check that the EC tag and the Google Ads conversion tag fire on the same event, in the same GTM container.
Step 3: inspect the data sent. In the browser's network console, filter requests to googleads.g.doubleclick.net. Check that the em (hashed email) and ph (hashed phone) parameters are present and not empty.
Step 4: test after every deployment. Automated monitoring helps most here. Korvus detects the symptoms of failing EC: a drop in tracked conversion volume (pixel_dead alert), inconsistent amounts (checkout_zero alert). The CMO sees the impact in euros before even knowing it's an Enhanced Conversions problem.
Validation checklist
| Checkpoint | Expected status | How to check |
|---|---|---|
| EC tag and conversion tag on the same trigger | Same dataLayer event | GTM debug mode |
| CSS selector captures the email | Non-empty value in preview | Tag Assistant + DOM inspection |
| Email normalized (lowercase, no spaces) | [email protected] format | Network console, em parameter |
| Enhanced Conversions enabled in Google Ads | Toggle ON in settings | Google Ads > Conversions > Settings |
| Consent checked before sending PII | ad_user_data: granted | GTM consent state |
| Match rate > 60% | EC report in Google Ads | Google Ads > Diagnostics |
Key points
- Enhanced Conversions recover up to 30% of lost conversions, a major gain for Smart Bidding
- The most common implementation errors are 100% silent: the tag fires, the data is empty
- Wrong timing and broken CSS selectors are the two main causes of failure
- The financial impact of failing EC: €3,000 to €8,000 a month on a €50,000 budget
- Real-time monitoring of conversion volume is the only safety net: a drop in volume gives away an EC problem before anyone diagnoses it