---
title: "Offline Conversion Tracking for Google Ads: A Guide"
description: Learn how offline conversion tracking bridges your CRM data with Google Ads to measure real-world sales and optimize your campaigns effectively.
image: https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/3ab3a57c-e278-4aff-8e29-17456bedd145/offline-conversion-tracking-google-ads.jpg
---

[Skip to content](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#main-content)

![](https://www.cometogether.media/hubfs/ctm_logo-1.svg)Homepage

- [Home](https://www.cometogether.media)
- [Google Ads Sprint](https://www.cometogether.media/google-ads-sprint)
- [Case Studies](https://www.cometogether.media/case-studies)
- [Contact](https://www.cometogether.media#contact)
- [Blog](https://www.cometogether.media/blog)

[Free Account Review](https://www.cometogether.media/#contact)

- [Home](https://www.cometogether.media)
- [Google Ads Sprint](https://www.cometogether.media/google-ads-sprint)
- [Case Studies](https://www.cometogether.media/case-studies)
- [Contact](https://www.cometogether.media#contact)
- [Blog](https://www.cometogether.media/blog)

[Free Account Review](https://www.cometogether.media/#contact)

![](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/3ab3a57c-e278-4aff-8e29-17456bedd145/offline-conversion-tracking-google-ads.jpg)

# Offline Conversion Tracking for Google Ads: A Guide

![Chase McGowan](https://7528315.fs1.hubspotusercontent-na1.net/hub/7528315/hubfs/raw_assets/public/mV0_d-cms-elevate-theme_hubspot/elevate/images/avatar-placeholder.jpg?width=48&height=48&name=avatar-placeholder.jpg)

 Chase McGowan

October 22, 2026

Your cheapest form fill is often your most expensive lead. I've seen Google Ads accounts hit every lead target on paper while the sales team quietly worked junk, duplicates, and people outside the service area. That's not a bidding problem. It's a measurement problem, and **offline conversion tracking** is how you fix it. I'm Chase McGowan, an independent Google Ads operator. I keep a deliberately small roster, there's no account manager layer, and I fix tracking before I touch bidding.

## Table of Contents

- [Why Form Fills Are Lying to Your Bidding](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#why-form-fills-are-lying-to-your-bidding)
    - [What junk optimization looks like in practice](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#what-junk-optimization-looks-like-in-practice)
- [Capturing the GCLID and First-Party Identifiers](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#capturing-the-gclid-and-first-party-identifiers)
    - [Preserve more than the GCLID](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#preserve-more-than-the-gclid)
- [Designing the CRM Schema and Lifecycle Mapping](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#designing-the-crm-schema-and-lifecycle-mapping)
    - [Fields every lead record needs](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#fields-every-lead-record-needs)
    - [Map stages to conversion actions separately](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#map-stages-to-conversion-actions-separately)
- [Manual Uploads vs Data Manager vs the API](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#manual-uploads-vs-data-manager-vs-the-api)
    - [Manual CSV uploads](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#manual-csv-uploads)
    - [Data Manager scheduled connections](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#data-manager-scheduled-connections)
    - [The API route](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#the-api-route)
- [Attribution Windows, Deduplication, and the Daily Reconciliation](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#attribution-windows-deduplication-and-the-daily-reconciliation)
    - [The clocks you're working against](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#the-clocks-youre-working-against)
    - [Deduplication and the daily check](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#deduplication-and-the-daily-check)
- [Consent, Privacy, and the 2026 Migration You Should Plan For Now](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#consent-privacy-and-the-2026-migration-you-should-plan-for-now)
    - [Consent Mode can quietly zero out your match rate](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#consent-mode-can-quietly-zero-out-your-match-rate)
    - [The migration is an architecture decision](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#the-migration-is-an-architecture-decision)
- [Troubleshooting, Validation, and Your Next Move](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#troubleshooting-validation-and-your-next-move)
    - [Capture failures](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#capture-failures)
    - [Upload failures](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#upload-failures)
    - [Reporting failures](https://www.cometogether.media/blog/single-post/offline-conversion-tracking#reporting-failures)

## Why Form Fills Are Lying to Your Bidding

Automated bidding does exactly what you tell it to do. If the primary conversion is a raw form submission, Google will find more people who submit forms cheaply, whether or not they can pay, show up, or ever answer the phone.

That distinction matters because [Google's documentation on importing offline conversions](https://support.google.com/google-ads/answer/2998031?hl=en) describes connecting an ad interaction to a later outcome outside the website, such as a qualified opportunity, signed contract, booked procedure, or phone-based sale. In other words, reporting doesn't have to stop at the submit button. The CRM can send back the stage that matters.

### What junk optimization looks like in practice

I worked with an ophthalmology practice where, platform-reported, conversion rate moved from **under 1% to 17%+** and cost per conversion fell **89%, from roughly $400 to roughly $44**, with **190 additional patient calls per month**. The shift wasn't a new ad angle. We stopped treating every inquiry as equal and aimed spend at booked, real patient intent.

You can't replicate that logic if your account treats these as the same event:

- **Raw form fill:** Someone clicked submit. You know nothing about fit yet.
- **Reachable lead:** A human answered and confirmed basic details.
- **Qualified lead:** Sales accepted the lead as a real opportunity.
- **Booked or closed outcome:** Money or a firm commitment changed hands.

If bidding optimizes to the first item, you'll scale the first item. Your cost per lead can improve while cost per qualified lead gets worse, and nobody sees it until pipeline review.

> Import only a milestone sales would defend in a pipeline meeting as your primary bidding conversion. Everything earlier belongs in secondary diagnostics.

**tROAS**, which is target return on ad spend bidding based on conversion value, only helps if the value you import is real. Offline conversion tracking gives it something honest to work with. Even the mechanics of how a lead enters the system matter here, and if you're troubleshooting how signups connect to downstream records, [CapyScout signup setup help](https://www.capyscout.com/help/connect-your-signup-form) is a useful reference for that front-end handoff. Nail the definition of qualified first. The plumbing comes second.

## Capturing the GCLID and First-Party Identifiers

Start at the click. Turn on auto-tagging so Google appends the **GCLID**, Google Click ID, to the landing page URL. Your page needs to read that value on load, store it in a first-party cookie and a hidden form field, and pass it into the CRM on submit. Don't rely on the URL still being there later. Redirects, multi-step forms, and thank-you page hops strip it constantly.

The flow below is the capture sequence I check first in any audit.

![A diagram illustrating the offline conversion tracking process from an ad click to form submission.](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/fb65bd45-7287-4d3a-9ede-f0a165b4bdbd/offline-conversion-tracking-gclid-process.jpg)

### Preserve more than the GCLID

Capture **GBRAID and WBRAID** when they're present too. These are the privacy-preserving click identifiers Google uses for iOS-driven traffic and engaged-view interactions. You won't use them the same way as a GCLID for every upload, but storing them costs nothing and losing them costs you options later.

Then add **Enhanced Conversions for Leads**. That's Google's method for supplementing click IDs with hashed first-party data like email and phone so a conversion can still match when the click identifier is missing or incomplete. The capture sequence is specific:

- **Normalize email:** Lowercase it and trim whitespace before anything else.
- **Normalize phone:** Standardize it consistently, including country code, so the same number doesn't produce different values across systems.
- **Hash after normalizing:** Apply **SHA-256** hashing to the cleaned value, never to the raw form input.
- **Persist both paths:** Store the click IDs and the first-party identifiers on the lead record itself, not just in the browser.

Google reports that advertisers combining first-party identifiers with imported GCLIDs saw a **median 10% increase in reported conversions** compared with standard offline imports, as described in the verified source I cited in the opening section. That lift only shows up if normalization is consistent between capture and upload. One uppercase letter before hashing creates a completely different hash.

Here's the step you can take today. Submit a test lead from a URL with a fake gclid parameter, then check three places: the hidden field fired, the CRM record stored the value, and the record survived deduplication. If any step fails, you've found your break. This capture discipline is the foundation of the broader [PPC playbook for 2026](https://www.cometogether.media/blog/single-post/first-party-data-strategy) approach to first-party data. Captured identifiers still have to survive the sales process, which is a CRM design problem, not a tagging problem.

## Designing the CRM Schema and Lifecycle Mapping

Most offline pipelines don't break at upload. They break weeks earlier because nobody designed the lead record to hold what the upload needs. If the GCLID lives in a notes field, or the qualification timestamp gets overwritten every time a rep touches the record, no upload method will save you.

### Fields every lead record needs

Build these as dedicated, locked-down fields:

- **Click identifiers:** GCLID, plus GBRAID and WBRAID when present, written once and never edited by reps.
- **First-party identifiers:** Email and phone as captured, with normalized and hashed versions generated systematically.
- **Click and capture timestamps:** When the lead was created, stored separately from later stage changes.
- **Stage timestamps:** A distinct datetime for qualified, booked, attended, and closed, each set once.
- **Value and currency:** The monetary value of the stage and a stable currency code.
- **event\_id:** An immutable, unique ID per stage event, used to prevent duplicate uploads.

That last field does more work than people expect. Without a stable event\_id, a re-export or a rep reopening an opportunity can send the same conversion twice, and your reported performance inflates.

The upload itself needs consistent data too. [Google's API documentation for uploading offline conversions](https://developers.google.com/google-ads/api/docs/conversions/upload-offline) describes populating conversion objects with the click ID, conversion date and time, conversion action, value, currency, and normalized, hashed customer data. Design your schema backward from that payload and you'll avoid most reformatting pain.

### Map stages to conversion actions separately

Don't collapse the funnel into one conversion. Create a distinct Google Ads conversion action per meaningful stage, then decide which ones bidding should chase.

**CRM Lifecycle Stage to Google Ads Conversion Mapping**

| CRM Stage | Trigger Field | Primary Bidding Conversion | Secondary Diagnostic |
| --- | --- | --- | --- |
| New lead | Lead created timestamp | No | Yes |
| Contacted | First contact timestamp | No | Yes |
| Qualified | Qualified timestamp plus rubric met | Yes | No |
| Appointment booked | Booked timestamp | Yes | No |
| Appointment attended | Attended timestamp | Yes, if volume supports it | No |
| Closed-won | Closed timestamp plus value | Yes, with value | No |
| Closed-lost | Closed timestamp | No | Yes, for analysis only |

My rule is simple. Never let automated bidding optimize toward a stage sales wouldn't call a real opportunity. Define qualified with a deterministic rubric, valid service area, reachable contact, stated need, sales-accepted status, and write that rubric down where reps can see it. If you want a structured way to audit whether your own schema has these gaps, the [Fre Vault Preview](https://www.cometogether.media/ppc-vault/free-preview) offers a free preview of vault audit checklists, including the tracking checks I run before any rebuild.

## Manual Uploads vs Data Manager vs the API

You've got three real paths from CRM to Google Ads. All three can work. They differ in latency, maintenance, and how badly they punish sloppy data.

The comparison below summarizes where each option fits before I get into the trade-offs.

![A comparison chart showing differences between Manual CSV Uploads, Data Manager, and API for data integration.](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/bfb500f6-ba57-4e80-8dc5-ce03ab5d6309/offline-conversion-tracking-data-integration-comparison.jpg)

### Manual CSV uploads

A manual upload is fine for a one-off backfill or a proof of concept. It's terrible for ongoing optimization because bidding learns from stale signals, and a human has to remember to do it correctly every time. Column order slips, timezones drift, and somebody uploads the same file twice. I've cleaned up all three.

### Data Manager scheduled connections

Data Manager is the middle ground for lean teams. Per [Google's setup guidance on offline conversion imports](https://support.google.com/google-ads/answer/7012522?hl=en), Data Manager can import from sources including Google Cloud Storage, Amazon S3, HTTP, SFTP, and Google Sheets on a recurring schedule. You get automation without writing code, and you keep a file-based trail you can inspect when something looks off. The trade-off is schema rigidity and less control over error handling.

### The API route

The API path, sending conversions programmatically from your CRM or a server-side process, is the production-grade option. You control timing, retries, deduplication, and logging. It also means someone owns the integration when Google changes an interface, and Google is consolidating these uploads under the Data Manager API, so build with that endpoint direction in mind rather than hard-coding a legacy workflow.

> **Decision rule I use:** If you'd upload more than once a week, you shouldn't be uploading manually.

Upload cadence isn't a reporting preference, it determines how fresh your bidding feedback is. A qualified lead imported today can influence bidding this week. The same lead sitting in a spreadsheet for three weeks influences nothing and risks falling outside its eligible window. If you're setting this up alongside standard tag-based tracking, [Come Together Media's tracking guide](https://www.cometogether.media/blog/single-post/how-to-set-up-google-ads-conversion-tracking) covers the on-site conversion setup that this offline layer sits on top of. Pick the least complex method you'll run on schedule. A reliable Data Manager sync beats an abandoned API project every time.

## Attribution Windows, Deduplication, and the Daily Reconciliation

An upload that arrives late, twice, or with a bad timestamp doesn't just fail to help. It actively trains bidding on fiction. Windows and deduplication are where trust in the whole system is won or lost.

Here's the timing framework I work from on every build.

![A list outlining key concepts of offline conversion tracking including attribution windows, deduplication, and daily reconciliation processes.](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/c5bf6b15-f416-46fd-b093-7536ce3cf065/offline-conversion-tracking-attribution-windows.jpg)

### The clocks you're working against

For GCLID-linked conversions, [Google's guidance on offline conversion timing](https://support.google.com/google-ads/answer/10029210?hl=en) states uploads must generally occur no later than **90 days after the last click**, while Enhanced Conversions for Leads using hashed first-party data carry a shorter **63-day limit**. Uploads outside those windows aren't imported into conversion statistics. If your sales cycle runs longer, you need a mid-funnel conversion action, like qualified or booked, that fires inside the window. You can't backfill your way past the deadline.

Timestamps need equal care. The conversion time must occur after the click, include a timezone, and reflect when the event happened, not when you uploaded it. Google also notes imported statistics can take about **three hours** to appear, with full processing sometimes taking **24 to 48 hours** depending on workflow, per the same source above. So don't judge an upload in the first hour. Also note that Google's setup guidance puts the click-to-conversion cycle at **less than 14 or 90 days depending on the data source**, which I linked in the previous section, so check your specific source before designing your cadence.

### Deduplication and the daily check

Attach your immutable event\_id to every uploaded row. That's your defense against double-counting when a file reruns, an opportunity reopens, or the same customer gets imported under two stages. Duplicate imports are the most common silent budget leak I find in lead-gen accounts because performance looks great right up until someone reconciles against the CRM.

Run this reconciliation daily:

- **CRM qualified count:** How many leads hit the stage yesterday, per CRM truth.
- **Uploaded rows:** How many rows your process sent.
- **Accepted rows:** How many Google accepted without errors.
- **Attributed conversions:** How many appear in Google Ads reporting.

When any column drifts from the others, investigate before you touch budgets. Understanding [what is attribution modeling](https://www.cometogether.media/blog/single-post/what-is-attribution-modeling-a-consultant-s-guide-vs-agency-hype) helps here, because imported conversions report against the original ad interaction, which surprises teams expecting upload-date reporting.

The walkthrough below shows the reconciliation mindset in practice.

<iframe width="100%" style="aspect-ratio: 16 / 9;" src="https://www.youtube.com/embed/t6cepbd8ABE" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>

## Consent, Privacy, and the 2026 Migration You Should Plan For Now

Two risks sink offline pipelines, and neither is a tagging bug. The first is consent. The second is building on an interface Google is already retiring.

### Consent Mode can quietly zero out your match rate

**Consent Mode** is Google's framework for adjusting tag behavior based on a user's consent choices. Its current version governs signals like ad\_storage and ad\_user\_data, which directly affect whether identifiers get captured and whether hashed customer data can be used for matching. If your consent banner strips ad\_storage before the GCLID persists, or your web consent state never gets recorded alongside the CRM lead, your upload can be perfectly formatted and still match poorly.

Treat hashed email and phone as personal data, not anonymous data. Hashing is pseudonymization. Your privacy policy, your consent records, and your upload logic need to agree with each other. That discipline extends past forms, and if phone conversations feed your qualification process, reviewing [SnapDial compliance best practices](https://snap-dial.com/call-recording-compliance/) is worthwhile reading on the recording and consent side of call handling. Align consent state across the website, any server-side tagging, and the CRM record so you're never uploading data you don't have a basis to use. Getting that server-side layer right is one practical way to [improve Google Ads data accuracy](https://www.cometogether.media/blog/single-post/what-is-server-side-tracking) while respecting consent choices.

### The migration is an architecture decision

Here's the part most setups ignore. According to [Google's documentation on the Data Manager migration](https://support.google.com/google-ads/answer/14274408?hl=en), offline conversion imports and Enhanced Conversions for Leads uploads are moving to the Data Manager API, with Google Ads API uploads blocked beginning **June 15, 2026**. If you're building today on the older path without a migration plan, you're scheduling an emergency rebuild.

Design so the platform interface is replaceable:

- **Platform-neutral schema:** Keep your CRM conversion events in your own field structure, and map to Google's format at the upload step only.
- **Retained raw history:** Never overwrite stage events, so you can re-derive uploads if an endpoint changes.
- **Instrumented uploads:** Log latency, rejected rows, and acceptance rates from day one.
- **All identifiers stored:** Keep GCLID, GBRAID, and WBRAID plus hashed first-party data, so matching survives any single identifier going away.

> Resilient measurement isn't rebuilt every time Google ships a new connector. It's built once, with the connector treated as a replaceable part.

Offline conversion tracking built this way survives consent updates, identifier loss, and platform migrations. Built as a one-time CSV habit, it survives none of them.

## Troubleshooting, Validation, and Your Next Move

When an offline pipeline underperforms, the failure is almost always in one of three places. Work them in order, because downstream symptoms mimic upstream causes.

### Capture failures

The symptom is a low match rate or leads in the CRM with no click ID. The usual causes are a redirect that drops the URL parameter before it persists, a consent state that blocked storage, or the identifier living only in a cookie that expired before the form submit. The fix is to persist the value early, in multiple places, and test with a synthetic lead through your actual redirect chain. While you're auditing traffic quality during this process, it also helps to [monitor site visitors](https://expressify.ai/website-traffic-check) so you can spot whether identifier loss correlates with specific landing pages or traffic sources.

### Upload failures

Rejected rows usually come down to malformed timestamps, a missing timezone, a conversion time recorded before the click, missing currency, or inconsistently formatted phone numbers that hash differently than they did at capture. Google's diagnostics will tell you which rows failed and why, but only if somebody reads them. Assign that to a person. It's also worth confirming your approach against [Google's overview of conversion measurement options](https://developers.google.com/google-ads/api/docs/conversions/overview), which covers using Data Manager and API uploads plus Enhanced Conversions for Leads for more accurate measurement with first-party data.

### Reporting failures

This is the sneaky one. Attributed conversions look healthy, but cost per qualified lead in the CRM hasn't moved. That's almost always a denominator problem: duplicate imports, test leads in production uploads, reopened opportunities counted twice, or two stages imported as the same conversion action. Segment reporting by lead stage and cohort, and audit attribution drift after any consent, tagging, CRM, or landing page change.

Validate the full loop before you trust it with bidding. Run synthetic records, then a controlled production sample, and confirm a known conversion appears under the intended campaign and ad group. The [PPC Vault audit checklists](https://www.cometogether.media/ppc-vault) include the validation sequence I use, and the screenshot below shows where that work sits in a typical engagement.

![Screenshot from https://www.cometogether.media](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/screenshots/044b9e5d-5aa6-4ad1-b465-5d8905aceccb/offline-conversion-tracking-chase-mcgowan.jpg)

If you'd rather have this wired up by the person who'll also run the account, that's the core of my **$7,500 30-day Google Ads Sprint** at /google-ads-sprint. Hire me for 30 days before you hire me forever. Tracking gets fixed first, then the account gets rebuilt around qualified pipeline instead of form fills. Ongoing management after that starts at **$3,500/month**, month to month, and I take on **2 to 3 new clients per quarter maximum**. If you just want a second set of eyes first, a **$350 Office Hours session** covers a focused review of your current setup.

---

If your Google Ads account is optimizing to form fills while your CRM knows which leads closed, I can close that loop for you, starting with a 30-day Sprint that fixes tracking first and rebuilds bidding around qualified pipeline. You'll work directly with me, not an account manager, and every engagement starts from documented results rather than promises. Visit [Come Together Media LLC](https://www.cometogether.media) to see the Sprint details and check current availability.

## Share this post

<https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fwww.cometogether.media%2Fblog%2Fsingle-post%2Foffline-conversion-tracking><https://twitter.com/intent/tweet?url=https%3A%2F%2Fwww.cometogether.media%2Fblog%2Fsingle-post%2Foffline-conversion-tracking><https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Fwww.cometogether.media%2Fblog%2Fsingle-post%2Foffline-conversion-tracking><https://pinterest.com/pin/create/button/?url=https%3A%2F%2Fwww.cometogether.media%2Fblog%2Fsingle-post%2Foffline-conversion-tracking>[mailto:https%3A%2F%2Fwww.cometogether.media%2Fblog%2Fsingle-post%2Foffline-conversion-tracking](mailto:https%3A%2F%2Fwww.cometogether.media%2Fblog%2Fsingle-post%2Foffline-conversion-tracking)

## Keep reading

### [![](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/99fd7d9b-cbb5-4c82-836a-e99ef0a15015/google-tag-manager-conversion-tracking-conversion-tracking.jpg) Google Tag Manager Conversion Tracking Guide](https://www.cometogether.media/blog/single-post/google-tag-manager-conversion-tracking)

### [![](https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/4958a248-b978-40ad-a884-ba131d032eff/google-ads-for-premium-brands-business-strategy.jpg) Google Ads for Premium Brands: A Senior Operator Playbook](https://www.cometogether.media/blog/single-post/google-ads-for-premium-brands)

[![](https://www.cometogether.media/hubfs/ctm_logo-1.svg)](https://www.cometogether.media/)

- [Home](https://www.cometogether.media)
- [Google Ads Sprint](https://www.cometogether.media/google-ads-sprint)
- [Case Studies](https://www.cometogether.media/case-studies)
- [Contact](https://www.cometogether.media#contact)
- [Blog](https://www.cometogether.media/blog)

---

[Privacy Policy](https://www.cometogether.media/privacy-policy) · [Legal](https://www.cometogether.media/privacy-policy) · © 2026. All rights reserved.

```json
{
  "@context" : "https://schema.org",
  "@type" : "BlogPosting",
  "author" : {
    "@type" : "Person",
    "name" : "Chase McGowan",
    "url" : "https://www.cometogether.media/blog/author/chase-mcgowan"
  },
  "datePublished" : "2026-10-22T10:40:25.000Z",
  "headline" : "Offline Conversion Tracking for Google Ads: A Guide",
  "image" : [ "https://cdnimg.co/17b73926-1e47-4019-b5de-67eb948176d5/3ab3a57c-e278-4aff-8e29-17456bedd145/offline-conversion-tracking-google-ads.jpg" ],
  "mainEntityOfPage" : {
    "@id" : "https://www.cometogether.media/blog/single-post/offline-conversion-tracking",
    "@type" : "WebPage"
  },
  "publisher" : {
    "@type" : "Organization",
    "logo" : {
      "@type" : "ImageObject",
      "url" : "https://www.cometogether.media/hubfs/ctm_logo-1.svg"
    }
  }
}
```