Author: Diego Sanz. The single most important question for the offline-conversions build is: of the deals that convert (Quote / Order), how many can we actually tie back to a Google ad click and upload? This was measured directly against the live Supabase data and the live 4 Star Google Ads account — not estimated.
deals (lifecycle dates + rfq_source_id + value) joined to
rfq_attribution_touches (the click data: gclid / msclkid / UTMs) by deal_id.rfq_source_id = 1)
and carries a gclid whose click is within Google's 90-day window before the
conversion. Last-click attribution: the latest gclid click preceding the conversion.uv run python -m fourstar.pipeline --report.| Stage | Converted | Website | Uploadable now (gclid, in-window) |
|---|---|---|---|
| Quotes | 6,981 | 4,297 (61%) | 1,475 — 34% of web, 21% of all |
| Orders | 1,165 | 468 (40%) | 167 — 35% of web, 14% of all |
Why the rest is not uploadable via gclid (this is the "which rows did not import" log, produced at extraction time):
| Reason | Quotes | Orders |
|---|---|---|
| non-web RFQ (phone/email/fax/portal — no ad click exists) | 2,684 | 697 |
| web, but no gclid and no hashable PII | 1,860 | 278 |
| gclid click older than 90 days before the conversion | 828 | 11 |
Microsoft/Bing click only (msclkid — handled outside Google Ads) |
134 | 12 |
Quotes conversion action passed a live validate_only check against the 4 Star
account (no errors), so the data, the account, and the event shape are all sound.90 days before the quote — outside Google's hard limit. Nothing to do for those via gclid; ECL (63-day) won't help either. This is inherent to the business, not a bug.
msclkid). Out of Google Ads scope;
routes to the Microsoft/Bing leg if that scope is confirmed (still open with Mezar).rfq_value is frequently 0 at quote stage; order_total
carries the order value. Confirm which $ value each conversion action should receive
(bidding optimizes on it).fourstar.datamanager) with validateOnly dry-run and
per-row failure parsing.datamanager
OAuth token — the same Workspace session-control gate as the GA4 read. Unblocks when
that policy is relaxed (or via a service-account key). The Ads-API adwords token is
unaffected, which is how the real-account validation above was performed.