Docs / Setup guide

Google Ads · COD Order Protection

Google Ads: Sheet import vs PixelFly hold & fire

Both methods send a conversion after a COD order is confirmed — not at fake checkout. They are different Google products with different rules for time, click IDs, and setup. This guide explains which to use and how PixelFly’s hold → fire path maps to Google’s requirements.

Full COD setup: COD + server GTM. Official Google docs: offline import guidelines, import errors & 90-day GCLID.

Short answer: PixelFly hold & fire for Google Ads is valid and aligned with how delayed website conversions work (gclid + conversion hit inside your conversion window). Sheet import is Google’s classic Import from clicks path with an explicit conversion_date_time. Both need a real gclid (or wbraid / gbraid). Neither invents attribution without it.

Are PixelFly hold & fire OK for Google Ads?

Yes — when you do this:

  1. Store gclid (and iOS wbraid / gbraid when present) at hold.
  2. Set fire path to sGTM /data (not Receivers-only if you need Google Ads tags).
  3. On Approve & Fire, PixelFly POSTs purchase JSON to /data with click IDs on page_location.
  4. sGTM Data Client + Google Ads Conversion tag fire (Client Name = Data Client).
  5. Fire within your conversion window and within ~90 days of the click (Google retains GCLIDs ~90 days).
  6. Do not also fire a browser Purchase for the same COD order (double counting).

Receivers /e correctly replays Meta / GA4 / TikTok via PixelFly destinations. It does not run your Google Ads conversion tags inside sGTM — use sGTM /data for Ads.

Side-by-side comparison

Topic Google Sheet / offline import PixelFly hold → fire (sGTM)
What Google product Conversion action: Import from clicks Usually a Website (or GA4) conversion + sGTM Ads tag
How data is sent Upload CSV / Sheet / API with gclid + time + value Approve & Fire → POST /data → Data Client → Ads tag
Conversion time You set conversion_date_time with timezone (yyyy-mm-dd HH:mm:ss±HH:mm). Must be after the click Hit arrives at fire time; gclid links to the original click. PixelFly also stores checkout event_time (critical for Meta)
Click ID gclid / wbraid / gbraid column required for click match Same IDs held at checkout, replayed on page_location + event fields
GCLID age limit Upload more than ~90 days after click → rejected Fire outside window / ~90 days → usually not attributed
Speed Batch; often ~3 hours to appear Near real-time on Approve; UI can still lag hours
Meta / TikTok Google Ads only Same fire can hit Meta, GA4, TikTok tags
Deduping order_id / unique gclid + name + datetime transaction_id = Woo order id on the Ads tag
Common failure Wrong timezone (“conversion precedes click”), late upload, wrong conversion action No gclid at hold, fire path = Receivers only, browser Purchase still fires for COD

Event time explained (simple)

Day 0  Click ad (gclid created)
Day 0  COD order placed     → PixelFly HOLD (store gclid + checkout event_time)
Day 3  Order confirmed      → PixelFly FIRE

Sheet:  you upload conversion_date_time = Day 0 or Day 3 (your choice; must be after click)
sGTM:   Google Ads tag runs on Day 3; attribution still ties back via gclid to Day 0 click

Google Ads campaign reports usually credit the click / impression date, not the upload or fire date. To compare with your order list, add All conv. (by conv. time) in Google Ads (conversion reporting help).

Meta vs Google on time: PixelFly replays the original checkout event_time for Meta CAPI (correct for delayed events). Google Ads website tags primarily need a valid gclid on the fired hit; they are not the same as Sheet’s mandatory conversion_date_time column.

Architecture — PixelFly path for Google Ads

Web GTM: purchase + payment_method + email + phone + gclid → sGTM
  → PixelFly COD Protection tag → POST /cod/hold
  → Held Events (pending)

Confirm order
  → Approve & Fire (fire path = sGTM /data)
  → POST {host}/data  (gclid on page_location, transaction_id, value, user_data)
  → Data Client → Google Ads Conversion tag

Architecture — Sheet / offline import

Capture gclid at checkout (cookie / CRM / Sheet row)
Confirm COD order
  → Append row: Google Click ID | Conversion Name | Conversion Time | Value | Currency | Order ID
  → Upload to Google Ads (Import from clicks)
  → Google matches gclid → conversion

When to use which

  • Prefer PixelFly hold & fire if you already use server GTM, want Meta + Google from one approve, and want near real-time fire from the dashboard or Woo webhook.
  • Prefer Sheet / OCI if you have no sGTM Ads tag path, ops already live in Sheets/CRM, or you need an exact confirm timestamp in an Import from clicks action.
  • Do not use both for the same COD purchase into the same “primary” conversion unless you intentionally want two actions and understand double counting.

Checklist — Google Ads with PixelFly

  1. Web GTM forwards plaintext email, phone, payment_method, and gclid to sGTM (not hashed phone as the phone field).
  2. sGTM COD tag holds COD only; browser Ads Purchase = prepaid only (payment_methodcod).
  3. Dashboard fire path = sGTM /data.
  4. Data Client accepts /data; Google Ads tag trigger = purchase + Client = Data Client.
  5. Pass transaction_id = order id on the Ads tag.
  6. Confirm Held Event raw payload shows gclid before you rely on Ads attribution.
  7. Fire within the conversion window (and < ~90 days from click).

FAQ

Is hold & fire “as good as” Sheet import?

For attribution quality, both depend on gclid and timing windows. Sheet gives stricter control of conversion_date_time. PixelFly is better for automation and multi-platform fire. Neither works without click IDs (or a strong Enhanced Conversions match on an import action).

Why did my held order have no gclid?

The visitor had no Google click cookie / parameter, or Web GTM did not forward gclid to sGTM. PixelFly stores what the hold receives — fix mapping, then test a new order from a Google Ads click.

Can I use Receivers /e for Google Ads?

No for sGTM Google Ads tags. Use sGTM /data. Receivers are for PixelFly destinations (Meta CAPI, GA4 MP, etc.).

Related guides

Ready to hold COD and fire clean Google Ads conversions?

Enable COD Order Protection, set fire path to sGTM /data, and keep gclid on every hold.

We use cookies to enhance your experience, analyze site traffic, and for marketing purposes. By continuing to use our site, you consent to our use of cookies. Learn more