Opens in a new tab
Home/Blog/Google Ads offline conversions for WordPress leads

Google Ads offline conversions for WordPress leads

Server-Side Tracking ExplainedPhillip StemannOctober 21, 2026

Last updated: October 23, 2026

Title card reading Google Ads offline conversions for WordPress leads on a dark slate background with an orange glow
In this article
Key takeaways

  • Offline conversions close the gap between “someone filled in the form” and “that lead became a customer”. You capture the click ID on the landing page, store it with the lead, and send it back to Google Ads when the lead qualifies.
  • Google retains a GCLID for 90 days. Uploads that rely on hashed user data (enhanced conversions for leads) must arrive within 63 days of the click. Both are in Google’s import guidelines.
  • Which API you call matters now: from 15 June 2026 Google restricts UploadClickConversions for new adopters and says new conversion upload integrations must use the Data Manager API. Existing Google Ads API integrations are not affected by that restriction.
  • Each upload needs a conversion action of type UPLOAD_CLICKS, a timestamp with a time zone offset, a click ID or hashed user data, and, strongly recommended, a value, currency and consent.
  • Enhanced conversions for leads sends SHA-256 hashed email or phone instead of, or alongside, the click ID. Google recommends it for new users but still recommends including the GCLID.
  • Most failures are boring: click too old, conversion earlier than the click (usually a time zone), click too recent, or the wrong account. The flowchart below covers each.

A contact form submission is not revenue. For a roofing company, a law firm or a B2B agency, the form is the start of a conversation, and perhaps one lead in five turns into a job. If Google Ads only sees the form submission, Smart Bidding learns to find people who fill in forms, including the ones who were never going to buy. Offline conversion import lets you tell Google which clicks led to real business, days or weeks after the click.

This guide walks through the full loop on a WordPress site: capture, store, upload, verify. It also explains how that differs from enhanced conversions for leads, how to pick between them, and the errors you will meet. Facts come from Google’s API documentation and Ads Help pages, which I fetched and checked in October 2026. Where I could not confirm something, I say so.

The loop: from ad click to uploaded sale

An offline conversion needs three things to line up: the original ad click, the later business event, and a way to tie them together. The tie is an identifier. With auto-tagging on, Google Ads appends a click ID to your landing page URL. Your job is to catch it before the visitor clicks away from that page.

Timeline of five steps: ad click, landing page cookie, form submission, lead qualified, upload to Google Ads, with a day scale showing day 63 and day 90 limits
The click ID has to survive from step 1 to step 5. Google’s deadlines run from the click, not from the form.

Step 1: capture the click ID on landing

Google describes three identifiers in its offline conversions documentation:

  • GCLID: captured from the URL parameters when someone clicks your ad and lands on your website.
  • GBRAID: present when a user clicks an ad on the web and is directed to your iOS app.
  • WBRAID: present when a user clicks an ad in an iOS app and is directed to your web page.

For a plain WordPress lead site you will mostly see gclid, and sometimes wbraid when the click came from inside an iOS app. Google adds that in some cases you may be able to associate both a gclid and a gbraid with one conversion, and recommends setting both. We go deeper on when each appears in GCLID, GBRAID and WBRAID explained.

A small script on every landing page reads the query string and writes any of the three to a first-party cookie. Two practical rules: do not overwrite an existing value with an empty one when the visitor navigates to a second page, and keep the cookie long enough to cover your sales cycle (see the 90-day limit below, since a cookie older than that is useless anyway).

// Landing page: keep the latest click ID for 90 days
const p = new URLSearchParams(location.search);
['gclid','gbraid','wbraid'].forEach(k => {
  if (p.get(k)) document.cookie =
    `tr_${k}=${encodeURIComponent(p.get(k))}; max-age=7776000; path=/; SameSite=Lax`;
});

Browsers can limit how long script-set cookies survive (see Safari ITP and WordPress cookies), so also pass the ID into the form itself (next step). The client-side vs server-side tracking comparison covers the mechanics.

Also check that auto-tagging is enabled in the account; the API docs describe the IDs as coming from URL parameters. Test with your own ad click, or a URL with a made-up ?gclid=test123, and look at the address bar.

Step 2: save it with the lead

