ChatGPT conversion tracking that survives ad blockers
Convrail sends every conversion twice, once from the browser through the OAIQ pixel and once from your order webhooks through the Conversions API, with the same event ID. OpenAI keeps one copy, your bidding trains on the full picture, and no email or phone number ever leaves in clear text.
Why one pixel is not enough
A browser pixel is the easiest thing to install and the easiest thing to lose. Ad blockers, consent banners that fire late, Safari storage limits and closed tabs all remove events before they reach OpenAI. The Conversions API closes the gap by sending the same events from your server, where nothing is blocked. The two layers only work together when each event carries one shared identifier: without it, OpenAI counts the sale twice and your oCPC bids learn from inflated numbers.
✗ pixel only: part of your conversions never reach the auction
✓ browser + server with one event_id: complete and counted once
How it works
The pixel is installed without touching your theme
On Shopify, Convrail registers a web pixel through the official Web Pixel API. It runs in the sandbox Shopify provides and follows the store’s customer privacy settings. On WooCommerce, the plugin adds the snippet through
wp_footer.Each event is fired from the browser
The pixel implements the OAIQ protocol natively: it captures the
opprefclick identifier from the landing URL, stores it in a first-party cookie for 7 days, and fires the event to OpenAI’s image endpoint with your pixel ID.The same event is relayed to Convrail
The pixel posts a compact copy of the event to Convrail with the same
event_id. No personal data is included at this step.Orders arrive server-side from your webhooks
When Shopify or WooCommerce fires the paid-order webhook, Convrail builds an
order_createdevent with the IDorder_<orderId>, the exact same ID the pixel used at checkout. Emails and phone numbers are SHA-256 hashed at this moment, before anything is stored.Events are batched and sent to the Conversions API
Events are grouped per store in batches of up to 1,000, the limit of the API, and sent with a bearer token. Failed batches retry with exponential backoff; after the last attempt they land in a dead-letter queue and open a health alert instead of vanishing.
Events that are tracked
Convrail maps the standard storefront events to the OAIQ taxonomy. Amounts are converted to minor units (2599 for 25.99 EUR) as the API requires, with zero-decimal and three-decimal currencies handled correctly.
| Store event | OAIQ event | Sent from |
|---|---|---|
| page_viewed | page_viewed | browser |
| product_viewed, collection_viewed | contents_viewed | browser |
| search_submitted | page_viewed | browser |
| product_added_to_cart | items_added | browser |
| checkout_started | checkout_started | browser |
| checkout_completed | order_created | browser and server, one event_id |
Personal data never leaves in clear text
Advanced matching improves attribution, but it must not turn into a data leak. Convrail normalizes and hashes emails and phone numbers with SHA-256 before storing or sending them, so the only user fields that reach OpenAI are emails_sha256, external_ids_sha256, IP address and user agent.
- An automated guard inspects every outgoing payload and refuses to send it if it contains an email pattern, a forbidden key such as
email,phoneorfirst_name, or a hashed field that is not a valid digest. - The guard is covered by an automated test that tries to smuggle clear personal data through and must fail.
- Hashed values are validated as 64 lowercase hexadecimal characters; anything else is rejected before the network call.
- GDPR webhooks are honored: a customer deletion request purges their events by hashed identifier; a store uninstall purges the store.
- When the visitor has declined tracking, the event is recorded as
skipped_consentand never sent.
Reliability you can audit
| Mechanism | What it does |
|---|---|
| Batching | Up to 1,000 events per request, flushed by size or after a short delay |
| Retries | Exponential backoff on 429 and 5xx responses; 4xx responses are not retried |
| Dead-letter queue | Batches that exhaust their attempts are kept with the HTTP status and error summary |
| Replay safety | Exact duplicates (same store, event ID and source) are stored once; OpenAI deduplicates browser and server copies by ID |
| Test mode | New stores start in test mode: events are validated by OpenAI with validate_only and never counted |
| Live credential check | Your pixel ID and API token are verified against OpenAI when you save them |
The Events screen in the app shows every event with its source, status and timestamp, so you can watch a browser event and its server twin arrive side by side.
Frequently asked questions
Do I need to edit my theme to install the pixel?
No. On Shopify the pixel is registered through the Web Pixel API and runs in Shopify’s sandbox. On WooCommerce the plugin injects it. Uninstalling removes it completely.
Will OpenAI count my sales twice?
No. The browser event and the server event share the same event ID, `order_<orderId>`, and OpenAI deduplicates on that ID. Sending both is the recommended setup: the browser copy carries the click context, the server copy carries the hashed customer data.
What happens when the Conversions API is down?
Batches retry with exponential backoff. If all attempts fail, the batch is parked in a dead-letter queue with its error, and a health alert opens in the app and by email. Nothing is silently dropped.
Which customer data is sent to OpenAI?
Only SHA-256 hashes of the email and customer ID, plus IP address and user agent, as OpenAI’s advanced matching expects. An automated guard blocks any payload that contains personal data in clear text.
Can I test without polluting my real data?
Yes. Every store starts in test mode, where events are sent with OpenAI’s `validate_only` flag: they are checked for format but never recorded. Switch to live mode from the settings when you are ready.
How long is the attribution window?
The `oppref` click identifier is stored in a first-party cookie for 7 days, matching OpenAI’s click attribution window. Orders placed within that window carry the identifier to both the pixel and the server event.
Related guides
Measure the ChatGPT channel this week
Free during early access while we onboard the first stores. Leave your email and we send the install link when your spot opens.