Log in / Create free account🌐 ES☀️

Advanced training · Module 18 — ChatGPT Ads — measurement and traffic quality

Advanced measurement in ChatGPT Ads: sending the conversion from your server without losing the trail

⏱️ 7 min read · 🤖 ChatGPT Ads 📐 Measurement · updated on 2026-09-18

The ChatGPT Ads pixel is the short route to measurement, and on many websites it's enough. But it goes blind in a very common case: a conversion that doesn't finish on the page where it's installed.

It happened to us: our sign-up is completed in the client dashboard, not on the website, so we send it from the server. This is what we learnt, traps included — without going into how it is coded, which is a job for whoever handles your development. No pixel yet? Start with "Measuring from day one", in the Intermediate module.

When the pixel isn't enough

Then it is time to send the conversion from your server. OpenAI publishes a route for exactly that, set up by whoever handles your development (it is in the sources at the foot). You want it when:

The usual approach is to combine both and deduplicate.

The thread you can't lose: the oppref

Whoever clicks your ad arrives with a click identifier in the URL: the oppref. The pixel captures it and stores it in a first-party cookie, __oppref. On the server nobody does that for you: collect it and send it with the event exactly as it came.

The challenge is carrying it through to the conversion, perhaps on another domain and days later: a hidden form field, a parameter in the link or your database will do. We store it on the website on arrival and retrieve it on the server.

Deduplication: one conversion, one count

If the same conversion arrives through the pixel and from your server, OpenAI counts it once when the pixel, the event name and the event identifier all match.

⚠️ Pitfall: that identifier is named differently on each side, so it is easy to send two different values and count the sale twice. Decide it yourself, once — the order number, for example — and insist the same one is used on the website and on the server.

The data type of each event

Each standard event has to come with specific data and, if it doesn't match, the whole send is rejected: it isn't just that conversion that fails, it is every one travelling with it. It happened to us for copying an official purchase example to send a sign-up. These are the events the platform accepts today:

Event What it measures
registration_completed Registration completed
lead_created Lead created
appointment_scheduled Appointment booked
app_installed App installed
app_opened App opened
order_created Order placed (purchase)
checkout_started Checkout started
items_added Added to basket
contents_viewed Content viewed
page_viewed Page viewed
subscription_created Subscription created
trial_started Trial started
custom Custom event

Two more rules, so you can brief the work properly: amount and currency always travel together (one without the other is no good), and the custom event carries a name you choose that cannot clash with any standard one.

💡 Ninja trick: ask for the first test to be sent with OpenAI's dry-run check, the one that validates the send without recording anything. Errors then show up before they pollute your history.

The hashed email: better attribution, still personal data

You can add the customer's email hashed with SHA-256 to improve attribution. Normalise it first (no stray spaces, all lowercase): "Ana@Example.com" and "ana@example.com" produce different hashes.

⚠️ Pitfall: hashing isn't anonymising. A hashed email is still personal data: we declared it in our privacy policy before sending it. This isn't legal advice; check it with whoever handles your data protection.

The pixel's automatic advanced matching does something similar on its own: it detects customer information on your website (such as form entries) and hashes it with SHA-256 in the browser. The documentation doesn't explain how to switch it off, so mention it in your privacy policy too.

Attribution: which window counts

Line up the windows before comparing with Google Ads or your analytics.

Conversion campaigns: a single standard event

You need exactly one active standard event as the goal; custom events can't be used for optimisation. And it needs volume: if you sell little, optimising towards leads or sign-ups may suit you better. The objective and the event can't be changed later: you'd have to create another campaign. And since bidding by value doesn't exist, choosing THAT event well is the only way to ask the bidding for quality.

The pixel starts measuring unless told otherwise: in Europe it has to be left switched off before it is initialised and turned on only when the person accepts advertising (anything blocked isn't resent afterwards). On the server the filter is yours: apply your cookie banner's criteria before forwarding the oppref or the email, and stop if someone withdraws consent. We checked it in September 2026: server-side sending carries no consent field at all, so nobody will filter for you.

Two keys that get mixed up

Ads Manager has two different keys, and we mixed them up:

Both live on your server, never in your website's code: anyone holding one can spend your money or fake your data.

What to remember

📎 Sources and further reading

⚠️ Free training with no support. Ninja Scripts support channels (email and Telegram) are only for the use of the scripts, not for Google Ads questions or questions about this training.

Pick up here

After →Setting up conversions in Ads Manager, step by stepChatGPT Ads — measurement and traffic qualityRelatedWhere does your ad send people? The link that breaks most campaignsAdvertising in ChatGPT: first stepsRelatedWhy your clicks and your visits never match (and when to worry)Advertising in ChatGPT: first stepsRelatedChatGPT Ads case study: late-night mobile traffic, and how to move to office hours and desktop onlyChatGPT Ads in depth — ads, bidding and optimisationRelatedDiary of our campaign, day by dayChatGPT Ads — the platform, the market and our diary

See the full syllabus

🎓
You're reading the Ninja Academy in the open

Create your free account (no card) to save your progress, take the graded quizzes, earn the Basic level certificate and unlock part of the Intermediate and Advanced training.

Create my free account →
🥷

Subscriber feature

This option is part of Ninja Scripts’ paid subscriptions.

See the subscription →