Add hidden fields to the form: gclid, gbraid, wbraid, filled from the cookie. Contact Form 7, WPForms, Gravity Forms and Elementor forms all support hidden fields, and our guides on tracking form submissions server-side and Elementor form tracking show where to wire them in. When the form posts, the IDs travel with the name and email into your CRM, a custom table or the WordPress entries list.

Store three more things with the lead: the submission time with its time zone, the consent state at the moment of submission, and a stable lead ID. You will need all three at upload time. The submission time matters less than you might think, because Google wants the time of the conversion you are reporting (the qualification), not the form.

Step 3: decide what counts as the conversion

This is the part tools cannot decide for you. Common choices: “qualified lead” (sales accepted it), “quote sent”, “booked appointment”, “closed won”. Pick an event that happens often enough to give bidding something to learn from and still reflects revenue. If your close rate is 3%, “closed won” may be too rare to optimise on, so upload both “qualified” and “won” as separate conversion actions with different values.

Step 4: upload

Which API you use depends on when your integration started. Google’s quota page says that starting 15 June 2026, ConversionUploadService.UploadClickConversions is restricted for new adopters, and that new conversion upload integrations must use the Data Manager API. Its upload click conversions guide adds that the request fails if your developer token has not previously sent offline conversion or enhanced conversions for leads requests.

  • New integration, script or agency pipeline: use the Data Manager API. The pages I read give no way around this for new adopters.
  • Existing Google Ads API integration: the restriction targets tokens with no earlier offline history, so an established upload job is not blocked. I found no retirement date for the old route, but new work belongs on Data Manager.
  • File uploads in the Ads interface: Google Ads Help says enhanced conversions for leads uploads are now exclusively Data Manager files.

The Data Manager API takes a POST to https://datamanager.googleapis.com/v1/events:ingest, with the scope https://www.googleapis.com/auth/datamanager. Per its offline conversions guide and reference:

  • destinations: the operatingAccount (type GOOGLE_ADS plus the 10-digit customer ID), the loginAccount that holds the credentials, and productDestinationId, the conversion action ID. That action must be of type UPLOAD_CLICKS.
  • events: up to 2,000 per request. Each needs eventTimestamp (ISO 8601, for example 2026-10-21T09:15:00+02:00) and eventSource (WEB or CALL), plus at least one identifier: gclid, gbraid or wbraid inside adIdentifiers, or userData.
  • Recommended: transactionId (deduplication), conversionValue and currency.
  • encoding: HEX or BASE64, matching how you hashed (SHA-256). consent with adUserData and adPersonalization is optional but recommended. validateOnly: true tests without uploading.
Annotated Data Manager API events:ingest request for a Google Ads offline conversion with numbered notes on account, conversion action, encoding, consent, timestamp, click ID, transaction ID, value, hashed user data and validateOnly
One offline conversion with made-up values. Not every field is shown; see Google’s reference.

For existing Google Ads API integrations the same data uses the older fields: conversion_action, conversion_date_time in yyyy-mm-dd HH:mm:ss+|-HH:mm format, conversion_value, currency_code, a click ID or hashed user data, and a strongly recommended order_id. The Data Manager pages I read state no maximum event age, so plan around the limits in Google Ads Help (90 and 63 days, below).

Two details save hours. First, the offset: +02:00 is Danish summer time, but clocks go back at the end of October, so a server that hard-codes the offset will be an hour off for half the year. Use the lead’s actual local time with the correct offset for that date. Second, send each qualified lead once. Google deduplicates a combination of GCLID, conversion name and conversion time, so a retry with the same values is safe, but a retry with a different timestamp counts again.

Setting up the conversion action

In Google Ads, go to Goals, then Conversions, then create a new conversion action and choose the import-from-clicks route (offline data). Google’s error documentation tells you that the action must exist in the account that owns the click and must have “Import from clicks” as its source. In the API, that corresponds to a conversion action of type UPLOAD_CLICKS. If you manage clients through a manager account (MCC), Google says to enable cross-account conversion tracking.

For lead-gen, count “One” per click in most cases, so only one conversion per interaction is counted.

