{"id":372038,"date":"2026-09-28T21:03:49","date_gmt":"2026-09-28T21:03:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/conversion-tracking-for-openai-ads\/"},"modified":"2026-09-29T15:57:29","modified_gmt":"2026-09-29T15:57:29","slug":"webaround-pixel-conversions-api-for-openai-ads","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/webaround-pixel-conversions-api-for-openai-ads\/","author":23569743,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.3.0","stable_tag":"0.3.0","tested":"7.1.2","requires":"6.4","requires_php":"8.2","requires_plugins":null,"header_name":"Webaround Pixel and Conversions API for OpenAI Ads","header_author":"Webaround","header_description":"Measurement Pixel and Conversions API for OpenAI Ads, with browser\/server deduplication. An independent community integration, not affiliated with OpenAI.","assets_banners_color":"0c1416","last_updated":"2026-09-29 15:57:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/webaroundlabs\/openai-ads-toolkit","header_author_uri":"https:\/\/webaround.ro","rating":0,"author_block_rating":0,"active_installs":0,"downloads":79,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.3.0":{"tag":"0.3.0","author":"webaround","date":"2026-09-29 15:57:29","revision":3719400}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3717932,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3717932,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717911,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717911,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3719592,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Webaround Pixel and Conversions API for OpenAI Ads\",\"description\":\"Opens on the plugin's own screen, with Contact Form 7 installed so the integrations list has something real in it.\",\"categories\":[\"Analytics\"]},\"preferredVersions\":{\"php\":\"8.2\",\"wp\":\"latest\"},\"features\":{\"networking\":true},\"landingPage\":\"\\\/wp-admin\\\/admin.php?page=webaround-pixel-conversions-api-for-openai-ads\",\"steps\":[{\"step\":\"login\",\"username\":\"admin\",\"password\":\"password\"},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"contact-form-7\"},\"options\":{\"activate\":true}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"wp-consent-api\"},\"options\":{\"activate\":true}},{\"step\":\"setSiteOptions\",\"options\":{\"blogname\":\"Example Store\",\"openai_ads_settings\":{\"pixel_id\":\"px_7QK3F9ZM2T\",\"pixel_enabled\":true,\"capi_enabled\":true,\"strip_query_string\":true,\"use_scheduler\":true,\"debug\":true,\"consent_mode\":\"auto\"}}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"webaround-pixel-conversions-api-for-openai-ads\"},\"options\":{\"activate\":true}}]}"}},"all_blocks":[],"tagged_versions":["0.3.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3717911,"resolution":"1","location":"assets","locale":"","width":1280,"height":1082},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3717911,"resolution":"2","location":"assets","locale":"","width":1280,"height":956},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3717911,"resolution":"3","location":"assets","locale":"","width":1280,"height":1002}},"screenshots":{"1":"General - the Pixel, the Conversions API, and a connection test.","2":"Integrations and consent - what was found, and what is in use.","3":"Tag manager endpoint - an address your tag manager can post to."}},"plugin_section":[],"plugin_tags":[216196,986,195844,194533,286],"plugin_category":[36],"plugin_contributors":[283263],"plugin_business_model":[],"class_list":["post-372038","plugin","type-plugin","status-publish","hentry","plugin_tags-chatgpt","plugin_tags-conversion-tracking","plugin_tags-conversions-api","plugin_tags-openai","plugin_tags-woocommerce","plugin_category-analytics","plugin_contributors-webaround","plugin_committers-webaround"],"banners":{"banner":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/banner-772x250.png?rev=3717911","banner_2x":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/banner-1544x500.png?rev=3717911","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/icon-128x128.gif?rev=3717932","icon_2x":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/icon-256x256.gif?rev=3717932","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/screenshot-1.png?rev=3717911","caption":"General - the Pixel, the Conversions API, and a connection test."},{"src":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/screenshot-2.png?rev=3717911","caption":"Integrations and consent - what was found, and what is in use."},{"src":"https:\/\/ps.w.org\/webaround-pixel-conversions-api-for-openai-ads\/assets\/screenshot-3.png?rev=3717911","caption":"Tag manager endpoint - an address your tag manager can post to."}],"raw_content":"<!--section=description-->\n<p>Adds the OpenAI Ads Measurement Pixel to your site and sends the same conversions\nfrom your server through the Conversions API (CAPI), so a conversion measured in\nboth places is counted once rather than twice.<\/p>\n\n<p>OpenAI Ads are the ads that run in ChatGPT. If you buy them, this is how your\nsite tells OpenAI which visits turned into leads, orders or registrations - in\nthe browser, on the server, or both.<\/p>\n\n<p><strong>This is an independent community integration.<\/strong> It is not created, certified,\nendorsed or supported by OpenAI. \"OpenAI\" and \"ChatGPT\" are trademarks of OpenAI.<\/p>\n\n<h4>What it does<\/h4>\n\n<ul>\n<li>Loads the official OpenAI Ads Pixel, once, in your site head.<\/li>\n<li>Sends server-side conversions through the Conversions API, deduplicated against\nthe browser half by a shared event id.<\/li>\n<li>Hashes email addresses, phone numbers and names with SHA-256 before they leave\nyour server, using the normalization OpenAI documents.<\/li>\n<li>Strips query strings from the page address, so search terms and password-reset\ntokens do not reach an ad platform.<\/li>\n<li>Defers to your existing consent mechanism, so GDPR and ePrivacy choices your\nsite already collects are the ones that decide. It ships no cookie banner.<\/li>\n<li>Never makes the visitor wait: conversions go out after the page does, handed to\nAction Scheduler where the site has it.<\/li>\n<\/ul>\n\n<h4>Integrations<\/h4>\n\n<p>Contact Form 7, Elementor Forms, Gravity Forms, WPForms, Fluent Forms and Ninja\nForms are detected automatically. A lead is recorded when the submission is\naccepted, never when the button is clicked. Contact Form 7 and Elementor also fire\nthe matching browser event, sharing one event id.<\/p>\n\n<p>For ecommerce, <strong>WooCommerce<\/strong> measures product views, add to cart, checkout\nstart and paid orders. A purchase is reported only once payment is confirmed -\nnever for a pending, failed or cancelled order - and never twice, however many\ntimes the gateway or a webhook triggers it. Amounts use the currency's own minor\nunit.<\/p>\n\n<p><strong>Easy Digital Downloads<\/strong> reports a purchase once payment completes.\n<strong>WooCommerce Subscriptions<\/strong> reports trial_started or subscription_created.\n<strong>WordPress registration<\/strong> reports registration_completed, off by default because\nuser_register also fires for an administrator adding a colleague.<\/p>\n\n<p>Each can be switched off under OpenAI Ads -&gt; Integrations.<\/p>\n\n<h4>Tag manager endpoint<\/h4>\n\n<p>Optional, off by default. Lets Google Tag Manager hand a conversion to your site,\nwhich forwards it to OpenAI - server-side measurement without a paid GTM server\ncontainer. Protected by a generated secret.<\/p>\n\n<h4>For developers<\/h4>\n\n<p>Record a conversion at a confirmed boundary:<\/p>\n\n<pre><code>openai_ads_track( 'lead_created', [], [ 'event_id' =&gt; $lead_id, 'user' =&gt; [ 'email' =&gt; $email ] ] );\n<\/code><\/pre>\n\n<p>Also <code>openai_ads_event_id()<\/code>, <code>openai_ads_pixel_event()<\/code>, <code>openai_ads_hash_user()<\/code>,\n    openai_ads_image_tag() and <code>openai_ads_is_configured()<\/code>, plus filters and actions\nfor consent, event data, identity and integrations. Every event OpenAI documents\nfor the web is supported, plus custom.<\/p>\n\n<p>Full documentation: https:\/\/github.com\/webaroundlabs\/openai-ads-toolkit<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to OpenAI in order to measure advertising conversions. That\nis its entire purpose, and nothing happens until you enter a Pixel ID or an API\nkey.<\/p>\n\n<h4>Which services, and only which<\/h4>\n\n<p>Three addresses, all of them OpenAI's:<\/p>\n\n<ul>\n<li>https:\/\/bzrcdn.openai.com\/sdk\/oaiq.min.js - the browser SDK, when the Pixel is on<\/li>\n<li>https:\/\/bzr.openai.com\/v1\/events - the Conversions API, from your server<\/li>\n<li>https:\/\/bzr.openai.com\/v1\/sdk\/events - the image tag, only if you call it<\/li>\n<\/ul>\n\n<p>There is no fourth. The plugin sends nothing to its author or to any analytics,\ntelemetry or licensing service.<\/p>\n\n<h4>1. The OpenAI Ads Measurement Pixel<\/h4>\n\n<p>When the Pixel is on, the plugin loads https:\/\/bzrcdn.openai.com\/sdk\/oaiq.min.js\ninto your pages and initializes it with your public Pixel ID. That script is\nwritten and hosted by OpenAI. It sets first-party cookies named __oppref and\n__obref to remember which advertisement a visitor arrived from.<\/p>\n\n<p>WHAT IS SENT: the event name, a deduplication id, the page address, the amount and\ncurrency where the event carries one, and - only when your site supplies it -\nidentity as irreversible SHA-256 hashes. It runs in the visitor's browser, so their\nIP address and user agent reach OpenAI as part of the request. A commerce event\nalso carries the basket: each item's SKU or product id, name, quantity, line price\nand variation attributes. Product names are not hashed: hashing identifies a person.<\/p>\n\n<p>WHEN: on any page view, once you have enabled the Pixel.<\/p>\n\n<h4>2. The OpenAI Ads Conversions API<\/h4>\n\n<p>When server-side events are on, your server sends conversions to\nhttps:\/\/bzr.openai.com\/v1\/events using the API key you provide.<\/p>\n\n<p>WHAT IS SENT: the same event data as above, including the basket detail, plus the\nvisitor's IP address and user agent, the two attribution values read from the\n__oppref and __obref cookies, and the page address the conversion happened on.\nEmail addresses, phone numbers, names and customer ids are hashed with SHA-256 on\nyour server before they leave it - the raw values are never transmitted.<\/p>\n\n<p>WHEN: after a conversion your site confirms - a paid order, an accepted form\nsubmission - and never on a page view.<\/p>\n\n<h4>3. The image tag<\/h4>\n\n<p>Only if you call openai_ads_image_tag() yourself. It requests a 1x1 image from\nhttps:\/\/bzr.openai.com\/v1\/sdk\/events, carrying the event name, the deduplication\nid and the amount - and no personal data of any kind, by design.<\/p>\n\n<h4>Terms and privacy<\/h4>\n\n<p>OpenAI's terms: https:\/\/openai.com\/policies\/\nOpenAI's privacy policy: https:\/\/openai.com\/policies\/privacy-policy\/\nAdvertising documentation: https:\/\/developers.openai.com\/ads\/<\/p>\n\n<h4>Your responsibilities<\/h4>\n\n<p>Sending a visitor's data to OpenAI is a disclosure to a third party. You are\nresponsible for saying so in your own privacy policy and for obtaining consent\nwhere the law requires it. The plugin adds suggested wording under Tools -&gt;\nPrivacy for you to adapt.<\/p>\n\n<p>The plugin helps rather than decides. It detects a consent plugin - the WP Consent\nAPI and Complianz are read directly - and when consent for the \"marketing\"\ncategory is refused, no Pixel is loaded and no event is constructed. If it finds\nno consent mechanism at all it measures everybody, and says so on its settings\nscreen. That default is deliberate: a plugin that silently measured nothing would\nleave you hunting for the fault.<\/p>\n\n<h4>What is NOT sent<\/h4>\n\n<ul>\n<li>No raw email address, phone number or name. Ever. Only SHA-256 hashes.<\/li>\n<li>No query strings from your page addresses by default.<\/li>\n<li>No data at all until you enter credentials, and none for a visitor who has\nrefused marketing consent.<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate the plugin.<\/li>\n<li>Go to OpenAI Ads in the admin menu and enter your Pixel ID and Conversions API\nkey.<\/li>\n<li>Open Integrations and read what the Consent section reports. If it found none,\ndecide what you want before going further.<\/li>\n<li>Use \"Send a test event\" on the General screen. It uses the API's validation\nmode, so no fake conversion is recorded.<\/li>\n<\/ol>\n\n<p>Nothing requires editing a file. To keep credentials out of the database, define\nthem as constants in wp-config.php instead.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20does%20deduplication%20actually%20do%3F\"><h3>What does deduplication actually do?<\/h3><\/dt>\n<dd><p>A purchase measured in the browser and again on the server is one purchase, but\ntwo reports. Both halves send one event id, so OpenAI counts one conversion.<\/p><\/dd>\n<dt id=\"do%20i%20need%20the%20conversions%20api%20key%2C%20or%20is%20the%20pixel%20enough%3F\"><h3>Do I need the Conversions API key, or is the Pixel enough?<\/h3><\/dt>\n<dd><p>The Pixel alone works, and needs only a Pixel ID. It is also the half an ad\nblocker or a failed script can remove. The API key adds the server-side half,\nwhich nothing in the browser can block - and because the two are deduplicated,\nadding it inflates nothing.<\/p><\/dd>\n<dt id=\"i%20have%20no%20cookie%20banner.%20what%20happens%3F\"><h3>I have no cookie banner. What happens?<\/h3><\/dt>\n<dd><p>Everything is measured, and the settings screen tells you so in as many words.\nThat default is deliberate: the alternative is a plugin that silently measures\nnothing while you hunt for the fault. Install a banner supporting the WP Consent\nAPI and it is used automatically.<\/p><\/dd>\n<dt id=\"can%20i%20use%20this%20with%20google%20tag%20manager%3F\"><h3>Can I use this with Google Tag Manager?<\/h3><\/dt>\n<dd><p>Yes, and without a paid server-side container. Switch on the collection endpoint\nand point a tag at it; the API key never leaves your server.<\/p><\/dd>\n<dt id=\"does%20this%20slow%20down%20my%20site%3F%20do%20i%20need%20woocommerce%3F\"><h3>Does this slow down my site? Do I need WooCommerce?<\/h3><\/dt>\n<dd><p>No, and no. Conversions are never sent while the visitor is waiting, and\nWooCommerce is optional - where it is installed, the plugin reuses its queue.<\/p><\/dd>\n<dt id=\"will%20a%20measurement%20failure%20break%20my%20checkout%3F\"><h3>Will a measurement failure break my checkout?<\/h3><\/dt>\n<dd><p>No. If reporting fails the plugin logs it and moves on. The order, form submission\nor registration still completes.<\/p><\/dd>\n<dt id=\"is%20my%20api%20key%20exposed%3F\"><h3>Is my API key exposed?<\/h3><\/dt>\n<dd><p>No. It is used only server-side and is never printed into a page. The plugin's test\nsuite asserts this.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.3.0<\/h4>\n\n<ul>\n<li>Renamed to Webaround Pixel and Conversions API for OpenAI Ads. Your settings,\nand anything built on the openai_ads_* functions and hooks, are unaffected -\nbut the address of the settings screen changed, so update a bookmark.<\/li>\n<li>Scripts are now registered with WordPress rather than printed into the page,\nwhich lets caching and optimisation plugins see them.<\/li>\n<li>Translations now come from translate.wordpress.org instead of being bundled.<\/li>\n<\/ul>\n\n<h4>0.2.1<\/h4>\n\n<ul>\n<li>Fixed: the three consent-mode labels on the settings screen were never\ntranslatable, so they stayed English in every language.<\/li>\n<li>Clean pass of the official Plugin Check tool.<\/li>\n<\/ul>\n\n<h4>0.2.0<\/h4>\n\n<ul>\n<li>Translated into Bulgarian, Dutch, French, German, Greek, Hungarian, Polish,\nPortuguese, Romanian and Spanish.<\/li>\n<li>Suggested privacy policy wording now appears under Tools -&gt; Privacy.<\/li>\n<li>Corrected this readme: with no consent mechanism installed the plugin measures\neverybody and says so on its settings screen. A section claimed otherwise.<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>The settings moved into their own menu: General, Integrations, Tag manager.<\/li>\n<li>Fixed: saving one settings screen could blank the settings on another.<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>No change to this plugin.<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>First release: Pixel, Conversions API, deduplication and the first three\nintegrations.<\/li>\n<\/ul>","raw_excerpt":"OpenAI Ads Measurement Pixel and Conversions API (CAPI) for WordPress and WooCommerce, deduplicated so a conversion counts once.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/372038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=372038"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webaround"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=372038"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=372038"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=372038"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=372038"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=372038"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=372038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}