Skip to content
ceaksan

analytics

QUERY = 'contents'; CATEGORY = 'analytics' // 48 rows

Every Monday · One email

An applied measurement
case, every week

Analytics and measurement, developer tools, AI & LLM integrations, server-side tracking: weekly real case analyses.

Recent Emails
  • Turning Typography Rules into Prompts with Vibe Coding
  • Data Loss Analysis After GA4 Consent Mode v2
  • E-commerce Code Review Automation with Gemma 4
  • Shopify Flow: Auto Pricing Strategy on Low Stock
  • Server-side Tracking Setup with Cloudflare Workers
...and more
analytics

Reading URLs for Tracking: Gateway Design, ITP and Pixel Sandbox

How URL parts (scheme, host, path, query, fragment) impact tracking. Server-side gateway design, first-party context, Safari LTP and Safari 26 AFP, Shopify Custom Pixel sandbox pitfalls.

6/11/2019 Updated
analytics

Advertising Measurement Within Consent Limits: Google's Signal Architecture

Which measurement signals still work, legally and ethically, when a user declines consent? Consent Mode V2 ping architecture, gcs/gcd parameters, wbraid/gbraid, modeled conversions and Enhanced Conversions.

4/8/2026 Updated
analytics

Why Google Ads and GA4 Conversions Never Match: Counting Unit and Time Axis

Why does the conversion count in Google Ads differ from purchases in GA4? Six columns across two dashboards count the same order with different units and write it to different days. The two axes to align before any comparison.

8/15/2026
analytics MEMBERS ONLY

Fractional Conversions in the Ads Dashboard: The Model or the Date Range?

What does a fractional value like 0.29 against a single order in Google Ads actually mean? DDA's credit distribution and the report date range side effect get conflated. The test that separates them, a measured total preservation at account level, and how the lookback window changes things.

8/15/2026
analytics MEMBERS ONLY

Joining Google Ads and GA4 at Row Level: A Shared Key and a Two-Layer Reading

Instead of putting two dashboard totals side by side, join at row level on an identifier present in both. How the join key is chosen, the precondition in the Ads Webpages report, the three-bucket reading, and the measured ceiling of first-party cookie capture.

8/15/2026
analytics SUBSCRIBERS ONLY

Connecting a Shopify Order to an Ad Click: Choosing a Join Key for Offline Conversions

The ad platform wants a click ID for offline conversion upload, but the Shopify order does not carry one. The cart attribute path only works going forward, so it cannot serve a backfill request. Using GA4 as a join table, the cart token naming trap, and the consent ceiling both paths share.

8/6/2026
analytics

Are ChatGPT Ads a Measurable Channel? Preparing Before Access

ChatGPT ads are a measurable channel: the pixel, the Conversions API, and dedup together give a solid base. The real insight is that the measurement infrastructure can be built today, before access arrives in your market. The healthy setup I recommend (deployment via GTM and sGTM, consent with a CMP, cross-validation with GA4 and cookieless tools) already applies to every ad channel; when access lands, getting the ID from Ads Manager and starting is all that is left.

6/23/2026
analytics

Common Value-Sending Mistakes in OpenAI Ads: Decimal or Minor Unit?

OpenAI Ads expects monetary value as an integer in ISO 4217 minor units: 2599 for $25.99. The most common mistake is sending a decimal, because Meta CAPI, GA4, and Google Ads gtag all use decimals (25.99). Other traps: mis-scaling zero-decimal currencies like JPY, sending amount without currency, and confusing the Google Ads API micros value.

6/21/2026
analytics

OpenAI Ads Identity Matching and Privacy: SHA-256, oppref, and opt_out

OpenAI Ads uses the identity fields in the user object to bind a conversion to an ad interaction. Email and external ID are hashed with SHA-256 and sent as lowercase 64-character hexadecimal strings; raw email, external ID, and phone are never sent. This post explains identity matching, the hashing rules, and the oppref and opt_out fields.

6/17/2026
analytics

The OpenAI Ads Event Taxonomy: Which Event When, With Which Data Shape

OpenAI Ads defines eleven standard events and four data shapes (contents, customer_action, plan_enrollment, custom). Each event is bound to a specific shape: order_created and checkout_started use contents, lead_created uses customer_action, subscription_created uses plan_enrollment. This reference lists when each event fires and the fields of each shape.

6/15/2026
analytics

Dedup in OpenAI Ads: Not Counting the Same Conversion Twice

When the pixel and the Conversions API send the same conversion, double-counting happens. OpenAI Ads deduplicates it with three components: Pixel ID, event name, and event_id, keeping the pixel event_id equal to the server id. This guide shows how to generate a stable event_id, match on both sides, and the common mistakes.

6/13/2026
analytics

Sending Server-Side Conversions with the Conversions API: An OpenAI Ads Guide

The OpenAI Ads Conversions API sends conversion events server-to-server: a POST to the bzr.openai.com/v1/events endpoint with your Pixel ID and API key. This guide shows the request structure, the event fields and their required rules, the batch behavior, testing with validate_only, and dedup with the pixel.

6/11/2026
analytics

Setting Up the OpenAI Ads JavaScript Pixel: A Step-by-Step Guide

Setting up the OpenAI Ads pixel takes three steps: add the snippet to the head of every page, pass your Pixel ID with oaiq('init'), and call oaiq('measure') when a conversion happens. This guide shows the install snippet, the init and measure calls, standard and custom event examples, and the testing steps.

6/9/2026
analytics

OpenAI Ads Measurement Architecture: How the Pixel and Conversions API Work Together

OpenAI Ads conversion measurement rests on two layers: the browser JavaScript pixel and the server-side Conversions API. This post explains what each layer captures, why both are needed, and how they reconcile the same conversion without double-counting, conceptually, without diving into setup steps.

6/7/2026
analytics

Who Can Access ChatGPT Ads: Geographic Eligibility and Category Restrictions

ChatGPT ads (OpenAI Ads) are open as of June 2026 only to advertisers based in the US, Canada, Australia, and New Zealand. Türkiye is not yet eligible as an advertiser. The business location and category in the Ads Manager form determine eligibility; this post covers who can access it, which categories are excluded, and what can be done from a non-eligible region.

6/5/2026