Google’s conversion windows page gives a 30-day default click-through window, adjustable from 1 to 90 days depending on the source. It does not say which range applies to offline click imports, so check the setting on your own action. The window is separate from the import limits below (90 days for GCLID, 63 for enhanced conversions for leads), and a window change applies going forward only.

Offline click import or enhanced conversions for leads?

Enhanced conversions for leads (ECL) uses the same upload service and the same UPLOAD_CLICKS action type, but matches on hashed customer data you collected in the form, such as an email address. The API guide requires the action to be enabled with the customer data terms accepted and the feature turned on, and the user_identifiers field to be populated with normalized, SHA-256 hashed data. Up to five identifiers can go with each conversion.

Comparison table of offline click import and enhanced conversions for leads covering what you send, click ID requirement, latest upload, hashing, setup and when to choose each
Both methods upload through the same service. They differ in what Google uses to find the click.

Hashing rules for ECL

  • Trim whitespace, convert to lowercase, then hash with SHA-256.
  • For gmail.com and googlemail.com addresses, remove periods from the username and drop any + suffix before hashing. Google’s example turns Jane.Doe+Shopping@googlemail.com into janedoe@googlemail.com.
  • Phone numbers go in E.164 format with a leading +.
  • Country, state, city and ZIP are sent in plain text rather than hashed.

In the API, each UserIdentifier carries one of hashed email, hashed phone, mobile ID, third-party user ID or address info. If you have both email and phone, send two identifiers.

Which should you use?

  • Use click import when your site reliably captures the click ID and your sales cycle is under 90 days. It involves no personal data in the upload.
  • Use ECL when the click ID is often missing (cookie loss, form hosted on another domain, calls back from a different device), or when you want the extra matching Google describes. Google recommends it for new users.
  • Use both where you can. Google recommends including the GCLID in ECL uploads, so storing the click ID is never wasted effort.

If you used a CSV template last year, re-check it: the legacy ECL file formats need upgrading.

Diagnostics, timing and common errors

Google says it takes about 3 hours for imported conversion statistics to show up. It also says conversions report on the original click’s impression date, not the day you uploaded them, which is why last month’s numbers can move after an upload. To check what arrived, use the “All conv. (by conv. time)” column, which reports by conversion date. For GBRAID and WBRAID conversions, Google says processing normally takes under 12 hours but can take up to 72 hours. That 72-hour figure is the one worth remembering before you declare an import broken. (Google’s separate “about 72 hours” for tag diagnostics belongs to enhanced conversions for web, which is a different feature.)

The offline conversion diagnostics report in Google Ads lists errors by type. Google’s errors and discrepancies page and the offline import FAQ cover the usual suspects:

Troubleshooting flowchart with seven checks: click too old, conversion before click, click too recent, unknown click, wrong action or account, reporting delay, missing consent
Work down the list; the first match is usually the problem.
  • Click too old or identifier expired. The GCLID retention is 90 days, or 63 days for ECL. Upload more often, or upload an earlier-stage event that falls inside the window.
  • Conversion before the click. Google’s FAQ says an offline conversion cannot happen before the ad click, and the error is “Conversion date precedes click date”. The cause is almost always the time zone. Check the offset on the timestamp; Google also suggests adding 1 to 2 days to the conversion time.
  • Click too recent. If the click happened under 6 hours ago, retry later. Google also says conversions within a day of the click may not be recordable yet.
  • Unknown click. The conversion cannot be tied to a Google Ads click. For ECL Google says this is generally ignorable (many leads simply did not come from ads), but if every row shows it, check how the form data or click ID is captured.
  • Wrong account or no suitable action. Make sure an “Import from clicks” action exists in the account that owns the click.
  • User data not hashed correctly. Lowercase emails without spaces, E.164 phones.
  • Missing consent. Populate the consent field, as above.

If you need to change a value after upload, Google’s FAQ says conversion adjustments can be made up to 55 days after the conversion was first recorded.

WordPress and CRM practicalities

  • Caching. If a page cache serves one static page to everyone, server-side PHP that reads the query string will not run. Read the click ID in JavaScript, as in the snippet above.
  • Redirects. A redirect from /lp/?gclid=... to a clean URL can strip the parameter before your script sees it. Capture on first load.
  • Where the qualification happens. If your sales team works in a CRM, the CRM needs the click ID stored on the contact so the upload job can find it. A scheduled job that exports “won since yesterday” with click ID, value and timestamp is the simplest workable pipeline.
  • Consent. Store the consent state when the visitor submits the form and pass it on in the consent field. Our Consent Mode v2 guide explains the four signals.
  • Batching. Upload daily. It keeps you well within the 90 and 63-day limits and means errors surface quickly.

Cross-platform differences matter too. Google’s windows and attribution do not line up with Meta’s or GA4’s, which is why numbers rarely match; why Meta, Google and GA4 never match your orders explains that. The Meta equivalent of this whole pattern is in the Meta Conversions API guide.

Where Traculo fits

Traculo’s WordPress plugin forwards events from Traculo’s servers to several platforms, with Google Ads offline conversions among them, and each event has a delivery log with the response from each integration. That log helps with the troubleshooting above: you can see what Google answered for a given event instead of guessing.

Be realistic about the boundaries. Traculo does not decide what a qualified lead is in your business. Its Google Ads integration uploads click conversions: you map a site event to a conversion action, and the event must carry a gclid, gbraid or wbraid. With no mapping the delivery log shows “Skipped: no mapping”, and with no click ID “Skipped: missing gclid/gbraid/wbraid” (both logged as 204). Traculo sends the conversion time, value and currency, an order ID, and hashed email or phone if the event carries them. The current plugin release does not capture gclid, gbraid or wbraid itself, so check the delivery log for a test event before relying on it. It is not a CRM, and it does not replace a hosted Tag Manager server if you rely on custom GTM logic. See the beginner’s guide to server-side tracking for the wider picture.

Frequently asked questions

How long do I have to upload an offline conversion?

Google retains the GCLID for 90 days, so uploads made more than 90 days after the click are not imported. For conversions that rely on hashed user data (enhanced conversions for leads), the limit is 63 days.

What time format does the upload need?

The Data Manager API takes ISO 8601, for example 2026-10-21T09:15:00+02:00. The older Google Ads API wants yyyy-mm-dd HH:mm:ss+|-HH:mm. Both include the time zone offset.

Do I need a GCLID for enhanced conversions for leads?

Not strictly, but Google recommends including GCLIDs where possible. The action must still be of type UPLOAD_CLICKS and enhanced conversions for leads must be enabled with the data terms accepted.

Why do my uploaded conversions not show up?

Google says stats take about 3 hours to appear, and GBRAID/WBRAID conversions can take up to 72 hours. Conversions also report on the original click date, so look at the by-conversion-time column. If errors appear, use the diagnostics report.

Can I upload conversions if the visitor did not consent?

Populate the consent field with what the visitor actually chose; Google says leaving it unset can make conversions unattributable. Whether you may use the data at all is a question for your own legal adviser.

Related reading

If you want site events forwarded to Google Ads without maintaining your own upload scripts, check whether Traculo’s Google Ads integration fits your setup on the integrations page.

ShareLinkedInXEmail

About the author

Track what matters, without the guesswork

Traculo gives WordPress sites analytics, funnels and server-side event forwarding in one dashboard. Start on the free plan with 10,000 events a month.

Try Traculo free

Related articles

Title card reading GCLID, GBRAID and WBRAID: what they are and when each appears, on a dark slate background with an orange glow

GCLID, GBRAID and WBRAID: what they are and when each appears

What Google's click IDs are, when gclid, gbraid and wbraid appear, the upload rules, how WordPress loses them and how to capture them reliably.

Read more
Title card reading GA4 Measurement Protocol limits: the cheat sheet, on a dark slate background with an orange glow

GA4 Measurement Protocol limits: the cheat sheet

Every GA4 Measurement Protocol limit on one page: 25 events, 130 kB, 72 hours, reserved names, sessions, consent, validation and how to debug missing events.

Read more
Title card: One reference table, dedup rules and limits on every ad platform, on a dark slate background with an orange glow

Conversions API dedup rules and limits: Meta, TikTok, Snapchat, Pinterest, LinkedIn

One reference table of deduplication keys, windows, batch limits, event age, click IDs and hashing for Meta, TikTok, Snap, Pinterest, LinkedIn, Google.

Read more