# SweetCode — full content dump
Generated 2026-08-12T20:40:49.990Z. Source: https://sweetcode.com
---
# Google Automated Discounts for WooCommerce
URL: https://sweetcode.com/docs/gadwc
# Google Automated Discounts for WooCommerce
Google Automated Discounts for WooCommerce is an essential plugin for enhancing your Google Shopping campaigns by automatically applying discounts. This tool optimizes your product pricing in Shopping ads, helping to increase sales and maximize revenue. By integrating this plugin, you can seamlessly manage discounts within your WooCommerce store, ensuring a smooth shopping experience for your customers.
To get started with Google Automated Discounts, follow our straightforward [3-step setup guide](https://sweetcode.com/docs/gadwc/setup). By following these steps, you can effectively implement automated discounts, optimizing your campaigns for better performance and profitability.
New: The requirement to have at least 1,000 clicks per week on your Google Shopping campaigns was lifted in the summer of 2024. Now any shop can participate.
## Support Articles
- [3-step Setup Guide](https://sweetcode.com/docs/gadwc/setup) — Installation and basic configuration
- [Business Requirements](https://sweetcode.com/docs/gadwc/business-requirements) — What your shop needs to qualify
- [Technical Requirements](https://sweetcode.com/docs/gadwc/technical-requirements) — Server and store prerequisites
- [Configuration](https://sweetcode.com/docs/gadwc/configuration) — All configuration options
- [Testing](https://sweetcode.com/docs/gadwc/testing) — Verify that discounts are applied correctly
- [Logger](https://sweetcode.com/docs/gadwc/logger) — Inspect what the plugin is doing
- [Scenarios](https://sweetcode.com/docs/gadwc/scenarios) — How discounts behave in common situations
- [Remarks](https://sweetcode.com/docs/gadwc/remarks) — Additional notes worth knowing
- [Troubleshooting](https://sweetcode.com/docs/gadwc/troubleshooting) — Common issues and solutions
- [Implementation Recipes](https://sweetcode.com/docs/gadwc/implementation-recipes) — Ready-made solutions for specific setups
- [Auto Pricing Min Price](https://sweetcode.com/docs/gadwc/auto-pricing-min-price) — Control the lowest price Google may set
- [Developers](https://sweetcode.com/docs/gadwc/developers) — Hooks, filters, and technical details
- [Limitations](https://sweetcode.com/docs/gadwc/limitations) — What the plugin cannot do
- [FAQ](https://sweetcode.com/docs/gadwc/faq) — Frequently asked questions
- [License Management](https://sweetcode.com/docs/gadwc/license-management) — Activate and manage your license
- [Videos](https://sweetcode.com/docs/gadwc/video) — Video walkthroughs
---
# Auto Pricing Min Price
URL: https://sweetcode.com/docs/gadwc/auto-pricing-min-price
# Auto Pricing Min Price
:::info
Available since version `1.0.11`
:::
The plugin offers a way to set the Auto Pricing Min Price on each product. The field can then be ingested by a feed plugin and output into the Google Merchant Center feed.
The main settings are:
- A settings field for saving an Auto Pricing Min Price manually on each product.
- For automatic calculation and batch processing, the plugin offers a filter that can be used to calculate an Auto Pricing Min Price.
- The automatic calculation happens each time a product is updated manually. But, if a shop manager chooses to upload product updates with an import plugin, the automatic calculation may not be triggered. In that case, the batch regeneration on all products of the Auto Pricing Min Price can be triggered manually or by activating a nightly, recurring batch process.
## Manual Setting
Once enabled, you will see a new field in the pricing section of each product where you can set your Auto Pricing Min Price.
The manually set prices are saved in a meta field with the key `_google_auto_min_price_man`. This is the field you can use in your feed plugin to retrieve the manually set prices.

## Automatic Calculation
When you have dozens, hundreds, or thousands of products, automatically calculating the Auto Pricing Min Price may be more convenient.
For this case, the plugin offers a filter that can be used to calculate the Auto Pricing Min Price with any type of rule that you can imagine.

The automatic calculation is always triggered on a specific product when you manually update the product through the backend. However, if you upload product updates, such as prices, through some sort of import, the automatic calculation is not triggered. In that case, have a look at the [scheduled](#scheduled-regeneration) and [manual batch update](#instant-regeneration) features.
The automatically set prices are saved in a meta field with the key `_google_auto_min_price_calc`. This is the field you can use in your feed plugin to retrieve the automatically set prices. If a manually set field is present for a particular product, it will override the calculation and be saved in the same `_google_auto_min_price_calc` meta field. So you can use this field to retrieve all prices for your feed, the calculated prices and manual overrides.
Following, we provide several examples for the Auto Pricing Min Price calculation filter:
## Example: How the filter works
```php title="/wp-content/themes/child-theme/functions.php"
/**
* The filter provides a default value, which is null, and the product object.
*
* As output you need to return either a int or float value, or null if no calculated price can be determined.
*
* This example subtracts 1 from the regular price and returns that as new calculated value.
**/
add_filter( 'sgadwc_google_auto_pricing_min_price_calculation', function ( $value, $product ) {
$regular_price = $product->get_regular_price();
return wc_format_decimal( $regular_price - 1, 2 );
}, 10, 2 );
```
## Example: Return a value that is lowered by a specific percentage of the profit margin
```php title="/wp-content/themes/child-theme/functions.php"
/**
* This example takes the regular price and the COGS (cost of goods sold) and
* calculates an Auto Pricing Min Price that reduces the regular price by 20% of the profit margin.
*
* If no COGS is available, null is returned.
**/
add_filter( 'sgadwc_google_auto_pricing_min_price_calculation', function ( $value, $product ) {
if (!function_exists( 'sgadwc_get_product_cogs' )) {
return null;
}
$regular_price = $product->get_regular_price();
$cogs = sgadwc_get_product_cogs( $product );
// Safeguard in case no COGS is set for this product
if (is_null( $cogs )) {
return null;
}
$margin = $regular_price - $cogs;
return wc_format_decimal( $regular_price - ( $margin * 0.2 ), 2 );
}, 10, 2 );
```
## Example: Reduce the regular price to a fixed percent
```php title="/wp-content/themes/child-theme/functions.php"
/**
* This example takes the regular price and lowers it to a fixed percentage.
**/
add_filter( 'sgadwc_google_auto_pricing_min_price_calculation', function ( $value, $product ) {
$regular_price = $product->get_regular_price();
return wc_format_decimal( $regular_price * 0.8, 2 );
}, 10, 2 );
```
## Example: Add a fixed amount to the COGS
```php title="/wp-content/themes/child-theme/functions.php"
/**
* This example takes COGS and adds a fixed amount to it.
**/
add_filter( 'sgadwc_google_auto_pricing_min_price_calculation', function ( $value, $product ) {
if (!function_exists( 'sgadwc_get_product_cogs' )) {
return null;
}
$cogs = sgadwc_get_product_cogs( $product );
// Safeguard in case no COGS is set for this product
if (is_null( $cogs )) {
return null;
}
return wc_format_decimal( $cogs + 4.5, 2 );
}, 10, 2 );
```
## Example: This is a complex example from a real webshop
```php title="/wp-content/themes/child-theme/functions.php"
/**
* This filter uses plenty of log outputs to help determine issues
* with calculations on products that are missing information.
**/
add_filter('sgadwc_google_auto_pricing_min_price_calculation', function ($value, $product) {
$logger_source = 'sgadwc-auto-min-price-calculation';
// If function get_product_condition does not exist, define it
if (!function_exists('get_product_condition')) {
function get_product_condition($product) {
$attributes = $product->get_attributes();
if (!isset($attributes['condition'])) {
return null;
}
if ($attributes['condition'] == 'New') {
return 'A';
}
if ($attributes['condition'] == 'Used') {
return 'U';
}
return null;
}
}
// Function to calculate the minimum price for a product
if (!function_exists('get_auto_min_price')) {
function get_auto_min_price($condition, $margin_percent, $regular_price) {
if ($condition == 'A') {
if ($margin_percent > 0.3) {
return $regular_price * 0.8;
} else {
return $regular_price * 0.85;
}
}
if ($condition == 'U') {
if ($margin_percent > 0.3) {
return $regular_price * 0.75;
} else {
return $regular_price * 0.85;
}
}
return null;
}
}
// Abort if the COGS function is not available
if (!function_exists('sgadwc_get_product_cogs')) {
return null;
}
// Get the COGS for this product
$cogs = sgadwc_get_product_cogs($product);
// Only continue to process if cost of goods sold is set, otherwise abort
if (empty($cogs)) {
wc_get_logger()->notice(
'COGS is empty or not defined for the product ' . $product->get_id(),
['source' => $logger_source]
);
return null;
}
// Get the regular price for the product
$regular_price = $product->get_regular_price();
// If no regular price is set, abort
if (empty($regular_price)) {
wc_get_logger()->notice(
'Regular price is empty for the product ' . $product->get_id(),
['source' => $logger_source]
);
return null;
}
// Calculate the margin on this product
$margin = $regular_price - $cogs;
// Calculate the margin percentage on this product
$margin_percent = $margin / $regular_price;
// If the margin is below 15%, abort
if ($margin_percent < 0.15) {
wc_get_logger()->notice(
'The margin is below 15% for the product ' . $product->get_id(),
['source' => $logger_source]
);
return null;
}
// Get the condition of the product
$condition = get_product_condition($product);
// If the condition is null, abort
if ($condition == null) {
$message = '';
// If the product is a variation, get the parent ID
if ($product->is_type('variation')) {
$parent_id = $product->get_parent_id();
$message = 'Condition is not defined for the variation ' . $product->get_id() . ' of the product ' . $parent_id;
} else {
$message = 'Condition is not defined for the product ' . $product->get_id();
}
wc_get_logger()->notice(
$message,
['source' => $logger_source]
);
return null;
}
// Calculate the auto min price
$auto_min_price = get_auto_min_price($condition, $margin_percent, $regular_price);
// If the auto min price is null, abort
if ($auto_min_price == null) {
wc_get_logger()->notice(
'Auto Min Price could not be calculated for product ' . $product->get_id(),
['source' => $logger_source]
);
return null;
}
// Always return a float with 2 decimals
return wc_format_decimal($auto_min_price, 2);
}, 10, 2);
```
## Scheduled Regeneration
Once activated the plugin will run a batch update of the calculated Auto Pricing Min Price at 3:25 am (local time) every morning.
It requires the [automatic calculation filter](#automatic-calculation) to be set.
The process is very resource efficient and reliable. It can run through thousands of products quickly while limiting memory use to 90% during execution.
Tests have shown that on an average server, it can process 10'000 products within 15 minutes.
## Instant Regeneration
You can trigger the batch regeneration of all products anytime you need to. This may be convenient after you've done a manual import and update of product prices during the day.
---
# Business Requirements
URL: https://sweetcode.com/docs/gadwc/business-requirements
# Business Requirements
Before starting to use the Google Automated Discounts plugin, you must make sure to meet the following business and technical requirements:
- Conversion reporting must contain cart data. You can achieve this by using the [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw#pricing-section). Here's how to set it up: [Guide to set up Conversion Cart Data](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-cart-data).
- The Google Merchant Center feed needs to contain the `cost_of_goods_sold` field for each product.
- The Google Merchant Center feed needs to contain the `auto_pricing_min_price` field for each product that you want to activate for Automated Discounts (products missing that field will be ignored by Automated Discounts). This plugin provides a feature with which you can set manually or calculate Auto Pricing Min Prices on each product. Those prices then can be ingested by a feed plugin and uploaded to the Google Merchant Center.
:::warning[Important]
If your shop operates outside of the USA or Canada Google Merchant Center requires you to upload the prices including the VAT ([source](https://support.google.com/merchants/answer/7052209)). This means that the `auto_pricing_min_price` field must **include** the VAT.
For the `cost_of_goods_sold` a different rule applies. The `cost_of_goods_sold` must be the cost of the product **without** the VAT. Because the profit margin is calculated using the product price field from the cart data which should not include the VAT as per Google's specification: [Set up Conversions with Cart Data](https://support.google.com/sa360/answer/9455407)
:::
For businesses that have yet to meet the necessary requirements, the transition can be a complicated and time-consuming endeavor, often necessitating significant strategic decisions.
At SweetCode, our team of seasoned professionals specializes in guiding businesses through this comprehensive process. If you are interested in engaging our services to help you not only achieve these requirements but also excel beyond them, please contact us through our [support form](https://sweetcode.com/support/).
---
# Configuration
URL: https://sweetcode.com/docs/gadwc/configuration
# Configuration
## Cache Exclusion for Automated Discounts
:::caution[This is important]
You need to make sure that all cache layers exclude caching of WooCommerce sessions and if the following parameters are set. Otherwise Automated Discounts will not be displayed and processed correctly.
:::
### Exclude caching if the URL query parameter `pv2` is present in the URL
Example: `https://example.com/socks/?pv2=1234`
Typically, caches exist in one or more of the following:
- Server of your hosting provider
- Caching plugins (sometimes shop managers use more than one caching plugin. Make sure to configure all of them.)
- Content Delivery Networks (CDNs) like Cloudflare.
Once you've set the cache exclusion, also make sure to flush the cache(s) before testing.
### Exclude caching if the the session cookie `sgadwc_session_active` is present
The plugin sets a cookie `sgadwc_session_active` when a visitor clicks on an Automated Discounts link.
Make sure that the cache is disabled if that cookie is present in the browser of the visitor.
### Test your cache exclusion
1. Go to the plugin settings page. You will find testing links.
:::caution
- The testing links expire within 7 days.
- The test only works with valid (not expired) testing links.
- In case you need new testing links, simply press the `Reset testing links` button.
:::

2. Right click on one of the testing links in the second column of the table **and open the link in an incognito window**.
The link contains an Automated Discounts payload. If everything has bee set up correctly, it will start a new WooCommerce session and display the discounted price.
3. Open the developer tools of your browser and go to the **Console** tab.
4. Check if the following text is present in the console: `Automated Discounts session active`

If you see the text `Automated Discounts session active` in the console, it means that the cache exclusion works correctly.
If you don't see the text `Automated Discounts session active` in the console, it means that the cache exclusion does not work correctly, or that your testing link has expired.
Our plugin will output debug messages in the console with more information about why the session could not be started. If you don't see any debug messages, it means that the cache exclusion is not working correctly.
## Cache Exclusion for WooCommerce Sessions
Make sure to follow WooCommerce's guidelines on [how to exclude caching for WooCommerce sessions](https://developer.woocommerce.com/docs/how-to-configure-caching-plugins-for-woocommerce/).
If the cache exclusion for WooCommerce sessions is not set correctly, the Automated Discounts program will not approve your shop for the program.
Cart session must be valid for at least 48 hours after a click on an Automated Discounts link.
## Google Merchant Center ID
1. Get the Google Merchant Center ID by logging into the Google Merchant Center and copying the ID from the URL.

2. Save the Google Merchant Center ID in the settings of the plugin.

## Order Info
The plugin will add a column to the order list and a column to the order item page in the WooCommerce backend. The columns will show if an order has been placed with an Automated Discount and how much the discount was.
### Order List Info
The plugin will add a column to the order list in the WooCommerce backend. The column will show if an order has been placed with an Automated Discount.
- Badge in color: The order contains items that have been discounted with Automated Discounts.
- Badge in gray: The order was created during an Automated Discounts session, but no order items have been discounted with Automated Discounts. That's when a visitor clicks on an Automated Discounts link in Google Shopping ads, but doesn't purchase any of the discounted products.

### Order Item Info
The plugin will add a meta box to the order item page in the WooCommerce backend. The meta box will show if an order has been placed with an Automated Discount and how much the discount was.

## Variations Discount Inheritance
If you have variable products with variations that have the same or similar prices, you may want to use the Variations Discount Inheritance feature.
An Automated Discount is only generated for specific product IDs in the Google Merchant Center feed, not for groups of products (such as product variations of the same parent product). If a visitor clicks on an Automated Discount ad for a specific product variation of a variable product, the discount will only be applied to that specific product variation.
Without the Variations Discount Inheritance feature, discounts on a product page will be lost when switching from one variation to another. With the Variations Discount Inheritance feature enabled, the new variation will inherit the discount.
The feature is disabled by default. You can enable it in the plugin settings.

### Use cases
For example, if you sell shoes in different sizes and colors, the shop visitors might click on an Automated Discount ad with a shoe color they like but get directed to the wrong shoe size. Once they are on the product page for that shoe, they will likely change the size. But they will lose the discount as it was only valid for the first variant. Enabling the Variations Discount Inheritance feature will ensure the new variation inherits the discount.
However, using Variations Discount Inheritance doesn't make sense in every case. If your variations have very different prices and/or product margins, inheriting the same discount for all variations may cause issues. This could be true if you are using variable products to sell new and used versions of the same product.
### Inheritance Logic
- **Only for variable products**: The Variations Discount Inheritance feature only works with variable products. It is not available for simple or other products.
- **Only inherit within the same product**: The Variations Discount Inheritance feature only inherits discounts to other variations of the same parent product.
- **Automated Discount clicks trigger inheritance**: Once a visitor clicks on an ad with an Automated Discount for a product variation, the discount will be inherited to all other variations of the same parent product.
- **Automated Discount clicks override inherited discounts**: If a visitor clicks on a second ad with an Automated Discount for another variation of the same parent product, the previously inherited discount on the second variation will be overwritten with the new discount.
- **The highest discount is inherited**: If the discount for the second ad click is higher than the discount for the first ad click, the higher discount will be inherited to all other variations of the same product (except the variations that are in a specific Automated Discounts session).
- **The lowest sale price rules**: If a variation is about to receive a discount through inheritance but has an existing sale price lower than the price calculated through the inherited discount, the lower sale price will be used.
- **Parent product**: If you upload parent products instead of variable products to the Google Merchant Center, the plugin will also inherit discounts from parent products to their variations. As a reference price for the parent product, the plugin will use the lowest regular price of all variations of that parent product.
- **COG overrules**: If a variation is about to receive a discount through inheritance but has an existing Cost of Good (COG) price set that is higher than the price calculated through the inherited discount, the COG price will be used. (This works with the following COGS plugins: [WooCommerce Cost of Goods by SkyVerge](https://woo.com/products/woocommerce-cost-of-goods/) and [Cost of Goods Sold by WPFactory](https://wpfactory.com/item/cost-of-goods-for-woocommerce/)).
### Discount Type to Inherit
Google sends a fixed discounted price in the payload of the Automated Discount link (eg. 23.50).
There are two ways in which the plugin allows the discount to be inherited: Fixed Price Discount Inheritance and Percentage Discount Inheritance.
#### Fixed Price Discount Inheritance
The plugin will inherit the same fixed discounted price to all other variations of the same parent product.
If the discounted price is USD 23.50, then all other variations will inherit the same price of USD 23.50.
#### Percentage Discount Inheritance
The plugin will inherit the same percentage discount to all other variations of the same parent product.
On the first visit, the plugin will calculate the percentage discount based on the regular and discounted prices. The same percentage discount will then be inherited from all other variations of the same parent product.
Example: The regular price is USD 100.00, and the discounted price is USD 75.50. The plugin will calculate a percentage discount of 24.5%. All other variations will then inherit the same percentage discount of 24.5%.
If the resulting prices don't follow your decimal formatting rules, you can use the following filter to adjust the two digits after the comma.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_percent_discount_variation_discounted_price', function ( $price, $product_id ) {
// Return the price with the decimals removed and replaced with .99
return floor( $price ) + 0.99;
} );
```
:::warning[Possible Performance Issues]
If a parent product has many variations (e.g. more than 100), it may cause performance issues when loading the first product page.
You can use the following filter to limit the number of variations considered for the discount inheritance.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_discount_variation_array_max_length', function () {
return 50;
} );
```
:::
## Discount Banner
:::info
Available from version `1.4.2`
:::
To emphasize the discount an the urgency to buy, you can display a discount banner on the product page. In most cases it will increase the conversion rate.
When activated, the plugin will display the discount banner on the product page above the product. The banner will show the time left until the discount expires. After expiration the banner will will show an expired message.

The discount banner works with simple and variable products.
It is disabled by default. You can enable it in the plugin settings.
To give you full control over the design, the banner is built as a template that can be overridden by your theme.
### Activate the discount banner
1. Go to the plugin settings page.
2. Click on the **Discount Banner** checkbox.
3. Click on the **Save Changes** button.
### Discount Banner Template
You can find the template in the plugin folder under `/templates/discount-banner-flipper.php`.
Copy the template to your child theme folder under `/sgadwc/discount-banner-flipper.php`.
The default template uses the [Flip counter plugin](https://pqina.nl/flip/). If you want to keep using it, simply keep `flipper` in the template name. This will automatically load the flipper plugin scripts and stylings.
If you don't plan to user the Flip counter plugin, you can remove `flipper` from the template name. This will prevent the Flip plugin scripts and stylings from being loaded. The file name would then be `/sgadwc/discount-banner.php`.
The template has access to the `$ad_banner_settings` array. The information in the array can be used to customize the banner. It contains the following values:
```php
$ad_banner_settings = [
'productId' => 16,
'expiryInSeconds' => 876, // Seconds until the discount expires
'discountDetails' => [
'sale_price' => 17.48,
'regular_price' => 21,
'discount_percentage' => 16.76,
'exp' => 1706015751, // Unix timestamp of the expiry time
],
'localization' => [ // These fields are automatically used by the Flip counter plugin
'expiryText' => 'exp.'
'MINUTE_PLURAL' => 'Minutes',
'MINUTE_SINGULAR' => 'Minute',
'SECOND_PLURAL' => 'Seconds',
'SECOND_SINGULAR' => 'Seconds',
],
];
```
### Translate the discount banner
We provide a `.pot` file in the plugin folder under `/languages/sgadwc.pot`. You can use it to translate the discount banner into your language.
Alternatively, you can use the following filter to translate just the banner text.
Here's and example on how to translate the default English text to German.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'gettext', function ( $translated_text, $text, $domain ) {
if ( $text == 'Discount offer ends in' ) {
return 'Rabattangebot endet in';
}
if ( $text == 'Minutes' ) {
return 'Minuten';
}
if ( $text == 'Minute' ) {
return 'Minute';
}
if ( $text == 'Seconds' ) {
return 'Sekunden';
}
if ( $text == 'Second' ) {
return 'Sekunde';
}
return $translated_text;
}, 10, 3 );
```
## Google Ads Custom Variables
:::info
Available from version `1.6.0`
Currently available with beta version `1.6.0-beta.4`
:::
The plugin offers an option to transmit the [Google Ads Custom Variable](https://support.google.com/google-ads/answer/9962082) `gad_discounted` with the purchase conversion event.
This will enable reports in Google Ads that show the number of conversions that were made with a product that was discounted with Automated Discounts.
The requirement is that you are using our [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/).
### Setup Part 1: Enable the Custom Variable and use Segmentation
[Wistia video dkp0uq88kv]
### Setup Part 2: Create a Custom Column in Google Ads
[Wistia video 794mu9v25r]
### Example with a segmentation report

### Example with a custom column

### Example with a graph

---
# Developers
URL: https://sweetcode.com/docs/gadwc/developers
# Developers
## Global Functions
With the following function you can check if a product is currently in an Automated Discounts session. This is helpful if you use third party plugins that need to know if a product is currently discounted.
```php
if (function_exists( 'sgadwc_is_product_in_discount_session' )) {
$product_already_discounted = sgadwc_is_product_in_discount_session( $product_id );
// do something
}
```
### `sgadwc_get_product_cogs`
:::info
Available since version 1.6.12
:::
Retrieve the cost of goods sold (COGS) for a specific product or variation. This function checks supported COGS plugins (SkyVerge, WPFactory), falls back to postmeta, and respects custom meta keys set via the [`sgadwc_custom_cogs_meta_key`](#sgadwc_custom_cogs_meta_key) filter. The result can be overridden via the [`sgadwc_product_cogs`](#sgadwc_product_cogs) filter.
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| `$product` | `WC_Product\|int` | A WooCommerce product object or product ID. |
**Return:** `float|null` — The cost of goods sold, or `null` if not found.
```php title="/wp-content/themes/child-theme/functions.php"
if (function_exists( 'sgadwc_get_product_cogs' )) {
// Pass a product ID
$cogs = sgadwc_get_product_cogs( $product_id );
// Or pass a WC_Product object
$cogs = sgadwc_get_product_cogs( $product );
if ( ! is_null( $cogs ) ) {
// Use the COGS value
}
}
```
:::tip
For variations, if no COGS is set on the variation itself, the function automatically falls back to the parent product's COGS.
:::
## Filters
### `sgadwc_sanitize_payload_product_id`
:::info
Available since version 1.6.10
:::
Sanitize or transform the payload product ID before validation. Use this filter to handle custom product ID formats from third-party feed plugins that are not natively supported by the plugin.
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| `$payload_product_id` | string | The product ID from the ad payload (after built-in prefix stripping for `woocommerce_gpf_` and `gla_`). |
| `$current_product_id` | int | The current WooCommerce product ID being validated against. |
**Return:** `string|int` — The sanitized product ID (can be a post ID, SKU, or cleaned identifier).
#### Example 1: Strip a custom prefix and return the SKU
If your feed plugin uses a format like `customprefix_ABC123`, you can strip the prefix and let the plugin's built-in SKU matching handle the rest:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_sanitize_payload_product_id', function( $payload_id, $current_id ) {
// Transform customprefix_ABC123 → ABC123 (SKU)
if ( preg_match( '/^customprefix_(.+)$/', $payload_id, $matches ) ) {
return $matches[1];
}
return $payload_id;
}, 10, 2 );
```
#### Example 2: Convert custom format to WooCommerce Post ID
If you need to look up the product by SKU and return the actual WooCommerce Post ID:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_sanitize_payload_product_id', function( $payload_id, $current_id ) {
// Transform customprefix_ABC123 → WooCommerce Post ID
if ( preg_match( '/^customprefix_(.+)$/', $payload_id, $matches ) ) {
$sku = $matches[1];
$product_id = wc_get_product_id_by_sku( $sku );
if ( $product_id ) {
return $product_id;
}
}
return $payload_id;
}, 10, 2 );
```
:::tip
Use Example 1 if your SKUs are unique across all products including variations. Use Example 2 if you need more precise matching or if your variations share SKUs with parent products.
:::
### `sgadwc_custom_cogs_meta_key`
:::info
Available since version 1.6.12
:::
Specify a custom postmeta key for retrieving the cost of goods sold (COGS). Use this filter if your COGS data is stored in a custom meta field that is not natively supported by the plugin.
By default, the plugin checks the following meta keys (in order):
1. Custom meta key (set via this filter)
2. `_wc_cog_cost` (WooCommerce Cost of Goods by SkyVerge)
3. `_alg_wc_cog_cost` (Cost of Goods for WooCommerce by WPFactory)
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| `$meta_key` | `null` | The custom meta key. Default `null`. |
**Return:** `string|null` — The custom postmeta key to use for COGS lookup, or `null` to skip.
#### Example: Use a custom COGS meta key
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_custom_cogs_meta_key', function( $meta_key ) {
return '_my_custom_cogs_field';
} );
```
### `sgadwc_product_cogs`
:::info
Available since version 1.6.12
:::
Override or modify the resolved COGS value for a product. This filter is applied after all COGS retrieval logic (plugin APIs and postmeta lookups) has completed, so you receive the final resolved value and can adjust or replace it.
**Parameters:**
| Parameter | Type | Description |
|-----------|------|-------------|
| `$cogs` | `float\|null` | The resolved COGS value, or `null` if no COGS was found. |
| `$product` | `WC_Product` | The WooCommerce product object. |
**Return:** `float|null` — The COGS value to use.
#### Example: Provide COGS from a custom source
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_product_cogs', function( $cogs, $product ) {
// If no COGS was found by the plugin, try our custom source
if ( is_null( $cogs ) ) {
$custom_cogs = get_post_meta( $product->get_id(), '_my_erp_cost_price', true );
if ( ! empty( $custom_cogs ) ) {
return (float) $custom_cogs;
}
}
return $cogs;
}, 10, 2 );
```
---
# FAQ
URL: https://sweetcode.com/docs/gadwc/faq
# FAQ
## Is the Google Automated Discounts plugin compatible with the HPOS (High Performance Order Storage)?
Yes, it is.
---
# Implementation recipes
URL: https://sweetcode.com/docs/gadwc/implementation-recipes
# Implementation recipes
The subsequent documentation outlines proven strategies to fulfill all business requirements. We have included only those methods that we have verified to be effective. If you have discovered alternative or superior approaches to address these business requirements, we encourage you to share your insights by submitting feedback through our [support form](https://sweetcode.com/support/).
## Essential steps
1. Set up [conversion cart data reporting](#conversion-cart-data-reporting).
2. [Save the `cost_of_goods_sold`](#setting-cost_of_goods_sold) and `auto_pricing_min_price` in a field for each product.
3. [Upload the Google Merchant Center feed](#uploading-the-feed) containing `cost_of_goods_sold` and `auto_pricing_min_price`.
4. Apply for the Google Automated Discounts program at Google: [Application Link](https://support.google.com/merchants/answer/11542980)
5. Purchase and install the [Google Automated Discounts for WooCommerce plugin](https://sweetcode.com/plugins/gadwc/#pricing-section).
6. Double check that [caching for Automated Discounts is disabled](https://sweetcode.com/docs/gadwc/configuration/#cache-exclusion-for-automated-discounts) and [caching for WooCommerce sessions](https://sweetcode.com/docs/gadwc/configuration/#cache-exclusion-for-woocommerce-sessions) when a visitor clicks on an Automated Discount link.
7. Start running and optimizing the Google Automated Discounts program.
## SweetCode Implementation Service
Enhance your business effortlessly with SweetCode's custom implementation services for Automated Discounts. While some steps are relatively simple, others — such as determining and setting the Cost of Goods Sold and Auto Pricing Min Price for each product — demand meticulous preparation. Businesses vary in their compatibility with the Automated Discounts program, and each one calls for a tailored approach to ensure accurate calculations.
To truly unlock the potential of Automated Discounts, a well-crafted and customized strategy is essential for seamless implementation, execution, and performance optimization.
Should you find any of these steps challenging, SweetCode is here to help. Our team of skilled developers and business economists will guide you throughout the setup process, actively implementing the necessary steps and fine-tuning the program for optimal results. To receive a personalized quote, simply contact us via our [support form](https://sweetcode.com/support/), and we'll be eager to help you elevate your business's efficiency and profitability.
## Conversion Cart Data reporting
The [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) is the sole verified plugin that seamlessly transfers conversion cart data out-of-the-box. You can obtain it from [sweetcode.com](https://sweetcode.com/plugins/pmw#pricing-section) and [woocommerce.com](https://woocommerce.com/products/pixel-manager-pro-for-woocommerce/).
Upon activation, simply enable Google Ads conversion tracking and input the Google Merchant Center ID. With these steps completed, conversion cart data will be automatically transmitted to Google.
1. [Enable Google Ads conversion tracking](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#create-a-new-conversion-in-google-ads)
2. [Set the Google Merchant Center ID](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-cart-data)
:::info
If conversion cart data has never been sent before, the Automated Discounts program will take at least several days before recognizing that the data is being received.
:::
## Setting `cost_of_goods_sold`
For setting the `cost_of_goods_sold` we recommend the following plugin.
- [WooCommerce Cost of Goods](https://woocommerce.com/document/cost-of-goods-sold/). The plugin doesn't only set the Cost of Goods Sold (COGS). It also provides valuable reports on profit margins over all products sold.
## Uploading the feed
There are two feed plugins that officially support the `auto_pricing_min_price` field or have a direct integration with the Google Automated Discounts plugin.
- [WooCommerce Product Feed Manager](https://www.wpmarketingrobot.com/)
- [Google Product Feed](https://woocommerce.com/products/google-product-feed/)
## WooCommerce Product Feed Manager (by WPMarketingRobot)
Here's how to set the `cost_of_goods_sold` in the WooCommerce Product Feed Manager.
(This example shows the use of the `_wc_cog_cost` field created by the [WooCommerce Cost of Goods](https://woocommerce.com/document/cost-of-goods-sold/) plugin.)

Here's how to set the `auto_pricing_min_price` in the WooCommerce Product Feed Manager.

## Google Product Feed for WooCommerce (by Ademti Software)
When both plugins are active (Google Automated Discounts and Google Product Feed) you’ll see the `auto_pricing_min_price` field in the Google Product Feed settings (WooCommerce » Settings » Product Feeds). When enabling the field you can choose to have the values come from the pricing fields provided by the Google Automated Discounts for WooCommerce plugin:

---
# License Management
URL: https://sweetcode.com/docs/gadwc/license-management
# License Management
License management works the same for all SweetCode plugins. Please see our central [License Management documentation](https://sweetcode.com/docs/license-management) for all information about:
- Account access
- VAT and invoicing
- Transferring licenses between domains
- Development and staging servers
- Installing the pro version
- License activation troubleshooting
- Manual renewals
- Expired license warnings
- EULA
- License quotas (subdomains, staging)
- Upgrading subscriptions
- Removing licenses
- License security (white label, URL whitelisting)
- License recovery
- Upgrading to a bundle license
---
# Limitations
URL: https://sweetcode.com/docs/gadwc/limitations
# Limitations
Here's a list of limitations that we are aware of.
## Retrieving Product Data through the REST API
If you are using a theme or plugin (eg. product filter) that retrieves product data through the WooCommerce REST API, you need to adjust the code to retrieve the prices discounted through Automated Discounts.
By default the WooCommerce REST API can't return discounted prices of products that are in an Automated Discounts session.
To make the WooCommerce REST API much faster and efficient, it doesn't load many of the WooCommerce functions, including the WooCommerce session handler. That's why during a REST API call WooCommerce can't determine if a product is in an Automated Discounts session and thus can't return the discounted prices.
Here's a comment of a WooCommerce developer on this topic: [REST API doesn't load all the theme code](https://wordpress.org/support/topic/wc-cart-is-null-in-custom-rest-api/#post-11442843)
He outlines a way how to load the WooCommerce session handler during a REST API call.
Another approach is to request the product data through a WordPress AJAX call. The WooCommerce session handler is loaded during an AJAX call. However, there is no standardized way to retrieve product data through an AJAX call. You would need to write your own AJAX handler (backend and frontend) and return the product data in the response.
Because both approaches highly depend on how the theme or plugin is coded, we can't provide a standardized solution for this from our side.
---
# Logger
URL: https://sweetcode.com/docs/gadwc/logger
# Logger
Our logger can be used to log various events in the plugin and is especially useful for debugging purposes. It can be enabled in the plugin settings.
All logs are stored in the WooCommerce `/wp-content/uploads/wc-logs` directory and are prefixed with `sgadwc-`. You can access the logs via the WooCommerce settings page under `Status > Logs` or directly in the file system.

Use the `View latest log` button to view the file with the most recent logs.

Use the `Download all logs (ZIP)` button to download all logs as a zip file. This is useful for sharing logs with support or for backup purposes.

---
# Remarks
URL: https://sweetcode.com/docs/gadwc/remarks
# Remarks
## Currency Switchers
We tested the plugin with the WPML currency switcher and it works as expected.
The plugin is compatible with every currency switcher that uses the `woocommerce_currencies` filter to set the active currency. Simply try it out with your currency switcher and let us know if it works or if you need help with getting it to work.
## Caching
The plugin will disable caching once a link click with an Automated Discount payload reaches the website. So this should work out of the box. If not, there might still be a caching layer that needs exclusions to be set.
Please follow the troubleshooting guide for cache issues.
---
# Scenarios
URL: https://sweetcode.com/docs/gadwc/scenarios
# Scenarios
First, we show a simple and a variable product how they look like with regular prices.
Then we go through each possible scenario that can occur with price discounts.
## Simple product with no discount

## Variable product with no discount

## Simple product with a discount applied

## Variable product with a discount applied

## Shop page with discounts applied


## Mini cart with discount applied

## Cart page with discount applied

## Checkout page with discount applied


---
# 3-step Setup Guide
URL: https://sweetcode.com/docs/gadwc/setup
# 3-step Setup Guide
You have a full 45 days to try the plugin for free. Start with a 14-day free trial, then purchase a monthly or annual subscription with a 30-day money-back guarantee. Or, if you skip the trial, you’ll still have 30 days to decide with a full refund option.
Our dedicated support team is always on standby to help. Our support policy is to reply within 24 hours during business days. Our response average is 3 hours. We are proud of our 4.9 rating in over 300 reviews on wordpress.org.
## Step 1: Install & configure plugin
This step fulfills Google’s technical requirements
### Install plugin
- Go to the [pricing section](https://sweetcode.com/plugins/gadwc#pricing-section)
- Choose your currency.
- Select “annual” (best deal).
- Select "Buy now" or select “Start your 14-day FREE trial”.
### Configure plugin
- [Exclude cache](https://sweetcode.com/docs/gadwc/configuration/#cache-exclusion-for-automated-discounts).
- Optionally activate: [Discount inheritance variants](https://sweetcode.com/docs/gadwc/configuration/#variations-discount-inheritance); [Conversion push banner](https://sweetcode.com/docs/gadwc/configuration/#discount-banner); [Google Ads reporting](https://sweetcode.com/docs/gadwc/configuration/#google-ads-custom-variables).
## Step 2: Install technical connection to Google
This step fulfills Google’s business requirements
### Report cart data
- [Enable](https://sweetcode.com/docs/gadwc/business-requirements) conversion reporting to Google Ads with enhanced cart data with a plugin.
- We recommend [Pixel Manager](https://sweetcode.com/plugins/pmw/) (and improve conversion tracking at the same time) or [Google Tag Manager by Thomas Geiger](https://wordpress.org/plugins/duracelltomi-google-tag-manager/)
### Feed COGS
- Include Cost of Goods Sold (COGS) data to your Google Merchant Centre. We recommend using a plugin and recommend [WooCommerce Cost of Goods by SkyVerge](https://woocommerce.com/products/woocommerce-cost-of-goods/) or [Cost of Goods Sold by WPFactory](https://wpfactory.com/item/cost-of-goods-for-woocommerce).
- Add COGS values manually or in bulk.
### Feed Minimum price
- Our plugin creates an additional product field: minimum price. Include minimum price data to your Google Merchant Centre. We recommend suing a plugin and recommend: [Google Product Feed for WooCommerce by Ademti](https://woocommerce.com/products/google-product-feed/) or [WooCommerce Google Feed Manager By WP Marketing Robot](https://wordpress.org/plugins/wp-product-feed-manager/).
- Add minimum price values (manual or by [automatic calculation](https://sweetcode.com/docs/gadwc/auto-pricing-min-price)).
## Step 3: Activate, test and monitor
### Activate
Activate Automated Discounts in GMC.
### Testing
Follow Google’s testing procedures and test links generated by the plugin.
### Production
Monitor reports in the Merchant Centre
Ad COGS and minimum prices for new products in your shop.
---
# Technical Requirements
URL: https://sweetcode.com/docs/gadwc/technical-requirements
# Technical Requirements
Our plugin, the [Google Automated Discounts Plugin for WooCommerce](https://sweetcode.com/plugins/gadwc/), meets all of Google's requirements for processing Automated Discounts.
- Product ID validation.
- Currency validation.
- Merchant center ID validation.
- Expiry validation.
- Cryptographic token signature validation.
- Keeps the discounted price for a specific product visible during the entire visitor session on **every** page of the shop.
- If a visitor adds a discounted product to the cart, the plugin keeps the discounted price during the regular WooCommerce 48 hours cart session.
---
# Testing
URL: https://sweetcode.com/docs/gadwc/testing
# Testing
## Google's Testing Procedure
Google will guide you through the setup step-by-step. At one point, it will generate links with which you can test and see if automated discounts work on your website.

## Set product IDs to test
The plugin also provides automatic testing links, with randomly generated discounted prices. You can find them in the plugin settings.

For variable products the plugin prefers variations that a shopper can actually select on the product page, because a variation that no dropdown offers can never display a price, discounted or not. If a link points at a variation that cannot be selected, the row is flagged with a **Not selectable on the front end** note explaining which attribute value is missing. Fix the product data first, then reset the testing links. See [A variable product shows no price at all](https://sweetcode.com/docs/gadwc/troubleshooting#a-variable-product-shows-no-price-at-all) for the full walkthrough.
Use the following filter to set the specific product IDs that you want to test.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'sgadwc_testing_product_ids', function ($product_ids) {
$product_ids[] = 123; // Add your product IDs here
$product_ids[] = 456;
$product_ids[] = 789;
return $product_ids;
} );
```
## Console Debug Messages
When testing with the internal testing links, you can see debug messages in the browser console. This will help you understand what is happening behind the scenes.
It will show information if the Automated Discount session could be started and the payload that is processed.

It will also show error details if something goes wrong, such as when the product ID is not found.

---
# Troubleshooting
URL: https://sweetcode.com/docs/gadwc/troubleshooting
# Troubleshooting
## Viewing the Error Logs
The plugin outputs errors into the regular WooCommerce log directory. It is accessible by clicking on the **View Logs** link in the plugin's settings window and choosing the most recent log with the slug **sgadwc**. It will show all errors that it encountered. If you don't find a log with the slug **sgadwc** it means that no errors have been encountered.
## The website still shows cached prices, even if a valid discount has been successfully received
It is likely your caching rules are too aggressive.
Make sure to exclude caching if the URL query parameter `pv2` is present in the URL.
Example: `https://example.com/socks/?pv2=1234`
You also must ensure that caching is disabled as soon as a WooCommerce session is active. (Typically a WooCommerce session is created when a visitor adds a product to the cart.)
Make sure that the cache is disabled if at least one of the following server-side [WooCommerce cookies](https://woocommerce.com/document/woocommerce-cookies/#section-2) has been set:
- `woocommerce_cart_hash`
- `woocommerce_items_in_cart`
- `wp_woocommerce_session_` (This cookie always attaches a session ID at the end. Make sure that the match is not set to `exact` but will match any cookie which contains that cookie string.)
## Caching
In general 99% of all incompatibilities are caused by caching.
There are two conditions that need to be met for Automated Discounts to work correctly:
- When the URL query parameter `pv2` is present in the URL, caching must be disabled.
- WooCommerce sessions must be properly handled by the caching system. Neither page cache, nor server object cache, or any other caching layer should cache pages when a WooCommerce session is active.
## Known Incompatibilities
We have come across an install that uses Object Cache Pro (by Rhubarb Group), FlyingPress (by FlyingWeb) and the Astra Pro theme (by Brainstorm Force). Any one of these plugins or themes, or a combination of them, causes Automated Discounts to not work correctly because parts of the output get cached, including Ajax requests.
While FlyingPress may be configured to exclude caching, the other two plugins don't offer a way to exclude caching for specific URLs or WooCommerce sessions.
## How to Configure Kinsta Cache
Some Kinsta hosted sites need a specific cache setup to ensure Google Automated Discounts work reliably. Kinsta’s default caching rules do not fully cover the requirements, especially when sessions start or when tracking parameters are involved. This guide explains what Kinsta support must configure and what you, as the site owner, should double check.
### Required Cache Exclusions
Ask Kinsta support to add the following Nginx rules to ensure discounts display correctly for all eligible visitors:
```
if ($http_cookie ~* "s|_sce|sgadwc_session_active") {
set $skip_cache 1;
}
if ($query_string ~ "^pv2=") {
set $skip_cache 1;
}
```
### Why these rules matter
- `sgadwc_session_active` cookie
This cookie signals that a Google Automated Discounts session is active. If it is present, the visitor must bypass all caching layers.
- `pv2` URL parameter
This parameter is important on the first visit and triggers the Automated Discounts logic. Kinsta normally bypasses caching when a URL contains parameters, but we have confirmed that this does not work reliably on Kinsta when UTM parameters are present.
Some stores accidentally upload product URLs with UTM tags to Google Merchant Center, which leads to URLs like:
`?utm_source=xxx&pv2=...`
In these cases, Kinsta cache may still activate unless this explicit rule exists.
Adding the `pv2` rule is therefore a required safety net.
### Clear All Kinsta Cache After Setup
Once Kinsta adds the exclusions, they must clear all cache layers completely:
- Edge cache
- Server cache
- CDN cache
- Any additional Kinsta layer
If the cache is not fully cleared, old cached versions can override the new rules and cause inconsistent behavior.
### Important for Store Owners
#### Remove UTM parameters from Google Merchant Center feeds
- UTM parameters in Shopping product URLs can interfere with the `pv2` cache exclusion on Kinsta.
- They are also unnecessary. When Google Ads and Google Merchant Center are linked, Google automatically handles all tracking.
- Recommendation: Remove all UTM parameters from your feed URLs.
#### Summary
- Make sure Kinsta support adds the two explicit exclusions above.
- Removing UTM parameters in your Shopping feed improves reliability and prevents Kinsta from ignoring your `pv2` exclusion.
- With both steps in place, Google Automated Discounts will work smoothly on Kinsta hosted sites.
## A Variable Product Shows No Price at All
Google may reject your account with this message:
> Discounted price doesn't show on your product page. Your online shop must read discounted prices from Google-generated JSON web tokens and show those discounted prices on your product pages.
If your simple products pass the test but your variable products fail, the cause is usually the product setup rather than the discount. On a variable product WooCommerce only prints a price once a single variation has been resolved. Until then the page shows a price range, or nothing at all. No discount can be displayed on a page that displays no price in the first place.
### Symptoms
- Simple products show the discounted price correctly, variable products do not.
- Opening the product page shows a price range, or an empty price area, both with and without the `pv2` parameter.
- One or more of the attribute dropdowns (for example **Colour** or **Size**) is empty or is missing the option the tested variation uses.
- The plugin's Testing tab flags the variation with a **Not selectable on the front end** note.
### The Cause
A variation dropdown only lists a value when both of the following are true:
1. The value is assigned to the **parent** product under **Product data → Attributes**.
2. At least one variation actually uses that value.
The two lists can drift apart. A variation can keep pointing at a colour that was later removed from the parent product's attribute, for example after a feed import, a bulk edit, or an attribute cleanup. The variation still exists, still carries its own price, and is still submitted to Google, but the shopper can never select it, because the dropdown never offers that colour. The page therefore resolves no variation and prints no price, and Google reports that as a missing discounted price.
A second, milder case: if a variation leaves an attribute set to **Any**, the link cannot preselect a value for it. The shopper still has to choose before a price appears, so a crawler that only loads the URL sees a price range.
### How to Fix It
1. Open the product in WordPress and go to **Product data → Attributes**.
2. Add every value that your variations use, for example the missing colours, and tick **Used for variations**.
3. Save, then open the **Variations** tab and make sure each variation has a concrete value for every attribute rather than **Any**.
4. Reload the product page and pick the combination from the failing test link. A single price must now appear.
5. Go to the plugin's Testing tab, click **Reset testing links**, and run the tests again.
:::tip
The plugin picks testing links automatically and prefers variations that a shopper can actually select. When it cannot find enough of them, it still lists what it has and flags each affected row with the reason, so you can see the product data problem before you start debugging the discount.
:::
## Product ID Mismatch Issues
If discounts are not being applied when customers click on Google Shopping ads, the cause might be a product ID mismatch between what Google sends and what WooCommerce expects.
### Symptoms
- Discounts are not being applied when customers click on Google Shopping ads
- Error logs show "Product ID is not correct" messages
- The browser console shows mismatched expected vs. received product IDs
### How to Diagnose
1. Check the **WooCommerce logs** for errors (WooCommerce → Status → Logs → select logs with the `sgadwc` slug)
2. Click on a Google Shopping ad link (or a testing link) for one of your products
3. Open your browser's developer console (F12 → Console tab)
4. Look for log messages showing the payload product ID, for example:
```
Automated Discounts (1.6.10) Debugger: Product ID is not correct. Expected: 510759 Received: 8722_B16866310
```
### Common Causes
Your Google Merchant Center feed plugin may be using a custom product ID format that includes:
- A custom prefix (e.g., `customfeed_`, `myshop_`, `feed_`)
- Your SKU instead of the WooCommerce Post ID
- A combination of prefix + SKU (e.g., `shopify_ABC123`)
### Built-in Support
The plugin automatically handles these common formats:
- `woocommerce_gpf_123` → `123` (WooCommerce Product Feed Pro)
- `gla_123` → `123` (Google Listings & Ads)
- Direct SKU matching (if the ID doesn't match, the plugin checks against the product SKU)
### Solution for Custom Formats
If your feed plugin uses a different format, use the `sgadwc_sanitize_payload_product_id` filter to transform the product ID. Add this code to your theme's `functions.php` or a custom plugin:
```php
add_filter( 'sgadwc_sanitize_payload_product_id', function( $payload_id, $current_id ) {
// Replace 'yourprefix_' with your actual prefix
if ( preg_match( '/^yourprefix_(.+)$/', $payload_id, $matches ) ) {
$sku = $matches[1];
// Look up product by SKU and return the Post ID
$product_id = wc_get_product_id_by_sku( $sku );
if ( $product_id ) {
return $product_id;
}
}
return $payload_id;
}, 10, 2 );
```
For more details and examples, see the [Developers documentation](https://sweetcode.com/docs/gadwc/developers#sgadwc_sanitize_payload_product_id).
### Need Help?
Contact support with:
1. The error message from your debug console
2. The product ID format your feed plugin uses
3. Your feed plugin name
---
# Videos
URL: https://sweetcode.com/docs/gadwc/video
# Videos
Find informative videos in the [playlist Google Automated Discounts on our YouTube channel](https://www.youtube.com/watch?v=a-132j3mLfI&list=PL5IBRtbuDEY5ogGRfRTHXBiMgYuJBoGj2)
---
# Google Customer Reviews for WooCommerce
URL: https://sweetcode.com/docs/gcr
# Google Customer Reviews for WooCommerce
Google Customer Reviews for WooCommerce is a plugin that integrates Google's official Customer Reviews program with your WooCommerce store. It helps you collect authentic customer reviews through Google's survey system and display your seller rating in Google Search and Shopping ads.
:::tip[Google Top Quality Store Program]
Google Customer Reviews is part of Google's **Top Quality Store** program. Merchants who consistently deliver great shopping experiences can qualify for Top Quality Store status, earning a special badge and increased visibility in Google Shopping. [Learn more about Top Quality Store eligibility](https://support.google.com/merchants/answer/9148820).
:::
## How It Works

1. **Customer Opts In** — After completing a purchase, customers see an opt-in prompt on the order confirmation page
2. **Google Sends Survey** — Google emails a survey to opted-in customers a few days after their estimated delivery date
3. **Reviews Accumulate** — Customers rate their experience and submit reviews
4. **Ratings Appear** — After ~100 reviews, your seller rating appears in Google Search and Shopping ads
## Store Ratings on Free Listings
Store ratings display next to your merchant name when shoppers interact with free product listings in Google Search or Shopping, helping build trust with potential customers.
**Benefits of store ratings on free listings:**
- Increases shopper confidence in your business
- Differentiates your products from competitors
- No additional cost — appears on your free product listings automatically
## Key Features
- **Survey Opt-in Module** — Display Google's review survey opt-in on the order confirmation page
- **Seller Rating Badge** — Show your seller rating anywhere on your site with a shortcode, widget, or menu
- **Light & Dark Badge Variants** — Choose the badge style that matches your site's design
- **Product Ratings** — Include product GTINs for product-level ratings in Google Shopping
- **WooCommerce Blocks Compatible** — Full compatibility with the block-based checkout
- **HPOS Compatible** — Works with High-Performance Order Storage
- **No Coding Required** — Simple setup with your Google Merchant Center ID
## Getting Started
Follow our [setup guide](https://sweetcode.com/docs/gcr/setup) to get started with Google Customer Reviews for WooCommerce.
## Support Articles
- [Setup Guide](https://sweetcode.com/docs/gcr/setup) — Installation and basic configuration
- [Survey Opt-in](https://sweetcode.com/docs/gcr/survey-opt-in) — Configure the survey opt-in module
- [Seller Rating Badge](https://sweetcode.com/docs/gcr/seller-rating-badge) — Display your rating badge
- [Configuration](https://sweetcode.com/docs/gcr/configuration) — All configuration options
- [FAQ](https://sweetcode.com/docs/gcr/faq) — Frequently asked questions
- [Troubleshooting](https://sweetcode.com/docs/gcr/troubleshooting) — Common issues and solutions
## Requirements
- WooCommerce 7.0+
- WordPress 6.0+
- PHP 7.4+
- Google Merchant Center account (free)
- Products listed in Google Merchant Center
## Compatibility
| Platform | Version | Status |
|----------|---------|--------|
| WordPress | 6.0+ | ✅ Tested |
| WooCommerce | 7.0+ | ✅ Tested |
| PHP | 7.4+ | ✅ Required |
| WooCommerce Blocks | Latest | ✅ Compatible |
| HPOS | Latest | ✅ Compatible |
---
# Configuration
URL: https://sweetcode.com/docs/gcr/configuration
# Configuration
This page documents all configuration options available in Google Customer Reviews for WooCommerce.
## General Settings

### Merchant Center ID
Your Google Merchant Center ID. This is required for the plugin to function.
- **Location:** Google Merchant Center → Settings → Account information
- **Format:** Numeric ID (e.g., `123456789`)
### Enable Plugin
Master toggle to enable or disable all plugin functionality.
## Survey Opt-in Settings

### Enable Survey Opt-in
Toggle the survey opt-in module on the order confirmation page.
- **Default:** Enabled
### Estimated Delivery Days
Number of days after the order that delivery is estimated. Google uses this to time the survey email.
- **Default:** 7 days
- **Range:** 1-30 days
### Opt-in Position
Where the opt-in appears on the order confirmation page.
- **Options:** After order details, Before order details
- **Default:** After order details
### Include Product GTINs
Include product GTIN/UPC/EAN codes with the opt-in for product-level ratings.
- **Default:** Enabled
- **Note:** Products must have GTINs set, and GTINs must match your Merchant Center feed
### GTIN Source
Where to pull GTIN values from:
- **WooCommerce GTIN field** (if using WooCommerce 9.2+)
- **Custom field** — Specify a custom meta field name
- **SKU** — Use product SKU as GTIN (not recommended)
Product-level ratings are managed on the **Product Ratings** tab:

## Seller Rating Badge Settings

### Enable Badge
Toggle the seller rating badge display.
- **Default:** Disabled
### Badge Position
Position of the floating badge.
- **Options:** `BOTTOM_RIGHT`, `BOTTOM_LEFT`, `INLINE`
- **Default:** `BOTTOM_RIGHT`
### Badge Language
Language for the badge. Leave empty for auto-detection based on site/browser language.
- **Default:** Auto-detect
## Advanced Settings
### Debug Mode
Enable debug logging to help troubleshoot issues.
- **Default:** Disabled
- **Log location:** WooCommerce → Status → Logs
## Filters and Hooks
### Filters
```php
// Modify estimated delivery days per order
add_filter('gcr_estimated_delivery_days', function($days, $order) {
// Add extra days for international orders
if ($order->get_shipping_country() !== 'US') {
return $days + 7;
}
return $days;
}, 10, 2);
// Disable opt-in for specific products
add_filter('gcr_show_survey_optin', function($show, $order) {
// Disable for virtual products
foreach ($order->get_items() as $item) {
$product = $item->get_product();
if ($product && $product->is_virtual()) {
return false;
}
}
return $show;
}, 10, 2);
// Modify GTIN value
add_filter('gcr_product_gtin', function($gtin, $product) {
// Custom GTIN logic
return $gtin;
}, 10, 2);
// Control badge display
add_filter('gcr_show_badge', function($show) {
// Hide on specific pages
if (is_checkout()) {
return false;
}
return $show;
});
```
### Actions
```php
// Before survey opt-in renders
add_action('gcr_before_survey_optin', function($order) {
// Custom code before opt-in
});
// After survey opt-in renders
add_action('gcr_after_survey_optin', function($order) {
// Custom code after opt-in
});
// Before badge renders
add_action('gcr_before_badge', function() {
// Custom code before badge
});
```
## WooCommerce Blocks Settings
The plugin automatically detects and works with WooCommerce Blocks checkout. No additional configuration is required.
## HPOS Compatibility
The plugin is fully compatible with High-Performance Order Storage (HPOS). No additional configuration is required.
## Recommended Settings
For most stores, we recommend:
1. **Estimated Delivery Days:** Your average delivery time + 2 days buffer
2. **Include Product GTINs:** Enabled if you have GTINs in your product data
3. **Badge Position:** `BOTTOM_RIGHT` is the most common placement
4. **Debug Mode:** Only enable when troubleshooting
---
# FAQ
URL: https://sweetcode.com/docs/gcr/faq
# FAQ
Frequently asked questions about Google Customer Reviews for WooCommerce.
## General Questions
### What is Google Customer Reviews?
Google Customer Reviews is a free program that allows Google to collect valuable feedback from customers who've made a purchase on your site. The program helps you get seller ratings that can appear with your Search ads and Shopping ads, as well as on your Google Merchant Center account.
### Is this the same as Google Reviews?
No, Google Customer Reviews is different from:
- **Google Business Reviews** — Reviews for physical business locations
- **Google Product Reviews** — Reviews for specific products (though GCR can contribute to these)
- **Third-party review platforms** — Like Trustpilot, Reviews.io, etc.
Google Customer Reviews specifically collects feedback about the shopping experience from your online store.
### How much does Google Customer Reviews cost?
The Google Customer Reviews program itself is **free from Google**. Our plugin provides the WooCommerce integration to participate in the program.
### Do I need a Google Merchant Center account?
Yes, you need an active Google Merchant Center account to participate in Google Customer Reviews.
## Reviews and Ratings
### How many reviews do I need for a seller rating?
Google typically requires approximately **100 reviews** collected within the past 12 months before your seller rating will appear in ads. This threshold may vary by country.
### How long does it take to get a seller rating?
This depends on your order volume and opt-in rate. If you process 100 orders per month and 30% opt in, you could reach 100 reviews in about 3-4 months.
### Can I see the reviews customers submit?
You can see your aggregated rating in Google Merchant Center, but individual reviews are not publicly displayed or accessible to merchants.
### Can I respond to reviews?
No, Google Customer Reviews doesn't provide a mechanism for responding to reviews. The reviews are used to calculate your seller rating, not for public display.
### Will bad reviews hurt my rating?
Yes, all reviews contribute to your seller rating average. However, a few negative reviews among many positive ones will have minimal impact.
### How do I check if I have a store rating?
To find out if you have a store rating, edit the following URL to replace `{your website}` with your homepage URL:
```
https://www.google.com/storepages?q={your website}
```
or with a specific country:
```
https://www.google.com/storepages?q={your website}&c={country code}
```
You'll be able to view information about your store and store ratings if your site meets the minimum store rating thresholds.

*Example of the Google Store Pages report showing opt-ins, reviews, average rating, and review text*
**Multiple countries:** If your website domain varies by country, repeat the above step for each variation. If your site uses the same domain across countries and has reviews in multiple countries, the above URL will return a page for one country. You can edit the country code in the browser URL to view other countries. For example, if the URL contains `c=AU` you can update this to `c=US` to view ratings for the US.
:::note
If Google doesn't have information for your store or if it doesn't meet the minimum store rating thresholds, a store ratings page may not load for your homepage. Additionally, an invalid URL value or the wrong homepage may prevent a store ratings page from loading. Having a store rating associated with your domain doesn't necessarily mean your store rating will show on ads, since store ratings on ads depend on auction dynamics and other factors.
:::
### What is the Shop Insights Panel?
The Shop Insights Panel is a feature that displays the overall shopping experience of your shop in a concise manner on Google Search, Maps, and other Google surfaces. You can also add the Shop Insights Panel to your own website.

Displaying the quality of the shopping experience you provide helps set the right expectations with customers and gives them key information to decide whether to proceed with a purchase.
The Shop Insights Panel sources data from the **Shop Quality scorecard** in your Merchant Center. Based on your performance in each metric measured by the Shop Quality scorecard, the panel displays a ranking to communicate the level of shopper experience you provide.
**Benefits of the Shop Insights Panel:**
- Builds trust with potential customers before they visit your site
- Displays your shop quality metrics on Google Search and Maps
- Can be embedded on your own website to showcase your ratings
- Automatically updates based on your Merchant Center performance data
## Technical Questions
### Does this work with WooCommerce Blocks checkout?
Yes, the plugin is fully compatible with both the classic WooCommerce checkout and the new block-based checkout.
### Does this work with HPOS?
Yes, the plugin is fully compatible with High-Performance Order Storage (HPOS).
### What about caching plugins?
The plugin is compatible with most caching plugins. If you experience issues:
1. Exclude the order confirmation page from caching
2. Clear your cache after changing settings
### Can I use this with other review plugins?
Yes, Google Customer Reviews can work alongside other review plugins (like WooCommerce Product Reviews). They serve different purposes:
- **GCR:** Collects seller ratings for Google ads
- **Other plugins:** Collect product reviews for your website
## Survey Opt-in Questions
### Where does the opt-in appear?
By default, the opt-in appears on the WooCommerce order confirmation (thank you) page, after the order details.
### Can customers opt out after opting in?
The opt-in is a one-time choice at checkout. If a customer opts in, they'll receive the survey email. They can choose not to complete the survey.
### What languages does the survey support?
The survey is available in multiple languages and will display in the customer's browser language (if supported by Google).
### When do customers receive the survey?
Google sends the survey email a few days after the estimated delivery date you configure. This ensures customers have received their order before being asked to review.
## Badge Questions
### Can I display the badge before I have a rating?
The badge requires a seller rating to display. Until you have enough reviews (~100), the badge will not show any content.
### Can I customize the badge appearance?
The badge uses Google's standard design. You can control placement and add CSS for the container, but you cannot modify the badge itself.
### Does the badge affect page load speed?
The badge loads asynchronously and has minimal impact on page load speed.
## Pricing and License
### What's included in the license?
Your license includes:
- Plugin updates for 1 year
- Priority support for 1 year
- Use on the number of sites in your tier (1, 5, 10, or 25)
### Can I upgrade my license later?
Yes, you can upgrade to a higher tier at any time. Contact support for a prorated upgrade.
### What happens when my license expires?
The plugin will continue to work, but you won't receive updates or support. We recommend renewing to ensure compatibility and security.
### Do you offer refunds?
Yes, we offer a 30-day money-back guarantee. If you're not satisfied, contact support for a full refund.
---
# Seller Rating Badge
URL: https://sweetcode.com/docs/gcr/seller-rating-badge
# Seller Rating Badge
Display your Google seller rating badge anywhere on your website to build trust with potential customers. The badge shows your star rating and review count, linking to your Google Customer Reviews profile.

## How It Works
Once you've collected enough reviews through Google Customer Reviews, you can display a badge showing your seller rating. The badge:
- Shows your star rating (1-5 stars)
- Displays the number of reviews
- Links to your Google Customer Reviews profile
- Updates automatically as you collect more reviews
- Available in **light** and **dark** variants to match your site's design
:::info
The badge will only display if you have a seller rating. This typically requires approximately 100 reviews collected through Google Customer Reviews.
:::
## Enabling the Badge
1. Go to the plugin settings in **WooCommerce → Settings → Google Customer Reviews**
2. Find the **Seller Rating Badge** section
3. Toggle **Enable Badge** to on
4. Configure the badge options (see below)
5. Save changes

## Display Options
### Using a Shortcode
Place the badge anywhere using the shortcode:
```
[gcr_badge]
```
**With parameters:**
```
[gcr_badge position="BOTTOM_RIGHT" language="en"]
```
### Available Parameters
| Parameter | Values | Default | Description |
|-----------|--------|---------|-------------|
| `position` | `BOTTOM_RIGHT`, `BOTTOM_LEFT`, `INLINE` | `BOTTOM_RIGHT` | Badge position |
| `language` | `en`, `de`, `fr`, etc. | Auto-detect | Badge language |
### Using a Widget
1. Go to **Appearance → Widgets**
2. Find the **GCR Seller Rating Badge** widget
3. Drag it to your desired widget area
4. Configure the options
5. Save
### Using a Menu
You can add the badge to any navigation menu:
1. Go to **Appearance → Menus**
2. Select the menu you want to edit
3. Under **Custom Links**, add the badge shortcode as a menu item:
- URL: `#`
- Link Text: `[gcr_badge position="INLINE"]`
4. Save the menu

:::tip
Menu integration works best with the `INLINE` position. The badge will render inline with your menu items.
:::
### Using PHP
For theme developers, you can display the badge programmatically:
```php title="/wp-content/themes/child-theme/functions.php"
'INLINE',
'language' => 'en'
]);
}
?>
```
## Position Options
### BOTTOM_RIGHT (Default)
The badge appears as a floating element in the bottom-right corner of the page. This is the most common placement.
### BOTTOM_LEFT
The badge appears as a floating element in the bottom-left corner of the page.
### INLINE
The badge appears inline where you place the shortcode or widget. Use this for placing the badge within your page content, footer, or sidebar.
## Badge Style Variants
The badge automatically adapts to your site's design, but you can also choose between light and dark variants:
### Light Background Badge
Best for sites with light-colored backgrounds (white, light gray, etc.).

### Dark Background Badge
Best for sites with dark-colored backgrounds (black, dark gray, dark blue, etc.).

## Mobile Display
The badge is fully responsive and displays properly on mobile devices:

For floating badges (`BOTTOM_RIGHT` or `BOTTOM_LEFT`), the badge automatically adjusts its position and size on smaller screens.
## Styling the Badge
### CSS Classes
The badge container has the following CSS class for styling:
```css
.gcr-badge-container
/* For inline badges */
.gcr-badge-container.gcr-badge-inline {
margin: 20px 0;
}
/* For floating badges */
.gcr-badge-container.gcr-badge-floating {
z-index: 9999;
}
```
### Hiding on Specific Pages
To hide the floating badge on specific pages:
```css
/* Hide on cart page */
.woocommerce-cart .gcr-badge-container.gcr-badge-floating {
display: none;
}
```
Or use PHP:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('gcr_show_badge', function($show) {
if (is_cart() || is_checkout()) {
return false;
}
return $show;
});
```
## Best Practices
1. **Place where visible** — Put the badge where customers will see it, such as the footer, sidebar, or product pages
2. **Don't overdo it** — One or two badge placements is enough; too many can look spammy
3. **Wait for reviews** — Don't enable the badge until you have enough reviews for a rating to display
## Troubleshooting
### Badge not appearing
1. Verify you have enough reviews for a seller rating (approximately 100)
2. Check that the badge is enabled in settings
3. Verify your Merchant Center ID is correct
4. Clear any page caches
### Badge shows wrong rating
The badge pulls data directly from Google. If the rating seems wrong:
1. Check your Google Merchant Center for the correct rating
2. Clear your browser cache
3. Wait a few hours for Google's cache to update
See the [Troubleshooting guide](https://sweetcode.com/docs/gcr/troubleshooting) for more solutions.
---
# Setup Guide
URL: https://sweetcode.com/docs/gcr/setup
# Setup Guide
Get started with Google Customer Reviews for WooCommerce in just a few minutes. This guide will walk you through the installation and basic configuration.
## Prerequisites
Before you begin, make sure you have:
1. **Google Merchant Center account** — [Create one here](https://merchants.google.com/) if you don't have one
2. **Products in Google Merchant Center** — Your products should be listed for product-level ratings
3. **WooCommerce 7.0+** installed and active
4. **WordPress 6.0+**
5. **Google Customer Reviews enabled** in your Merchant Center (see below)
## Step 1: Install the Plugin
### Purchase and Download
1. Go to the [pricing section](https://sweetcode.com/plugins/gcr#pricing-section)
2. Choose your currency (USD or EUR)
3. Select your license tier based on the number of sites
4. Complete the purchase
5. Download the plugin ZIP file from your account
### Install in WordPress
1. Go to **Plugins → Add New** in your WordPress admin
2. Click **Upload Plugin**
3. Choose the downloaded ZIP file
4. Click **Install Now**
5. After installation, click **Activate Plugin**
## Step 2: Enable Google Customer Reviews in Merchant Center
Before configuring the plugin, you need to enable Google Customer Reviews in your Merchant Center:
1. Log in to your [Google Merchant Center](https://merchants.google.com/) account
2. Click the **Settings** icon (gear) in the top right
3. Navigate to **Customer reviews** (under "Programs" or "Tools")
4. Click **Enable** to activate the Google Customer Reviews program
5. Review and accept the Terms of Service

:::info
After enabling, it may take up to 24 hours for Google to activate the program for your account.
:::
## Step 3: Enter Your Merchant Center ID
1. Go to **WooCommerce → Settings → Google Customer Reviews** (or the plugin settings page)
2. Enter your **Google Merchant Center ID**
- Find this in your [Google Merchant Center](https://merchants.google.com/) account under **Settings → Account information**
3. Click **Save Changes**

## Step 4: Configure the Survey Opt-in
1. **Enable Survey Opt-in** — Turn on the survey opt-in module
2. **Set Estimated Delivery Days** — Configure how many days after the order the delivery is estimated (default: 7 days)
3. **Position** — Choose where the opt-in appears on the order confirmation page

See the [Survey Opt-in configuration guide](https://sweetcode.com/docs/gcr/survey-opt-in) for detailed options.
## Step 5: Test Your Integration
1. Place a test order on your store
2. After completing checkout, verify the survey opt-in appears on the order confirmation page
3. Check the browser console for any errors

## Step 6: Enable Seller Rating Badge (Optional)
Display your seller rating on your website:
1. Go to the plugin settings
2. Enable the **Seller Rating Badge**
3. Use the shortcode `[gcr_badge]`, the widget, or a menu item to display the badge

See the [Seller Rating Badge guide](https://sweetcode.com/docs/gcr/seller-rating-badge) for placement options and badge style variants.
## What Happens Next?
1. **Customers opt in** — Customers who opt in will receive a review survey from Google
2. **Google sends surveys** — A few days after the estimated delivery date, Google emails the survey
3. **Reviews accumulate** — As customers submit reviews, your seller rating builds
4. **Ratings appear** — After approximately 100 reviews, your seller rating can appear in Google Search and Shopping ads
### The Customer Experience
Here's what your customers will experience after opting in.
:::info[Patience Required]
It takes time to collect enough reviews for your seller rating to appear in ads. Google typically requires around 100 reviews before displaying seller ratings. Continue to encourage customers to opt in and the reviews will accumulate over time.
:::
## Viewing Your Reviews in Merchant Center
Once you start collecting reviews, you can track your progress in Google Merchant Center:
1. Go to your [Google Merchant Center](https://merchants.google.com/) account
2. Navigate to **Growth → Customer reviews** (or **Programs → Customer reviews**)
3. View your seller rating, review count, and trends

## Need Help?
- Check our [FAQ](https://sweetcode.com/docs/gcr/faq) for common questions
- Visit [Troubleshooting](https://sweetcode.com/docs/gcr/troubleshooting) for common issues
- [Contact support](https://sweetcode.com/support) if you need assistance
---
# Survey Opt-in Module
URL: https://sweetcode.com/docs/gcr/survey-opt-in
# Survey Opt-in Module
The survey opt-in module displays Google's official review survey opt-in on your WooCommerce order confirmation page. This is the core feature that allows you to collect Google Customer Reviews.

## How It Works
1. A customer completes a purchase on your store
2. On the order confirmation (thank you) page, they see an opt-in checkbox from Google
3. If they opt in, Google will email them a survey a few days after the estimated delivery date
4. The customer rates their experience and submits the review
5. The review contributes to your seller rating
### What Customers See
After opting in, customers receive an email from Google with a simple survey asking them to rate their shopping experience.
## Configuration Options
These options live on the **Survey Opt-in** tab of the plugin settings.

### Enable/Disable
Toggle the survey opt-in module on or off. When disabled, the opt-in will not appear on the order confirmation page.
### Estimated Delivery Days
Set the number of days after the order that delivery is estimated. Google uses this to determine when to send the survey email.
- **Default:** 7 days
- **Recommendation:** Set this to your typical delivery time plus a buffer
:::tip
It's better to overestimate delivery time slightly. If the survey arrives before the product, customers may give lower ratings or not respond at all.
:::
### Position
Choose where the opt-in appears on the order confirmation page:
- **After order details** (default)
- **Before order details**
- **Custom position** (using hooks)
### Language
The survey opt-in automatically displays in the customer's browser language. Google supports multiple languages for the survey.
## Product GTINs for Product Ratings
To enable product-level ratings (in addition to seller ratings), you need to include product GTINs. These options live on the **Product Ratings** tab of the plugin settings.

1. **Enable GTIN inclusion** in the plugin settings
2. **Add GTINs to your products** — Use the GTIN field in WooCommerce product settings or a compatible plugin
3. The plugin will automatically include GTINs in the opt-in data
:::info
Product GTINs must match the GTINs in your Google Merchant Center feed for product ratings to work correctly.
:::
## Customization
### CSS Styling
The opt-in module uses Google's standard styling. You can add custom CSS to adjust the container:
```css
.gcr-survey-optin {
margin-top: 20px;
margin-bottom: 20px;
}
```
### Custom Placement with Hooks
For advanced placement, you can disable the automatic placement and use hooks:
```php title="/wp-content/themes/child-theme/functions.php"
// Disable automatic placement
add_filter('gcr_auto_display_survey_optin', '__return_false');
// Add to custom location
add_action('your_custom_hook', function() {
if (function_exists('gcr_display_survey_optin')) {
gcr_display_survey_optin();
}
});
```
## WooCommerce Blocks Compatibility
The survey opt-in is fully compatible with the WooCommerce Blocks checkout. It automatically detects whether you're using the classic or block-based checkout and renders appropriately.
## Troubleshooting
### Opt-in not appearing
1. Verify the plugin is activated and the survey opt-in is enabled
2. Check that your Merchant Center ID is entered correctly
3. Clear any page caches
4. Check browser console for JavaScript errors
### Opt-in appears but looks broken
1. Check for CSS conflicts with your theme
2. Ensure Google's scripts are not being blocked by your firewall or security plugin
See the [Troubleshooting guide](https://sweetcode.com/docs/gcr/troubleshooting) for more solutions.
---
# Troubleshooting
URL: https://sweetcode.com/docs/gcr/troubleshooting
# Troubleshooting
Common issues and solutions for Google Customer Reviews for WooCommerce.
## Survey Opt-in Issues
### Opt-in not appearing on order confirmation page
**Possible causes and solutions:**
1. **Plugin not activated**
- Go to Plugins and ensure Google Customer Reviews for WooCommerce is activated
2. **Survey opt-in disabled**
- Go to plugin settings and ensure "Enable Survey Opt-in" is turned on
3. **Missing Merchant Center ID**
- Enter your Google Merchant Center ID in the plugin settings
4. **Caching issue**
- Clear your page cache
- Exclude the order confirmation page from caching
- Try in an incognito/private browser window
5. **JavaScript error**
- Open browser developer tools (F12)
- Check the Console tab for errors
- Look for conflicts with other plugins
6. **Theme compatibility**
- Try switching to a default theme (Storefront) temporarily
- If it works, there's a theme conflict
### Opt-in appears but looks broken or unstyled
1. **CSS conflicts**
- Check for CSS rules that might affect the opt-in container
- Try adding this CSS:
```css
.gcr-survey-optin {
all: initial;
}
```
2. **Google script blocked**
- Check if your firewall or security plugin is blocking Google scripts
- Whitelist `www.google.com` and `apis.google.com`
3. **Content Security Policy**
- If using CSP headers, ensure Google domains are allowed
### Customers not receiving survey emails
1. **Delivery time too short**
- Google sends surveys after the estimated delivery date
- Increase the "Estimated Delivery Days" setting
2. **Customer email issues**
- Survey emails may go to spam
- Advise customers to check their spam folder
3. **Not enough time passed**
- Surveys are sent days after the estimated delivery
- Wait for the appropriate time to pass
## Badge Issues
### Badge not displaying
1. **Not enough reviews**
- You need approximately 100 reviews for a seller rating
- The badge won't display without a rating
2. **Badge disabled**
- Check plugin settings to ensure the badge is enabled
3. **Wrong placement**
- If using INLINE position, ensure the shortcode is placed correctly
- If using floating position, check z-index conflicts
4. **Caching**
- Clear your page cache
- Try in an incognito window
### Badge displays wrong rating
1. **Google cache**
- Google caches ratings; updates may take several hours
- Wait 24 hours and check again
2. **Multiple Merchant Center accounts**
- Ensure you're using the correct Merchant Center ID
## Product GTIN Issues
### GTINs not being sent with opt-in
1. **GTIN field empty**
- Ensure products have GTINs entered
- Check the GTIN field in WooCommerce product settings
2. **Wrong GTIN source**
- Check plugin settings for the correct GTIN source field
- Ensure the custom field name matches if using a custom field
3. **GTIN inclusion disabled**
- Enable "Include Product GTINs" in plugin settings
### Product ratings not appearing in Google
1. **GTIN mismatch**
- GTINs must match exactly between your store and Google Merchant Center feed
- Verify GTINs are correct and formatted properly
2. **Not enough reviews**
- Product-level ratings also require sufficient reviews
## License and Activation Issues
### License key not working
1. **Copy/paste errors**
- Ensure no extra spaces when copying the license key
- Try typing the key manually
2. **Wrong site URL**
- License is tied to a specific domain
- Check your license is registered for this domain
3. **License expired**
- Check your account for license status
- Renew if expired
### Can't activate on additional site
1. **License limit reached**
- Your license tier limits the number of sites
- Upgrade to a higher tier for more sites
- Or deactivate on another site first
## Performance Issues
### Page load is slow after installing
1. **Debug mode enabled**
- Disable debug mode in production
- Debug logging can slow down the site
2. **Check other plugins**
- Temporarily disable other plugins to identify conflicts
## Debug Mode
To help troubleshoot issues, enable debug mode:
1. Go to plugin settings
2. Enable "Debug Mode"
3. Reproduce the issue
4. Check logs at **WooCommerce → Status → Logs**
5. Look for logs starting with `gcr-`
**Important:** Disable debug mode after troubleshooting to avoid performance impact.
## Getting Help
If you can't resolve your issue:
1. **Check the [FAQ](https://sweetcode.com/docs/gcr/faq)** for common questions
2. **Enable debug mode** and gather log information
3. **[Contact support](https://sweetcode.com/support)** with:
- Your WordPress and WooCommerce versions
- Plugin version
- Description of the issue
- Steps to reproduce
- Any error messages or logs
---
# Docs
URL: https://sweetcode.com/docs/index
# [Docs](https://sweetcode.com/docs/pmw/)
- [Pixel Manager for WooCommerce Documentation](https://sweetcode.com/docs/pmw/)
- [Google Automated Discounts for WooCommerce](https://sweetcode.com/docs/gadwc/)
---
# License Management
URL: https://sweetcode.com/docs/license-management
# License Management
This page covers license management for all SweetCode plugins, including [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/), [Google Automated Discounts for WooCommerce](https://sweetcode.com/plugins/gadwc/), and [Google Customer Reviews for WooCommerce](https://sweetcode.com/plugins/gcr/).
## Account Access
You can access your account under the following link: [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/)
Use the email address with which you have purchased the plugin and created the account.
## How to Find Your License Key
There are three ways to retrieve your license key:
### Option A: From the Plugin Settings
1. Open your WordPress admin dashboard
2. Go to the plugin settings page
3. Click on the **Account** tab

4. Copy the license key from the license field

### Option B: From Your Account Portal
1. Log into your account at [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/)
2. Navigate to **Licenses** in the left menu
3. Click on the license you need
4. Copy the license key from the license details
### Option C: Use the License Recovery Form
If you don't have access to the plugin or your account, you can use our license recovery forms to have the license key sent to your email:
- [Pixel Manager for WooCommerce](https://dashboard.freemius.com/license-recovery/7498/woocommerce-google-adwords-conversion-tracking-tag/)
- [Google Automated Discounts for WooCommerce](https://dashboard.freemius.com/license-recovery/8668/google-automated-discounts-for-woocommerce/)
- [Google Customer Reviews for WooCommerce](https://dashboard.freemius.com/license-recovery/11174/google-customer-reviews-for-woocommerce/)
See also: [License Recovery](#license-recovery)
## VAT
### The invoice is missing my VAT ID. How can I get a new invoice that includes the VAT ID?
1. Follow this [link](https://sweetcode.com/freemius-account/) to log into your account of our store at Freemius: [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/)
2. Under **My Profile** add the VAT ID
3. Now you can download a new invoice from the **Order History** that contains the VAT ID on your invoice.
### Reclaim VAT
If you forgot to add your VAT number during checkout, the VAT was added to your invoice. Here's what you need to do to fix this:
1. Update your profile in your [account](https://sweetcode.com/freemius-account/) with your VAT ID.
2. Ask us for a VAT refund through our support email support@sweetcode.com
Once we process your request, we will issue a refund for the VAT amount. Also future renewals will be VAT-exclusive.
### How does Freemius collect VAT in Europe?
Read more details about this in the following Freemius support article: [Collecting EU VAT in Europe](https://freemius.com/wordpress/collecting-eu-vat-europe/)
## How to transfer a license from one domain to another domain?
Simply disable the license on the domain where it is currently active.
Go to the plugin dashboard and click on the "Account" tab. On the Account tab, you can disable that license.

Once that's done you can reuse the license on another domain.
Another way is to disable the current license through your account: https://sweetcode.com/freemius-account/


Once that's done you can use the license on another site.
## Can I test my license on a development server?
Yes. The licensing server detects common development server setups and will allow you to activate the license on the production **and** on the development server. Here's a [list](https://freemius.com/help/documentation/selling-with-freemius/license-utilization/) of common localhost environments that are automatically detected.
We can add more staging domains when needed. In that case please reach out to us through our support email support@sweetcode.com.
## How do I install the pro version?
Right after the purchase, you should receive an email with the license key that explains how to install the pro version. Also, take a look in the spam inbox if you can't find it. If you still can't find it there's another way.
Follow this link [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/). It will redirect you to our store at Freemius, our licensing partner.
1. Reset the password to create a new password and get access
2. Login into the store [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/)
3. Download the pro version
4. Install it as explained in the following video [https://www.youtube.com/watch?v=Wp8TlD030EE](https://www.youtube.com/watch?v=Wp8TlD030EE)
5. After activation you should see a prompt that asks for the license key. You'll find the license key in your account portal at Freemius
6. After adding the license key the pro version is fully active
## Do I need to keep the free version active?
No. The pro (Premium) version can run just by itself and does not require the free version to be installed. That means after installation of the pro version you can safely deactivate and uninstall the free version. Keeping the free version installed doesn't hurt either, but it is not needed.
## Install Plugins with Composer
If you prefer to manage our plugins via Composer, you can install them directly from your Freemius account. This is particularly useful for agencies, developers who use version control, or anyone who prefers automated deployment workflows.
### Step 1: Access the Downloads Page
1. Log into your account at [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/)
2. Navigate to **Downloads** in the left menu
3. You'll see all your purchased plugins listed with a **Composer** button next to each one

### Step 2: Get Your Composer Repository URL
1. Click the **Composer** button next to the plugin you want to install
2. A modal will appear with your personal Composer repository URL and configuration

### Step 3: Configure Your Project
If you haven't yet installed [Composer](https://getcomposer.org/) or if your project is missing its configuration file, create a new `composer.json` file in your project's root folder with the following config:
```json
{
"name" : "your_company/your_project",
"version" : "1.2.3",
"require" : {
"freemius/pixel-manager-pro-for-woocommerce": "1.55.0"
},
"repositories": [{
"type": "composer",
"url" : "https://composer.freemius.com/packages.json?authorization=Basic+YOUR_AUTH_TOKEN"
}]
}
```
Replace the following placeholders:
- `your_company/your_project` with your actual project name
- `1.2.3` with your project version
- `freemius/pixel-manager-pro-for-woocommerce` with the correct package name for your plugin:
- **Pixel Manager Pro**: `freemius/pixel-manager-pro-for-woocommerce`
- **Google Automated Discounts**: `freemius/sgadwc-premium`
- **Google Customer Reviews**: `freemius/google-customer-reviews-for-woocommerce-premium`
- `YOUR_AUTH_TOKEN` with your personal authorization token (shown in the modal)
### Step 4: Install the Plugin
Run the following command in your project root:
```bash
composer install
```
Or if you already have a `composer.json` file and just need to add the plugin:
```bash
composer require freemius/pixel-manager-pro-for-woocommerce
```
:::tip
Your Composer repository URL contains a personal authorization token. Keep it secure and don't share it publicly (e.g., in public Git repositories). Consider using environment variables or a `auth.json` file for sensitive credentials.
:::
### Updating Plugins via Composer
To update to the latest version of a plugin, run:
```bash
composer update freemius/pixel-manager-pro-for-woocommerce
```
Or update all packages:
```bash
composer update
```
### Learn More
Watch this video tutorial to learn how to install plugins via Composer from your Freemius account:
- [Video: Getting started with Composer](https://www.youtube.com/watch?v=kyPonhmEsVU)
## What if I can't activate the license on my shop?
The following is a step-by-step guide on how to reset everything and make sure that license activation works. Sometimes license activation can't work because of duplicate installs of the plugin, or if the license management library runs into an error. Therefore, the following instructions explain a full reset, which takes a bit more time but has the highest chance to get it working fine again. If the following procedure doesn't work for you, please contact our support.
1. Identify all installed versions of the plugin.
2. Deactivate all active versions of the plugin.
3. Uninstall (delete) all versions of the plugin.
4. Download and install the Freemius Fixer and let it run once: https://github.com/Freemius/freemius-fixer
5. Re-install the pro version of the plugin. You can download it from the account page: https://sweetcode.com/freemius-account/
6. Activate the pro version. Normally during activation, you will be asked for the license key. If so, enter it. Done. The plugin and the license are fully active.
If the plugin doesn't ask for the license key, continue with 7.
7. Go to the plugin page. Open the account tab. Enter the license key in the license field. Done. Now everything should be running fine.
## My country doesn't allow for automatic renewals. What can I do?
You can renew the license manually through your account which you can access here: https://sweetcode.com/freemius-account/
Because the renewals have to be done manually, we recommend getting an annual subscription instead of a monthly subscription, if you haven't one already.
Then, each time you get a renewal notification, or latest when you get a failed payment notification follow the below procedure to renew your license manually.
1. Log into your account under https://sweetcode.com/freemius-account/
2. Click on **Licenses** on the left side menu
3. Click on the license that you want to renew
4. Click on the **Renew** button in the license overview that has opened on the right side


## Expired license warning
When a plugin detects that the license has expired, or no license has been activated, then all premium features get disabled.

### The license has expired
Purchase or extend your license through our [account page](https://sweetcode.com/freemius-account/).
### There is a valid license, but the plugin doesn't detect it
If you have a valid license, but the plugin can't detect it, try one ore more of the following troubleshooting approaches.
- Go to the account tab of your plugin settings page and check if the license has been set. If not, go to your [license management account](https://sweetcode.com/freemius-account/), get your license key and paste it into the plugin.
- Go to the account tab of your plugin settings page and sync your account manually:

- Rarely a full reset is necessary. In that case, download the [Freemius Fixer Plugin](https://github.com/Freemius/freemius-fixer/archive/refs/heads/master.zip). Install the plugin and run it. After you've run the Freemius Fixer you must reactivate your license. Go to your [license management account](https://sweetcode.com/freemius-account/), get your license key, open the account tab in the plugin settings page and paste the license key.
## EULA End User License Agreement
The current EULA conditions can be found under the following links:
- [Pixel Manager for WooCommerce EULA](https://freemius.com/product/7498/woocommerce-google-adwords-conversion-tracking-tag/legal/eula/)
- [Google Automated Discounts for WooCommerce EULA](https://freemius.com/product/8668/google-automated-discounts-for-woocommerce/legal/eula/)
- [Google Customer Reviews for WooCommerce EULA](https://freemius.com/product/11174/google-customer-reviews-for-woocommerce/legal/eula/)
## License Quotas
### Subdomains
Each subdomain counts as a separate domain. For example, if you have a license for `example.com` and you want to add a license for `a.example.com` and `b.example.com` you need to purchase two additional licenses.
### Staging
Staging environments are not counted as a separate domain. For example, if you have a license for `example.com` and you want to add a license for `staging.example.com` you don't need to purchase an additional license. This includes `localhost`.
The system detects staging environments automatically. If it doesn't work for you, please contact our support. We will add your staging environment to your license.
### Freeing up a license
If you want to free up a license, for example, because you want to use it on another domain, you can do so by deactivating the license on the domain where it is currently active. You can manage your licenses in your account: [https://sweetcode.com/freemius-account/](https://sweetcode.com/freemius-account/)
## Upgrade a subscription
If you want to upgrade your subscription to a higher tier because you want to assign licenses to more websites, follow these instructions step by step:
1. Log into your account under https://sweetcode.com/freemius-account/
2. Click on **Renewals & Billing**
3. Click on the product subscription that you want to adjust.
4. Click on the **Upgrade to...** drop down.
5. Click on the tier you want to upgrade to.
A checkout window will open.
6. Complete the checkout process.
You only will be charged pro rata for the remaining time of your current subscription.


## Removing a license from a website
If you want to remove a license from a website to use the free version for that website, you can do so by logging into your account, clicking on the site where you want to downgrade the license and then click on the downgrade button.
1. Log into your account under https://sweetcode.com/freemius-account/
2. Click on the **Site** where you want to remove the license.

3. Click on the **Downgrade** button

## License Security
### Restrict Sites

### White Label Mode
Agencies and freelancers who work on client projects can hide confidential information about their account and license by flagging a license as White Labeled:

This means that account details normally shown in the account tab in the WP Admin will not appear when users check the box that says "This license is activated on my client(s) site(s)". This addition to the user dashboard is great for anyone who uses our plugins as part of their own services. Here's everything that will be hidden when a license is set as white-labeled:
- User information
- Billing details and invoices
- License key
- Pricing page
- Add-on prices
- Contact Us page
## License Recovery
To recover your license key and get a download link for a plugin, please use one of the following license recovery forms:
- [Pixel Manager for WooCommerce](https://dashboard.freemius.com/license-recovery/7498/woocommerce-google-adwords-conversion-tracking-tag/)
- [Google Automated Discounts for WooCommerce](https://dashboard.freemius.com/license-recovery/8668/google-automated-discounts-for-woocommerce/)
- [Google Customer Reviews for WooCommerce](https://dashboard.freemius.com/license-recovery/11174/google-customer-reviews-for-woocommerce/)
## Upgrade to a Bundle License
We offer a bundle license that includes [multiple of our plugins at a discounted price](https://sweetcode.com/plugins/bundle/).
You will need your existing license key and the checkout will automatically recognize the license as part of the bundle's offering and apply the appropriate prorated discount.
What happens to the upgraded license?
1. The license becomes a bundle license, unlocking all products included in [our bundle plan](https://sweetcode.com/plugins/bundle/).
2. The license adopts the bundle's plan and pricing.
Here's how to upgrade your existing single plugin license to a bundle license:
1. Get the license of your existing single plugin license: [Get the license](https://sweetcode.com/docs/license-management#how-to-find-your-license-key)
2. Choose the bundle license that you want to upgrade to: [Bundle license](https://sweetcode.com/plugins/bundle/)
3. During checkout, enter the license key of your existing single plugin license into the upgrade field.

4. Complete the checkout process. You will only be charged pro rata for the remaining time of your current subscription.
---
# Pixel Manager for WooCommerce
URL: https://sweetcode.com/docs/pmw
# Pixel Manager for WooCommerce
Pixel Manager for WooCommerce allows you to track your conversions through the use of Pixels. Using this plugin, you’ll be able to connect WooCommerce data to your Conversion Reports on the supported platforms like Google Ads, Google Analytics, Meta (Facebook) Ads, Microsoft Ads, Twitter Ads, Pinterest Ads, Snapchat Ads, TikTok Ads, Hotjar and more to come.
# Support Articles
The articles below will help you get started in setting up the extension, as well as provide information and a step-by-step configuration to connect WooCommerce data to the supported platforms.
- Features
- [Features](features/features.md)
- [Events](features/events.md)
- [Automatic Conversion Recovery (ACR)](features/acr.md)
- [Why Upgrade to Pro?](features/why-upgrade-to-pro.md)
- Setting up Pixel Manager for WooCommerce
- [Requirements](setup/requirements.mdx)
- [Plugin Installation](setup/plugin-installation.md)
- [Script Blockers](setup/script-blockers.md)
- Plugin Configuration
- [General Settings](plugin-configuration/general-settings.md)
- [Shop Settings](plugin-configuration/shop.mdx)
- [AB Tasty](plugin-configuration/ab-tasty.mdx)
- [AdRoll](plugin-configuration/adroll.mdx)
- [Contentsquare](plugin-configuration/contentsquare.mdx)
- [CrazyEgg](plugin-configuration/crazyegg.mdx)
- [Criteo](plugin-configuration/criteo.mdx)
- [Google](plugin-configuration/google.mdx)
- [Google Ads](plugin-configuration/google-ads.mdx)
- [Google Analytics](plugin-configuration/google-analytics.mdx)
- [GroundTruth](plugin-configuration/groundtruth.mdx)
- [Hotjar](plugin-configuration/hotjar.mdx)
- [Hyros](plugin-configuration/hyros.mdx)
- [LinkedIn](plugin-configuration/linkedin.mdx)
- [Meta (Facebook)](plugin-configuration/meta.md)
- [Microsoft Advertising (Bing Ads)](plugin-configuration/microsoft-advertising.mdx)
- [Microsoft Clarity](plugin-configuration/clarity.mdx)
- [Mixpanel](plugin-configuration/mixpanel.mdx)
- [Nextdoor](plugin-configuration/nextdoor.mdx)
- [OpenAI](plugin-configuration/openai.mdx)
- [Optimizely](plugin-configuration/optimizely.mdx)
- [Outbrain](plugin-configuration/outbrain.mdx)
- [Pinterest](plugin-configuration/pinterest.md)
- [Reddit](plugin-configuration/reddit.mdx)
- [Snapchat](plugin-configuration/snapchat.md)
- [Taboola](plugin-configuration/taboola.mdx)
- [TikTok](plugin-configuration/tiktok.md)
- [Triple Whale](plugin-configuration/triple-whale.mdx)
- [VWO](plugin-configuration/vwo.mdx)
- [X (Twitter)](plugin-configuration/twitter.md)
- [Settings Reference](settings-reference.mdx)
- [Testing](testing.md)
- [Diagnostics](diagnostics.mdx)
- [Troubleshooting](troubleshooting.md)
- [GA4 `anon_*` client IDs](ga4-anon-client-id.md)
- [Plugin Compatibility](plugin-compatibility.md)
- [Caching and Optimization Exclusions](caching-and-optimization.md)
- Consent Management
- [Overview](consent-management/overview.md)
- [Platforms](consent-management/platforms.mdx)
- [Google Consent Mode](consent-management/google.md)
- [Microsoft Ads Consent Settings](consent-management/microsoft.md)
- [API](consent-management/api.md)
- Server-Side Proxy
- [Overview](server-side-proxy/overview.md)
- [Setup](server-side-proxy/setup.md)
- [Management](server-side-proxy/management.md)
- [FAQ](server-side-proxy/faq.md)
- [Shop](shop.md)
- [License Management](license-management.md)
- [Opportunities](opportunities.md)
- [Videos](videos.mdx)
- Developer's Documentation
- [PHP Filters](developers/php-filters.md)
- [Event Filters](developers/event-filters.md)
- [Hooks](developers/hooks.md)
- [Shortcodes](developers/shortcodes.md)
- [Experiments](developers/experiments.md)
- [JavaScript Events](developers/javascript-events.md)
- [Console Logger](developers/console-logger.md)
- [Command Queue](developers/command-queue.md)
- [Logs](developers/logs.md)
- [Tips and Tricks](developers/tipps-and-tricks.md)
- Recipes
- [Status-Driven Purchase Conversions](developers/recipes/status-driven-purchase-events.md)
- [Track Phone Conversions for Multiple Store Locations](developers/recipes/track-phone-conversions-for-multiple-store-locations.md)
- [Frequently Asked Questions](faq.mdx)
- Changelog
- [Changelog Free](changelog/free.mdx)
- [Changelog Pro](changelog/pro.mdx)
---
# Caching and Optimization Exclusions
URL: https://sweetcode.com/docs/pmw/caching-and-optimization
# Caching and Optimization Exclusions
This page lists the exact scripts, paths and endpoints to exclude if a caching, minification or performance plugin needs to be told to leave the Pixel Manager alone.
:::tip[Short answer]
In almost all cases you don't need to exclude anything. Page caching is fully supported by design, and the Pixel Manager applies the required JavaScript optimization exclusions **automatically** for the most common optimization plugins. Only add manual exclusions if you actually see tracking break, or if your optimizer is not in the [automatic list](#handled-automatically).
:::
## Handled automatically
For these plugins the Pixel Manager registers its own exclusions at runtime. There is no setting to switch on, and nothing to add by hand:
| Plugin | What the Pixel Manager excludes automatically |
|---|---|
| **WP Rocket** | JS minification, JS combination, inline JS optimization, plus Delay JS on cart, checkout and order confirmation pages |
| **LiteSpeed Cache** | JS minification and combination |
| **SiteGround Optimizer** | JS combination (including inline), JS minification, and jQuery deferring |
| **Autoptimize** | JS minification (treated as already minified) and script moving |
| **WP-Optimize** | JS minification |
| **Optimocha (Speed Booster Pack)** | JS optimization (adds the Pixel Manager to the exclusion list, removes it from the include list) |
| **FlyingPress** | Delay-until-interaction for tracking scripts on cart, checkout and order confirmation pages |
The Pixel Manager also purges the cache when you change its settings, so you don't keep serving stale HTML after a configuration change. That covers the plugin layer (NitroPack, WP Rocket, LiteSpeed, Autoptimize, Hummingbird, W3 Total Cache, WP-Optimize, WP Super Cache, WP Fastest Cache, FlyingPress), the host layer (SiteGround, WP Engine, Kinsta, Nginx Helper, Proxy Cache Purge) and Cloudflare.
:::info
Purging is not the same as excluding. For NitroPack, W3 Total Cache, WP Super Cache, WP Fastest Cache, Hummingbird, Perfmatters, Swift Performance, Breeze, Cloudflare Rocket Loader and any other optimizer not listed in the table above, the Pixel Manager only purges the cache. If one of those tools breaks tracking, add the exclusions below manually.
:::
## What breaks tracking, and what doesn't
Not every optimization is a problem. Excluding more than necessary costs performance for no gain.
**Safe, no exclusion needed:**
- Full page caching of the HTML. The Pixel Manager is built for it: cart contents and product data that can go stale are fetched from the server after the page has loaded, never baked into cached HTML.
- `defer` on the Pixel Manager script. Deferring only changes the load order, not whether the script runs.
- Serving the Pixel Manager files from a CDN, gzip/Brotli compression, HTTP caching of the static `.js` files.
- CSS optimization, image optimization, font optimization, lazy loading images.
**Breaks tracking, exclude it:**
- **JS minification** of the Pixel Manager files. The files are already minified, and re-minifying them can corrupt the bundle.
- **JS combination / concatenation / bundling.** The Pixel Manager loads its pixel code as separate webpack chunks on demand. If the entry script is repackaged, or the entry script is excluded while the chunks are not, the browser requests chunk file names that no longer exist and the console shows a `ChunkLoadError`. Always exclude the whole plugin folder, not a single file.
- **Delay JavaScript until user interaction** on the cart, checkout and order confirmation pages. Many buyers never click, scroll or move the mouse on the order confirmation page, so a delayed script means the purchase conversion is never sent. Delaying on other page types is usually fine.
- **Removing unused JavaScript** or any feature that rewrites, inlines or reorders inline script tags. The Pixel Manager's data layer is an inline script.
- **Cloudflare Rocket Loader**, which reorders and defers inline scripts.
## The exclusion list
### 1. The Pixel Manager script files
The safest and most future proof rule is to exclude the whole plugin folder. Chunk file names contain a content hash that changes with every release, so a rule that names individual files goes stale.
Use the folder that matches how you installed the plugin:
| Distribution | Path |
|---|---|
| Free version from WordPress.org | `/wp-content/plugins/woocommerce-google-adwords-conversion-tracking-tag/` |
| Pro version from sweetcode.com | `/wp-content/plugins/pixel-manager-pro-for-woocommerce/` |
| Pro version from WooCommerce.com | `/wp-content/plugins/woocommerce-pixel-manager/` |
If your optimizer wants wildcard patterns, these three cover every case:
```
*woocommerce-google-adwords-conversion-tracking-tag*
*pixel-manager-pro-for-woocommerce*
*woocommerce-pixel-manager*
```
If a tool insists on concrete file names, the front end assets are:
```
# Free tier assets
/wp-content/plugins//js/public/free/pmw-public.p1.min.js
/wp-content/plugins//js/public/free/*.chunk.min.js
# Pro tier assets
/wp-content/plugins//js/public/pro/pmw-public__premium_only.p1.min.js
/wp-content/plugins//js/public/pro/pmw-lazy__premium_only.js
/wp-content/plugins//js/public/pro/*.chunk.min.js
```
Notes:
- A Pro installation contains both the `free` and the `pro` folder and serves one of them depending on the license state, so exclude both directories.
- `.p1` in the Pro entry script name is the script optimization preset. It becomes `.p2` if the preset is changed through the `pmw_script_optimization_preset_version` filter. A wildcard such as `*pmw-public*` covers both.
- The WordPress script handle is `pmw`, for optimizers that exclude by handle rather than by URL.
### 2. The inline data layer
The Pixel Manager writes its configuration and the product, cart and order data into inline `
```
## Planning Your Filters
Before implementing filters, consider where your events are processed:
### Front-End vs. Server-Side Events
**Front-end events** (processed in the browser):
- All events when server-to-server tracking is disabled
- Events like `add_to_cart`, `view_item`, `begin_checkout`, etc.
- Purchase events **only if** processed through the browser
**Server-side events** (processed on the server):
- Purchase events when server-to-server tracking is enabled (Facebook CAPI, TikTok EAPI, Pinterest APIC, Snapchat CAPI)
- Google Analytics purchase events when Measurement Protocol is enabled
- These are **always** sent from the server, never through the browser
**Why server-side purchase events?** Browser-based tracking can be blocked by ad blockers, browser extensions, privacy settings, or network-level filters. When server-to-server tracking is enabled, purchase events are compiled and sent directly from your server to the advertising platforms, completely bypassing the browser. This makes them immune to client-side blocking, ensuring 100% reliable conversion tracking. The tradeoff is that these events are processed in a completely independent pipeline, which means they require separate filters.
:::warning[Critical: Purchase Events with Server-to-Server Tracking]
When server-to-server tracking is active, purchase events are **compiled and sent exclusively from the server**. This means:
- **Front-end filters will NOT affect these purchase events**
- **You must implement PHP server-side filters** to modify purchase event data
**Example:** To filter purchase events with server-to-server tracking enabled, you need both:
```javascript
// Front-end (for any browser-based purchase events)
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_event_payload_purchase', 'my-filter', function(payload) {
payload.event_data.custom_field = 'value';
return payload;
});
});
```
```php
// Server-side (REQUIRED for server-to-server purchase events)
add_filter('pmw_server_event_payload_event_purchase', function($pixel_data, $pixel_name, $event_name) {
$pixel_data['custom_data']['custom_field'] = 'value';
return $pixel_data;
}, 10, 3);
```
Always implement server-side filters when working with purchase events if you have server-to-server tracking enabled.
:::
## Front-End Filters (JavaScript)
### Filter Pipeline
Events flow through 4 stages. Each filter must return the modified data:
1. **`pmw_event_payload_pre`** - Before pixel transformations (modify core event data)
2. **`pmw_pixel_data_{pixel}`** - Per-pixel transformations (e.g., `pmw_pixel_data_facebook`)
3. **`pmw_event_payload_{event}`** - Per-event type (e.g., `pmw_event_payload_purchase`)
4. **`pmw_event_payload_post`** - Final stage (logging, debugging)
**Supported pixels:** `facebook`, `google_ads`, `google_analytics`, `tiktok`, `pinterest`, `snapchat`, `linkedin`, `microsoft_ads`, `twitter`, `reddit`, `taboola`, `outbrain`
**Supported events:** `page_view`, `add_to_cart`, `view_item`, `view_item_list`, `begin_checkout`, `add_payment_info`, `add_to_wishlist`, `search`, `purchase`
### API
```javascript
pmw.hooks.addFilter(hookName, namespace, callback, priority)
pmw.hooks.removeFilter(hookName, namespace)
pmw.hooks.hasFilter(hookName, namespace)
```
- **namespace** - Unique identifier to prevent conflicts (e.g., `'my-plugin/feature'`)
- **priority** - Execution order (default: 10, lower runs first)
- **Return `null`** to block an event from firing
### Examples
#### Add Custom Facebook Parameters
```javascript
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-store', function(pixelData) {
pixelData.custom_data = pixelData.custom_data || {};
pixelData.custom_data.store_location = 'NYC';
pixelData.custom_data.user_segment = 'premium';
return pixelData;
});
});
```
#### Adjust Prices Globally
```javascript
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_event_payload_pre', 'price-modifier', function(payload) {
if (payload.event_data?.product?.price) {
payload.event_data.product.price *= 1.15; // +15% markup
}
return payload;
});
});
```
#### Filter by Event Type
```javascript
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_event_payload_purchase', 'purchase-tags', function(payload) {
if (payload.event_data?.order_total > 500) {
payload.event_data.high_value = true;
}
return payload;
});
});
```
#### Block Events Conditionally
```javascript
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_pixel_data_facebook', 'admin-filter', function(pixelData) {
if (window.userIsAdmin) {
return null; // Block event
}
return pixelData;
});
});
```
#### Use Priority for Execution Order
```javascript
window._pmwq.push(function() {
// Runs first (priority 5)
pmw.hooks.addFilter('pmw_event_payload_pre', 'early-filter', function(payload) {
payload.event_data.processed_by = ['early-filter'];
return payload;
}, 5);
// Runs second (priority 10)
pmw.hooks.addFilter('pmw_event_payload_pre', 'late-filter', function(payload) {
payload.event_data.processed_by.push('late-filter');
return payload;
}, 10);
});
```
## Server-Side Filters (PHP)
### Filter Pipeline
Server-side events (Facebook CAPI, TikTok EAPI, Pinterest APIC, Snapchat CAPI) flow through 5 stages:
1. **`pmw_server_event_payload_pre`** - Before pixel processing (all pixels at once)
2. **`pmw_server_event_payload_{pixel}`** - Per-pixel, all events (e.g., `facebook`)
3. **`pmw_server_event_payload_event_{event}`** - Per-event, all pixels (e.g., `purchase`)
4. **`pmw_server_event_payload_{pixel}_{event}`** - Specific pixel + event (e.g., `facebook_purchase`)
5. **`pmw_server_event_payload_post`** - Final stage before API transmission
### Examples
#### Modify All Purchase Events (All Pixels)
```php
add_filter('pmw_server_event_payload_event_purchase', function($pixel_data, $pixel_name, $event_name) {
// Add timestamp to all purchase events across all pixels
$pixel_data['custom_data']['order_timestamp'] = time();
// Categorize by value
if (isset($pixel_data['custom_data']['value'])) {
$value = $pixel_data['custom_data']['value'];
$pixel_data['custom_data']['value_tier'] = $value < 50 ? 'low' : ($value < 200 ? 'medium' : 'high');
}
return $pixel_data;
}, 10, 3);
```
#### Add Custom Data to Facebook Only
```php
add_filter('pmw_server_event_payload_facebook', function($pixel_data, $pixel_name) {
$pixel_data['user_data']['subscription_status'] = 'premium';
return $pixel_data;
}, 10, 2);
```
#### Target Specific Pixel + Event
```php
add_filter('pmw_server_event_payload_facebook_purchase', function($pixel_data, $pixel_name, $event_name) {
$user_id = get_current_user_id();
if ($user_id) {
$ltv = get_user_meta($user_id, 'customer_ltv', true);
if ($ltv > 1000 && isset($pixel_data['custom_data']['value'])) {
$pixel_data['custom_data']['value'] *= 1.2; // Boost value for high-LTV customers
}
}
return $pixel_data;
}, 10, 3);
```
#### Block Events Conditionally
```php
// Block low-value purchases from all pixels
add_filter('pmw_server_event_payload_event_purchase', function($pixel_data, $pixel_name, $event_name) {
if (isset($pixel_data['custom_data']['value']) && $pixel_data['custom_data']['value'] < 10) {
return null; // Blocks event for all pixels
}
return $pixel_data;
}, 10, 3);
// Block only from Facebook
add_filter('pmw_server_event_payload_facebook', function($pixel_data) {
if (some_condition()) {
return null;
}
return $pixel_data;
});
```
## Event Payload Structure
```javascript
{
event: 'add_to_cart',
event_data: {
product: {
id: 123,
name: 'Product Name',
price: 99.99,
quantity: 1,
currency: 'USD',
categories: ['Electronics']
}
},
pixels: {
facebook: {
event_name: 'AddToCart',
event_id: 'unique-id',
custom_data:
},
google_analytics: {
event_name: 'add_to_cart',
event_data:
}
}
}
```
## Best Practices
1. **Always return the value** - Filters must return the modified data or `null` to block
2. **Use unique namespaces** - Format: `'plugin-name/feature'` or `'company-name/modifier'`
3. **Wrap in `_pmwq`** - Ensures Pixel Manager loads before your filters
4. **Check data exists** - Use optional chaining: `payload.event_data?.product?.price`
5. **Use appropriate priority** - Default is 10; lower numbers run first
6. **Test thoroughly** - Check browser console for filter execution logs
## Debugging
### Console Logging
Filter execution is logged to the browser console:
```
🔍 Pre-processing filter called: add_to_cart
📊 GA pixel data filter called: add_to_cart
```
### Inspect Payloads
```javascript
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_event_payload_post', 'debugger', function(payload, eventName) {
console.log(`Event: ${eventName}`, payload);
return payload;
}, 999); // High priority to run last
});
```
### PHP Debugging
```php
add_filter('pmw_server_event_payload_post', function($pixel_data, $pixel_name) {
if (defined('WP_DEBUG') && WP_DEBUG) {
error_log("Sending {$pixel_data['event_name']} to {$pixel_name}: " . json_encode($pixel_data));
}
return $pixel_data;
}, 10, 2);
```
## Migration from Old System
If you were using jQuery event listeners:
**Before:**
```javascript
jQuery(document).on("pmw:add-to-cart", function(event, product) {
product.price = product.price * 1.1;
});
```
**After (Recommended - Using Filters):**
```javascript
window._pmwq.push(function() {
pmw.hooks.addFilter('pmw_event_payload_add_to_cart', 'namespace', function(payload) {
payload.event_data.product.price *= 1.1;
return payload;
});
});
```
**Alternative - Using Public API Events:**
:::tip[Available Since Version 1.52.0]
If you only need to **listen** to events (not modify them), you can use the new public API events instead of filters.
:::
```javascript
window._pmwq.push(function() {
// Listen to the official public API event
jQuery(document).on('pmw:event:add-to-cart', function(event, payload) {
// payload contains fully processed event data
console.log('Product added:', payload.event_data.product);
console.log('Pixel-specific data:', payload.pixels);
// You can trigger your own tracking here
myCustomTracker.track('add_to_cart', payload.event_data);
});
});
```
The `pmw:event:*` events provide the complete processed payload including all pixel adaptations. See the [Command Queue documentation](./command-queue.md#event-reference) for the full list of available events.
## Event Name Mapping
The Pixel Manager uses **internal snake_case event names** which each pixel adapter transforms to the vendor-specific format.
### Internal Event Names
| Internal Event | Description |
|----------------|-------------|
| `page_view` | User views any page |
| `view_item` | User views a single product |
| `view_category` | User views a product category |
| `add_to_cart` | User adds product to cart |
| `begin_checkout` | User begins checkout process |
| `add_payment_info` | User adds payment information |
| `purchase` | Purchase completed |
| `add_to_wishlist` | User adds product to wishlist |
| `search` | User performs a search |
| `login` | User logs in |
### Vendor Event Name Mappings
Each pixel adapter transforms the internal event name to the vendor's format:
| Internal Event | Facebook | TikTok | Snapchat | Pinterest |
|----------------|----------|--------|----------|-----------|
| `page_view` | `PageView` | — | `PAGE_VIEW` | — |
| `view_item` | `ViewContent` | `ViewContent` | `VIEW_CONTENT` | `pagevisit` |
| `add_to_cart` | `AddToCart` | `AddToCart` | `ADD_CART` | `addtocart` |
| `purchase` | `Purchase` | `Purchase` | `PURCHASE` | `checkout` |
**Note:** A "—" indicates the pixel doesn't support this event (the adapter returns `null` and the event is skipped for that pixel).
### Modifying Vendor-Specific Data
Use `pmw_pixel_data_{pixel}` filters to modify data after it's been transformed to the vendor format:
```javascript
window._pmwq.push(function() {
// Modify Facebook-specific data structure
pmw.hooks.addFilter('pmw_pixel_data_facebook', 'my-plugin', function(pixelData, eventName) {
// pixelData.event_name is already "AddToCart" (Facebook format)
if (eventName === 'add_to_cart') {
pixelData.custom_data.source = 'mobile_app';
}
return pixelData;
});
});
```
---
# Experiments
URL: https://sweetcode.com/docs/pmw/developers/experiments
# Experiments
Over time, we will implement experiments into the plugin and let users vote them up if they like it.
:::caution
Experimental code may be changed or removed without prior notice.
:::
## Defer the WPM script
:::info
From version 1.15.0
:::
There are many JavaScript optimization plugins that can defer scripts. We thought it might be a good idea to offer this option natively in the Pixel Manager. For now this can be done using an experimental filter.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_experimental_defer_scripts', '__return_true');
```
If you like this script filter, vote it up over [here](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce?card=622f4ba9d0b938002e8378c0).
## Move the WPM script to the footer
:::info
From version 1.15.0
:::
With this filter you can move the WPM script from the header to the footer. It is similar to deferring the script.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_experimental_move_pmw_script_to_footer', '__return_true');
```
If you like this script filter, vote it up over [here](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce?card=622f4bc2d0b938002e8378e2).
---
# Hooks
URL: https://sweetcode.com/docs/pmw/developers/hooks
# Hooks
Hooks give you the ability to use the plugin's functionality in your own code.
For instance, not all themes follow WooCommerce conventions. In this case, you can use hooks like the `pmw_print_product_data_layer_script_by_product` hook to add the product details to the data layer.
## Add product details to the data layer
This hook adds the product details to the Pixel Manager data layer. Use it in your product template file.
This architecture is useful because it allows the product details in the data layer to be added only when the product is displayed and works very well with caching plugins.
```php title="product-template.php"
do_action('pmw_print_product_data_layer_script_by_product', PRODUCT_OBJECT);
```
```php title="product-template.php"
do_action('pmw_print_product_data_layer_script_by_product_id', YOUR_PRODUCT_ID);
```
---
# JavaScript Events
URL: https://sweetcode.com/docs/pmw/developers/javascript-events
# JavaScript Events
The Pixel Manager exposes a JavaScript event API on top of jQuery's event system. It works in two directions:
- **Listen** to `pmw:event:*` events to react to everything the Pixel Manager tracks, with the fully processed payload.
- **Trigger** a `pmw:*` event to tell the Pixel Manager that something happened that it could not detect on its own.
Both are supported entry points for your own code and for third party plugins.
:::info[Available Since]
The `pmw:*` trigger events have existed for a long time. The `pmw:event:*` listener API was introduced in version `1.52.1`.
:::
## Which direction do you need?
| You want to | Use | Example |
|---|---|---|
| Send data to another system whenever the Pixel Manager tracks something | Listen to `pmw:event:*` | Push every purchase into your own analytics endpoint |
| Add a pixel or a conversion the Pixel Manager does not cover | Listen to `pmw:event:*` | Fire a partner network tag on `purchase` |
| Make the Pixel Manager track an interaction it cannot see | Trigger `pmw:*` | A headless or custom-built add-to-cart button |
| Adjust the data before it reaches a platform | Neither, use [Event Filters](https://sweetcode.com/docs/pmw/developers/event-filters) | Rewrite the product ID sent to Meta |
:::tip
If you only want to **change** data that the Pixel Manager already sends, use [Event Filters](https://sweetcode.com/docs/pmw/developers/event-filters) instead. Filters run inside the pipeline and modify the payload. The events on this page run around it.
:::
## Listening to events
Listen to `pmw:event:`. The event name is the tracking event with underscores replaced by hyphens, so `add_to_cart` becomes `pmw:event:add-to-cart`.
```js
jQuery(document).on("pmw:event:purchase", function (event, payload) {
console.log(payload.event); // "purchase"
console.log(payload.event_data); // the order, product, cart, etc.
console.log(payload.context); // url, referrer, page_type, consent, ...
console.log(payload.pixels); // the data adapted per pixel
console.log(payload.firing); // which pixels fired browser-side and server-side
});
```
These events fire **after** the Pixel Manager has processed the event, applied all filters and decided which pixels fire. That makes them the right place to read final, authoritative data.
### Available events
Every event the Pixel Manager processes is dispatched:
| Event | Fires when |
|---|---|
| `pmw:event:page-view` | A page is viewed |
| `pmw:event:view-item` | A product is viewed |
| `pmw:event:view-item-list` | A product list becomes visible |
| `pmw:event:view-category` | A product category page is viewed |
| `pmw:event:select-item` | A product in a list is clicked |
| `pmw:event:search` | A search results page is viewed |
| `pmw:event:add-to-cart` | A product is added to the cart |
| `pmw:event:remove-from-cart` | A product is removed from the cart |
| `pmw:event:view-cart` | The cart is viewed |
| `pmw:event:add-to-wishlist` | A product is added to a wishlist |
| `pmw:event:begin-checkout` | The checkout starts |
| `pmw:event:add-shipping-info` | A shipping method is selected |
| `pmw:event:add-payment-info` | A payment method is selected |
| `pmw:event:place-order` | The order button is clicked |
| `pmw:event:purchase` | The purchase confirmation page is reached |
| `pmw:event:login` | A customer logs in |
| `pmw:event:account-created` | A customer account is created |
### The payload
| Key | Contents |
|---|---|
| `event` | The event name in its canonical form, e.g. `add_to_cart` |
| `event_data` | The core data of the event: `product`, `order`, and so on. Empty for events that carry no data of their own |
| `context` | `timestamp`, `url`, `referrer`, `user_agent`, `page_type`, `user_id` and the full `consent` state |
| `pixels` | The event data adapted to each active pixel's own format |
| `firing` | Per pixel, whether it fired in the browser and whether it fired server-side |
### Respect consent
The payload is dispatched regardless of the visitor's consent state, so that your code can make its own decision. `payload.context.consent` tells you what the visitor allowed:
```js
jQuery(document).on("pmw:event:purchase", function (event, payload) {
// Only act if the visitor accepted marketing cookies
if (!payload.context.consent.categories.marketing) return;
// Your code here
});
```
:::warning
If your code sets cookies or sends personal data to a third party, you are responsible for honoring consent yourself. The Pixel Manager only applies consent to its own pixels.
:::
## Triggering events
Trigger `pmw:` on `document` when the Pixel Manager cannot detect an interaction on its own. This is the same entry point the Pixel Manager's own listeners use, so the event goes through the entire pipeline: filters, all active pixels, server-side tracking and consent handling included.
```js
jQuery(document).trigger("pmw:add-to-cart", product);
```
### Available events
| Event | Argument | Notes |
|---|---|---|
| `pmw:add-to-cart` | product object | See [Building a product object](#building-a-product-object) |
| `pmw:remove-from-cart` | product object | |
| `pmw:view-item` | product object, optional | |
| `pmw:view-item-list` | product object, optional | |
| `pmw:view-category` | product object, optional | |
| `pmw:select-item` | product object | |
| `pmw:add-to-wishlist` | product object | |
| `pmw:search` | none | Reads the search term from the page |
| `pmw:view-cart` | none | |
| `pmw:begin-checkout` | none | Deduplicated against the Pixel Manager's own checkout triggers |
| `pmw:add-shipping-info` | `{shippingTier: {slug, text}}` | |
| `pmw:add-payment-info` | `{paymentType: {slug, text}}` | |
| `pmw:place-order` | none | |
| `pmw:purchase` | none | Reads the order from the data layer |
| `pmw:login` | none | |
| `pmw:account-created` | none | |
:::caution
Do not trigger `pmw:purchase` to report an order the Pixel Manager did not already know about. It reads the order from `pmwDataLayer.order`, which is written by the plugin on the purchase confirmation page, and it does not bypass the order duplication prevention. Reporting purchases from your own code is not a supported path.
:::
### Building a product object
The product argument is not free-form. Build it with the Pixel Manager's own helper so it carries every field the pixels expect:
```js
let product = pmw.getProductDetailsFormattedForEvent(productId, quantity);
```
If the product is not in the data layer yet, because it was never rendered on the page, fetch it from the server first:
```js
if (!pmwDataLayer.products[productId]) {
await pmw.getProductsFromBackend([productId]);
}
```
### Complete example: a custom add-to-cart button
This is how the Pixel Manager's own [Doofinder](https://www.doofinder.com/) integration works. It listens to the search plugin's event and hands the product to the Pixel Manager:
```js
document.addEventListener("doofinder.cart.add", async function (event) {
const {item_id, amount} = event.detail;
// Make sure the product is in the data layer
if (!pmwDataLayer.products[item_id]) {
await pmw.getProductsFromBackend([item_id]);
}
if (!pmwDataLayer.products[item_id]) return;
const product = pmw.getProductDetailsFormattedForEvent(item_id, amount);
if (!product) return;
jQuery(document).trigger("pmw:add-to-cart", product);
});
```
:::info
Trigger the event only for the tracking. If the product was already added to the WooCommerce cart, either by your own code or on the server, do not call `pmw.addProductToCart()` as well. That would add it a second time in the Pixel Manager's own cart state.
:::
## Load order
Your listeners have to be attached before the Pixel Manager fires its events, and your code must not run before `pmw` exists. Both are solved by the [command queue](https://sweetcode.com/docs/pmw/developers/command-queue):
```js
window._pmwq = window._pmwq || [];
window._pmwq.push(function () {
jQuery(document).on("pmw:event:add-to-cart", function (event, payload) {
// Your code here
});
});
```
This works no matter when the Pixel Manager loads, which matters on shops that delay or lazy load JavaScript.
## Lifecycle events
Besides the tracking events, the Pixel Manager dispatches a few events about its own state. They fire in this order:
| Event | Fires when |
|---|---|
| `pmw:load-pixels` | All active pixels have been loaded and are about to initialize |
| `pmwLoad` | The Pixel Manager finished loading and `pmw` is available |
| `pmw:ready` | The page has finished loading and the Pixel Manager is fully operational |
These three are native browser events dispatched on `document`, so they work with `addEventListener` as well as with jQuery's `.on()`:
```js
document.addEventListener("pmwLoad", function () {
// pmw is available from here on
});
```
:::tip
For your own code, prefer the [command queue](#load-order) over `pmwLoad`. The queue also runs your function when the Pixel Manager loaded before your script did, which `pmwLoad` does not, because the event has already fired by then.
:::
## Debugging
Turn on the [console logger](https://sweetcode.com/docs/pmw/developers/console-logger) by loading any page with `?pmwloggeron`. It prints a line for every event that enters and leaves the pipeline, which tells you immediately whether your triggered event arrived:
```
Pixel Manager: pmw:add-to-cart event fired
Pixel Manager: Processing event: add_to_cart
Pixel Manager: Public event dispatched: pmw:event:add-to-cart
```
Switch it off again with `?pmwloggeroff`.
## Stability
The event names and the payload structure on this page are a public API and we keep them stable. Two notes:
- Internal `pmw:pixel:*` and `pmw:s2s:*` events also exist. They are the plumbing between the pipeline and the individual pixels. Do not build on them, they change with the pixel implementations.
- New keys may be added to the payload. Read the keys you need instead of assuming a fixed shape.
---
# Logs
URL: https://sweetcode.com/docs/pmw/developers/logs
# Logs
The Pixel Manager has an internal logger that logs messages of different levels to a file. They are here to help understand what is going on inside the Pixel Manager. The range is from critical errors to informational messages.
Use it with caution, as it can generate a lot of data.
## Logger Activation
In the Pixel Manager, open **Support → Logger**, turn on **Enable logger**, and save.

## Log Levels
The logger has 5 levels of logging:
- **Critical**: Critical errors that may crash WordPress.
- **Error**: Errors that prevent the Pixel Manager from working properly.
- **Warning** (default): Warnings that should be addressed, but do not prevent the Pixel Manager from working properly.
- **Info**: Information about the Pixel Manager's activity that is good to know.
- **Debug**: Debug information about the Pixel Manager's activity. Even more details about the internal activity are logged. Use it only when debugging as it can generate a lot of data.

## Log HTTP Requests
When the **Log HTTP requests** checkbox is checked, the logger will log detailed information about HTTP requests made by the Pixel Manager. This is useful to debug issues with the Pixel Manager's communication with external servers.

Enabling logging of HTTP requests switches web requests from asynchronous (faster, non-blocking) to synchronous (slower, blocking) to record the server responses. Server responses coming from synchronous web requests can be analyzed in depth, but also use more server resources. It's only meant for troubleshooting and will turn off automatically after 3 hours to limit the impact on the server. You can extend the duration by using the following filter:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter( 'pmw_http_request_log_auto_off_delay', function() {
return 6 * HOUR_IN_SECONDS;
} );
```
## Accessing Log Files
For simple access to the log files, the Pixel Manager provides buttons to view and download the log files. The buttons are only active when logs are available.
If you have to file a support request, use the **Copy log file links** button to copy the links of the log files to the clipboard. Then paste them in your support request. It will allow the support team to access the log files directly.
The logs are saved in the regular WooCommerce logs directory: `/wp-content/uploads/wc-logs/`. The file names are prefixed with `pmw-`.

---
# PHP Filters
URL: https://sweetcode.com/docs/pmw/developers/php-filters
# PHP Filters
> While our goal is to make the plugin very simple to use through the user interface, this can be limiting for users and developers who need much more granular control over the plugin's output. For those users we provide filters that give them the option to adjust the plugin's behavior programmatically, making the options almost limitless.
> Filters can be added to the `functions.php` file in your child-theme or by using them in a custom plugin. The easiest and safest way is using them in the functions.php file: [functions.php](https://developer.wordpress.org/themes/advanced-topics/child-themes/#using-functions-php)
> If you think there is a good use case for a new filter, let us know by sending a feature request [here](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce/ideas).
## Marketing Conversion Value Filter
> Use the marketing conversion value filter in order to recalculate the conversion value. The output will only affect the conversion value of the paid ads pixels (marketing pixels). The Google Analytics conversion value output will not be touched.
`add_filter( 'pmw_marketing_conversion_value_filter', 'filter_conversion_value', 10, 2 );`
Example:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_marketing_conversion_value_filter', function ($order_total, $order)
:::info
This filter requires Pixel Manager 1.64.0 or higher, and it will only work if the main **Pixel ID** is set in the Pixel Manager under **Tracking Pixels → Facebook (Meta)** (which activates the Facebook pixel in the first place).
:::
> With the following filter the Pixel Manager provides a way to add more than one Facebook (Meta) pixel programmatically.
Every event, on every page, is sent to all configured pixels. This is useful if you want to track the same shop in more than one Facebook ad account or dataset.
:::tip
Before you add a second pixel, check whether [sharing your existing pixel with the other ad account](https://www.facebook.com/business/help/352686481592916?id=1205376682832142) solves your case. A single data source keeps all conversions, audiences and learnings together and remains Meta's own best practice. More on that trade-off in the [FAQ](https://sweetcode.com/docs/pmw/faq#is-it-possible-to-use-multiple-meta-facebook-pixels-with-the-plugin).
:::
The filter receives an array that is already seeded with the pixel from the settings, including its Conversion API token and test event code. Append your additional pixels to it and return the array.
Each pixel is an array with the following keys:
- `pixel_id` (required): The Facebook pixel ID. It has to be numeric. Entries without a valid pixel ID are ignored, and a pixel ID that appears more than once is only used once.
- `capi_token` (optional, Pro): A Conversion API access token for this pixel. If set, all server-side events, including purchases, the generic server-side events and the subscription lifecycle events, are also sent to this pixel. If omitted, the pixel only receives browser events.
- `test_event_code` (optional, Pro): A Conversion API test event code for this pixel. Each pixel is tested with its own code.
Place the following code into your `functions.php` and replace the placeholders.
Here's an example that adds a second pixel with browser events only:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_pixel_identifiers', function ( $pixel_identifiers ) {
$pixel_identifiers[] = [
'pixel_id' => 'PIXEL_ID_2',
];
return $pixel_identifiers;
});
```
Here's an example that adds a second pixel including the Conversion API (Pro):
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_pixel_identifiers', function ( $pixel_identifiers ) {
$pixel_identifiers[] = [
'pixel_id' => 'PIXEL_ID_2',
'capi_token' => 'CAPI_TOKEN_2',
'test_event_code' => 'TEST_EVENT_CODE_2', // optional
];
return $pixel_identifiers;
});
```
:::note
Browser and Conversion API events share the same event ID per event, and Facebook deduplicates them per pixel, so each pixel receives every event exactly once.
If you are using the server-side proxy, the Pixel Manager automatically syncs the additional pixels to the proxy. After adding or changing pixels in the filter, the new configuration is picked up within a few minutes. To push it right away, open the Pixel Manager settings under **Server-Side → SweetCode Server-Side Proxy** and click **Sync Now**.
:::
### Verify that the additional pixels are tracking
1. Open any page of your shop and check the data layer in the browser console. `pmwDataLayer.pixels.facebook.pixel_ids` lists every pixel the browser initializes. Access tokens are never part of the data layer, they stay on the server.
2. Run `fbq.getState().pixels` in the browser console. It shows one entry per initialized pixel.
3. Watch the network tab for requests to `facebook.com/tr`. Each event produces one request per pixel, all with the same `eid` (event ID) so Meta can deduplicate against the server-side events.
4. For the Conversion API, use Meta's [Test Events tool](https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api/#testEvents) in each pixel's own Events Manager view, with that pixel's `test_event_code`.
5. The debug info in the Pixel Manager lists all configured pixels in the Meta sections, including the Meta Event Setup Tool and Meta Business Category Event Restrictions checks.
:::caution
Do not make the filter output depend on the current page, the current product or the logged-in user. Server-side events run in contexts that have nothing to do with the page the visitor was on, for example a purchase triggered by a WooCommerce order hook or a subscription renewal, so a conditional filter can result in a pixel that receives the browser event but not the matching server-side event. Return the same set of pixels on every request.
Every additional pixel multiplies the number of requests to Meta, in the browser and, if it carries a Conversion API token, also on your server. Only add the pixels you really need.
:::
More about how the multi-pixel output behaves, including advanced matching, consent and the mobile bridge: [Multiple Meta (Facebook) pixels](https://sweetcode.com/docs/pmw/plugin-configuration/meta#multiple-pixels).
## Protect the Google Ads Conversion Adjustments Feed
:::info[Premium feature]
This filter only applies when the Google Ads Conversion Adjustments feature is active.
:::
> The Pixel Manager exposes a public CSV feed at `/wp-json/pmw/v1/google-ads/conversion-adjustments.csv` that Google Ads' scheduled bulk uploader fetches on its own schedule. The feed contains recent cancelled and refunded order data (order ID, adjustment time, value, currency).
>
> By default the URL is reachable without authentication, because Google's scheduler does not carry session credentials. If you want to lock the feed down so a competitor or scraper cannot harvest your refund data, register the `pmw_google_ads_conversion_adjustments_credentials` filter to require HTTP Basic Auth.
The filter must return an array with `user` and `pass` keys. When credentials are returned, the feed responds with `401 Unauthorized` for any request that does not present matching `Authorization: Basic` credentials. The feed is also rate-limited to 30 requests per minute per IP regardless of whether the filter is active.
Add the snippet to your `functions.php`:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_ads_conversion_adjustments_credentials', function () {
return [
'user' => 'gads-feed',
'pass' => 'paste-a-long-random-string-here',
];
});
```
Then, in Google Ads:
1. Go to **Goals → Conversions → Uploads → Schedules**.
2. Edit the existing **conversion-adjustments.csv** schedule (or create a new one).
3. Paste the same `user` value into the **Username (optional)** field and the same `pass` value into the **Password (optional)** field.
4. Save and run a manual test upload to confirm Google Ads can reach the feed.
:::caution[Hosting compatibility]
A small number of hosts running PHP under FastCGI strip the `Authorization` header before PHP sees it. If Google Ads reports authentication failures after enabling the filter, ask your host to forward the `Authorization` header to PHP, or add this rule to your site's `.htaccess`:
```apacheconf
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
```
:::
:::tip[Generating a strong password]
Use a password manager or run `openssl rand -base64 32` to generate a long random string. The longer the password, the safer the feed.
:::
## Adjust Google Analytics Config Parameters
> To keep the user interface lightweight we only included basic parameters like Enhanced Link Attribution. For those who need much more granular control over the Google Analytics config parameters, we provide a filter. The filter can also be used to override parameters from the user interface.
:::info
GA4 processes IPs from pageviews anonymized by design. This can't be changed. [IP Anonymization in Google Analytics](https://support.google.com/analytics/answer/2763052)
For Universal Analytics we've set the default parameters to also anonymize IPs. That setting can be overwritten with the filter below.
:::
The following code will remove the `anonymize_ip` parameter on all Google Universal Analytics configs:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_ga_ua_parameters', function ($analytics_parameters, $analytics_id) {
unset($analytics_parameters['anonymize_ip']);
return $analytics_parameters;
}, 10,2);
```
The following code will adjust the parameters only for the given Google Universal Analytics property:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_ga_ua_parameters', function ($analytics_parameters, $analytics_id) {
if('UA-12345678-3' == $analytics_id){
unset($analytics_parameters['anonymize_ip']);
/**
* The following parameter setting will override the one set
* in the user interface.
**/
$analytics_parameters['link_attribution'] = true;
}
return $analytics_parameters;
}, 10,2);
```
Or maybe, you want to set much more specific settings for `link_attribution` in your Google Universal Analytics property, like specified [here](https://developers.google.com/analytics/devguides/collection/gtagjs/enhanced-link-attribution#customizing_enhanced_link_attribution):
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_ga_ua_parameters', function ($analytics_parameters, $analytics_id) {
if('UA-12345678-3' == $analytics_id){
$analytics_parameters['link_attribution'] = [
'cookie_name' => '_gaela',
'cookie_expires' => 60,
'levels' => 2
];
}
return $analytics_parameters;
}, 10,2);
```
And with the following filter you can enable the debug mode in GA4.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_ga_4_parameters', function ($analytics_parameters, $analytics_id) {
$analytics_parameters['debug_mode'] = true;
return $analytics_parameters;
}, 10,2);
```
## Product ID Output Filter for Paid Ads Pixels
> To keep the UX simple and the setup consistent over several advertising channels, there is only one setting in the UX to adjust the product ID output. The same ID then will be used for all paid ads pixels. The standard setting is either the post ID (e.g. `14`), the ID for the WooCommerce Google Feed plugin (e.g. `woocommerce_gpf_14`) or the SKU (e.g. `Hoodie`). In some cases you might need to use a different ID type on different channels. Maybe you're using the post ID for Google Ads, and the SKU for Meta (Facebook). In this case the following filter will adjust the output for a specific pixel. It is even possible to completely customize the ID, if necessary.
:::info
We strongly recommend using the post ID for all product catalogs and for the product ID output. It is the most compatible way and causes the least trouble.
:::
### Set specific product ID types per channel
> By adding the pixel name to the filter name, you can choose which pixel you want to adjust. For Meta (Facebook) use `pmw_product_id_type_for_facebook`, for Microsoft Ads (Bing) use `pmw_product_id_type_for_bing`, etc. You can use the following pixel filters:
- `adroll`
- `bing` (for the Microsoft Ads pixel)
- `facebook` (for the Meta pixel)
- `google_ads`
- `linkedin`
- `outbrain`
- `pinterest`
- `reddit`
- `snapchat`
- `taboola`
- `tiktok`
- `twitter`
> The default values are `post_id` for the post ID, `gpf` for the WooCommerce Google Feed ID output (e.g. `woocommerce_gpf_14`), and `sku` for the SKU.
Here's an example on how to switch the product ID output for Meta (Facebook) to the `SKU`:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_product_id_type_for_facebook', function () {
return 'sku';
});
```
Here's an example to switch the Meta (Facebook) output to post ID:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_product_id_type_for_facebook', function () {
return 'post_id';
});
```
### Custom product IDs
> You have even the option to completely customize the product ID output and assign it to a specific channel with the `pmw_product_ids` filter.
In the following example use the `pmw_product_ids` filter to add one or more custom IDs for each product.
In a second step, use the `pmw_product_id_type_for_` filter to assign the new custom ID to one or more specific pixels.
1. The following filter creates the custom product IDs.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_product_ids', function ($product_ids, $product) {
$product_ids['custom1'] = 'custom_type_' . $product->get_id();
$product_ids['custom2'] = 'custom_pinterest_catalog_' . $product->get_sku();
return $product_ids;
}, 10, 2);
```
2. Then assign the new custom product IDs to the channels of your choice.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_product_id_type_for_google_ads', function () {
return 'custom1';
});
```
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_product_id_type_for_pinterest', function () {
return 'custom2';
});
```
## Google Analytics Product ID Output Filter
> By default, the plugin uses the `post ID` as the identifier for Google Analytics. This filter allows you to change this to the `SKU`.
:::info
The main reasons why the plugin uses the `post ID` by default are:
1. The `post ID` is more reliable. A shop owner might not add SKUs to all products, leaving the field sometimes empty. But we need to send an identifier to Google Analytics. (In the case the shop owner doesn't add a SKU to a product, we will fall back to the `post ID`.)
2. The products can be identified by the product name in Google Analytics anyway.
3. It is easier to search for a product ID in WooCommerce or in Google Analytics, so it's also more practical to use the `post ID`.
4. Some Google tools (e.g. Google Ads scripts) return product IDs in lowercase only, even if they were uploaded with mixed or uppercase characters. Since the `post ID` is purely numerical, it is unaffected by case-sensitivity issues.
:::
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_product_id_type_for_google_analytics', function () {
return 'sku';
});
```
## View Item List Trigger Filter
> The plugin uses a smart trigger for the `view_item_list` event. It only triggers if a product is actually visible in the viewport for more than 1 second. If a visitor scrolls up and down and sees a product several times, `view_item_list` will be triggered each time (again, only if visible for more than one second). The following filter allows tweaking that behavior.
> Lazy loading products is supported too 😀
:::info
This will only work on a website where caching is off, or after flushing the cache each time you change the settings.
:::
The following settings are available:
- `testMode`: It activates the test mode, which shows a transparent overlay on each product for which `view_item_list` has been triggered.
- `backgroundColor`: Change the background color of the test overlay in case product images are in use where the overlay would not be visible. This is only relevant for the test mode.
- `opacity`: By default, the overlay is half transparent. Adjust the opacity to a level that suits better. This is only relevant for the test mode.
- `repeat`: By default, the plugin resends `view_item_list` events when a visitor scrolls up and down and sees a product multiple times. Turn this off by setting the value to `false`. Then the plugin will send only one `view_item_list` event when a product becomes visible on a page.
- `threshold`: This sets how much of a product card must be visible before the event is triggered. With a setting of `1` the event triggers only when 100% of the product is visible. The default is `0.8`.
- `timeout`: This value instructs the plugin how long a product must be visible before the `view_item_list` event is triggered. The timer resets each time the product leaves the viewport. The time must be set in milliseconds, and the default value is `1000` milliseconds (1 second).
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_view_item_list_trigger_settings', function ($settings) {
$settings['testMode'] = true;
$settings['backgroundColor'] = 'green';
// $settings['backgroundColor'] = 'rgba(60,179,113)';
$settings['opacity'] = 0.5;
$settings['repeat'] = true;
$settings['threshold'] = 0.8;
$settings['timeout'] = 1000;
return $settings;
});
```
> Another simple way to enable the view_item_list demo mode is by appending the parameter `vildemomode` to the URL you want to test. Don't forget the `?`. Example: `https://example.com/shop/?vildemomode`. This method even works on websites with caching turned on. It will use the default settings.


## Cross Domain Linker Settings for Google
> Googles domain linker functionality enables two or more related sites on separate domains to be measured as one. You'll find more information about this functionality [here](https://support.google.com/searchads/answer/9165554) and [here](https://developers.google.com/gtagjs/devguide/linker).
> The domain linker values need to be passed as an array to the filter. The plugin will then output all values as a JavaScript formatted domain linker script.
> You'll find a list of all possible parameters over [here](https://developers.google.com/gtagjs/devguide/linker#parameters_table).
Basic example with multiple `domains`: You can list multiple string values in the domain's property. When the domain's property has at least one value, `gtag.js` will accept incoming domain links by default. This allows you to use the same code snippet on every domain.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_cross_domain_linker_settings', function (){
return [
"domains" => [
'example.com',
'example-b.com',
]
];
});
```
Example output:
```js
gtag('set', 'linker', {
'domains': ['example.com', 'example-b.com']
});
```
`decorate_forms`: If you have forms on your site that point to the destination domain, set the `decorate_forms` property to `true`.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_cross_domain_linker_settings', function (){
return [
"domains" => [
'example.com',
'example-b.com',
],
"decorate_forms" => true,
];
});
```
`url_position`: To configure the linker parameter to appear in the URL after a fragment (`#`) instead of as a query parameter (`?`) (e.g. `https://example.com#_gl=1~abcde5~`), set the url_position parameter to fragment.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_cross_domain_linker_settings', function (){
return [
"domains" => [
'example.com',
'example-b.com',
],
"decorate_forms" => true,
"url_position" => 'fragment',
];
});
```
`accept_incoming`: Once a user arrives at a page on the destination domain with a linker parameter in the URL, gtag.js needs to be configured to parse that parameter.
If the destination domain has been configured to automatically link domains, it will accept linker parameters by default. No additional code is required on the destination domain.
If the destination domain is not configured to automatically link domains, you can instruct the destination page to look for linker parameters. Set the `accept_incoming` property to `true`.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_cross_domain_linker_settings', function (){
return [
"accept_incoming" => true
];
});
```
## Custom Brand Taxonomy
> If you are using your own product attribute to store brand names for products, you can use this filter to output the brand names for the pixels. The filter must return the taxonomy name for the brand attribute. Usually, it is the attribute slug, prefixed with `pa_`. In this example, it would be `pa_custom-brand`. Depending on how the taxonomy has been created, it also can only be the slug `custom-brand`. If one doesn't work make sure to try the other.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_custom_brand_taxonomy', function (){
return 'pa_custom-brand';
});
```
## Disable adding the tax to product prices
By default, the Pixel Manager outputs the prices on product pages depending on the tax settings in WooCommerce. Some themes don't use the same logic and display product prices without tax, even though the setting in WooCommerce is set to display them including the taxes. In those cases, the Pixel Manager will still output the prices with tax. If you want to instruct the Pixel Manager to also output the products without taxes, please use the following filter.
:::info
Don't mix this up with the setting for the purchase confirmation page. The plugin offers a setting to include or exclude tax and shipping on the purchase confirmation page. This is a different setting and only affects the output for the conversion pixels on the purchase confirmation page.
:::
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_output_product_prices_with_tax', '__return_false');
```
## Add Facebook tracking exclusion patterns
Facebook doesn't allow the tracking of URLs that contain potentially violating personal data (PII). This is why Facebook has implemented a check that under certain conditions detects such URLs and throws a warning in the event manager.
Such a URL might look like this: `https://example.com/shop-feature/?firstname=John&lastname=Doe`
By default, the Pixel Manager tracks all URLs, because generally WordPress and WooCommerce don't add PII data to URLs. But, WordPress and WooCommerce customizations may add such PII to URLs. In such a case you might run into warning messages in the Facebook event manager, requesting you to fix those.
In order to address this, we implemented a filter that gives you the option to add URL exclusion patterns. Once activated the Pixel Manager will exclude all URLs from tracking in Facebook that match one or more of the exclusion patterns that have been added to the configuration.
The patterns that you can use are regular expression string patterns. In the background, the Pixel Manager uses a [RegExp constructor](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#literal_notation_and_constructor) which you can feed with those string patterns. Take a look at [this article](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp#literal_notation_and_constructor) to get a better idea of how such a pattern can be constructed. Or, take a look at [regex101.com](https://regex101.com/) with the following [example](https://regex101.com/r/3RCGgO/1), which shows a way to construct a [matching pattern](https://regex101.com/r/3RCGgO/1) (take note of the backslashes which are necessary to escape forward slashes in the URL).
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_tracking_exclusion_patterns', function($patterns) {
$patterns[] = 'parcel-panel';
return array_unique($patterns);
});
```
## Block IPs from all tracking (browser and server-side)
From version `1.57.1` the Pixel Manager supports a unified IP exclusion filter `pmw_ip_exclusion_list` that blocks **all tracking** for specified IPs:
- **Browser pixel firing** (e.g. `fbq()`, `gtag()`, `ttq()`, `pintrk()`) — suppressed on the frontend
- **Browser-initiated server-to-server events** (add_to_cart, page_view, etc.) — blocked before sending
- **Server-side purchase events** (CAPI / S2S purchase hits) — blocked on the WooCommerce server
- **SSP purchase proxy events** — blocked before sending to SweetCode Cloud
The IPs can be written either as normal IPs or as CIDR ranges. IPv4 and IPv6 are supported.
Learn more about how to specify a CIDR range over here: https://www.ipaddressguide.com/cidr
:::info[Frontend IP detection]
When the exclusion list is populated, the Pixel Manager automatically activates client-side IP detection (via external services like Cloudflare, ipify, etc.) to determine the visitor's IP, even if no server-to-server integration is active. This adds a small initial delay (~100ms) on the first page load while the IP is fetched and cached for the session.
:::
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_ip_exclusion_list', function($ip_exclusions) {
// Exact IPv4 address
$ip_exclusions[] = '203.0.113.50';
// IPv4 CIDR range (entire /24 subnet)
$ip_exclusions[] = '198.51.100.0/24';
// Exact IPv6 address
$ip_exclusions[] = '2001:db8::1';
// IPv6 CIDR range
$ip_exclusions[] = '2001:db8::/32';
return array_unique($ip_exclusions);
});
```
:::note[Deprecated filter]
The older `pmw_exclude_ips_from_server_2_server_events` filter is deprecated since version `1.57.1` but still works for backward compatibility. It only blocked browser-initiated S2S events. Migrate to `pmw_ip_exclusion_list` to also block browser pixels and server-side purchase events.
:::
## Block IPs from server-to-server events (deprecated)
:::caution[Deprecated since 1.57.1]
This filter is deprecated. Use [`pmw_ip_exclusion_list`](#ip-exclusion) instead, which provides broader coverage including browser pixels and server-side purchase events.
:::
From version `1.27.8` the Pixel Manager automatically prevents server-to-server events that are triggered by known bots. This reduces the load on the server.
The following filter allows users of the Pixel Manager to add more IPs and IP ranges to the exclusion list.
The IPs can be written either as normal IPs or as CIDR ranges.
Learn more about how to specify a CIDR range over here: https://www.ipaddressguide.com/cidr
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_exclude_ips_from_server_2_server_events', function($ip_exclusions) {
// normal IP
$ip_exclusions[] = '123.123.123.123';
// CIDR range
$ip_exclusions[] = '123.123.123.123/32';
return array_unique($ip_exclusions);
});
```
## Disable subscription renewal tracking for all tracking pixels
Use the following filter to disable subscription renewal tracking for all pixels.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_subscription_renewal_tracking', '__return_false');
```
## Disable Google Analytics subscription renewal tracking
Use the following filter to disable Google Analytics subscription renewal tracking.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_analytics_subscription_renewal_tracking', '__return_false');
```
## Disable Facebook CAPI subscription renewal tracking
Use the following filter to disable Facebook CAPI subscription renewal tracking.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_subscription_renewal_tracking', '__return_false');
```
## Suppress the browser purchase conversion for specific orders
:::info
Available in Pixel Manager 1.31.2 and later, in both the free and the pro version.
:::
Use the `pmw_conversion_prevention` filter to stop the Pixel Manager from firing the browser purchase conversion for an individual order. Returning `true` withholds the order data from the data layer on the order received page, which means **no** browser pixel fires a purchase event for that order: not Google Ads, not Meta, not Google Analytics, none of them.
The filter receives two arguments:
| Argument | Type | Description |
|------------|-------------|----------------------------------------------------------------------|
| `$prevent` | `bool` | Whether to suppress the conversion. Default `false`. |
| `$order` | `WC_Order` | The order the confirmation page was reached for. |
### What it does and does not cover
- It affects the **browser** purchase conversion only. Server-side purchase events run on order status transitions and are gated separately. To suppress those, use [`pmw_skip_s2s_purchase_event`](#skip-s2s-purchase-event).
- It is an addition to the checks the Pixel Manager already performs. Orders in `failed`, `cancelled` or `refunded` status, and visits by [user roles excluded from tracking](https://sweetcode.com/docs/pmw/settings-reference), never fire a purchase conversion in the first place.
- Because no pixel fires, the Pixel Manager does not write its duplication prevention marker on the order. The order therefore stays eligible for [Automatic Conversion Recovery](https://sweetcode.com/docs/pmw/features/acr) (pro), which is what makes the deferral pattern below work.
### Deferring a conversion until the order is paid
The most common use for this filter is a payment gateway that creates orders in `pending payment` status and confirms the payment later: bank transfer, invoice, manual review, or a custom gateway. The customer still lands on the order received page, so the browser purchase conversion fires for an order that may never be paid.
Write the filter so it evaluates the **current** order status rather than suppressing the gateway outright. ACR re-evaluates this same filter on the customer's next visit to the shop, so as soon as the order reaches a paid status the filter returns `false` and the full purchase conversion is recovered, including the Google Ads conversion.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_conversion_prevention', function ($prevent, $order) {
if (!$order instanceof WC_Order) {
return $prevent;
}
// Only this gateway is affected. Every other gateway keeps its current behavior.
if ($order->get_payment_method() !== 'my_custom_gateway') {
return $prevent;
}
// Hold the conversion back until the order reaches a paid status.
// wc_get_is_paid_statuses() returns `processing` and `completed` by default.
if (!in_array($order->get_status(), wc_get_is_paid_statuses(), true)) {
return true;
}
return $prevent;
}, 10, 2);
```
:::caution
Make the suppression conditional on the order status, as in the example above. A filter that returns `true` for a gateway unconditionally discards the conversion permanently, because the order never becomes eligible for recovery either.
:::
Orders recovered this way are reported in the ACR column of the [Payment Gateway Tracking Accuracy report](https://sweetcode.com/docs/pmw/diagnostics#payment-gateway-tracking-accuracy-report), so you can verify that the deferral works instead of silently losing conversions.
### Requirements and limits of the deferred conversion
The recovery half of this pattern depends on ACR, so its [requirements](https://sweetcode.com/docs/pmw/features/acr#requirements-for-the-automatic-conversion-recovery-to-work) apply: the customer has to return to the shop with the same browser after the order reaches a paid status. If that never happens, the conversion is not recorded at all.
For platforms that have a server-side counterpart in the Pixel Manager, prefer the [Status-Driven Purchase Conversions](recipes/status-driven-purchase-events.md) recipe instead. It routes the purchase through the platform's Conversion API, which fires on the paid-status transition itself and needs no return visit. Google Ads has no server-side purchase API in the Pixel Manager, which is why the filter above combined with ACR is the available route for Google Ads conversions.
## Skip server-side purchase events for specific orders
:::info
Available in Pixel Manager Pro 1.58.10 and later.
:::
Use the `pmw_skip_s2s_purchase_event` filter to prevent the Pixel Manager from firing server-side purchase events for specific orders. Returning `true` skips the purchase event for **every** server-side platform (Facebook CAPI, TikTok Events API, Pinterest Conversions API, Snapchat CAPI, Reddit CAPI, and GA4 Measurement Protocol), including the SweetCode Cloud (SSP) proxy path. The order is also excluded from the Google Ads Conversion Adjustments CSV feed so it cannot later be sent as a `RETRACT` or `RESTATE` adjustment.
The filter receives three arguments:
| Argument | Type | Description |
|------------|-------------|---------------------------------------------------------------------------------------------------------------------------|
| `$skip` | `bool` | Whether to skip the purchase event. Default `false`. |
| `$order` | `WC_Order` | The WooCommerce order. |
| `$context` | `string` | The pixel class name (e.g. `SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_CAPI`) or `conversion_adjustments_feed`. |
Common use case: exclude marketplace orders that were imported programmatically (Amazon, eBay, etc.) and therefore should not be counted as conversions.
The following example skips every server-side purchase event for orders imported by the [magnalister](https://www.magnalister.com/) plugin. Magnalister prefixes every imported order's customer note with `magnalister-Verarbeitung`, which makes the match simple regardless of the source marketplace.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_skip_s2s_purchase_event', function ($skip, $order, $context) {
// Skip every PMW server-side purchase event and Google Ads conversion
// adjustment for magnalister-imported marketplace orders.
if (strpos((string) $order->get_customer_note(), 'magnalister-Verarbeitung') === 0) {
return true;
}
return $skip;
}, 10, 3);
```
You can also target a specific platform by checking the `$context` argument:
```php title="/wp-content/themes/child-theme/functions.php"
use SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_CAPI;
add_filter('pmw_skip_s2s_purchase_event', function ($skip, $order, $context) {
// Only skip the Facebook CAPI purchase event, leave all other platforms alone.
if ($context === Facebook_CAPI::class && $order->get_payment_method() === 'some_gateway') {
return true;
}
return $skip;
}, 10, 3);
```
## Filter the Google Ads Conversion Adjustments feed
:::info
Available in Pixel Manager Pro 1.60.1 and later.
:::
Use the `pmw_conversion_adjustments_feed_row` filter to exclude or modify individual rows of the [Google Ads Conversion Adjustments CSV feed](#google-ads-conversion-adjustments-credentials) (the `RETRACT` / `RESTATE` feed built from cancelled orders and refunds).
Return an empty value (`null`, `false`, or `[]`) to drop a row from the feed. You can also modify the row's fields; the Pixel Manager re-applies its own validation afterwards (clamping negative values to `0`, enforcing Google's column order), so the feed always stays within Google's spec.
This is the recommended way to customize the feed. Unlike [`pmw_skip_s2s_purchase_event`](#skip-s2s-purchase-event), it only affects the feed, so there is no risk of accidentally suppressing your live server-side purchase events.
The filter receives three arguments:
| Argument | Type | Description |
|------------|-------------|----------------------------------------------------------------------|
| `$row` | `array` | The associative row data (see keys below). |
| `$order` | `WC_Order` | The order being adjusted. |
| `$type` | `string` | The adjustment source: `cancelled` or `refund`. |
The `$row` array has the following keys:
| Key | Description |
|-------------------|------------------------------------------------------------------|
| `order_id` | The order number Google uses to match the original conversion. |
| `conversion_name` | The configured conversion name. |
| `adjustment_time` | ISO 8601 timestamp, e.g. `2026-06-25T13:00:00+00:00`. |
| `adjustment_type` | `RETRACT` or `RESTATE`. |
| `adjusted_value` | The new order value (`RESTATE` only; empty for `RETRACT`). |
| `currency` | The currency code (`RESTATE` only). |
### Example: only send adjustments for orders that came from a Google Ads click
The following example drops every order that has no Google Ads click ID. The Pixel Manager stores the click ID on the order as `_wpm_gclid` when the customer reaches the order received page. Orders imported from marketplaces (Amazon, eBay, etc. via Channable, M2E Cloud, magnalister, and similar integrators) never reach that page, so they never carry a click ID and are dropped.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_conversion_adjustments_feed_row', function ($row, $order) {
// Drop orders that have no Google Ads click ID recorded.
if (empty($order->get_meta('_wpm_gclid', true))) {
return null;
}
return $row;
}, 10, 2);
```
:::warning
Filtering the feed reduces noise in your Google Ads logs, but it does not improve the accuracy of your data, and it can reduce it.
Google also matches conversions through [Enhanced Conversions](https://support.google.com/google-ads/answer/9888656) (hashed email and phone number) even when no readable click ID is present. Those orders have no local `_wpm_gclid`, so a click-ID filter will drop their legitimate `RETRACT` / `RESTATE` adjustments, and Google will keep counting the original (now cancelled or refunded) conversion.
[Google's own documentation](https://support.google.com/google-ads/answer/7686447) states that the "this conversion does not exist" responses can be safely ignored. We recommend uploading **all** adjustments and ignoring those warnings, and we treat the contradiction between that documentation and the warnings shown in the Google Ads UI as a low-priority inconsistency on Google's side. Use this filter only if you want to quiet the logs, not as a fix for conversion accuracy.
:::
## Mark custom order flows as backend-manual
:::info
Available in Pixel Manager Pro 1.58.10 and later.
:::
Use the `pmw_is_backend_manual_order` filter to teach the Pixel Manager about custom order-creation flows (B2B quote-to-order, push-cart, pay-for-order, etc.) that neither set `_created_via = 'admin'` nor trigger WooCommerce Order Attribution. When an order is recognized as backend-manual, the Pixel Manager re-captures the customer's browser identifiers on the purchase confirmation page so server-side purchase events carry the real customer context instead of being empty or attributed to the staff member who created the order.
The filter receives two arguments:
| Argument | Type | Description |
|----------------------|-------------|-------------------------------------------------------------------|
| `$is_backend_manual` | `bool` | Whether PMW already considers this a backend-manual order. |
| `$order` | `WC_Order` | The WooCommerce order being evaluated. |
Example: flag every order created by a custom quote plugin that stores its origin in order meta.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_is_backend_manual_order', function ($is_backend_manual, $order) {
if ($order->get_meta('_my_quote_plugin_origin') === 'staff_quote') {
return true;
}
return $is_backend_manual;
}, 10, 2);
```
## Enable Facebook Hybrid Mobile App Events
If you're using a wrapper to make your website available as a hybrid mobile app on iOS or Android, you can use the following filter to enable the Facebook hybrid mobile app events bridge.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_mobile_bridge_app_id', function () {
return 'YOUR_APP_ID';
});
```
:::note
Find more information about the Facebook hybrid mobile app events bridge over [here](https://developers.facebook.com/docs/app-events/hybrid-app-events/)
:::
## Add more selectors for specific events
If you are using a custom theme that doesn't implement the standard WooCommerce classes on buttons like add-to-cart or begin-checkout, the events won't be triggered. In this case, you can use the following filters to add more selectors for specific events.
:::note
First try to use the `body` selector. In most cases, this alone will work and fix the trigger.
:::
:::note
Don't use `document` as selector. It won't work.
:::
### add-to-cart event
First, try the `body` selector. In most themes, this will work.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_add_selectors_add_to_cart', function () {
return [
'body',
];
});
```
If that doesn't work, you'll have to add a selector that is specific to the button that triggers the add-to-cart event.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_add_selectors_add_to_cart', function () {
return [
'.custom-add-to-cart-selector',
];
});
```
### begin-checkout event
First, try the `body` selector. In most themes, this will work.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_add_selectors_begin_checkout', function () {
return [
'body',
];
});
```
If that doesn't work, you'll have to add a selector that is specific to the button that triggers the begin-checkout event.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_add_selectors_begin_checkout', function () {
return [
'.custom-begin-checkout-selector',
];
});
```
## Order Fees Filter
This filter controls the **payment processor fees** that the Pixel Manager deducts from the marketing conversion value. These are the fees your payment provider keeps out of your payout: the customer never pays them, and they are not part of any WooCommerce order figure. They are deducted under both the [Order Subtotal](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#order-subtotal-default) and the [Profit Margin](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#profit-margin) option in **General → Order configuration → Marketing value logic**.
Unlike taxes and shipping costs, which are standardized in WooCommerce, payment gateway fees have no standard storage location. Some gateways save them in a dedicated order meta field, and many do not save them at all. The Pixel Manager reads them for the popular gateways listed under [Shop Settings](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#profit-margin). For every other gateway, use this filter to calculate them yourself.
:::warning
Since version 1.64.1, `$order_fees` no longer includes amounts that were added to the order as a **WooCommerce order fee** (a gift wrap fee, a cash on delivery surcharge, or a deposit instalment).
Such a surcharge is money the customer pays, not a cost, and the WooCommerce order subtotal never contained it, so deducting it removed it a second time and reported less than the products were worth. If you relied on the previous behaviour, add `$order->get_total_fees()` back inside this filter.
:::
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_order_fees', function($order_fees, $order){
// The $order_fees variable contains the payment processor fees
// that the Pixel Manager has been able to extract from the
// order meta fields of popular payment gateways.
// You can use the value of $order_fees as a starting point
// and add your own calculated fees to it. Or you can
// completely override the value of $order_fees
// and return your own value.
// If the payment method is braintree_cc
// then the order fee is 0.29 + 2.09% of the order total.
// Add it to the order_fees.
if ($order->get_payment_method() == 'braintree_cc') {
$order_fees += 0.29 + ($order->get_total() * 0.0209);
}
return $order_fees;
}, 10, 2);
```
## Split Payment Order Role
Deposit and partial-payment plugins split one sale across several WooCommerce orders. The Pixel Manager reports each sale once, in full, at the moment the deposit is paid, on the order that represents the sale. Since version 1.64.1 this works out of the box for **Deposits & Partial Payments for WooCommerce** (Acowebs, free and Pro) and **WooCommerce Deposits** (Webtomizer, woocommerce.com).
If you use a different deposits plugin, the `pmw_split_payment_order_role` filter tells the Pixel Manager what role an order plays:
- `standard` — a regular order, tracked normally.
- `payment_leg` — the order only collects an instalment for a sale that lives on its **parent order**. The purchase is reported with the parent order's products and value, and the duplication prevention marker is written on the parent, so the other instalments of the same sale stay silent. Server-side purchase events for the order itself are skipped.
- `follow_up_invoice` — the order re-invoices a part of a sale that was already reported when its parent order was placed. It never reports a purchase, neither in the browser nor server-side.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_split_payment_order_role', function ($role, $order) {
// Example: a deposits plugin that stores its instalment orders
// with a custom created_via and the sale on the parent order.
if (
$order instanceof WC_Order
&& 'my_deposits_plugin' === $order->get_created_via()
&& $order->get_parent_id() > 0
) {
return 'payment_leg';
}
return $role;
}, 10, 2);
```
For `payment_leg` orders the parent must be a regular shop order that carries the product line items, otherwise the Pixel Manager falls back to standard handling.
## Set the maximum of orders to analyze for the tracking accuracy analysis
The tracking accuracy analysis may take too much time to complete. This is especially the case if you have a slow server, a short PHP timeout, or a clogged Action Scheduler queue.
The following filter allows you to set the maximum number of orders that should be analyzed.
Try 100 orders first. If that works, you can increase the number.
The analysis runs overnight, so you'll have to wait until the next day to see the results.
If that doesn't help, you'll probably need to fix the Action Scheduler queue.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_tracking_accuracy_analysis_max_order_amount', function () {
return 100;
});
```
## Adjust Outbrain event name mapping
If you've been working with Outbrain before and have been using different event names than the default ones in the Pixel Manager, you can use the following filter to adjust the event name mapping.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_outbrain_event_name_mapping', function ( $mapping ) {
$mapping['purchase'] = 'purchase';
return $mapping;
});
```
## Adjust Taboola event name mapping
If you've been working with Taboola before and have been using different event names than the default ones in the Pixel Manager, you can use the following filter to adjust the event name mapping.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_taboola_event_name_mapping', function ( $mapping ) {
$mapping['purchase'] = 'purchase';
return $mapping;
});
```
## Suppress the version info output in the developer console
The Pixel Manager prints a single line to the browser console on every page load, even when the [Console Logger](./console-logger.md) is switched off:
```
Pixel Manager for WooCommerce: pro | distro: fms | active license: yes | version: 1.63.0
```
If you want to suppress it, you can use the following filter.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_show_version_info', '__return_false');
```
:::info
This filter is available in version 1.58.5 and later.
:::
The line isn't removed, it's demoted into the Console Logger. With the logger off nothing is printed, and it reappears when you enable the logger with `?pmwloggeron` for debugging.
## Add custom parameters to the Google Analytics purchase event
:::info
These filters are only available in version 1.44.0 and later.
:::
The Pixel Manager automatically sends various standard parameters to Google Analytics. With the custom order parameters filters, you can add additional parameters to the Google Analytics purchase event on order and order item level.
### Order level custom parameters
Use cases for order level custom parameters are:
- Customer segmentation
- Based on total order value
- Based on the number of orders
- Weather conditions at the location of the customer at the time of the purchase
- Expected delivery time
#### Order level custom parameters example
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_custom_order_parameters', function ( $custom_parameters, $order ) {
$custom_parameters['custom_parameter_a'] = 'custom_value_a';
$custom_parameters['custom_parameter_b'] = 'custom_value_b';
return $custom_parameters;
}, 10, 2);
```
### Order item level custom parameters
Use cases for order item level custom parameters are:
- Supplier for this particular product on this particular order
- Customization of the product
- Gift wrapping option
#### Order item level custom parameters example
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_custom_order_item_parameters', function ( $custom_parameters, $order_item, $order ) {
$custom_parameters['custom_parameter_1'] = 'custom_value_1';
$custom_parameters['custom_parameter_2'] = 'custom_value_2';
return $custom_parameters;
}, 10, 3);
```
### How to use the Google Analytics custom parameters filters
1. Add the custom parameters to the Google Analytics purchase event by using one or both of the filters above.
2. Configure the custom parameters in Google Analytics as custom dimensions or metrics:
- [Google Analytics custom event scoped dimensions and metrics](https://support.google.com/analytics/answer/14239696)
- [Google Analytics custom item scoped dimensions and metrics](https://support.google.com/analytics/answer/14239695)
3. Wait one day for the data to be processed by Google Analytics.
4. Now you can use the custom parameters in Google Analytics reports.
## Filter script opening attributes
:::info
These filters are only available in version 1.45.1 and later.
:::
Example: Add the Cloudflare `data-cfasync` attribute to the script tag.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_opening_script_string_attributes', function ( $attributes ) {
// The value is an array of text strings that will be concatenated.
$attributes['data-cfasync'] = ['false'];
return $attributes;
});
```
## Filter the Pixel Manager options
:::info
This filter is only available in version 1.46.2 and later.
:::
Every now and then you might have a special setup or a special requirement that can't be fulfilled by using the standard settings. In such cases, you can use the following filter to adjust the Pixel Manager's options before it processes them.
:::warning
Be aware that we might change the structure of the settings array in future versions. So be careful when using this filter. Changes to structure happen very rarely, but they can happen.
:::
```php title="/wp-content/themes/child-theme/functions.php"
/**
* Purpose: Filter the Pixel Manager's options before it processes them.
*
* Place this code into functions.php of your child theme.
*
* Example:
* Some shops use the same install to serve on different domains.
* The following example shows how to adjust the Google Analytics measurement ID based on the host.
* You can use the same logic to adjust any other pixel ID or setting.
**/
add_filter('pmw_options', function ($options) {
// Use the error_log to get a better understanding of the options array.
// error_log('options: ' . print_r($options, true));
$host = $_SERVER['HTTP_HOST'];
if (preg_match("/.*example.nl/", $host)) {
$options['google']['analytics']['ga4']['measurement_id'] = 'abc';
} elseif (preg_match("/.*example.us/", $host)) {
$options['google']['analytics']['ga4']['measurement_id'] = 'def';
}
return $options;
});
```
## Google tag ID
With the following filter you can override the default Google tag ID. The override is applied on every request, so it takes effect even when the tag ID is cached.
:::info
The `pmw_google_tag_id` filter is available as of version 1.60.1. In earlier versions (1.58.5 to 1.60.0) use `google_tag_id` instead; it still works as a deprecated alias.
:::
```php title="/wp-content/themes/child-theme/functions.php"
` tags, causing them to be visible on the page. This is a theme issue, but if you can't easily change the theme, you can use this filter to suppress the inline script output for cart item data.
The Pixel Manager outputs small inline `
get_status() !== 'completed') {
return null;
}
return $pixel_data;
}, 10, 3);
```
Returning `null` from this filter blocks the CAPI event for the matched pixel and event.
## Custom order statuses (e.g. `partially-paid`)
Deposit and partial-payment plugins add custom order statuses that WooCommerce does not treat as paid. Because the purchase conversion fires on the transition into a paid status, an order that only ever reaches a custom order status such as `partially-paid` never triggers purchase conversion tracking.
To register a custom order status as paid, use WooCommerce's `woocommerce_order_is_paid_statuses` filter. It is the filter behind `wc_get_is_paid_statuses()`, so the Pixel Manager picks it up automatically and fires the purchase conversion when an order transitions into that status:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('woocommerce_order_is_paid_statuses', function($statuses) {
$statuses[] = 'partially-paid'; // status slug without the `wc-` prefix
return $statuses;
});
```
There is no separate Pixel Manager filter for this; the WooCommerce filter is the single source of truth. Be aware that it widens what WooCommerce itself considers paid (for example `$order->is_paid()`), not just the Pixel Manager's conversion trigger.
## Optional: manually re-fire CAPI for an order
If a custom workflow needs to push a CAPI purchase event for a specific order (for example from a custom hook), call the platform's static `send_purchase_hit()` method with the order object:
```php
\SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_CAPI::send_purchase_hit($order);
```
This is an internal method and is not part of the public Pixel Manager API. It can change between releases.
## Same pattern for other platforms
The same approach works for every platform that has a server-side counterpart in the Pixel Manager. Replace the pixel slug in both filter names.
| Platform | JavaScript filter | PHP server-side filter |
|--------------------|-------------------------------------|------------------------------------------------------|
| Facebook / Meta | `pmw_pixel_data_facebook` | `pmw_server_event_payload_facebook_purchase` |
| TikTok | `pmw_pixel_data_tiktok` | `pmw_server_event_payload_tiktok_purchase` |
| Pinterest | `pmw_pixel_data_pinterest` | `pmw_server_event_payload_pinterest_purchase` |
| Snapchat | `pmw_pixel_data_snapchat` | `pmw_server_event_payload_snapchat_purchase` |
| Reddit | `pmw_pixel_data_reddit` | `pmw_server_event_payload_reddit_purchase` |
| Google Analytics 4 | `pmw_pixel_data_google_analytics` | `pmw_server_event_payload_google_analytics_purchase` |
## Platforms without a server-side counterpart (Google Ads, Microsoft Advertising, and others)
This recipe relies on the platform having a server-side purchase API in the Pixel Manager, because that is what supplies the status-driven trigger. Google Ads does not, and neither do Microsoft Advertising, LinkedIn, X, Taboola, Outbrain, AdRoll, Criteo, and the other browser-only pixels. For those platforms the purchase conversion is sent from the browser, so suppressing the browser event with no server-side sender behind it discards the conversion entirely.
Use the [`pmw_conversion_prevention`](../php-filters.md#conversion-prevention) PHP filter instead. It withholds the browser purchase conversion for an individual order while the order is not yet in a paid status, and because the filter is re-evaluated by [Automatic Conversion Recovery](https://sweetcode.com/docs/pmw/features/acr) (pro), the conversion is recovered in full on the customer's next visit to the shop once the order has been paid.
Two differences from the CAPI-based recipe above are worth knowing before you choose it:
- It suppresses **every** browser purchase pixel for the affected orders, not one platform, because the order data is withheld from the data layer as a whole.
- Recovery requires the customer to return to the shop with the same browser. CAPI needs no return visit.
If a platform in your setup does have a Conversion API, prefer this recipe for that platform and use the filter only for the browser-only pixels.
## Troubleshooting
- **Conversions still appear for failed orders.** The browser pixel filter is not active. Confirm the snippet is rendered in the page source and that `pmw.hooks` is defined when it runs (this is what the `_pmwq` queue guarantees).
- **No conversions appear at all.** Confirm Facebook CAPI is enabled in the Pixel Manager under **Tracking Pixels → Meta** and that the access token is valid. Check the logs in the Pixel Manager under **Support → Logger** for the CAPI request.
- **Conversions appear later than expected.** That is the expected behavior. CAPI fires when WooCommerce transitions the order into a paid status, not when the customer lands on the thank-you page.
## Related
- [Event Filters](../event-filters.md)
- [PHP Filters](../php-filters.md)
---
# Integrate a Third-Party Conversion Tag
URL: https://sweetcode.com/docs/pmw/developers/recipes/third-party-conversion-tag
# Integrate a Third-Party Conversion Tag
Report the Pixel Manager's purchase event to an external tag that the Pixel Manager does not support natively, such as an affiliate network, a partner platform or an in-house tracker.
The worked example below uses [Adtraction](https://adtraction.com/), but the pattern is the same for every network. Only the tag's own script URL and parameter names change.
## The pattern
Three rules carry the whole integration. Everything else is the network's own API.
1. **Register the purchase listener synchronously.** The purchase event fires once per order and is then locked out permanently, a page reload included. A listener that registers after any wait, such as loading the network's script, can miss the order and never get a second chance.
2. **Load the external script inside the handler.** Not before it. The script is only needed once there is a conversion to report.
3. **Check consent inside the handler.** The visitor's consent state is available to the Command Queue, but reading it inside the handler keeps the decision next to the conversion it governs, which is also correct when consent is granted after the page has loaded.
:::tip[Why the order matters so much]
If your integration reports clicks or page views but never a sale, this is almost always the cause. See [Missing Purchase Conversions](../command-queue.md#missing-purchase-conversions).
:::
:::info[Version requirements]
The recipe below uses `pmw.bus`, which is available from version `1.65.0`, and reads the consent state from the event payload, which works on every version from `1.52.0`.
On versions older than `1.65.0`, replace `pmw.bus.on('pmw:event:purchase', function (payload) { … })` with `jQuery(document).on('pmw:event:purchase', function (event, payload) { … })`. Everything else stays the same.
Do not read `pmw.consent` at the top level of a queued command on version `1.64.0` or older: the consent module had not loaded at that point, so the command failed silently and never registered its listener. Reading the consent state from the event payload, as this recipe does, avoids the problem on every version.
:::
## The code
Add this to your child theme's `functions.php` or to a small custom plugin.
```php title="/wp-content/themes/child-theme/functions.php"
add_action('wp_head', function () {
?>
Only one number can be tracked on a single page using the default Javascript tag.
Source: [Set up tracking calls to a phone number on a website](https://support.google.com/google-ads/answer/6095883) (Google Ads Help).
So the supported model is **one tracked number per page**: give each location its own page and map that page to its number. Showing several numbers on one shared page is covered [further down](#tracking-several-numbers-on-one-page).
:::
## Before you start
1. In Google Ads, create one **"Calls from a website"** conversion action per location. Each gives you a conversion label, so the full conversion target for a location looks like `AW-123456789/AbCdEf123`.
2. Give each location its own page that displays that location's phone number.
3. Leave the **Phone Conversion Number** and **Phone Conversion Label** fields in the Pixel Manager settings empty, since this recipe handles all locations.
## Recipe
Add the following to your child theme's `functions.php`. Fill in the `$locations` map (one row per location page) and adjust the `is_page()` matching to your pages.
```php title="/wp-content/themes/child-theme/functions.php"
add_action( 'wp_head', function () {
// One entry per location page (page => the number shown on it + its conversion target).
$locations = array(
'contact-new-york' => array( 'number' => '+1 212-555-0100', 'label' => 'AW-123456789/AbCdEf123' ),
'contact-boston' => array( 'number' => '+1 617-555-0100', 'label' => 'AW-123456789/GhIjKl456' ),
'contact-chicago' => array( 'number' => '+1 312-555-0100', 'label' => 'AW-123456789/MnOpQr789' ),
// ... add the remaining locations
);
// Pick the entry for the current page (adapt the matching to your site).
$entry = null;
foreach ( $locations as $page => $data ) {
if ( is_page( $page ) ) {
$entry = $data;
break;
}
}
if ( null === $entry ) {
return;
}
?>
You should use this option if you want to track calls to multiple phone numbers on your website.
(from the same [Google Ads Help page](https://support.google.com/google-ads/answer/6095883)). That path is outside the scope of this recipe; the per-page setup above is the recommended approach.
## Troubleshooting
- **The number is not being swapped.** Confirm the `number` matches the digits shown on the page exactly. You can test Google's swapping by appending `#google-wcc-debug` to the page URL.
- **Nothing fires.** Make sure the page is matched by your `is_page()` logic, and that the Google Ads pixel is active in the Pixel Manager. The snippet only fires after marketing consent is granted.
- **The conversion is attributed to the wrong location.** Each location needs its own conversion action (its own label) in Google Ads, and its own page.
## Related
- [Command Queue](../command-queue.md)
- [Event Filters](../event-filters.md)
- [Google Ads configuration](../../plugin-configuration/google-ads.mdx)
---
# Shortcodes
URL: https://sweetcode.com/docs/pmw/developers/shortcodes
# Shortcodes
> In order to be able to track leads as conversions, the plugin provides shortcodes. They need to be added to the thankyou pages to which lead forms redirect to after a form submission.
> Additionally, there is one shortcode for the view-item event. It would be typically used on custom-made product pages, where WooCommerce can't determine if it is a product page and therefore the plugin can't automatically inject the necessary scripts for the view-item event. (The view-item event is equals to the ViewContent event in Meta (Facebook), etc.)
## Examples
### Fire all pixels with one shortcode
The following shortcode shows how to fire all tracking pixels with one shortcode. However, Google Ads and LinkedIn always require an event ID.
`[conversion-pixel pixel="all" gads-conversion-label="aabbcc" lintrk-event="1234567"]`
### Fire all pixels with one shortcode and override default values
If you want to fire all tracking pixels and override the default values for most of the pixels, you can use the following shortcode. Be aware that Google Ads and LinkedIn always require an event ID.
`[conversion-pixel pixel="all" gads-conversion-label="aabbccdd" meta-event="Schedule" twc-event="Signup" pinc-event="Signup" pinc-lead-type="test-type" snap-event="SIGN_UP" tiktok-event="SubmitForm" lintrk-event="1234567"]`
### Fire each pixel individually
The following examples show how to fire each pixel individually.
`[conversion-pixel pixel="google-ads" gads-conversion-label="abcdefg"]`
`[conversion-pixel pixel="linkedin" lintrk-event="1234567"]`
`[conversion-pixel pixel="meta"]`
`[conversion-pixel pixel="meta" meta-event="Schedule"]`
`[conversion-pixel pixel="ms-ads"]`
`[conversion-pixel pixel="pinterest"]`
`[conversion-pixel pixel="pinterest" pinc-event="Signup"]`
`[conversion-pixel pixel="pinterest" pinc-event="Signup" pinc-lead-type="test-type"]`
`[conversion-pixel pixel="reddit"]`
`[conversion-pixel pixel="snapchat" snap-event="SIGN_UP"]`
`[conversion-pixel pixel="tiktok" tiktok-event="SubmitForm"]`
`[conversion-pixel pixel="twitter"]`
`[conversion-pixel pixel="twitter" twc-event="Signup"]`
`[view-item pixel-id="14"]`
## General Instructions
> The only required parameter for all use cases is `pixel`. With this parameter you can choose which conversion pixel to fire, or, if you want to fire all of them.
`pixel="google-ads"`
`pixel="all"`
> All pixels use default parameters that can be overridden.
## Google Ads
> For each Google Ads conversion you need to set the `gads-conversion-label`. It is the only required parameter for a Google Ads lead conversion.
`[conversion-pixel pixel="google-ads" gads-conversion-label="abcdefg"]`
If you need to you can also set the `gads-conversion-id` as additional parameter. If you omit that parameter, the plugin will automatically use the **Conversion ID** set in the Pixel Manager under **Tracking Pixels → Google (Ads & GA4)**.
:::info
More information on conversion tracking you'll find on the Google Ads support pages [here](https://support.google.com/google-ads/answer/6331314) and [here](https://support.google.com/google-ads/answer/6331304)
:::
## LinkedIn
> The LinkedIn always requires an event ID.
`[conversion-pixel pixel="linkedin" lintrk-event="1234567"]`
Set up a new conversion in the LinkedIn Ads Manager and use the generated conversion ID as the `lintrk-event` parameter.
## Meta (Facebook)
> For the Meta (Facebook) lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event type is being reported as `Lead`.
`[conversion-pixel pixel="meta"]`
In order to override the default event you can set the `meta-event` parameter.
`[conversion-pixel pixel="meta" meta-event="Schedule"]`
:::info
More information on events you'll find on the Meta (Facebook) developer pages [here](https://developers.facebook.com/docs/analytics/send_data/events/)
:::
:::info
When you use shortcodes to track custom events, and Meta (Facebook) CAPI is enabled, the Pixel Manager will automatically process those custom events through CAPI too.
:::
## Microsoft Ads
!> This shortcode is in beta. Microsoft's documentation is not very clear on some parts of how to configure a lead conversion.
> For the Microsoft Ads lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event is being reported as `submit` and the event label as `lead`.
`[conversion-pixel pixel="ms-ads"]`
You can set an override all the following parameters:
`ms-ads-event`
`ms-ads-event-category`
`ms-ads-event-label`
`ms-ads-event-value`
:::info
More information on events you'll find on the Microsoft Ads developer pages [here](https://bingadsuet.azurewebsites.net/UETDirectOnSite_ReportCustomEvents.html)
:::
## Outbrain
> For the Outbrain conversion shortcode you need to set up a conversion in Outbrain. The JavaScript event names are not standardized in Outbrain. That means in the shortcode `outbrain-event` name you need to use exactly the name that you given during the setup. Capitalization matters, so make sure to write everything in lower caps.
Example: Create a new conversion for the `lead` event in Outbrain. As the name for the event write `lead`, all in lower caps. This is the name that you need to use as `outbrain-event` name.
Here is a list of event names that we recommend using:
- `registration`
- `email_sign_up`
- `lead`
- `download`
- `other`
Here's an example of how the shortcode could look like:
`[conversion-pixel pixel="outbrain" outbrain-event="lead"]`
## Pinterest
> For the Pinterest lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event is being reported as `lead`.
`[conversion-pixel pixel="pinterest"]`
In order to override the default event you can set the `pinc-event` parameter.
`[conversion-pixel pixel="pinterest" pinc-event="signup"]`
Additionally, you can set the `lead-type` parameter which is empty by default:
`[conversion-pixel pixel="pinterest" pinc-event="signup" pinc-lead-type="New release promotion"]`
:::info
More information on events you'll find on the Pinterest developer pages [here](https://help.pinterest.com/en/business/article/add-event-codes) and [here](https://help.pinterest.com/en/business/article/track-conversions-with-pinterest-tag)
:::
## Reddit
> For the Reddit lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event is being reported as `Lead`.
`[conversion-pixel pixel="reddit"]`
In order to override the default event you can set the `reddit-event` parameter.
`[conversion-pixel pixel="reddit" reddit-event="SignUp"]`
## Snapchat
> For the Snapchat lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event is being reported as `SIGN_UP`.
`[conversion-pixel pixel="snapchat"]`
In order to override the default event you can set the `snap-event` parameter.
`[conversion-pixel pixel="snapchat" snap-event="SIGN_UP"]`
:::info
More information on events you'll find on the Snapchat developer pages over [here](https://businesshelp.snapchat.com/s/article/pixel-website-install)
:::
## Taboola
> For the Taboola conversion shortcode to work you need to set up the event in the Taboola conversion setup.
Example: Create a new conversion for the `lead` event in Taboola. Write down the event name that is shown in the code example at the bottom of the setup window. This is the name that you need to use as `taboola-event` name.
`[conversion-pixel pixel="taboola" taboola-event="lead"]`
## TikTok
> For the TikTok lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event is being reported as `SubmitForm`.
`[conversion-pixel pixel="tiktok"]`
In order to override the default event you can set the `tiktok-event` parameter.
`[conversion-pixel pixel="tiktok" tiktok-event="SubmitForm"]`
:::info
More information on events you'll find on the TikTok developer pages over [here](https://ads.tiktok.com/help/article?aid=10028)
:::
## Twitter
> For the Twitter lead conversion shortcode there are no required parameters other than the `pixel` parameter. By default, the event is being reported as `CompleteRegistration`.
`[conversion-pixel pixel="twitter"]`
In order to override the default event you can set the `twc-event` parameter.
`[conversion-pixel pixel="twitter" twc-event="Signup"]`
With the new version of the Twitter pixel you will need to create the Lead (or Signup) event in the Twitter Ads Manager. Then use the generated event ID as the `twc-event` parameter.
`[conversion-pixel pixel="twitter" twc-event="tw-abcde-12345"]`
:::info
More information on events you'll find on the Twitter developer pages [here](https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html)
:::
## view-item shortcode
> The view-item shortcode fires all enabled pixels with their own view-item event, including all product information. That shortcode is necessary on custom-made product pages where WooCommerce can't detect that it is a product page and therefore the Pixel Manager can't automatically inject the necessary scripts for the view-item event.
In order to fire the view-item event on a custom product page add the following shortcode:
`[view-item product-id="14"]`
The `product-id` must contain the `post ID` of the product where all product information is stored.
---
# Tips and Tricks
URL: https://sweetcode.com/docs/pmw/developers/tipps-and-tricks
# Tips and Tricks
:::info
All the jQuery event listeners on this page will only work if jQuery has not been moved to the footer or delayed by a JavaScript optimizer. In case that happened use the following code to wait asynchronously (non page load blocking) until jQuery is loaded and then attach the event listeners.
:::
:::tip
Many examples on this page hook into the Pixel Manager's `pmw:*` events. [JavaScript Events](https://sweetcode.com/docs/pmw/developers/javascript-events) documents all of them, including the payloads and how to trigger events yourself.
:::
## A way to always attach event listeners after jQuery has been loaded
Some shop owners use JavaScript optimizers to delay or lazy load jQuery and tracking scripts, including Pixel Manager for WooCommerce.
Pixel Manager for WooCommerce itself can handle this seamlessly. But if you want to track your own events using the Pixel Manager for WooCommerce API, handling delayed and lazy loaded scripts is a challenge because hooking into jQuery, only after it loaded, is not straight forward. So if jQuery gets delayed or lazy loaded we need a way to deal with this.
The following code example will wait until jQuery is loaded. Once done it will attach an event listener to any element and execute the code each time the event is triggered.
The advantage of the method is, that it won't block any other page loading execution, because it runs asynchronously.
```js
// This first part of the code waits until jQuery has been loaded
// without blocking the main page loading thread
new Promise((resolve) => {
(function waitForjQuery() {
if (window.jQuery) return resolve()
setTimeout(waitForjQuery, 100)
})()
}).then(() => {
// Replace the following code with your event listener
jQuery(document).on("SOME_EVENT", function () {
// Here is your custom code
})
// End replacement code
})
```
## Add the product name to add-to-cart events with a label
Ever wanted to see which products are added to the cart in real-time? Then this filter is for you. Simply add the following code to `functions.php` and from then on it will send the product name as the event label to Google Analytics
```php title="/wp-content/themes/child-theme/functions.php"
add_action('wp_footer', function () {
?>
query_vars['order-received'] ?? 0);
if (!$order_id) {
return;
}
$order = wc_get_order($order_id);
if (!$order) {
return;
}
$customer_email = $order->get_billing_email();
if (!$customer_email) {
return;
}
// Thresholds (set these to the same values you used in PixelYourSite)
$frequent_shopper_min_tx = 2;
$vip_min_tx = 2;
$vip_min_aov = 200;
$big_whale_min_ltv = 5000;
// Collect all paid orders for this customer.
// Matching by billing email also includes guest orders.
$customer_orders = wc_get_orders([
'billing_email' => $customer_email,
'status' => ['wc-processing', 'wc-completed'],
'limit' => -1,
]);
$transaction_count = count($customer_orders);
$ltv = 0;
foreach ($customer_orders as $customer_order) {
$ltv += (float) $customer_order->get_total();
}
$aov = $transaction_count > 0 ? $ltv / $transaction_count : 0;
$is_first_time_buyer = $transaction_count <= 1;
$is_returning = $transaction_count > 1;
$is_frequent_shopper = $transaction_count >= $frequent_shopper_min_tx;
$is_vip_client = $transaction_count >= $vip_min_tx && $aov >= $vip_min_aov;
$is_big_whale = $ltv >= $big_whale_min_ltv;
?>
10000`).
- The events hook into `pmw:purchase`, which respects the Pixel Manager's order duplication prevention. Reloading the purchase confirmation page won't re-fire the segment events.
- If Meta (Facebook) CAPI is enabled (pro version), `pmw.trackCustomFacebookEvent()` automatically sends the events through CAPI too.
- Audiences in Meta populate dynamically going forward, the same way they did with PixelYourSite. Past purchases can't be backfilled through pixel events.
- The customer's order history is queried once per purchase confirmation page load, which is negligible on virtually all shops.
:::tip[Let our chatbot write the code for you]
This snippet was generated by [our chatbot](https://sweetcode.com/help). If you want different thresholds, additional segments, or the same events sent to GA4 or other platforms, paste the description of what you need (or the docs page of the plugin you're migrating from) into the chatbot and ask it to generate the code for you.
:::
## Adjust pixel IDs and other settings per country domain
There is a use case where shop owners want to run the same shop instance on different country domains (e.g. example.com, example.nl, example.br) and run paid ads traffic from different accounts to each of those domains.
But the Pixel Manager for WooCommerce user interface only allows to set one pixel ID in the settings.
In this case you can use the `pmw_options` filter to adjust the pixel IDs based on the domain.
The `pmw_options` filter allows you to modify the options before they are processed by the Pixel Manager.
The `$options` array contains all the options that are set in the Pixel Manager for WooCommerce settings.
Use the `error_log` function to output and see the structure of the `$options` array to find out how the options for other pixels are structured.
:::warning
The structure of the `$options` array may change in future releases. It happens very rarely, but it can happen. Subscribe to our newsletter and read the changelogs to be informed about new releases and breaking changes.
:::
```php title="/wp-content/themes/child-theme/functions.php"
/**
* Filter the Pixel Manager's options before it processes them.
*
* Place this code into functions.php of your child theme.
*
* This example shows how to set different GA4 and Google Ads conversion IDs and labels.
*
* Use the error_log function to output and see the structure of the $options array
* if you want to see how the options for other pixels are structured.
**/
add_filter('pmw_options', function ( $options ) {
// error_log('options: ' . print_r($options, true));
$host = $_SERVER['HTTP_HOST'];
if (preg_match("/.*example.nl/", $host)) {
$options['google']['analytics']['ga4']['measurement_id'] = 'abc';
$options['google']['ads']['conversion_id'] = '1234567890';
$options['google']['ads']['conversion_label'] = 'abc123';
} elseif (preg_match("/.*example.fr/", $host)) {
$options['google']['analytics']['ga4']['measurement_id'] = 'xyz';
$options['google']['ads']['conversion_id'] = '1122334455';
$options['google']['ads']['conversion_label'] = 'def123';
} elseif (preg_match("/.*example.us/", $host)) {
$options['google']['analytics']['ga4']['measurement_id'] = 'def';
$options['google']['ads']['conversion_id'] = '9988776655';
$options['google']['ads']['conversion_label'] = 'ghi123';
}
return $options;
});
```
## Fire the view_item event on variable products when no variation is pre-selected
:::info
By default, when [Variations Output](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#variations-output) is enabled, the Pixel Manager does not fire the `view_item` event on a variable product page until a variation is selected.
The reason is that for dynamic remarketing events like `view_item`, the product information sent with the event must match a product in the uploaded catalog. When variations are uploaded to the catalog, the parent product is not. So when no variation is pre-selected on the product page, there is no reliable way for the Pixel Manager to know which variation ID to send. Sending the correct variation ID also yields much more precise ad sets.
:::
### Recommended: use the Variations Output setting
If you are fine reporting the **parent product ID** for variable products, you do not need any custom code. Disable the [Variations Output](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#variations-output) setting in the Pixel Manager under **General → Product data** (the **Output product variations as separate items** toggle). With it disabled, the Pixel Manager automatically fires a `view_item` event with the parent product data on page load for variable products, even when no variation is selected.
Keep in mind this setting is global: it switches all product reporting (remarketing, `add_to_cart`, `purchase`, and so on) from variation-level IDs to parent-product IDs. Only disable it if your product feed is built around parent products. See [Variations Output](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#variations-output) for the full trade-offs.
### Alternative: keep Variations Output enabled and fire a parent view_item on load
If you want to keep variation-level reporting enabled but also fire a `view_item` for the parent product on page load, add the following code to your `functions.php` file.
:::caution
Do not use the `hide_variation` event for this. That event fires only when a customer deselects a variation that was already selected, not on a fresh page load when nothing is selected. The snippet below hooks the Pixel Manager's own `pmwLoad` event instead, which fires reliably on page load.
:::
```php title="/wp-content/themes/child-theme/functions.php"
add_action('wp_footer', function () {
if (!function_exists('is_product') || !is_product()) {
return;
}
?>
The plugin uses the newest version of the Google Ads dynamic data tracking code, which doesn't use the `ecomm_prodid` parameter anymore. This parameter was replaced with the `view_item` and `items` parameters. [Google specifications](https://support.google.com/google-ads/answer/7305793)
If you see the warning, this could have several causes.
- You haven't set up the plugin correctly yet. You will need to enable dynamic remarketing within the plugin. Only then that tracking code will be injected.
- You made the switch from the old to the new tracking code just recently. In that case, Google will need a few days before it picks up the new parameters and removes the warning.
- Google Ads is reporting a false warning. The report shows, that a parameter is missing, but in fact, it is being transmitted and received by Google Ads. Look at the following example:

If the warning doesn't go away, please reach out to us and ask for support.
## Google Tag Assistant reports multiple installations of Global site tag (gtag.js) detected. What shall I do?
:::info
This warning is of very low severity. It can be safely ignored.
:::
There are two main reasons, why this warning pops up.
- You have activated more than one Google service, such as Google Ads and Google Analytics. During initialization `gtag.js` is configured once for each service. Google Tag Assistant detects this as a separate global site tag, but it should not. It is safe to ignore that warning.
We implemented this exactly as [specified by Google](https://developers.google.com/gtagjs/reference/api).
- Some other plugin also injects a `gtag` source file into the HTML output of the page. As a consequence, the `gtag` namespace will be declared two times. Technically this is no problem, as they both initialize exactly the same namespace. So one just overwrites the other. Therefore, it is safe to ignore that warning.
## Can I use the Pixel Manager together with the Google for WooCommerce plugin (formerly Google Listings & Ads)?
Yes. The two plugins are meant to run side by side, and the Pixel Manager sets this up automatically. When you have Google Ads tracking enabled in the Pixel Manager, it disables the tracking features of Google for WooCommerce (previously named Google Listings & Ads, still called GLA in its code) using the `woocommerce_gla_disable_gtag_tracking` filter. This prevents duplicate event tracking (such as `add_to_cart`, `view_item`, and `purchase` events).
Everything else in Google for WooCommerce keeps working. The Merchant Center connection and the **product feed sync** are not affected. Only tracking is switched off, so the division of labor is: Google for WooCommerce syncs the product feed, the Pixel Manager does the tracking.
This also covers the case where you deliberately connect Google for WooCommerce to Merchant Center only and not to Google Ads. That setup works, and the Pixel Manager remains the single source of Google Ads conversion tracking.
If you use Google for WooCommerce for the feed, set the Pixel Manager's product identifier to **Post ID with `gla_` prefix** so that the IDs in the tracking events match the IDs in the feed. See [Product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier).
If you see GLA tracking code in your browser (identifiable by `gla_` prefixed IDs, `glaGtagData` data object, or `send_to: "GLA"` in gtag calls), it means that Google Ads tracking is not yet enabled in the Pixel Manager. Once you configure Google Ads in the Pixel Manager, GLA's tracking will be automatically disabled.
For more details, see the [Plugin Compatibility](https://sweetcode.com/docs/pmw/plugin-compatibility) page.
## How do I find my Google Merchant Center ID and what does the Pixel Manager use it for?
Sign in to the [Google Merchant Center](https://merchants.google.com/). Your Merchant Center ID is the number in the browser address bar, in the `a` URL parameter, for example `https://merchants.google.com/mc/overview?a=123456789` gives you `123456789`. Copy only the digits. It is 6 to 12 digits long.
The Pixel Manager uses it for exactly one thing: **Conversion Cart Data**. Saving the ID under **Tracking Pixels → Google (Ads & GA4) → Merchant Center ID** attaches the items that were sold to your Google Ads purchase conversions, so Google Ads can report items sold, cart size, average order value and Shopping Ads revenue. There is no separate toggle, and it works in the free version.
For this to produce data you also need a Google Ads conversion ID and label set in the Pixel Manager, your Merchant Center account linked to your Google Ads account, and product IDs that match the `id` attribute in your Merchant Center feed.
The Merchant Center ID is not the same as the Google Ads Conversion ID (`AW-…`), the Conversion Label, the GA4 Measurement ID (`G-…`) or the GA4 Property ID.
Full instructions, including how to verify and troubleshoot the setup: [Conversion Cart Data](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-cart-data).
## No conversions are being reported in Google Ads
There are several possible reasons why this can happen:
- Cookie Management Platforms (cookie banners) might be blocking the conversion tracking
- Off-page payment gateways need to be configured to redirect back to the purchase confirmation page. If that's not set up correctly, or if a user interrupts the redirect, no conversion is reported.
- Google Ads only shows conversions that were triggered through an ad click. Please follow these testing procedures exactly: [How to test conversion tracking](https://sweetcode.com/docs/pmw/testing#test-order)
- It can take up to 48 hours before the conversion appears in Google Ads
- Either the conversion ID or the conversion label or both are wrong
- If you are using caching you must make sure to exclude the purchase confirmation page
- If you are using minification plugins, turn them off and try again. Some minification plugins break the conversion code
- Users who disabled JavaScript or users who are blocking cookies (e.g. with ad blockers) can't be tracked
:::info
Using the pro version of the Pixel Manager for WooCommerce can alleviate some of those issues. For Google Analytics the Pixel Manager uses the Google Analytics Measurement Protocol to send purchase conversions which lifts the tracking accuracy to 100%.
Some paid ads pixels also offer server-to-server tracking (such as Facebook CAPI) which also increases tracking accuracy significantly. This is also only available in the pro version of the Pixel Manager.
You can get the pro version of the Pixel Manager from [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Not all conversions are being reported
Unfortunately, it is not always possible to track 100% of all conversions. There are several possible reasons why this can happen:
- Some users might be using Brave browser (that blocks all trackers by default) or strict privacy settings in other browsers.
- Some users might be using privacy-enhancing browser extensions that block Google Analytics and Google Tag Manager. Adblockers and other privacy-related browser extensions.
- Browsers with strict privacy settings.
- JavaScript is disabled in a browser.
- Cookie Management Platforms (cookie banners) might be blocking the conversion tracking
- Off-page payment gateways need to be configured to redirect back to the purchase confirmation page. If that's not set up correctly, or if a user interrupts the redirect, no conversion is reported.
If you are specifically seeing fewer orders in GA4 than in WooCommerce, see [Why does GA4 report fewer orders than WooCommerce?](#why-does-ga4-report-fewer-orders-than-woocommerce) for a detailed explanation and the recommended fix.
## The dismiss button doesn't work. Why?
You are using some kind of ad- or script-blocker in your browser. It blocks the script in the Pixel Manager that is responsible to dismiss the notification.
You have the following options:
- Temporarily disable the ad- / script-blocker in your browser and then dismiss the notification.
- Whitelist our scripts in the ad- / script-blocker.
- Switch to a different ad- / script-blocker. Not all of them block our scripts.
> We recommend whitelisting our scripts because they are also required on the plugin's settings page.
:::info
You might wonder why our scripts, but no others, get blocked by the ad- / script-blocker. The reason is that the Pixel Manager helps to track conversions for various ad platforms. And apart from blocking ads, many ad blocking service providers also block scripts that help track visitors and conversions. Because many of those providers are unable to distinguish if the scripts are being used for the front-end or the back-end, they simply block the scripts also on the back-end, thus triggering the issue you are facing. We've spent a considerable amount of time removing the Pixel Manager from the ad- and script-blockers. In some cases we succeeded, in others, we didn't.
:::
## Why is tracking accuracy so important?
You might ask yourself why tracking accuracy is important and why it can be low.
If for some reason only 20% of the visitors and conversions can be tracked, then paid ads platforms like Google Ads only get 20% of the data that they could get. Such a low accuracy prevents campaigns to run optimally. Actually, the difference in campaign performance can be as large as day and night. We've seen revenues and profit margins more than double in certain cases, just by fixing the visitor and conversion tracking. It doesn't mean that accurate conversion tracking makes every campaign high performing and profitable. But it will give you the best shot possible.
Here are few (of many) possible reasons why the accuracy can be low:
- Using off-site payment gateways
- Misconfigured cookie consent banners
- Custom purchase confirmation pages that don't properly follow WooCommerce specifications
## I see a duplicate Facebook Purchase event with an event ID like `pmw__`. Where is it coming from?
This duplicate is fired by Meta's own `fbevents.js`, not by the Pixel Manager. It comes from the **Track Events Automatically Without Code** feature in Meta Events Manager (also called automatic event detection, microdata events, or inferred events). When that feature is on, `fbevents.js` scans the page's structured data shortly after `PageView` and fires its own additional `Purchase` event, appending an internal counter to the most recent event ID it has seen on the page.
The Pixel Manager's own `Purchase` event ID uses the format `pmw_` (e.g. `pmw_145741`). Any event ID matching the pattern `pmw_<16 random chars>_` (e.g. `pmw_xq9m1b4a3uqdcc61_26495490706760077`) is generated by Meta, not by the Pixel Manager.
The recommended fix is to turn off **Track Events Automatically Without Code** in Meta Events Manager → your pixel → Settings. See the full troubleshooting article with diagnosis steps and an alternative code-based fix: [Duplicate Purchase event with `pmw__`](https://sweetcode.com/docs/pmw/troubleshooting#duplicate-purchase-event-caused-by-metas-automatic-event-detection).
**Already disabled it and still seeing duplicates?** Then the cause is almost certainly a separate, intermittent bug in Meta's own `fbevents.js` tracking library — not the automatic event detection feature. You can confirm it in under a minute by loading the order confirmation page with `?fbevents-version=2.9.84` appended to the URL. If the duplicate stops, the Pixel Manager has a PHP filter that pins that older library version permanently. Full steps and the filter snippet: [Duplicate events persist even with automatic event detection disabled (`fbevents.js` library bug)](https://sweetcode.com/docs/pmw/troubleshooting#duplicate-events-persist-even-with-automatic-event-detection-disabled-fbeventsjs-library-bug).
## Meta only receives PageView and ViewContent. AddToCart, InitiateCheckout and Purchase are missing. Why?
If page views arrive in Meta Events Manager but the add to cart, checkout and purchase events never do, and there is no error message anywhere, the most likely cause is not your website. Meta blocks conversion events for pixels that belong to a business category it treats as sensitive, most commonly **health and wellness**: medical devices, medical alert systems, supplements, pharmacies, clinics, therapy and mental health services, test kits and similar shops.
For a restricted pixel, Meta's own `fbevents.js` library accepts the `AddToCart` or `Purchase` call from any tracking tool and then discards it before it is sent. There is no request to `facebook.com/tr` and no error in the console. The Conversions API does not get around it either, because Meta applies the restriction to the data source rather than to the way the event is transported.
You can confirm it in a few seconds: open `https://connect.facebook.net/signals/config/` in a browser and search for `restrictedEventNames`. A non-empty list there names exactly the events Meta blocks. The Pixel Manager (1.64.0 and higher) checks this for you and names the blocked events in the browser console and in the debug report under **Meta Business Category Event Restrictions**.
The fix is on Meta's side, in Events Manager under your pixel's **Settings**, in **Manage data source categories** and **Manage event blocking**. Full diagnosis, the control test and the solution steps: [Meta silently drops AddToCart, InitiateCheckout and Purchase (restricted business category)](https://sweetcode.com/docs/pmw/troubleshooting#meta-silently-drops-addtocart-initiatecheckout-and-purchase-restricted-business-category).
## I am using a different Meta (Facebook) plugin and get the error "Receive the same event_id for many events". Does this also happen with this plugin?
When using Meta (Facebook) CAPI with other Meta (Facebook) plugins it can happen that you run into one of the following errors:
- "Deduplication not set"
- "Receive the same event_id for many events"
- "Event Purchase not deduplicated”
This happens when the browser and server-side event IDs are not unique for each event.
The Pixel Manager properly deals with this. It creates a unique event ID for each event which is why you should not run into that issue with the Pixel Manager.
## Is it possible to use multiple Meta (Facebook) pixels with the plugin?
Short answer: Yes, from version 1.64.0 and higher, with the [`pmw_facebook_pixel_identifiers` filter](https://sweetcode.com/docs/pmw/developers/php-filters#additional-facebook-pixels). But in most cases sharing a single pixel between ad accounts is the better solution.
Detailed answer: The most common reason to want a second Meta (Facebook) pixel is to run campaigns for the same WooCommerce shop from more than one Meta (Facebook) ad account. For that scenario you usually don't need a second pixel at all, because Meta (Facebook) lets you [share a pixel with other Meta (Facebook) ad accounts](https://www.facebook.com/business/help/352686481592916?id=1205376682832142). Sharing keeps all conversion data, all custom audiences and all learnings in one data source, which is why it is Meta's own best practice, and it stays the recommendation.
There are cases where sharing is not an option, for example when a media agency is not allowed into your Business Manager, when a partner brand needs its own data source, or when you are migrating from an old pixel to a new one and want both to collect data in parallel. For those cases the Pixel Manager provides the `pmw_facebook_pixel_identifiers` filter:
- Every browser event, on every page, is sent to all configured pixels.
- Each additional pixel can carry its own Conversion API access token, so server-side events, including purchases and subscription lifecycle events, are sent to that pixel as well (Pro).
- Additional pixels are also synced to the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview), if you use it.
A second pixel is a few lines in your child theme's `functions.php`, on top of the main **Pixel ID** that stays in the settings:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_pixel_identifiers', function ( $pixel_identifiers ) {
$pixel_identifiers[] = [
'pixel_id' => 'PIXEL_ID_2',
'capi_token' => 'CAPI_TOKEN_2', // optional, Pro
];
return $pixel_identifiers;
});
```
Setup instructions and code examples: [Additional Facebook Pixels](https://sweetcode.com/docs/pmw/developers/php-filters#additional-facebook-pixels). An overview of how the multi-pixel output behaves: [Multiple Meta (Facebook) pixels](https://sweetcode.com/docs/pmw/plugin-configuration/meta#multiple-pixels).
Keep in mind that each additional pixel multiplies the number of requests to Meta. A second pixel doubles the browser requests and, if it has a Conversion API token, also the server-side requests. Only add pixels you really need.
## How to enable and disable Beta releases?
:::info
This information is only valid for pro users of the plugin. If you plan to test bleeding edge beta releases go ahead and acquire the plugin from the [pricing page](https://sweetcode.com/plugins/pmw#pricing-section)
:::
If you plan to test the newest beta releases you need to first unlock beta releases in your install. Open the Pixel Manager settings and click **Account & billing** in the top-right corner. On the account page check the box for beta releases. Done. From now on you'll be able to update your plugin to the newest beta releases through the regular WordPress update mechanism.
In some cases, it may take half an hour or so before a newly released beta version shows up in your plugin update list.

## Will the Pixel Manager host tracking scripts locally?
After careful analysis, we concluded that there is no benefit in hosting tracking scripts, such as Google Analytics, locally. **Considering all factors, hosting the tracking scripts locally is detrimental to the user experience.**
The promise stands in the room that when hosting tracking scripts locally this would be beneficial for speed, caching, and improved scores in speed measurement tools such as Google PageSpeed Insights, GT Metrix, etc.
Following is a point by point analysis:
***Caching on the first page-load on the website***
Local: The browser of each visitor has to download the script from your server.
CDN: The browser of the visitor **only needs to download the script** from the CDN, **if the script is not already in the browser cache**. It can be in the browser cache already after having visited another website earlier, that includes the same tracking script.
Conclusion: It is very likely that visitors to your website have browsed the web before they reached your website. Therefore using the CDN will much more likely speed things up. Because, in many, if not most cases, the script is already in the browser cache.
***Caching on the second page-load on the website***
Local: The browser takes the script from the cache. This will only work however if the setup has been done correctly. There is a small chance that the developer didn't set up the script hosting correctly, which will make the browser download the script on **each** page load.
CDN: The browser takes the script from the cache.
Conclusion: Both methods take the script from the cache. CDNs are generally better engineered which lowers the risk of some misconfiguration that would lead to disabling the browser cache and make the script download on each page load.
***Caching the latest version***
Local: In order to make sure that the latest version of the tracking script is served by your website, the developer needs to build some logic to regularly download the latest version from the CDN. This adds complexity which can break. Also, depending on how often this is done, your server might serve outdated versions of the tracking script.
CDN: The CDN always serves the latest version of the tracking script.
Conclusion: In favor of the CDN.
***Caching in general***
If you want to run a fast website, chances are high that you are using some kind of cache layer. Cache layers usually load the locally hosted scripts into their CDN cache layer keeping an outdated tracking script for much longer. Plus, user browsers will still have to first download the script from there on the first visit. The cross-website CDN cache only works if you use the CDN of the tracking script provider.
Those are two moe disadvantages for hosting tracking scripts locally.
***Speed***
Local: Downloading the script is limited by your server's bandwidth.
CDN: Downloading the script is limited by the CDN's bandwidth.
Conclusion: Guess which one is faster. CDNs have much higher bandwidths. Using a CDN will less likely limit the download speed of the script. Also, it alleviates stress on your own server.
***Speed Measurement Tools***
Speed Measurement Tools such as PageSpeed Insights test with a headless browser with an empty cache. That means they test as if your website is the first thing that the visitor is opening in his browser. That by itself is a special case, because in most cases the visitor has browsed other websites before, and probably has the tracking script in his browser cache from one of those visits already. So using the CDN method again, is the more favorable method.
There is one way how you can **fool** Speed Measurement Tools **and improve your scores massively**. Use a JavaScript optimizer that **only loads all scripts after the first user interaction** on each page of your website. If high PageSpeed scores is what you're after, this is what you need to do. However, this also comes with a downside. Visitor tracking accuracy will be slightly negatively impacted.
***Overall Conclusion***
Keep using the CDN version of the scripts.
And don't get us wrong. Building local script hosting is technically easy to do and would not take much time. We're not lazy but really convinced that using the tracking script CDNs is a much better option for website owners.
## Why is the order count between GA3 (Google Universal Analytics) and GA4 sometimes different (pro version)?
:::info
Before comparing GA3 and GA4 order data, make sure both are being run by the Pixel Manager. Using third-party plugins, custom code or GTM for one or the other will very likely never result in the same order count.
(The reasons are that third-party code uses different approaches to send orders to GA3 and GA4. Most third-party plugins don't have such a rigorous order duplication prevention mechanism as the Pixel Manager has. And this is not the only point that sets the Pixel Manager apart from third-party plugins.)
:::
GA3 and GA4 should receive and report precisely the same order count and total revenue.
But, due to a few processing differences between GA3 and GA4, you may see differences in the order count for a particular date range.
In the pro version of the plugin, the Pixel Manager sends orders to GA3 using the [Google Analytics Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/v1). This is a server-to-server protocol and makes the tracking 100% accurate.
GA4's setup is a little different from GA3's. And GA4's processing speed is slower than GA3's. So when you analyze data between the two, you need to know what to do to verify the same data.
1. The Pixel Manager Pro version doesn't use the [Google Analytics Measurement Protocol for GA4](https://developers.google.com/analytics/devguides/collection/protocol/ga4) out-of-the-box. The reason is that Google introduced a security measure in GA4 to avoid abuse of the Measurement Protocol like it was possible for GA3 (e.g., [referrer spam](https://en.wikipedia.org/wiki/Referrer_spam)). So you have to [set a GA4 API secret in the Pixel Manager](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-api-secret). Once the API secret has been added to the settings, the Pixel Manager will also use the Measurement Protocol for GA4.
(As long as the Measurement Protocol is inactive, GA4 uses the browser pixel to report orders. This is less accurate because ad blockers or technical issues can prevent the browser pixel from working correctly.)
When you compare data between GA3 and GA4, make sure that the from date is a date where the GA4 API secret had been active for the entire day.
2. GA4 takes much longer to process and show orders in the reports. You'll have to wait 24 hours before comparing a specific date between GA3 and GA4. So if today is December 15, you can only compare data up to December 13.
Following these rules, you should see exactly (or nearly exactly) the same amount of orders and revenue in GA3 and GA4.
## Why is the conversion count between Google Ads and GA4 imported conversions sometimes different?
Google Ads and GA4 don't use exactly the same attribution model and settings. There may be differences in conversion window, attribution model, conversion counting, and other settings.
Plus, GA4 has been know to have issues to attribute all conversions to paid search campaigns.
Here are few Google support articles that explain the differences:
- [Comparing Analytics and Google Ads conversion metrics](https://support.google.com/analytics/answer/2679221)
- [Fix your conversion discrepancies](https://support.google.com/google-ads/answer/13881741)
- [Updates to attribution models in GA4](https://support.google.com/analytics/answer/9164320#061024)
## Suddenly very long URLs with a `_gl` parameter show up
If you see very long URLs with a `_gl` parameter while browsing your website, don't worry. This appears when you enable the Google Consent Mode and explicit tracking mode in the Pixel Manager. Under these conditions, the Pixel Manager instructs Google Analytics to track visitors without using cookies. To still be able to track visitors, Google Analytics uses the `_gl` URL parameter to keep tracking visitors.
Such an URL looks like this:
`https://example.com/?_gl=1*3p75d6*_up*MQ..*_ga*MTIwNjU1MjM2NC4xNjc0NTU3MDky*_ga_YQBXCRGVLT*MTY3NDU1NzA5MS4xLjAuMTY3NDU1NzA5MS4wLjAuMA..`
Under rare conditions this so called URL passthrough can cause issues. It is possible to disable it. However, disabling the URL passthrough will also deteriorate tracking accuracy. A better way would be to fix the underlying condition that causes the URL passthrough not to work properly. If you decide to disable the ULR passthrough the following support article explains how to do that: [How to disable the Google Analytics url_passthrough](https://sweetcode.com/docs/pmw/consent-management/google#url_passthrough)
## Why are PageView events not being sent to Meta CAPI?
When Meta CAPI is enabled, the Pixel Manager by default doesn't send PageView events to Meta CAPI.
Here are the reasons why:
- Tracking PageView events would add tremendous stress to the server. It would be as if no caching is enabled on the server.
- For optimizing campaigns, tracking the PageViews through CAPI is not necessary.
- Most of the PageViews are being tracked through the browser pixel.
- The Pixel Manager sends all the lower funnel events, which are important for campaign optimization, to CAPI.
From version `1.49.0` on, the Pixel Manager allows you to enable PageView tracking through CAPI. Please take a look into our [documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#track-pageview-events-server-to-server) to learn how to enable it.
This is a pro feature. If you want to use it, please [get the pro version](https://sweetcode.com/plugins/pmw#pricing-section).
## Can I disable the browser pixel and only use server-side tracking (CAPI)?
No, this is not supported.
**How pixel activation works:**
When you add a pixel ID for a tracking pixel provider in the Pixel Manager, the browser pixel is activated. If the tracking pixel also offers a server-side tracking option (such as Meta CAPI, TikTok EAPI, etc.) and you enable it, events will be sent through both channels: the browser pixel and the server-side API.
**Why we don't offer an option to disable the browser pixel while keeping server-side tracking active:**
Some customers have requested to run the browser pixel through Google Tag Manager while only using the Conversion API in the Pixel Manager. However, this setup would break event deduplication.
Ad platforms use the `event_id` to identify and deduplicate events received from both the browser and the server. For deduplication to work correctly, the same `event_id` must be sent with both the browser event and the server-side event. The Pixel Manager generates a unique `event_id` for each event and sends it through both channels, ensuring proper deduplication.
If the browser pixel is managed by a different tool (like GTM) while the server-side event is sent by the Pixel Manager, each tool will generate its own `event_id`. The ad platform will then count these as two separate events instead of deduplicating them, leading to inflated conversion counts.
This is why we require both the browser pixel and the server-side tracking to be managed by the Pixel Manager when using server-side tracking.
## GA4 Measurement Protocol limitations
When the GA4 Measurement Protocol is active by adding the [GA4 API Secret](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-api-secret) there are a few limitations to be aware of.
While the order purchase count and total amount are tracked much more accurately using the GA4 Measurement Protocol, other metrics and dimensions are not tracked as accurately (or not at all) as they are when using the browser pixel.
- Realtime order events are missing.
- GA4 takes 24 hours up to 48 hours to process and show orders in the reports. You'll have to wait 48 hours before analyzing or comparing a specific date between your shop system and GA4. So if today is December 15, you can only analyze or compare data up to December 13. This is also true for the channel attribution report.
- Geographic information is missing such as countries and cities. Google's suggested solution doesn't work (we tested that). Hopefully they will fix that in the future. [(more info)](https://developers.google.com/analytics/devguides/collection/protocol/ga4#geographic_information)
- Device information: Device information is only available through automatic collection from gtag, Google Tag Manager, or Google Analytics for Firebase.
- When Google Signals is enabled, same device remarketing is supported. For cross-device remarketing, reporting the User ID is an additional requirement. [(more info)](https://developers.google.com/analytics/devguides/collection/protocol/ga4#remarketing)
- Purchases can only be attributed to a user session for up to 72 hours after the session ends. After that, the purchase is attributed to `(not set)`. That means if a placed order doesn't change into a paid state within 72 hours (no payment arrived), the purchase will be attributed to `(not set)`.
- Channel attribution is inherited, never supplied. A Measurement Protocol event carries no traffic source of its own. It can only be attributed if the visitor's browser-side GA4 tag created a session that the purchase can be joined to. Orders from visitors whose browser-side tag was blocked arrive with the correct revenue but land under Unassigned. There is no way to pass a `GCLID` or a traffic source into the Measurement Protocol to fix this. [(details)](https://sweetcode.com/docs/pmw/troubleshooting#unassigned-traffic-in-ga4)
- Purchases from visitors whose browser-side GA4 tag never ran have no `client_id` to send. The Pixel Manager then falls back to a generated `anon_*` value so the revenue is still recorded, and those purchases cannot be attributed to a session. See [GA4 `anon_*` client IDs](https://sweetcode.com/docs/pmw/ga4-anon-client-id) for when this happens and how to check a specific order.
If geographic information is more important to you than purchase count and purchase value accuracy, you can disable the GA4 Measurement Protocol by removing the [GA4 API Secret](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-api-secret) and using the browser pixel for GA4.
## Why do some GA4 Measurement Protocol purchases show "(not set)"?
Because a Measurement Protocol event can only be attributed if GA4 can join it to a session the visitor's browser already created. When the browser-side GA4 tag never ran, there is no `client_id` to send, the Pixel Manager sends a generated `anon_*` fallback instead, and GA4 has nothing to join the purchase to.
A successful `HTTP 204` response does not contradict this. It only means Google accepted the request. The full explanation, including how to tell from the logs whether a given order used the browser client ID or the fallback, is on [GA4 `anon_*` client IDs](https://sweetcode.com/docs/pmw/ga4-anon-client-id).
## Why does GA4 report fewer orders than WooCommerce?
This is one of the most common questions we receive. A WooCommerce shop may report, say, 100 orders for a given period while GA4 only shows 50–60. Roughly half the orders appear to be missing. The reason is that, without the GA4 Measurement Protocol enabled, GA4 relies entirely on the **browser pixel** to track purchases. The browser pixel only fires if the visitor's browser successfully loads the purchase confirmation page **and** the GA4 tracking script executes without interference. There are many situations where this doesn't happen:
- **Ad blockers and script blockers** — Browser extensions like uBlock Origin, AdBlock Plus, or Brave's built-in shields prevent the GA4 pixel from firing.
- **Brave browser and strict privacy settings** — Brave blocks all trackers by default. Other browsers (Safari, Firefox) with strict tracking protection may also block GA4.
- **Cookie consent banners** — If the visitor hasn't accepted statistics/analytics cookies, the GA4 pixel is blocked by the consent management platform.
- **Off-page payment gateways** — Payment gateways that redirect the visitor to an external payment page (e.g., PayPal, certain bank payment pages) may not redirect the visitor back to the WooCommerce purchase confirmation page reliably. If the redirect doesn't happen, the pixel never fires.
- **Visitor leaves before the page loads** — The visitor may close the browser tab, navigate away, or experience a network interruption before the purchase confirmation page fully loads.
- **Misconfigured caching** — If the purchase confirmation page is cached, the GA4 pixel may not fire correctly for each unique order.
- **Custom thank-you pages** — Custom purchase confirmation pages that don't follow WooCommerce specifications will prevent the Pixel Manager from injecting the tracking pixel.
- **JavaScript disabled** — GA4 requires JavaScript to run. Visitors with JavaScript disabled can't be tracked.
All of these issues are inherent to browser-based tracking and apply to every tracking pixel, not just GA4.
:::info
**Recommended fix: Enable the GA4 Measurement Protocol**
The GA4 Measurement Protocol is a server-to-server tracking method available in the [pro version of the Pixel Manager](https://sweetcode.com/plugins/pmw#pricing-section). Instead of relying on the visitor's browser, the Pixel Manager sends purchase events directly from the WooCommerce server to GA4. This is completely independent of ad blockers, browser privacy settings, consent banners, and payment gateway redirects.
With the Measurement Protocol enabled, purchase count and revenue in GA4 should match WooCommerce very closely.
To enable it, add your GA4 API secret in the Pixel Manager settings: [GA4 API Secret setup instructions](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-api-secret).
:::
:::caution
**Trade-off:** While the Measurement Protocol dramatically improves purchase tracking accuracy, it comes with its own set of limitations — such as missing geographic data, missing device information, and a delayed reporting window. Please review the full list of trade-offs in the [GA4 Measurement Protocol limitations](#ga4-measurement-protocol-limitations) section above before enabling it.
:::
## Does the Pixel Manager support FunnelKit (formerly WooFunnels)?
Only partially.
With the Pixel Manager order tracking can only work with the original order and not with the upsells.
FunnelKit (formerly WooFunnels) uses an uncommon way to track orders.
FunnelKit allows adding upsells to the checkout process. That's great to increase the average order value, and not a problem by itself.
Different from other upsell plugins, FunnelKit allows adding the upsells after the initial purchase. It makes a reservation on the credit card of the customer for the original order. And with each successful upsell, it increases the amount of the reservation.
Similarly to this process, FunnelKit also tracks orders. It tracks the initial order and then sends new purchase events for each successful upsell.
FunnelKit sends new transaction IDs with each upsell which is good to prevent order duplication (if the ad platform supports it). However, they use different transaction IDs for the upsells than for the initial order. On the surface this is a good idea. It solves the duplication prevention problem. However, it opens up new problems for advanced functions.
There are several disadvantages shop managers have to deal with when using FunnelKit's order ID approach:
- Google Ads [Conversion Adjustments](https://support.google.com/google-ads/answer/7686447), which allow for even more accurate conversion tracking, can't be used.
- Processing refunds (full or partial) is not possible using the the Pixel Manager because orders created through FunnelKit use not one but several transaction IDs.
The Pixel Manager's strength is to track orders accurately, which allows for much better campaign optimization and a much better return on advertising investment. Therefore, we can't fully support FunnelKit's order-tracking approach.
## Does the Pixel Manager support the Google Tag Manager (GTM)?
No, the Pixel Manager doesn't directly support the Google Tag Manager (GTM). The Google Tag Manager is a different tracking code manager than the Pixel Manager.
In theory, it is possible to use the GTM alongside the Pixel Manager. But, it is not recommended. The reason is that the GTM is a very complex tool that requires a lot of knowledge to use it correctly. That is true for the GTM itself, and especially true if used alongside the Pixel Manager. You need to make sure that the Google Tag Manager doesn't interfere with the Pixel Manager, which requires a lot of knowledge about both tools.
The other reason is ownership of the data layer: the Pixel Manager owns and maintains its data layer across releases, so tracking quality stays high as WooCommerce, pixels, browsers, and consent rules keep changing. With GTM, every container is a custom build that has to be maintained separately \u2014 see [Best Google Tag Manager Alternative for WooCommerce conversion tracking](https://sweetcode.com/blog/best-gtm-alternative#who-owns-the-data-layer-faster-tag-setup-is-not-better-tag-setup) for the full reasoning.
If something is missing in the Pixel Manager that you need and think you could solve with the GTM, please let us know ([contact](https://sweetcode.com/support/)). We are always happy to add new features to the Pixel Manager.
## Can I activate Google Analytics in the Pixel Manager if I'm using another app for that already?
No, you shouldn't. This would lead to double tracking and inaccurate data in Google Analytics.
## Can I activate a tracking pixel in the Pixel Manager if I'm using another app for that pixel already?
No, you shouldn't. This would lead to double tracking and inaccurate data in the respective ad platform.
## Does the Pixel Manager support Cloudflare Zaraz?
Currently not.
The Pixel Manager already has a way to make page load times much faster without compromising tracking accuracy through its [Lazy Load feature](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#lazy-load-the-pixel-manager) (pro version).
So there is no need to use Cloudflare Zaraz.
However, we will keep an eye on Cloudflare Zaraz and might add support for it in the future.
## Does the Pixel Manager support store sales measurement Google Ads?
Currently no.
Google's threshold to process store sales measurement is very high. The store must have at least 300'000 store visits in average over the past 90 days and a minimum of 30'000 transactions per month. ([eligibility](https://support.google.com/google-ads/answer/9994849#eligibility))
## Can I use the Pixel Manager with a custom thank-you page?
Generally said, yes, you can, as long as the custom thank-you page follows the WooCommerce specifications.
WooCommerce offers an endpoint and a conditional to check if the current page is the thank-you page. If the custom thank-you page uses the standard WooCommerce endpoint and conditional, the Pixel Manager will work with it. Most plugins that offer custom thank-you pages follow the WooCommerce specifications.
If you want to verify if your custom thank-you page follows the WooCommerce specifications and works with the Pixel Manager, please follow the testing procedure described in the following article: [Testing](https://sweetcode.com/docs/pmw/testing)
If your plugin or custom code doesn't follow the WooCommerce specifications, the Pixel Manager will not work with it. You will have to fix the custom thank-you page by implementing the WooCommerce specifications.
## Which Pixel Manager scripts and paths do I need to exclude from caching or optimization?
Usually none. Page caching is supported by design, and the Pixel Manager registers the required JavaScript optimization exclusions automatically for WP Rocket, LiteSpeed Cache, SiteGround Optimizer, Autoptimize, WP-Optimize, Optimocha and FlyingPress.
If your optimizer is not one of those, NitroPack being the most frequent case, exclude the plugin folder (`woocommerce-google-adwords-conversion-tracking-tag` for the free version, `pixel-manager-pro-for-woocommerce` or `woocommerce-pixel-manager` for the Pro version) from JavaScript minification and combination, exclude the inline `pmwDataLayer` script from inline JS optimization, and don't delay the Pixel Manager until user interaction on the cart, checkout and order confirmation pages.
The full list with concrete file names, wildcards, endpoints and vendor specific steps is here: [Caching and Optimization Exclusions](https://sweetcode.com/docs/pmw/caching-and-optimization).
## My optimization plugin supports script lazy loading. Should I use that or the Pixel Manager's internal script lazy lading?
The recommendation is to enable lazy loading in both, your optimization plugin **and** the Pixel Manager, and exclude the lazy loading of the Pixel Manager script in your optimization plugin.
This will result in all third-party scripts being lazy-loaded by the optimization plugin, while the Pixel Manager manages the lazy loading of its own functions.
You might ask yourself, why enable it in both and then exclude the Pixel Manager in the optimization plugin?
The Pixel Manager has several improvements in its lazy loading logic. One optimization is that the Pixel Manager ensures that the tracking accuracy is as high as possible by automatically disabling lazy loading in the cart and checkout funnel. Those are pages where tracking should always load immediately. Another optimization is to disable lazy loading automatically in case AB testing tools are active within the Pixel Manager. To generate valid test results, AB testing tools need to always be loaded immediately, not delayed.
If you're using WP Rocket you can enable lazy loading in both without having to manually exclude the Pixel Manager from lazy loading in WP Rocket. The Pixel Manager automatically excludes itself from WP Rocket's lazy loading.
## Do I need to set up the conversion linker separately when using the Pixel Manager?
No. The Pixel Manager takes care of the [conversion linker](https://support.google.com/tagmanager/answer/7549390) automatically.
When Google Ads is enabled in the Pixel Manager, the Pixel Manager injects the Google `gtag.js` tracking library into every page of the shop. This tracking library takes care of the conversion linker automatically.
## Meta (Facebook) Poor Event Match Quality
If you see the following warning in your Meta (Facebook) Business Manager, don't worry. It is not a problem.

Meta (Facebook) is misguided in those cases. Here is why:
- **Browser ID (fbp)**: The `fbp` can only be set if the browser loads the Meta (Facebook) pixel. Some visitors use ad or tracking blockers. Those prevent the Meta (Facebook) pixel from loading. This why this percentage cannot be 100%.
- **Click ID (fbc)**: The `fbc` is only set if the visitor clicks on a Meta (Facebook) ad. If the visitor doesn't click on a Meta (Facebook) ad, the `fbc` cannot be set. If not all your visitors come to your website through clicking on a Meta (Facebook) ad, this percentage cannot be 100%. Essentially the percentage is as high as the traffic that comes through Meta (Facebook) ad clicks.
- **External ID**: The external ID can only be set if a visitor is logged into the shop. The Pixel Manager can't determine who the visitor is and therefore can't set the external ID. This is why this percentage cannot be 100%.
The [Pro version of the Pixel Manager](https://sweetcode.com/plugins/pmw#pricing-section) also allows you to enable [Meta's (Facebook)'s Advanced Matching feature](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-advanced-matching). Once enabled the Pixel Manager will send more identifiers like first name, last name, email, etc. to Meta (Facebook). This will increase the match quality. However, you will need to make sure that your privacy policy allows you to send this data to Meta (Facebook).
## Pinterest Poor Event Match Quality
If you see the following warning in your Pinterest ads manager, don't worry. It is usually not a problem.

**Reporting Period**
The reporting period is set to 14 days.
If you recently enabled the Pinterest pixel in the Pixel Manager, it can take up to 14 days until Pinterest shows the exact match quality.
**External ID**
The external ID is only available once a visitor is logged in. The external ID is essentially the user ID within WordPress for that visitor. But again, if he doesn't log in before browsing the website, the Pixel Manager can't know the ID. That's why it can't be sent, and that's why you can ignore that low coverage warning.
**Email**
Same as the external ID, the email can only be sent if the data is available. That is when the visitor is logged in, or on the purchase confirmation page, if the visitor has provided his email address. If the email address is not a mandatory field in the checkout process, the email address will only be sent if the visitor has entered it voluntarily during the checkout process.
**Click ID**
The click ID is only set if the visitor clicks on a Pinterest ad. If the visitor doesn't click on a Pinterest ad, the Pinterest cookie cannot be read. If not all your visitors come to your website through clicking on a Pinterest ad, this percentage cannot be 100%. Essentially the percentage is as high as the traffic that comes through Pinterest ad clicks.
**PageVisit**
The Pixel Manager doesn't send Conversion API events for PageVisits out of two reasons.
It would essentially circumvent any type of caching, making caching obsolete, which is not really the best way forward.
For conversion optimization PageView events are of very little value.
This is why tracking those events also on server side don't make much sense. (and they are tracked through the browser pixel). Here's an article we wrote about that: https://sweetcode.com/docs/pmw/faq#why-are-pageview-events-not-being-sent-to-meta-capi
## Which domains to whitelist in the Content Security Policy (CSP) to make the Pixel Manager work?
If you are using a Content Security Policy (CSP) you need to whitelist the following domains to make the Pixel Manager work:
- myexternalip.com
- ipify.org
- cloudflare.com
- geojs.io
- ipinfo.io
- ipapi.co
The Pixel Manager uses those services to determine the visitor's IP address and location under certain conditions. For instance, if the Pixel Manager is configured to block the pixels only in certain regions, it needs to detrimne the visitor's location and decide if the pixels should be blocked or not.
## Do I need to keep Meta (Facebook) CAPI test event code activated?
No. You can remove it after you have successfully tested the Meta (Facebook) CAPI.
You can also keep it, it doesn't hurt.
You only need to make sure to updated the test event code when you test again. Facebook requires that the test event code is updated after approx. 24 hours (there is no exact time frame given by Facebook).
## I want to renew with my subscription at the same price as when I subscribed. Is that possible?
As long as you don't cancel your subscription, we will never increase the price for you. Even if we increase the price for new customers, you will always pay the same price as when you subscribed.
## Is the Pixel Manager compatible with the HPOS (High Performance Order Storage)?
Yes, it is.
## I am currently using the free version of the plugin pixel manager. What are the steps I need to do to upgrade to the pro version?
To upgrade from the free version of the Pixel Manager plugin to the pro version, you can follow these steps:
1. Visit the Pixel Manager for WooCommerce pricing page by clicking [here](https://sweetcode.com/plugins/pmw#pricing-section) and choose the pro plan that suits your needs.
2. Purchase the pro plan that aligns with the number of sites you want to set up conversion tracking for.
3. Once you have purchased the pro plan, you will get an email with instructions how to install it.
Here's another document that shows you how to install the pro version of the Pixel Manager: [How to install the pro version](https://sweetcode.com/docs/license-management#how-do-i-install-the-pro-version)
## Do I need to keep the free version installed if I have the Pixel Manager for WooCommerce (Premium) version installed?
No. The pro (Premium) version runs completely on its own and does not require the free version. Once the pro version is installed and activated, you can safely deactivate and uninstall the free version.
Keeping the free version installed doesn't hurt either, but it is not needed.
See also: [Do I need to keep the free version active?](https://sweetcode.com/docs/license-management#do-i-need-to-keep-the-free-version-active)
## Request for Reviews
The Pixel Manager for WooCommerce is a free and user supported plugin. One way to understand if we're doing a good job and keep us motivated is by reading your reviews. However, the Pixel Manager is a one time install and forget plugin, which is why we only got few reviews until we started to ask our users for reviews.
We try to be very careful with our review requests. We don't want to annoy you. We only ask for a review after the plugin has been used for a while. And if you choose to dismiss the review request temporarily, we will ask you two more times before we stop asking you for a review.
If you want to stop our review request immediately, you can click on the `Ok, you deserve it` or the `I already did` button and we won't ask you again.

## Which is better to use, Google Ads native conversion actions or imported GA4 conversions?
We strongly recommend using Google Ads native conversion actions. Here are the reasons why:
- **Conversion Value Adjustments**: It allows you to adjust the output of the conversion value, such as removing the shipping costs and VAT. The Pixel Manager offers a few [standard settings](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#marketing-value-logic) and a [powerful filter](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter) that allows you to adjust the output of the conversion value in any way you want.
- **Conversion Deduplication**: They offer a much more powerful deduplication mechanism than GA4 imported conversions.
- **Conversion Adjustments**: You can use the [Conversion Adjustments](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments) feature that allows you to restate or remove conversions after partial refunds, full refunds and order cancellations.
- **Conversion Cart Data Reporting**: This feature allows [granular reporting of the cart data](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-cart-data). You get more granular reports in Google Ads and it is requirement if you want to use the [Google Automated Discounts program](https://sweetcode.com/plugins/gadwc/).
- **Enhanced Conversions**: It allows you to use [Enhanced Conversions](https://sweetcode.com/docs/pmw/plugin-configuration/google#setup) which increases the tracking accuracy of the conversions.
- **Subscription Value Multiplier**: It allows you to use the [Subscription Value Multiplier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#subscription-value-multiplier) which increases the Lifetime Value tracking accuracy of conversions for subscriptions.
GA4 imported conversions are a little easier to set up. But they lack the advanced features that Google Ads native conversion actions offer.
## Pixel Manager Cookies List and Classifications
The Pixel Manager sets several cookies for its own, necessary functionality. Here's a comprehensive list of all cookies with their classifications:
| Cookie Name | Purpose | Classification | Duration |
|-------------|---------|----------------|----------|
| `_pmw_session_data` | Used for session data storage when sessionStorage is not available | Necessary | Session |
| `_pmw_session_data_cart` | Used for keeping track of the cart data | Necessary | Session |
| `_pmw_persistent_data` | Stores user consent preferences for different cookie categories (statistics, marketing, preferences, necessary). Stores order IDs (anonymized) for order duplication prevention. | Necessary | 400 days |
| `_pmw_automatic_conversion_recovery` | Used for automatic conversion recovery for buggy payment gateway setups | Necessary | 90 days |
This list can be used for documentation purposes and for integration with cookie management platform providers.
## Why Am I seeing errors like `ERR_BLOCKED_BY_ORB` or `ERR_BLOCKED_BY_CLIENT` in my browser?
These errors usually mean that a browser extension (like an ad blocker or privacy tool) is interfering with a script or resource on the page. Below, you'll find answers to common questions about this issue.
- `ERR_BLOCKED_BY_CLIENT`
- `ERR_BLOCKED_BY_ORB`
- `net::ERR_BLOCKED_BY_CSP`
- `net::ERR_BLOCKED_BY_RESPONSE`
- `net::ERR_FAILED`
These errors happen when something on the client side (your browser or its extensions) blocks a request that the page is trying to make.
Try these steps:
1. Open the page in Incognito Mode. (Most extensions are disabled there by default.)
2. Disable all extensions, then reload the page.
3. Re-enable them one by one to find the blocker.
---
# Automatic Conversion Recovery (ACR)
URL: https://sweetcode.com/docs/pmw/features/acr
# Automatic Conversion Recovery (ACR)
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## What is the Automatic Conversion Recovery (ACR)?
For many tracking pixels the purchase events only can be tracked, if the customer reaches the purchase confirmation page. That unfortunately is not always the case. Data we collected for over a year shows, that shops almost never track 100% of all possible purchase events. The majority is somewhere between 90% and 98%. But there are shops where this is lower, sometimes even much lower. And when conversions are only tracked partially, paid ads campaigns are affected significantly. To learn more about why tracking accuracy can be lower than 100% read our in-depth articles over [here](https://sweetcode.com/docs/pmw/diagnostics#payment-gateway-tracking-accuracy-report) and [here](https://sweetcode.com/blog/are-all-payment-gateways-created-equal).
**Here is where the Automatic Conversion Recovery steps in.**
No matter what the cause of a deteriorated conversion tracking accuracy is, the Automatic Conversion Recovery (or ACR) will detect if a purchase has not been tracked and will recover the conversion upon the next visit of the customer to the webshop.
ACR bridges the tracking gaps, no matter how they happen.
We only have started testing ACR with a few select clients and we already see it working well. At the moment our raw estimate is, that approximately 50% of the conversions can be recovered with ACR, fully automated. We will update this paragraph once we have collected more real-world data.
## The Automatic Conversion Recovery Report
The report is generated once every night and it contains data for the past 30 days.
If you've enabled ACR just recently (by installing the newest pro version or upgrading), you'll have to wait 30 days before you see the full effect of ACR relative to the missing conversions.

## Requirements for the Automatic Conversion Recovery to work
There are only a few requirements for ACR to work:
- The customer has to revisit the shop
- with the same browser that he used to make the purchase
- within 90 days after the purchase (the lifetime of the recovery cookie).
- The order has to be in a paid state.
Given those conditions, we estimate that ACR will work best on the same date of the purchase and within the first few days after the purchase.
The [Automatic Conversion Recovery Report](#the-automatic-conversion-recovery-report) covers the past 30 days. Recoveries that happen later than that still take place; they just fall outside the reporting window.
## Limitations of the Automatic Conversion Recovery
Many customers will browse the shop immediately after making a purchase. In those cases, ACR will recover the conversions right there.
But, if the customer doesn’t revisit the shop with the same browser within 90 days after the purchase, ACR will not work.
On the purchase conversion page, the conversion pixels always fire, unless the order fails. But for ACR we made the conditions more strict. Conversions will only be recovered if the order is in a paid state. Failed, canceled, refunded or on-hold orders will be ignored.
## Using ACR deliberately to defer a conversion
Because ACR only recovers orders that are in a paid state, you can use it on purpose to make a conversion wait for the payment. This is useful for gateways that create orders in `pending payment` status and confirm the payment later, such as bank transfer, invoice, or a custom gateway.
Suppress the browser purchase conversion while the order is unpaid with the [`pmw_conversion_prevention`](https://sweetcode.com/docs/pmw/developers/php-filters#conversion-prevention) filter. ACR re-evaluates that filter on the customer's next visit, so the conversion is recorded once the order reaches a paid status, and never for orders that stay unpaid.
For platforms that have a Conversion API in the Pixel Manager, the [Status-Driven Purchase Conversions](https://sweetcode.com/docs/pmw/developers/recipes/status-driven-purchase-events) recipe is the better route, because it does not depend on the customer returning to the shop. The ACR route is what makes this possible for browser-only platforms such as Google Ads.
## How to increase the effectiveness of the Automatic Conversion Recovery
Since ACR only can work if a customer revisits the web shop, the best way to increase ACR’s effectiveness is to give the customer an incentive to revisit the shop.
Many customers will browse the shop immediately after purchase. In those cases, the chances of an ACR recovery will be the highest.
Sometimes customers revisit the shop within a few days after the purchase by themselves. In those cases, ACR will recover conversions as well.
But for customers who don’t plan to revisit the shop, ACR can’t work.
So the best way to increase ACR’s effectiveness you have to incentivize those customers to revisit the shop soon after the purchase. You can do that by creating an email with an incentive. It doesn’t matter which page they visit. ACR will detect their presence and will fire the conversion pixels.
:::info
We are planning to implement an automated email that will only be sent to those customers where conversion tracking failed, with an incentive to revisit the shop.
But, it is difficult to find a text that is generic enough to work for a wide range of shops, and with a high enough incentive that will make customers revisit the shop. If you have some creative input, feel free to send an email with suggestions to aleksandar@sweetcode.com
:::
---
# Events
URL: https://sweetcode.com/docs/pmw/features/events
## General and E-commerce Events
The following table lists the supported events for various platforms. The table also includes links to the official event documentation for each platform.
We try to implement all the events that are supported by the platforms and that can be triggered in a standardized way. Most platforms don't support all the events. For example, the `refund` event is only supported by GA4 and Mixpanel, and the `add_to_wishlist` event is only supported by around 50% of the platforms.
The platforms develop slowly and we try to keep up with the latest changes. If you find that a platform has added a new event, please let us know and we will try to implement it as soon as possible.
\* Only available in the pro version of the plugin.
## Lead Generation Events
Use our shortcodes to track lead generation events on your website: [Shortcodes](https://sweetcode.com/docs/pmw/developers/shortcodes).
---
# Facebook Login ID
URL: https://sweetcode.com/docs/pmw/features/facebook-login-id
# The Facebook Login ID (fb_login_id)
:::info
Sending the Facebook Login ID is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
The Pixel Manager can send Meta's **Facebook Login ID** with your [Conversions API](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-conversion-api-capi) events. It is one more identifier Meta can use to match an event to a real person, and it is available for every customer who signed in to your shop with their Facebook account.
You do not need a new plugin from us to get it, and the Pixel Manager does not add social login buttons to your shop. Instead it reads the identifier out of the social login plugin you already use. If you use one of the seven supported plugins, the identifier is one setting away.
## What the Facebook Login ID is
When a visitor signs in to your website with Facebook, Meta hands your website an identifier for that person. It is unique to that person and to your Facebook app, which is why Meta calls it an *app-scoped ID*.
That identifier is interesting for tracking because it is **deterministic**. Most of the customer data you send to Meta is probabilistic: you send a hashed email address and Meta looks for an account with the same hashed email. That works well, but it depends on the customer using the same address at your shop and on Facebook. The Facebook Login ID skips the guessing. It came from Meta in the first place, so Meta knows exactly whose it is.
Meta accepts it in the Conversions API as the [`fb_login_id` parameter](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters), and it is one of the few customer parameters that is sent unhashed.
## What it does for your Event Match Quality score
Meta scores every Conversions API event with an **Event Match Quality (EMQ)** score from 0 to 10. The score reflects how much usable identifying information the event carries. More identifiers, and better identifiers, mean a higher score, and a higher score means Meta can attribute more of your conversions and build better audiences from them.
The Facebook Login ID raises that score, and here is the honest picture of by how much.
**What it adds.** With [Advanced Matching](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-advanced-matching) enabled, the Pixel Manager already sends Meta a substantial set: the hashed email address, phone number, first and last name, city, state, postcode and country, plus the click ID (`fbc`), the browser ID (`fbp`), an external ID, the IP address and the user agent. The Facebook Login ID is an additional, deterministic identifier on top of that set. For customers who signed in with Facebook, their events become as identifiable as they can be.
**What it does not do.** It will not rescue a low EMQ score on its own, for two reasons:
1. It only exists for customers who actually signed in with Facebook. Customers who checked out as guests, or who signed in with an email and password, or with Google, have no Facebook Login ID. On a typical shop that is the large majority of orders.
2. The email address and phone number already do most of the work in the score. Adding a further identifier to an event that is already well matched moves the number by less than adding the first one did.
**So the honest order of operations is this.** If your EMQ score is low, the Facebook Login ID is not where the points are. Set up the [Conversions API](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-conversion-api-capi) and turn on [Advanced Matching](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-advanced-matching) first, because that is what puts email, phone, name and address into your events and that is worth several points. Once those are in place, the Facebook Login ID is a genuine, free improvement on the events it applies to.
**And if you are choosing whether to offer social login at all:** offer it because it removes friction at signup and checkout, which is a good reason on its own. The better match quality is a real bonus that comes with it, not a reason to add a login flow you did not otherwise want. On a shop where most people check out as guests, do not expect the score to jump. On a membership site, a subscription shop, a course platform or a B2B store where customers routinely sign in, the share of events carrying the identifier is much higher and so is the benefit.
## Supported social login plugins
Every plugin on WordPress.org that offers Facebook login was reviewed. These seven store the Facebook identifier in a way the Pixel Manager can read, so all seven are supported:
| Plugin | Notes |
| --- | --- |
| [Nextend Social Login and Register](https://wordpress.org/plugins/nextend-facebook-connect/) | The most widely used option, and a good default choice. Facebook login is in the free version. |
| [miniOrange Social Login and Register](https://wordpress.org/plugins/miniorange-login-openid/) | Supports a long list of providers besides Facebook. |
| [UsersWP Social Login](https://wordpress.org/plugins/userswp-social-login/) | An add-on for the UsersWP membership plugin. |
| [Super Socializer](https://wordpress.org/plugins/super-socializer/) | No longer available for download from WordPress.org, but still supported for shops that already run it. |
| [Wapu Auth](https://wordpress.org/plugins/wapu-auth-social-login/) | |
| [Heateor Login](https://wordpress.org/plugins/heateor-login/) | Facebook only. |
| [Easy Social Login](https://wordpress.org/plugins/easy-social-login/) | |
Whichever one you pick, you configure it with **your own Facebook app**, following that plugin's own setup instructions. The Pixel Manager never asks for Facebook credentials and never handles the login itself.
### Important: the Facebook app and the pixel must belong to the same business
:::caution
This is the one requirement that catches people out.
The Facebook Login ID is scoped to the Facebook app that issued it. Meta can only match it to your pixel data if **the Facebook app you configured in your social login plugin is in the same Meta Business Manager as your pixel.**
If the app lives in a different business, the identifier is meaningless to your pixel. Meta will not report an error and nothing in WordPress can detect it. The events simply will not benefit. So when you create the Facebook app for your login plugin, create it in the same Business Manager that owns your pixel.
:::
## Plugins that cannot be supported
If you use a social login plugin that is not in the list above, it is for one of these reasons.
**The plugin does not keep the identifier.** Some plugins use the Facebook identifier during login and then discard it, storing only which provider the customer used. There is nothing left on your site for us to read. This applies to Wp Social, Login & Register Forms, Happy Social Login, Ventra Connect, Login Me Now, Titan Social Login, SocialAll, TomS Social Login, Rundiz OAuth, Social Login by BestWebSoft and WP Social AutoConnect.
**The identifier belongs to someone else's Facebook app.** Some plugins route the login through the plugin vendor's own Facebook app rather than yours. The identifier they receive is scoped to the vendor's app, so Meta could never match it against your pixel, no matter what we did with it. This applies to OneAll's Social Login.
If you would like your social login plugin supported, the requirement is simply that it stores the Facebook user ID against the WordPress user, and that it authenticates through the site owner's own Facebook app. Get in touch and we will take a look.
### What about Google login?
There is no equivalent for Google. Google Ads matches conversions on a hashed email address, and the Pixel Manager already takes the email address from the order, so a Google sign-in adds nothing that we were not already sending. Google does not offer a deterministic login identifier that Google Ads accepts the way Meta accepts `fb_login_id`.
This is worth knowing if you are choosing which providers to offer: for tracking purposes specifically, only the Facebook button adds an identifier.
## How to enable it
1. Install and configure one of the supported social login plugins, with a Facebook app that belongs to the same Business Manager as your pixel.
2. Make sure the [Meta Conversions API](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-conversion-api-capi) is set up in the Pixel Manager, and that [**Advanced Matching**](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-advanced-matching) is enabled. The Facebook Login ID travels with the Conversions API events and follows the Advanced Matching setting.
3. Enable **Meta (Facebook): Send Facebook Login ID** in the Pixel Manager settings.
The setting is off by default. When a supported plugin is detected, the Pixel Manager also surfaces this as an [opportunity](https://sweetcode.com/docs/pmw/opportunities) in the admin, so you do not have to go looking for it.
## Checking that it works
**In Meta Events Manager.** Open Events Manager, go to your pixel and open the **Test Events** tab, then place a test order while signed in to your shop with Facebook. The event should list `fb_login_id` among its parameters.
**In the Pixel Manager debug info.** The debug info has a **Social Login (Facebook Login ID)** section reporting which supported plugin was detected, whether the setting is on, and whether an identifier could be resolved for your own user account. If you linked your own Facebook account to your admin user, that line is the quickest confirmation that the reading side works.
**Give the score time.** The EMQ score is calculated over a rolling window of recent events, so it will not move the moment you save the setting. Compare it after a few hundred events have come in.
## Troubleshooting
**The parameter never appears.** Work through it in this order: is a supported plugin active, is the Conversions API set up, is Advanced Matching on, is the Facebook Login ID setting on, and did the test customer actually sign in with Facebook rather than with an email and password. The debug info section answers the first three at a glance.
**It appears, but the EMQ score did not move.** The most likely cause is that the Facebook app of your login plugin is in a different Business Manager than your pixel, which makes the identifier unmatchable. The second most likely cause is simply that too few of your customers sign in with Facebook for it to show up in an average across all your events. Check what share of your orders come from customers who signed in with Facebook before concluding something is broken.
**Only some events carry it.** That is expected. Guests and customers who signed in another way have no Facebook Login ID, and their events carry the email, phone and address identifiers as before.
## Privacy note
The Facebook Login ID is personal data. It is not treated as a special case: it travels inside the Conversions API event alongside the rest of the Advanced Matching data, so it is governed by exactly the same rules as the email address and phone number you already send. Whenever an event is suppressed because the customer did not [consent](https://sweetcode.com/docs/pmw/consent-management/overview), the identifier goes with it, because the whole event is withheld rather than individual parameters being stripped.
Two settings widen that, and they widen it for all Advanced Matching data, not just this identifier. If you have enabled [**Always Send Server-Side Events**](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#always-send-server-side-events), events are sent regardless of the consent state. And an order that carries no consent snapshot at all is sent by default, unless you opt into requiring one through the `pmw_s2s_require_consent_snapshot` filter. If you operate under an explicit consent regime, review both of those.
The identifier itself is stored on your site by your social login plugin, not by the Pixel Manager, so when you describe in your privacy policy where the data comes from, name that plugin.
---
# Features
URL: https://sweetcode.com/docs/pmw/features/features
# Features
## Highlights
- Tracking Pixels
The plugin provides a variety of the most common tracking pixels for e-commerce such as Google Ads, Google Analytics, Meta (Facebook), Microsoft Ads and more.
You can use just one, or a selection of tracking pixels that suite your own purpose best.
The plugin covers all the core features that each pixel provides. New features (and beta features) are added to the development [roadmap](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce) frequently.
- Powerful control layer, yet simple to use
The design principles for the plugin are simplicity and accuracy. That means we designed the user interface to be simple to use. At the same time we pay a lot of attention to the logic beneath the surface to make the tracking pixels work as accurate as technically possible.
The plugin's powerful, internal pixel manager controls all the pixels and their settings, while making it very easy for the user to adjust the behavior globally.
Wherever possible, the internal pixel manager automatically detects the best settings for the specific environment which allows to keep the user interface uncluttered and as light as possible.
And, the plugin is very developer friendly. It provides hooks and filters to enable users to adjust the plugin behavior in ways that we didn't think of.
- Privacy features
Privacy concerns and new regulation have driven a development of many new Consent Management Platforms (CMPs). At the same time the pixel providers (like Google and Meta (Facebook)) have implemented new features into their tracking pixels that give the website visitors much more control over the data collected.
The plugin integrates seamlessly with the most popular Consent Management Platforms and implements all the new tracking pixel privacy features available to date.
## Pro Features Principles
When we decide to include a feature into the Pro version rather than the Free version there are several considerations we make. Following we'll explain a few of the principles:
- New features (like beta features) will only become available for users of the Pro version.
- If a new feature is essential for the working of the free version we will make it available to the users of the free version as soon as possible.
- Complex features that generate a high volume of support requests will only be available for users of the Pro version.
- The subscriptions for the Pro version must cover the costs for giving support and further improving the plugin (for the Pro version and the Free version).
## Features
### Pixels
Pixel | free | pro
--- | --- | ---
**Facebook** | ✔️ | ✔️
**Google Universal Analytics** | ✔️ | ✔️
**Google Analytics 4** | ✔️ | ✔️
**Google Ads** | ✔️ | ✔️
**Hotjar** | ✔️ | ✔️
**Microsoft Ads** | | ✔️
**Twitter Ads** | | ✔️
**Pinterest Ads** | | ✔️
**Snapchat Ads** | | ✔️
### General Features
The following features are implemented in all pixels (as long as the specific pixel supports that type of feature).
Feature | free | pro
--- | --- | ---
**Purchase transaction ID** | ✔️ | ✔️
**Purchase currency** | ✔️ | ✔️
**Basic order deduplication** | ✔️ | ✔️
**Advanced order deduplication** | | ✔️
**Ignore orders where the payment failed** | ✔️ | ✔️
**Different Types of Order Total Calculation** | ✔️ | ✔️
**Localized by professional translators** | ✔️ | ✔️
**Environment checks** | ✔️ | ✔️
**Event processing on lazy loaded products** | ✔️ | ✔️
**Automatic compatibility with various JavaScript optimizers** | ✔️ | ✔️
**Custom conversions with shortcodes** | ✔️ | ✔️
**Conversion value filter for custom order total calculation** | ✔️ | ✔️
### Google
Feature | free | pro
--- | --- | ---
**Consent mode** | ✔️ | ✔️
**Cross domain linker** | ✔️ | ✔️
**User ID tracking** | | ✔️
### Google Analytics
Feature | free | pro | info
--- | --- | --- | ---
**Standard e-commerce tracking** | ✔️ | ✔️ |
**Enhanced e-commerce tracking** | ✔️ | ✔️ | [1](https://support.google.com/analytics/answer/6014841) [2](https://support.google.com/analytics/answer/6032539) [3](https://www.youtube.com/watch?v=csIzGSsEeO0)
**Enhanced link attribution** | ✔️ | ✔️ |
**Product item data** | ✔️ | ✔️ |
**Scroll Tracking** | | ✔️ |
**Phone Click Tracking** | | ✔️ |
### Google Ads
Feature | free | pro
--- | --- | ---
**Add multiple conversion pixels (filter)** | ✔️ | ✔️
**All business verticals** | | ✔️
**All dynamic remarketing events** | ✔️ | ✔️
**Cart item tracking** | ✔️ | ✔️
**Conversion tracking** | ✔️ | ✔️
**Enhanced Conversions** | | ✔️
**Conversion Adjustments** | | ✔️
**Phone conversion tracking** | | ✔️
**Purchase currency** | ✔️ | ✔️
**Purchase transaction ID** | ✔️ | ✔️
**Retail business vertical** | ✔️ | ✔️
### Meta (Facebook)
Feature | free | pro
--- | --- | ---
**All dynamic remarketing events** | ✔️ | ✔️
**Conversion API (CAPI)** | | ✔️
**Purchase currency** | ✔️ | ✔️
**Subsriptions tracking** | | ✔️
### Microsoft Ads
Feature | free | pro
--- | --- | ---
**Purchase event tracking** | | ✔️
**All dynamic remarketing events** | | ✔️
**Purchase currency** | | ✔️
### Twitter Ads
Feature | free | pro
--- | --- | ---
**Purchase event tracking** | | ✔️
**All dynamic remarketing events** | | ✔️
**Purchase transaction ID** | | ✔️
**Purchase currency** | | ✔️
### Pinterest Ads
Feature | free | pro
--- | --- | ---
**Purchase event tracking** | | ✔️
**All dynamic remarketing events** | | ✔️
**Purchase transaction ID** | | ✔️
**Purchase currency** | | ✔️
### Snapchat Ads
Feature | free | pro
--- | --- | ---
**Purchase event tracking** | | ✔️
**Purchase transaction ID** | | ✔️
**Purchase currency** | | ✔️
**All dynamic remarketing events** | | ✔️
### TikTok Ads
Feature | free | pro
--- | --- | ---
**Purchase event tracking** | | ✔️
**Purchase transaction ID** | | ✔️
**Purchase currency** | | ✔️
**All dynamic remarketing events** | | ✔️
## Plugin Compatibility List
For one or another reason we've tested the Pixel Manager together with third party plugins. The following list shows which third party plugins we've tested and how well the Pixel Manager works along with them. This is not an exhaustive list and we'll add more case by case.
If a third plugin is marked with full compatibility, you shouldn't expect any issues. Plugins that we've marked with partial compatibility have proven to break the output of the Pixel Manager under certain conditions and lead to unexpected behavior.
### General Plugins
Plugin | full | partial
--- | --- | ---
**Doofinder** | ✔️ |
**WPML** | ✔️ |
**Yoast SEO** | ✔️ |
**Google Site Kit** | ✔️ |
### WooCommerce Extensions
Plugin | full | partial
--- | --- | ---
**CartFlows for WooCommerce** | ✔️ |
**CheckoutWC** | ✔️ |
**Cost of Goods for WooCommerce (WPFactory)** | ✔️ |
**WooCommerce Brands** | ✔️ |
**WooCommerce Composite Products** | ✔️ |
**WooCommerce Cost of Goods (SkyVerge)** | ✔️ |
**WooCommerce Deposits** | ✔️ |
**WooCommerce Google Product Feed** | ✔️ |
\* **WooCommerce Product Bundles** | | ✔️
**WooCommerce Subscriptions** | ✔️ |
**WooCommerce Wishlists** | ✔️ |
\*\* **FunnelKit** | | ✔️
**YITH WooCommerce Brands** | ✔️ |
**YITH WooCommerce Wishlist** | ✔️ |
**Woo Discount Rules** | ✔️ |
**WP Marketing Robot Feed Manager** | ✔️ |
\* WooCommerce Product Bundles: At the moment support is only partial. The total conversion value for all pixels for a purchase is calculated correctly. But not all dynamic remarketing events fire and the values for the dynamic remarketing events might not be correct. As the WooCommerce Product Bundles plugin has several options that can affect the output for dynamic remarketing in a wide range, the implementation is complex. If you are a user of that plugin go over to our roadmap and give it a thumbs up: [roadmap](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce/?card=61b78bca6b48c8002cb2bbf8)
\** FunnelKit is using an uncommon approach for upsell funnels (multiple purchases in a row). When using such upsells the Pixel Manager doesn't work as expected and you'll have to disable the Pixel Manager purchase conversion pixel. You will lose order duplication prevention, total order value settings, etc.
### JavaScript Optimization Plugins
Plugin | full | partial | not yet tested
--- | --- | --- | ---
**Async JavaScript** | ✔️ | |
**Autoptimize** | ✔️ | |
**FlyingPress** | ✔️ | |
**LiteSpeed Cache** | ✔️ | |
**Hummingbird** | ✔️ | |
**SiteGround Optimizer** | ✔️ | |
**WP Rocket** | ✔️ | |
**W3 Total Cache** | ✔️ | |
**Swift Performance** | | | ✔️
**WP Fastest Cache** | | | ✔️
**Powerpack** | | | ✔️
**Breeze** | | | ✔️
**PhastPress** | | | ✔️
**WP Super Cache** | | | ✔️
**PageSpeed Ninja** | | | ✔️
**Comet Cache** | | | ✔️
:::info
If a plugin that you are using has not been tested yet, please put in a feature request which will allow us to prioritize it. Feature requests can be posted on our [roadmap](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce/ideas).
:::
### Caching Plugins and Server Side Caching
Plugin | full | partial | not yet tested
--- | --- | --- | ---
**Autoptimize** | ✔️ | |
**WP Rocket** | ✔️ | |
**W3 Total Cache** | ✔️ | |
**LiteSpeed Cache** | ✔️ | |
\* **LiteSpeed ESI** | ✔️ | |
**SG Optimizer** | ✔️ | |
**WP Fastest Cache** | ✔️ | |
**Hummingbird** | ✔️ | |
**NitroPack** | ✔️ | |
**WP Optmimize** | ✔️ | |
**WP Super Cache** | ✔️ | |
**Cloudflare Plugin** | ✔️ | |
**WP Engine** | ✔️ | |
**Pagely** | ✔️ | |
**Kinsta** | ✔️ | |
\* LiteSpeed ESI: See [LiteSpeed Cache and ESI](#litespeed-cache-and-esi) below for details and one distribution-specific exception.
:::info
If a particular plugin or hosting provider is not on the list doesn't mean that it is not working. It only means that we haven't tested it yet. Send us a feature request [here](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce/ideas) or to support@sweetcode.com
:::
#### LiteSpeed Cache and ESI
The Pixel Manager natively supports LiteSpeed Cache, including LiteSpeed ESI (Edge Side Includes). Running the Pixel Manager on a LiteSpeed server with ESI caching enabled does not degrade tracking accuracy or performance. No configuration is required, the Pixel Manager detects LiteSpeed Cache and ESI automatically and adjusts its output accordingly.
When LiteSpeed Cache is active, the Pixel Manager automatically:
- Excludes its scripts from LiteSpeed's JavaScript optimization (minification and combination), so the tracking scripts always run as shipped.
- Registers its AJAX and REST nonces with LiteSpeed's nonce handling, so requests from cached pages stay valid.
- Purges the LiteSpeed cache whenever Pixel Manager settings are saved.
When ESI is enabled, the Pixel Manager additionally outputs its data layer through a dedicated, uncached ESI block for logged-in visitors. The rest of the page remains fully cached and is served at full speed, while the visitor-specific data layer is generated fresh on every page view. For guests, the data layer output is cache-safe by design: dynamic data such as cart contents is retrieved in the browser after the page loads, so fully cached pages still report accurate data.
In short, ESI caching and the Pixel Manager work well together. You get the page speed benefits of ESI without sacrificing tracking accuracy.
**Exception, woocommerce.com distribution:** Due to some limitations of WooCommerce and WordPress we can't ship the LiteSpeed ESI feature in the woocommerce.com distribution of the Pixel Manager. In that distribution, when ESI is enabled, the Pixel Manager instead disables caching on pages viewed by logged-in visitors to keep the data layer accurate. All other Pixel Manager distributions (like the ones from wordpress.org and sweetcode.com) fully support ESI and are not affected by this limitation.
### Cookie Consent Plugins
Our full list of supported cookie consent plugins can be found here: [Cookie Consent Plugins](https://sweetcode.com/docs/pmw/consent-management/platforms)
### Plugins with tracking pixels
Plugin | full | partial
--- | --- | ---
**Facebook for WooCommerce** | ✔️ |
**Woo Product Feed** | ✔️ |
**Google Listing and Ads** | ✔️ |
**Pinterest for WooCommerce** | ✔️ |
**WooCommerce Google Analytics Integration** | ✔️ |
**Google Site Kit** | ✔️ |
- **Facebook for WooCommerce**: While the Facebook tracking pixel is active in the Pixel Manager it disables the Facebook tracking pixel in the Facebook for WooCommerce plugin. The shop manager can still use the catalog feature in the Facebook for WooCommerce plugin.
- **Woo Product Feed**: The Woo Product Feed plugin offers a feature to enable the Facebook tracking pixel and/or the Google Ads tracking pixel. The Pixel Manager disables the tracking pixels in the Woo Product Feed plugin if they are active in the Pixel Manager.
- **Google Listing and Ads**: The Google Listing and Ads plugin offers a feature to enable the Google Ads tracking pixel. The Pixel Manager disables the tracking pixel in the Google Listing and Ads plugin if it is active in the Pixel Manager.
- **Pinterest for WooCommerce**: The Pinterest for WooCommerce plugin offers a feature to enable the Pinterest tracking pixel. The Pixel Manager disables the tracking pixel in the Pinterest for WooCommerce plugin if it is active in the Pixel Manager. All other features of the Pinterest for WooCommerce plugin are not affected by the Pixel Manager.
- **WooCommerce Google Analytics Integration**: The WooCommerce Google Analytics Integration plugin enables the Google Analytics tracking pixel. The Pixel Manager disables the Google Analytics tracking pixel in the WooCommerce Google Analytics Integration plugin if Google Analytics (GA4) is active in the Pixel Manager.
- **Google Site Kit**: Google Site Kit is a plugin that offers a variety of Google services, including tracking pixels for Google Ads and Google Analytics. The Pixel Manager disables the tracking pixels in the Google Site Kit plugin if they are active in the Pixel Manager.
## Support
Service | free | pro
--- | --- | ---
**Fixing issues caused by our plugins** | ✔️ | ✔️
**Support within 5 business days** | ✔️ | ✔️
**Support within 24h (during business days)** | | ✔️
---
# Why Upgrade to Pro?
URL: https://sweetcode.com/docs/pmw/features/why-upgrade-to-pro
# Why Upgrade to Pro?
The Pro version of Pixel Manager for WooCommerce unlocks the full potential of your conversion tracking infrastructure. While the free version provides essential tracking capabilities for Google Ads, Google Analytics, Meta (Facebook), and Hotjar, the Pro version delivers enterprise-grade features that significantly improve tracking accuracy, expand platform coverage, and future-proof your marketing analytics.
## The Case for Server-Side Tracking
### The Problem with Browser-Only Tracking
Traditional browser-based tracking faces increasing challenges:
- **Ad blockers** block up to 40% of tracking requests
- **Browser privacy features** (Safari ITP, Firefox ETP) limit cookie lifetimes
- **iOS 14.5+ App Tracking Transparency** restricts user identification
- **Network issues** and page abandonment cause lost conversions
- **Third-party cookie deprecation** threatens attribution accuracy
### The Solution: Server-to-Server (S2S) Tracking
Server-side tracking sends conversion data directly from your server to advertising platforms, completely bypassing browser limitations. This results in:
- ✅ **Up to 30% more conversions tracked** compared to browser-only tracking
- ✅ **Immunity to ad blockers** and browser privacy restrictions
- ✅ **First-party data ownership** for improved attribution
- ✅ **Enhanced data accuracy** with complete customer information
- ✅ **Better campaign optimization** through more complete conversion data
---
## Pro Features Overview
### 🚀 Server-Side Conversion APIs (S2S/CAPI)
The Pro version includes server-side tracking for all major advertising platforms:
| Platform | API Name | Benefits |
|----------|----------|----------|
| **Meta (Facebook)** | Conversions API (CAPI) | Bypass iOS 14 restrictions, improved event match quality |
| **Google Analytics 4** | Measurement Protocol | Server-side events, guaranteed delivery |
| **TikTok** | Events API (EAPI) | Reach Gen Z audiences with accurate attribution |
| **Pinterest** | API for Conversions (APIC) | Capture visual shopping intent |
| **Snapchat** | Conversions API (CAPI) | Track younger demographics reliably |
| **Reddit** | Conversions API (CAPI) | Measure community-driven conversions |
Each server-side API sends conversion events in parallel with browser-based events, then deduplicates on the platform side—giving you the best of both worlds.
---
### 📊 Additional Advertising Pixels
The Pro version unlocks tracking for 10+ additional advertising platforms:
#### Major Advertising Platforms
| Platform | Key Features |
|----------|--------------|
| **Microsoft Ads (Bing)** | UET tag, all dynamic remarketing events, purchase tracking |
| **LinkedIn Ads** | Partner ID integration, B2B conversion tracking |
| **Pinterest Ads** | Visual shopping events, catalog integration |
| **Snapchat Ads** | Snap Pixel, audience building, purchase events |
| **TikTok Ads** | TikTok Pixel, viral campaign attribution |
| **X (Twitter) Ads** | Tweet-to-conversion tracking |
| **Reddit Ads** | Community engagement to purchase attribution |
#### Native Advertising Networks
| Platform | Key Features |
|----------|--------------|
| **Outbrain** | Content recommendation tracking |
| **Taboola** | Native ad conversion attribution |
| **AdRoll** | Retargeting pixel for cross-platform reach |
---
### 🔬 A/B Testing & Analytics Integrations
Optimize your store with enterprise testing tools:
| Platform | Use Case |
|----------|----------|
| **VWO (Visual Website Optimizer)** | A/B testing, multivariate tests, personalization |
| **Optimizely** | Feature flags, experimentation at scale |
| **AB Tasty** | Personalization and conversion optimization |
| **Contentsquare** | Digital experience analytics, heatmaps, session replay |
---
### ✨ Enhanced Conversions & Advanced Matching
Improve attribution accuracy by sending hashed customer data to ad platforms:
| Feature | Supported Platforms | How It Helps |
|---------|---------------------|--------------|
| **Google Enhanced Conversions** | Google Ads | Matches conversions to logged-in Google users |
| **Microsoft Enhanced Conversions** | Microsoft/Bing Ads | Improved Windows/Edge user attribution |
| **Facebook Advanced Matching** | Meta Ads | Better event match quality score |
| **Pinterest Advanced Matching** | Pinterest Ads | Enhanced visual shopper identification |
| **TikTok Advanced Matching** | TikTok Ads | User ID, email, phone matching |
| **Snapchat Advanced Matching** | Snapchat Ads | Improved Gen Z attribution |
| **Reddit Advanced Matching** | Reddit Ads | Community member identification |
All customer data is **hashed before transmission** using SHA-256, ensuring privacy compliance while maximizing match rates.
---
### 🔄 Subscription & Renewal Tracking
For stores using **WooCommerce Subscriptions**, the Pro version provides:
- **Automatic renewal tracking** via server-side APIs
- **Subscription lifecycle events** (subscribe, renew, cancel)
- **Subscription value multiplier** for accurate LTV-based bidding
- **First payment vs. renewal differentiation** for campaign optimization
This is critical for subscription businesses where the true value of a customer isn't known at initial purchase.
---
### 💰 Lifetime Value (LTV) Features
Make smarter bidding decisions with customer lifetime value data:
| Feature | Description |
|---------|-------------|
| **Order-Level LTV Calculation** | Automatically calculates each customer's total historical value |
| **Automatic Updates on Refunds** | Refunds and cancellations update the affected customer's LTV on their own |
| **Manual LTV Recalculation** | On-demand recalculation across all customers, immediately or scheduled overnight |
| **LTV in Order Details** | View customer LTV directly in WooCommerce order screens |
LTV data can be sent to advertising platforms to optimize for high-value customers rather than just conversions.
---
### 🔙 Refund Tracking
Complete your analytics picture with refund data:
- **Full refund tracking** to Google Analytics 4
- **Partial refund tracking** with line-item details
- **Conversion adjustments** for Google Ads (retracts conversion value)
- **Accurate ROAS reporting** that accounts for returns
Without refund tracking, your reported conversion value and ROAS will always be inflated.
---
### 📱 Google-Specific Advanced Features
Unlock the full power of Google's tracking ecosystem:
| Feature | Description |
|---------|-------------|
| **GA4 Measurement Protocol** | Server-side event tracking with API secret |
| **GA4 Data API Integration** | Pull analytics data directly into WordPress |
| **GA4 Page Load Time Tracking** | Core Web Vitals monitoring |
| **Google User ID Tracking** | Cross-device attribution for logged-in users |
| **Google Ads Phone Conversions** | Track calls as conversions |
| **Conversion Adjustments Feed** | CSV endpoint for automated value adjustments |
| **Google Tag Gateway** | Custom measurement path for server-side GTM |
| **Automatic Email Link Tracking** | Track `mailto:` link clicks |
| **Automatic Phone Link Tracking** | Track `tel:` link clicks |
| **All Business Verticals** | Education, flights, hotels, jobs, local, real estate, travel |
---
### ⚙️ Advanced Shop Settings
Fine-tune tracking behavior for your specific needs:
| Feature | Description |
|---------|-------------|
| **Disable Tracking by User Role** | Exclude admins, shop managers, etc. from tracking |
| **Scroll Depth Tracking** | Track 25%, 50%, 75%, 90% scroll milestones |
| **Lazy Load PMW** | Defer script loading until user interaction for better PageSpeed |
| **ACR Integration** | Integration with Abandoned Cart Recovery tools |
| **Advanced Order Deduplication** | Prevents duplicate purchase events across sessions |
---
### 🔒 Facebook/Meta Advanced Features
Maximize your Meta advertising effectiveness:
| Feature | Description |
|---------|-------------|
| **Conversions API (CAPI)** | Server-side event tracking with access token |
| **CAPI Test Event Code** | Debug mode for validating server events |
| **Domain Verification** | Automated meta tag injection for domain ownership |
| **Advanced Matching** | Send hashed customer PII for better attribution |
| **Subscription Tracking** | Track WooCommerce Subscription renewals |
---
## Platform Comparison Matrix
### What's Included in Each Version
| Capability | Free | Pro |
|------------|------|-----|
| **Core Pixels (Google, Meta, Hotjar)** | ✅ | ✅ |
| **Basic E-commerce Events** | ✅ | ✅ |
| **Standard Order Deduplication** | ✅ | ✅ |
| **Consent Mode Support** | ✅ | ✅ |
| **Microsoft Ads Pixel** | ❌ | ✅ |
| **LinkedIn, Pinterest, Snapchat, TikTok, X, Reddit** | ❌ | ✅ |
| **Server-Side APIs (CAPI/EAPI)** | ❌ | ✅ |
| **Enhanced Conversions** | ❌ | ✅ |
| **Advanced Matching** | ❌ | ✅ |
| **Subscription Renewal Tracking** | ❌ | ✅ |
| **Lifetime Value Tracking** | ❌ | ✅ |
| **Refund Tracking** | ❌ | ✅ |
| **Phone Conversion Tracking** | ❌ | ✅ |
| **Scroll Depth Tracking** | ❌ | ✅ |
| **A/B Testing Integrations** | ❌ | ✅ |
| **Priority Support (24h response)** | ❌ | ✅ |
---
## Real-World Impact
### Case Study: Before vs. After Server-Side Tracking
| Metric | Before (Browser Only) | After (Browser + S2S) | Improvement |
|--------|----------------------|----------------------|-------------|
| Tracked Conversions | 1,000 | 1,280 | +28% |
| Event Match Quality (Meta) | 5.2 | 8.4 | +62% |
| Attributed Revenue | $50,000 | $64,000 | +28% |
| Campaign Optimization | Limited | Full funnel | ↑ |
*Results vary by store and audience composition*
---
## Getting Started with Pro
1. **[Purchase a Pro License](https://sweetcode.com/plugins/pixel-manager-for-woocommerce/)** — Choose single site, 5 sites, or unlimited
2. **Activate Your License** — Enter your license key in the plugin settings
3. **Configure Server-Side Tracking** — Add API tokens for each platform
4. **Verify Events** — Use platform debuggers to confirm events are firing
5. **Monitor Improvements** — Watch your conversion tracking accuracy increase
---
## Frequently Asked Questions
### Is server-side tracking difficult to set up?
No! The Pixel Manager Pro handles all the complexity. You just need to generate API tokens from each ad platform (we provide step-by-step guides) and, in the Pixel Manager, paste them into the relevant platform card under **Tracking Pixels** (for example the **Conversions API Token** field under **Tracking Pixels → Meta**).
### Will I lose any existing tracking data?
No. Server-side tracking works alongside browser tracking. Both event sources are deduplicated by the ad platforms, so you'll never double-count conversions.
### Do I need technical skills to use Pro features?
The Pro version is designed to be accessible to non-developers. Most features are enabled with a simple toggle and require only API credentials that you generate in each ad platform's dashboard.
### What happens to my data if I downgrade?
Your historical tracking data stays in your ad platforms. If you downgrade, you simply return to browser-only tracking without server-side redundancy.
### Is the Pro version GDPR compliant?
Yes. The Pixel Manager respects consent management platforms and only fires tracking events when users have provided consent. Customer data sent via server-side APIs is SHA-256 hashed before transmission.
---
## Ready to Unlock Pro Features?
[**Upgrade to Pro →**](https://sweetcode.com/plugins/pixel-manager-for-woocommerce/)
- 💳 **14-day money-back guarantee**
- 🔄 **Seamless upgrade from free version**
- 📧 **Priority support within 24 hours**
- 🔄 **Automatic updates**
---
# GA4 `anon_*` client IDs
URL: https://sweetcode.com/docs/pmw/ga4-anon-client-id
# GA4 `anon_*` client IDs
:::info
Server-side Google Analytics 4 Measurement Protocol tracking is a feature only available for users of the Pro version. Get the Pro version [here](https://sweetcode.com/plugins/pmw?utm_source=wpm-docs&utm_medium=cta&utm_campaign=ga4-anon-client-id#pricing-section).
:::
If you inspect the Pixel Manager logs you may find server-side GA4 purchase events whose `client_id` looks like this:
```
anon_76413.1786483870
```
instead of the browser's normal GA4 client ID, which looks like this:
```
171933599.1747821527
```
This page explains exactly when the Pixel Manager generates an `anon_*` value, whether it is only a fallback, and what it means for GA4 Measurement Protocol attribution and "(not set)" reporting.
## Short answer
:::tip[Short answer]
The Pixel Manager uses an `anon_*` GA4 `client_id` **only as a fallback**, and only for server-side GA4 Measurement Protocol events. Whenever a browser GA4 `client_id` was captured for the order, that value is used. There is no case in which the Pixel Manager sends `anon_*` while a usable browser client ID is available.
So an `anon_*` value is not itself a failure, and it is not the root cause of anything. It is a **marker** that the browser's GA4 client ID was never captured for that order. That missing identity is what prevents GA4 from joining the server-side purchase to the original browser session, which is what produces "(not set)" attribution.
:::
## Which events this affects
`anon_*` can only ever appear in three payloads, all of them server-side GA4 Measurement Protocol events:
- `purchase`
- full `refund`
- partial `refund`
Browser-side GA4 events are never affected. They always use the real client ID that `gtag` issued in the browser.
## What an `anon_*` client ID is
The value is built from a random 10 digit number and the current Unix timestamp, after which the first five characters are replaced by the `anon_` prefix. The result keeps the general shape of a GA4 client ID:
| Property | Behavior |
|---|---|
| Origin | Randomly generated at the moment the payload is built |
| Derived from the customer, order, browser, or session? | No |
| Stored anywhere? | No. It is never written to order meta, the WooCommerce session, or a cookie |
| Stable across events? | No. A purchase and a later refund on the same order carry different `anon_*` values |
| Persistent or deterministic? | Neither |
| Accepted by GA4? | Yes. GA4 treats any string as a syntactically valid `client_id` |
Because it is random and never reused, an `anon_*` value identifies nothing. It exists purely because the GA4 Measurement Protocol requires a `client_id` field to be present in every payload.
## Identifier selection
| Situation | Browser GA4 client ID available? | `client_id` sent | `session_id` sent | Expected GA4 attribution |
|---|---|---|---|---|
| Normal checkout, statistics consent granted, `_ga` cookie readable | Yes | Browser client ID | Yes | Joins the original session, normal source, medium, and campaign |
| `_ga` cookie missing at checkout (never written, cleared, or blocked) | No | `anon_*` | No | New unattributed user and session, typically "(not set)" |
| `_ga` cookie present but malformed (fewer than four dot separated parts) | No | `anon_*` | No | Same as above |
| Statistics consent denied, "always send server-side events" **off** | Not applicable | Nothing is sent. The purchase event is suppressed entirely | Nothing | No GA4 purchase at all, by design |
| Statistics consent denied, "always send server-side events" **on** | Usually no, because Consent Mode stops `gtag` from writing `_ga` | `anon_*` | No | "(not set)". This is the most common way a store produces `anon_*` at scale |
| Checkout only ever observed inside a cross domain payment gateway iframe | No | `anon_*` | No | "(not set)" |
| Subscription renewal order (since 1.59.0) | Yes, resolved from the parent order | Parent order's client ID | Parent order's stored session ID | Attributed to the same user. A session level join is unlikely because the original session is long over |
| Order created in the WordPress backend and paid by the customer on the front end | Yes, refreshed from the paying customer's browser | Browser client ID | Yes | Normal attribution |
| A valid browser client ID exists and was captured | Yes | **Always the browser client ID** | Yes | `anon_*` is never used in this case |
## Where the browser client ID comes from
The Pixel Manager reads the GA4 client ID out of the `_ga` cookie that `gtag` writes. The cookie looks like `GA1.1.171933599.1747821527`, and the client ID is the third and fourth part joined together: `171933599.1747821527`.
Three details matter for troubleshooting:
1. **The client ID is captured at checkout, not at send time.** It is stored in the WooCommerce session and then on the order, and read back from the order when the Measurement Protocol event is dispatched. If the cookie was not readable when the order was created, no client ID is stored, and nothing later can recover it. This is why delayed payments, webhooks, and cron triggered sends cannot repair a missing identity: there is no browser in those contexts.
2. **Identifier capture is skipped inside an iframe.** Some payment gateways render the checkout in a cross domain iframe, where reading the parent context would produce wrong data. The Pixel Manager deliberately skips capture there.
3. **A malformed cookie is ignored.** If the `_ga` cookie does not have at least four dot separated parts, it is treated as unusable.
## `session_id` travels with the client ID
The GA4 session ID comes from a **separate** cookie, `_ga_`. The Pixel Manager only adds `session_id` to the payload when that cookie was captured, and it adds `engagement_time_msec` alongside it.
Because `gtag` writes the `_ga` and `_ga_*` cookies together, when the `_ga` cookie is missing the session cookie is almost always missing too. An `anon_*` purchase therefore usually carries **no `session_id` either**, and it is that combination, an unknown user with no session reference, that makes a session join impossible.
## `HTTP 204` does not prove attribution
This is the single most important distinction on this page.
:::warning
An `HTTP 204` response means Google **accepted** the Measurement Protocol request. It says nothing about attribution.
:::
The GA4 Measurement Protocol production endpoint does not return error responses, even when the payload is malformed. A `204` therefore does **not** confirm any of the following:
- that the `client_id` matched an existing GA4 user
- that the event was joined to the original browser session
- that source, medium, and campaign were assigned
- that the event appears in your reports the way you expect
To validate that a payload is well formed, use Google's Measurement Protocol [validation endpoint](https://developers.google.com/analytics/devguides/collection/protocol/ga4/validating-events), which does return errors. Even then, a valid payload with an `anon_*` client ID remains an unattributed one.
## What the order flags actually mean
`wpm_google_analytics_4_mp_purchase_hit` is written immediately after the request is dispatched, without inspecting the response. It means "the Pixel Manager sent this purchase once", and it exists to prevent duplicate hits. It is not a statement about GA4 attribution, or even about GA4 having processed the event.
The Pixel Manager order meta keys are:
- `wpm_google_analytics_4_mp_purchase_hit`
- `wpm_google_analytics_4_mp_full_refund_hit`
- `wpm_google_analytics_4_mp_partial_refund_hit`
- `wooptpm_google_analytics_4_mp_purchase_hit` (legacy key, still honored)
:::note
`_ga_tracked` is **not** a Pixel Manager order meta key. It does not exist anywhere in the plugin. If you see it on your orders, it was written by another plugin or by a custom integration, and its meaning is defined by whatever wrote it.
:::
## Consent
Server-side GA4 purchase events are gated on the **statistics** consent category, not marketing, because GA4 is an analytics destination. This gate was introduced in 1.62.0.
- **Statistics consent denied, always send off.** The purchase event is suppressed completely. Nothing is sent, and you will not see an `anon_*` hit. Refunds for that order are suppressed too, so GA4 never receives a refund for a purchase it never saw. This is expected behavior and requires no action.
- **Statistics consent denied, always send on.** The consent gate is bypassed and the event is sent. But Google Consent Mode sets `analytics_storage` to `denied`, so `gtag` never writes the `_ga` cookie, so there is no browser client ID to capture, so the hit goes out with `anon_*` and no `session_id`. If you have enabled "always send server-side events" and a meaningful share of your visitors deny statistics consent, this is almost certainly where your `anon_*` hits and your "(not set)" revenue come from.
- **No consent snapshot on the order.** Orders created before the consent gate existed, or through an integration that never reported a consent state, are sent by default to preserve legacy behavior. Strict setups can suppress those as well with the `pmw_s2s_require_consent_snapshot` filter.
The trade-off is deliberate: with always send enabled you keep the revenue figure in GA4 but lose its attribution, and with it disabled you lose the purchase entirely but never send an unattributable one. Neither setting can produce an attributed purchase for a visitor who denied statistics consent, because no identity was ever allowed to exist.
## Why "(not set)" happens when everything else looks correct
The reported pattern is: WooCommerce order attribution is stored correctly, the Pixel Manager order flags are set, the Measurement Protocol returns `HTTP 204`, and GA4 still reports "(not set)" for a share of purchases.
All of those facts are compatible with each other, because they measure different things:
| Fact | What it proves | What it does not prove |
|---|---|---|
| WooCommerce attribution shows `source=google`, `medium=cpc` | WooCommerce observed and stored the referral itself | Nothing about GA4. WooCommerce order attribution is an entirely separate system, and GA4 cannot read it |
| `wpm_google_analytics_4_mp_purchase_hit` is set | The Pixel Manager dispatched the event once | That GA4 accepted, processed, or attributed it |
| Measurement Protocol returned `HTTP 204` | Google accepted the request | That it was joined to a session or attributed |
None of the three tells you whether GA4 could identify the user. Only the `client_id` and `session_id` in the payload do that.
Once delivery is confirmed, attribution can still be missing for these reasons:
1. **`anon_*` client ID and no session ID.** No join is possible. GA4 records a new unattributed user, so the purchase lands under "(not set)".
2. **A real client ID but no session ID.** GA4 can identify the user but has no session to attach the event to.
3. **A real client ID and session ID, but the session has expired.** Server-side events dispatched long after checkout, for example on a bank transfer or invoice paid days later, arrive after the original session is over.
4. **The 72 hour backdating limit.** The Pixel Manager sends `timestamp_micros` so GA4 attributes the purchase to the moment the order was placed, but GA4 only honors a timestamp up to 72 hours before it receives the hit. Anything older is silently clamped.
5. **General GA4 Measurement Protocol limitations**, which no plugin side change can remove.
Point 1 is the only one that `anon_*` itself indicates, and even there the `anon_*` value is the symptom, not the cause. Fixing "(not set)" means restoring the browser identity at checkout, not changing what the fallback sends.
## Diagnosing a specific order
1. In the Pixel Manager, open **Support → Logger**, turn on **Enable logger**, set the log level to **Debug**, and check **Log HTTP requests**. See the [Logs](developers/logs.md) page for details. HTTP request logging turns itself off automatically after 3 hours.
2. Reproduce a purchase, or wait for an affected order.
3. Open the log file at `/wp-content/uploads/wc-logs/`. The file names are prefixed with `pmw-`.
4. Find the `json payload:` line for the GA4 request and record:
- the `client_id`, and whether it starts with `anon_`
- whether a `session_id` is present
- the event timestamp and the WooCommerce order ID
- the response code that follows
- the Pixel Manager version
5. Then follow the decision tree:
| What the log shows | What it means | What to do |
|---|---|---|
| `client_id` starts with `anon_`, no `session_id` | The browser identity was never captured for this order | Check why `_ga` was absent at checkout: statistics consent state, the "always send server-side events" setting, an iframe checkout, ad blockers, or cleared cookies |
| `client_id` looks like `171933599.1747821527` | The identity was captured correctly. `anon_*` is not your problem | Investigate session timing, the 72 hour limit, and GA4 processing delay instead |
| No GA4 request at all, plus a log line about consent suppression | The consent gate suppressed the event | Expected behavior. No action needed unless you intend to enable always send |
| The request is logged with an error response | A configuration or connectivity problem | Check the measurement ID, the API secret, and outbound connectivity |
Allow for GA4's processing delay before concluding anything from reports. Comparing a purchase in DebugView or a report within minutes of the hit will mislead you.
## When to contact support
If the log shows a normal browser `client_id` and a `session_id` and attribution is still missing, or if you see `anon_*` on orders where you can prove the `_ga` cookie existed at checkout, send a request to [support@sweetcode.com](mailto:support@sweetcode.com) with:
- Pixel Manager version, WooCommerce version, and WordPress version
- the affected order IDs, with timestamps and timezone
- whether `anon_*` or a browser GA4 client ID was logged, and whether a `session_id` was present
- the relevant log file links, using **Copy log file links** in the logger panel
- your consent platform and its configuration, plus the state of the "always send server-side events" setting
- whether browser-side GA4 requests are visible for the same checkouts
- a screenshot or export showing the GA4 "(not set)" result
- whether the issue affects all orders or only a subset, and roughly what share
:::warning
Do not post full client IDs, customer data, GA4 API secrets, or unredacted log files in public channels such as the WordPress support forum. Use email for those, or share the log file links, which are access controlled.
:::
## Frequently asked questions
### When does Pixel Manager generate an `anon_*` GA4 client ID?
Only when it is building a server-side GA4 Measurement Protocol payload (purchase, full refund, or partial refund) and no browser GA4 client ID was captured for that order.
### Why does Pixel Manager use an `anon_*` client ID?
Because the GA4 Measurement Protocol requires a `client_id` in every payload. Without a placeholder the request would be invalid and the purchase would be lost from GA4 entirely, including its revenue.
### Is `anon_*` only a fallback when the browser's normal GA4 client ID cannot be retrieved?
Yes. It is used only in that case.
### Can Pixel Manager use `anon_*` when the original GA4 client ID is available?
No. If a client ID was captured for the order it is always used. There is no exception, no setting, and no filter that makes the plugin prefer a random value over a real one.
### Does an `anon_*` GA4 client ID cause "(not set)" attribution?
Not on its own, and the distinction matters. `anon_*` is used *because* the browser identity was unavailable, and that same absence is what prevents GA4 from joining the purchase to the original session. An `anon_*` hit will not be attributed, but replacing the fallback with something else would not fix attribution, because there is no identity to send. Treat `anon_*` as the diagnostic signal, not the defect.
### Why do I see "(not set)" in GA4 even though my Measurement Protocol purchase request returned HTTP 204?
Because `HTTP 204` only means Google accepted the request. The GA4 Measurement Protocol production endpoint does not return errors even for malformed payloads. Acceptance, storage, session joining, and traffic source attribution are four separate things, and only the first is confirmed by the response code.
### Why do `_ga_tracked=1` and `wpm_google_analytics_4_mp_purchase_hit=1` not guarantee GA4 source, medium, and campaign attribution?
`wpm_google_analytics_4_mp_purchase_hit` is written right after the request is dispatched, without checking the response, purely to prevent duplicate sends. It records that the Pixel Manager did its job, not that GA4 attributed the result. `_ga_tracked` is not a Pixel Manager key at all, so whatever it means is defined by the plugin or integration that wrote it.
### How can I check whether Pixel Manager used the browser GA4 client ID or an `anon_*` fallback?
Enable the logger at Debug level with **Log HTTP requests** turned on, then read the `json payload:` line for the GA4 request in `/wp-content/uploads/wc-logs/pmw-*.log`. See [Diagnosing a specific order](#diagnosing-a-specific-order).
### Can cookie consent, blocked storage, or browser privacy controls affect the GA4 client ID sent by Pixel Manager?
Yes, indirectly, because they determine whether the `_ga` cookie exists to be captured. Note the asymmetry: denying statistics consent normally suppresses the server-side purchase entirely rather than sending an `anon_*` one. You only get `anon_*` from a consent restricted visit when "always send server-side events" is enabled. Blocked or cleared storage, and iframe checkouts, produce `anon_*` without any consent involvement.
### What information should I send support when a purchase uses `anon_*`?
See [When to contact support](#when-to-contact-support).
## Related
- [Google (Ads & GA4) configuration](plugin-configuration/google.mdx)
- [Consent Management overview](consent-management/overview.md)
- [Logs](developers/logs.md)
- [Troubleshooting](troubleshooting.md)
---
# License Management
URL: https://sweetcode.com/docs/pmw/license-management
# License Management
License management works the same for all SweetCode plugins. Please see our central [License Management documentation](https://sweetcode.com/docs/license-management) for all information about:
- Account access
- VAT and invoicing
- Transferring licenses between domains
- Development and staging servers
- Installing the pro version
- License activation troubleshooting
- Manual renewals
- Expired license warnings
- EULA
- License quotas (subdomains, staging)
- Upgrading subscriptions
- Removing licenses
- License security (white label, URL whitelisting)
- License recovery
- Upgrading to a bundle license
---
# Opportunities
URL: https://sweetcode.com/docs/pmw/opportunities
# Opportunities
The Pixel Manager automatically scans and detects opportunities to improve tracking accuracy and performance. When new opportunities are detected it shows a dashboard notification and, in the Pixel Manager, lists all available opportunities under the **Opportunities** tab.
Each opportunity gives several points of information:
- A text why the opportunity was detected.
- A text that briefly explains what the opportunity will accomplish if activated.
- The level of how high the impact is once activated.
- A link to the setup procedure.
- Optionally a `learn more` link with a more in-depth explanation what improvements are to be expected if the opportunity is set up.
## Google Ads Enhanced Conversions
Enhanced conversions is a feature that can improve the accuracy of your conversion measurement and unlock more powerful bidding. It supplements your existing conversion tags by sending hashed first-party conversion data from your website to Google in a privacy-safe way. The feature uses a secure one-way hashing algorithm called SHA256 on your first-party customer data, such as email addresses, before sending to Google. You can learn more about [Google’s conversion modelling solutions](https://support.google.com/google-ads/answer/12284070).
## Google Ads Conversion Adjustments
A customer's typical conversion path ends after they convert, but this isn't always the case. Customers return retail purchases, cancel reservations, or perform actions that increase their value to your business. To account for these changes in conversion value, you can adjust the value of a conversion after it's reported in Google Ads.
Conversion adjustments can be useful if you need to:
- **Retract conversions that should no longer be counted** in your conversion columns, such as cancelled reservations or returned purchases.
- **Reduce (restate) the value of conversions when you receive partial returns** for an order. For example, if a customer is shopping for shoes, he might order shoes in different sizes and return the ones that don't fit, which brings down the total value of the purchase.
- **Change the value of conversions based on customer lifetime value**, that is, when customers (and, consequently, their conversions) become more valuable or less valuable to your business based on their purchase history.
## Google Tag Gateway
The Google Tag Gateway lets you route all Google tracking (Google Analytics and Google Ads) through your own domain, making it truly first-party. This helps bypass ad blockers and browser restrictions, extends cookie lifetimes beyond Safari's 7-day ITP limit, and significantly improves tracking accuracy.
[According to Google](https://support.google.com/google-ads/answer/16214371), advertisers who configured the Google Tag Gateway saw an **11% uplift in signals**.
Starting with version `1.53.0`, Pixel Manager includes a built-in proxy that makes setup incredibly simple—just set a measurement path and you're done. No external services, cloud infrastructure, or Cloudflare required.
## Google Ads Conversion Cart Data
When Google Ads purchase conversion is enabled, you can also enable Google Ads Conversion Cart Data to include cart item data in your conversion reports. This provides more detailed reporting by showing which products were purchased in each conversion, giving you better insights into product performance and helping optimize your campaigns.
## Customer Lifetime Value Calculation
When Google Ads purchase conversion is enabled, you can enable the Customer Lifetime Value (LTV) Calculation to send the customer's total lifetime value to Google Ads. This helps Google optimize your campaigns for higher-value customers rather than just individual conversions, potentially improving your return on ad spend (ROAS) over time.
## Dynamic Remarketing Variations Output
When at least one paid ads pixel is enabled and Dynamic Remarketing is active, you can enable Variations Output to collect more fine-grained dynamic audiences down to the product variation level. This allows you to show more specific remarketing ads to visitors who viewed particular product variations (e.g., specific sizes or colors).
**Note:** When enabling this setting, you also need to upload product variations to your ad platform catalogs.
## Meta (Facebook) CAPI
When the Meta (Facebook) Pixel is enabled, you can enable Meta Conversions API (CAPI) to improve conversion tracking accuracy. CAPI sends conversion events directly from your server to Meta, bypassing browser restrictions and ad blockers. This results in more accurate attribution and better optimization of your Meta advertising campaigns.
## Pinterest Enhanced Match
When Pinterest is enabled, you can enable Pinterest Enhanced Match to improve conversion tracking accuracy. Enhanced Match sends hashed customer data (like email addresses) to Pinterest, allowing for better attribution when no Pinterest cookie is present and for cross-device conversions.
## Reddit Conversions API
When the Reddit Pixel is enabled, you can enable Reddit Conversions API to improve conversion tracking accuracy. Similar to other server-side APIs, this sends conversion events directly from your server to Reddit, helping you track more conversions that might otherwise be lost due to ad blockers or browser privacy restrictions.
## Snapchat Advanced Matching
When the Snapchat pixel is active, you can enable Advanced Matching to improve the accuracy of your Snapchat pixel data. Advanced Matching sends hashed customer data to Snapchat, allowing for better attribution and more accurate conversion tracking, especially for cross-device conversions.
## Subscription Multiplier
When a WooCommerce Subscriptions plugin is active and the Subscription Multiplier is set to 1.00, this opportunity suggests adjusting the multiplier to better reflect the true lifetime value of subscription products. By multiplying the conversion value of subscription products by an expected number of renewal cycles, you can give ad platforms a more accurate picture of conversion value, leading to better campaign optimization.
---
# Plugin Compatibility
URL: https://sweetcode.com/docs/pmw/plugin-compatibility
# Plugin Compatibility
The Pixel Manager automatically detects and resolves tracking conflicts with other WooCommerce plugins. When the Pixel Manager is configured to handle tracking for a specific platform, it automatically disables the tracking features of other plugins for that same platform — preventing duplicate tracking, duplicate `gtag.js` loading, and inaccurate conversion data.
**No manual configuration is required.** The Pixel Manager handles all of this automatically in the background.
The [Checkout plugins](#checkout-plugins) section further down covers plugins that replace the WooCommerce checkout rather than compete for tracking.
## Google for WooCommerce
The Pixel Manager works together with the **Google for WooCommerce** plugin (previously named **Google Listings & Ads**, still referred to as GLA in its code). The two plugins are designed to run side by side: Google for WooCommerce keeps handling the Google Merchant Center product feed sync, and the Pixel Manager takes over all Google Ads tracking.
When Google Ads tracking is enabled in the Pixel Manager, it automatically disables Google for WooCommerce's tracking features. This includes:
- GLA's `gtag.js` script loading
- GLA's `add_to_cart` event tracking
- GLA's `view_item` event tracking
- GLA's `purchase` and `conversion` event tracking
- The `glaGtagData` JavaScript variable
**Why this is necessary:** Google for WooCommerce loads its own `gtag.js` and fires its own Google Ads tracking events (e.g., `add_to_cart` with `send_to: "GLA"`). If both plugins are handling Google Ads, this causes duplicate event tracking and inaccurate conversion data in Google Ads.
**How it works:** The Pixel Manager uses the `woocommerce_gla_disable_gtag_tracking` filter provided by Google for WooCommerce to completely disable its tracking framework. Only tracking is switched off. The Merchant Center connection, the product feed sync, and campaign management inside Google for WooCommerce are untouched.
If Google Ads tracking is **not** enabled in the Pixel Manager (for example, you only use the Pixel Manager for Google Analytics), Google for WooCommerce's own Google Ads tracking is left in place, since the Pixel Manager isn't handling Google Ads in that case.
:::tip
You can safely keep Google for WooCommerce installed for **product feed syncing** with Google Merchant Center. This also covers the setup where you connect Google for WooCommerce to Merchant Center only and not to Google Ads. In that case there is nothing to disable on the Google Ads side, and the two plugins simply cover different jobs: feed sync on one side, tracking on the other.
:::
:::info
If you use Google for WooCommerce for the product feed, set the Pixel Manager's product identifier to **Post ID with `gla_` prefix** so the IDs in the tracking events match the IDs in the feed. See [Product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier).
:::
## Facebook for WooCommerce
When Meta (Facebook) tracking is enabled in the Pixel Manager, it automatically disables the **Facebook for WooCommerce** plugin's pixel tracking.
**How it works:** The Pixel Manager uses the `facebook_for_woocommerce_integration_pixel_enabled` filter to disable Facebook for WooCommerce's pixel. It also overrides the product identifier format to match the Pixel Manager's configuration using the `wc_facebook_fb_retailer_id` filter.
:::tip
You can still use Facebook for WooCommerce for the **product catalog sync**. The Pixel Manager only disables its tracking pixel.
:::
## Pinterest for WooCommerce
When Pinterest tracking is enabled in the Pixel Manager, it automatically disables the **Pinterest for WooCommerce** plugin's tracking using the `woocommerce_pinterest_disable_tracking` filter.
## Reddit for WooCommerce
When Reddit tracking is enabled in the Pixel Manager, it automatically disables the **Reddit for WooCommerce** plugin's pixel and conversion tracking using the `reddit_for_woocommerce_filter_tracking_data` filter.
## WooCommerce Google Analytics Integration
When Google Analytics (GA4) tracking is enabled in the Pixel Manager, it automatically disables the **WooCommerce Google Analytics Integration** plugin's tracking using the `woocommerce_ga_disable_tracking` filter.
## WooCommerce Google Ads Dynamic Remarketing (WGDR)
When the Pixel Manager detects the WGDR plugin, it automatically disables its tracking features using the `wgdr_third_party_cookie_prevention` filter to prevent duplicate Google Ads remarketing events.
## WooFunnels
When the Pixel Manager detects WooFunnels (FunnelKit), it automatically disables WooFunnels' built-in pixel tracking features (Google Ads, Facebook, etc.) to prevent duplicate event tracking. This only applies on non-admin pages to avoid interfering with WooFunnels settings.
## Woo Product Feed
When the Pixel Manager detects the Woo Product Feed plugin, it automatically disables its built-in Facebook Pixel and Google Remarketing tracking features.
## Caching and optimization plugins
The Pixel Manager registers its own JavaScript optimization exclusions for WP Rocket, LiteSpeed Cache, SiteGround Optimizer, Autoptimize, WP-Optimize, Optimocha (Speed Booster Pack) and FlyingPress, and it purges the caches of all major caching plugins when you change its settings. Nothing has to be configured for that.
For optimizers that offer no filters to hook into, NitroPack being the most common one, exclusions have to be entered by hand if tracking breaks. The [Caching and Optimization Exclusions](https://sweetcode.com/docs/pmw/caching-and-optimization) page lists the exact script paths, inline script identifiers and endpoints to exclude, plus step by step settings for NitroPack and Cloudflare Rocket Loader.
## Checkout plugins
Plugins that replace the WooCommerce checkout with their own interface are a different case. They don't compete with the Pixel Manager for tracking, so there is nothing to disable. The question is whether the Pixel Manager still recognizes the checkout steps once the layout is no longer WooCommerce's own.
It does. The Pixel Manager doesn't track the checkout by looking at a particular template, theme or URL. It listens to the standard WooCommerce checkout signals, which these plugins keep using underneath their own interface. **No setting, filter or snippet is required.**
### CheckoutWC
[CheckoutWC](https://www.checkoutwc.com/) replaces the WooCommerce checkout with a single page, multi step checkout. All checkout events are tracked:
| Event | Tracked |
|---|---|
| `begin_checkout` | ✔️ |
| `add_shipping_info` | ✔️ |
| `add_payment_info` | ✔️ |
| `purchase` | ✔️ |
:::info[Requires version 1.64.1]
`add_shipping_info` needs Pixel Manager `1.64.1` or newer. CheckoutWC selects the shipping method for the customer once the address is complete, instead of waiting for a click on a shipping option. Earlier versions only recognized a shipping method that the customer had actively clicked, so the event never fired. See the [changelog](https://sweetcode.com/docs/pmw/changelog/free).
:::
**The Pixel Manager does not track CheckoutWC's hash steps.** CheckoutWC moves through its steps by changing the URL hash (`#cfw-customer-info`, `#cfw-shipping-method`, `#cfw-payment-method`, `#cfw-order-review`). These are CheckoutWC's own names for its interface steps and the Pixel Manager ignores them. It reacts to what the customer actually did, which is more reliable than a hash that changes when someone clicks back and forth between steps.
:::note[There is no `order_review` event]
CheckoutWC's `#cfw-order-review` step has no matching tracking event, and it is not something the Pixel Manager is missing. Neither the [GA4 ecommerce specification](https://developers.google.com/analytics/devguides/collection/ga4/ecommerce) nor any of the ad platforms define an event for a checkout review step, so nothing will ever appear under that name in your reports. If you want to measure that step, send it as a custom event of your own. See [JavaScript Events](https://sweetcode.com/docs/pmw/developers/javascript-events).
:::
### Other checkout and funnel plugins
| Plugin | Notes |
|---|---|
| **WooCommerce Checkout Block** | Fully supported. The Pixel Manager hooks into the Store API's own checkout events |
| **CartFlows** | Fully supported, including funnel steps that reach the checkout without a cart page |
| **FunnelKit (WooFunnels)** | Checkout tracking works. Post purchase upsells are only partially supported, see the [FAQ](https://sweetcode.com/docs/pmw/faq#does-the-pixel-manager-support-funnelkit-formerly-woofunnels) |
:::tip[Verify it yourself]
Turn on the [console logger](https://sweetcode.com/docs/pmw/developers/console-logger) by opening your checkout with `?pmwloggeron` appended to the URL, then walk through the checkout with the browser console open. Every recognized step prints a line, for example `Pixel Manager: pmw:add-shipping-info event fired`. Switch it off again with `?pmwloggeroff`.
:::
## Summary
| Plugin | Condition | What's Disabled |
|--------|-----------|-----------------|
| Google for WooCommerce (Google Listings & Ads) | Google Ads active in PMW | All gtag tracking and events (feed sync keeps working) |
| Facebook for WooCommerce | Meta (Facebook) active in PMW | Facebook Pixel |
| Pinterest for WooCommerce | Pinterest active in PMW | Pinterest tracking |
| Reddit for WooCommerce | Reddit active in PMW | Reddit Pixel and conversions |
| WooCommerce Google Analytics | Google Analytics active in PMW | GA tracking |
| WGDR | Plugin detected | Dynamic remarketing |
| WooFunnels | Plugin detected | Built-in pixel tracking |
| Woo Product Feed | Plugin detected | Facebook Pixel and remarketing |
:::info
All of these compatibility fixes are applied automatically. You don't need to manually configure anything. Just enable the tracking platforms you want in the Pixel Manager, and it will handle the rest.
:::
---
# AB Tasty
URL: https://sweetcode.com/docs/pmw/plugin-configuration/ab-tasty
# AB Tasty
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
AB Tasty is an experimentation and personalization platform. Once an account ID is configured, the Pixel Manager loads the AB Tasty tag on your store so you can run A/B tests and personalization campaigns.
## Setup
1. Log in to your AB Tasty account.
2. Open your account settings and copy your **Account ID**. It's the identifier in your AB Tasty tag URL, which looks like this:
```html
```
In this example the account ID is `abcdef1234567890`.
3. In the Pixel Manager, open **Tracking Pixels → AB Tasty**, paste the account ID into the **Account ID** field, and save.
## Supported Events
AB Tasty is used for A/B testing, experimentation, and personalization. It doesn't track traditional e-commerce events through the Pixel Manager — once loaded, AB Tasty runs its own experiment tracking.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# AdRoll
URL: https://sweetcode.com/docs/pmw/plugin-configuration/adroll
# AdRoll
:::info
In production. Will be available in one of the next releases.
:::
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Advertiser ID and Pixel ID
[Wistia video xwr0q08bk0]
1. Go to: https://app.adroll.com
2. Click **Website** in the left sidemenu.

3. Scroll down and click **View Pixel**.

4. Click **Copy** to copy the entire code snippet.

5. Open a new [tab with a text editor](https://docs.new) and paste the code snippet.

6. In the Pixel Manager, open **Tracking Pixels → AdRoll**, then copy the `adroll_adv_id` and paste it into the **Advertiser ID** field.

7. Copy the `adroll_pix_id` and paste it into the **Pixel ID** field in the same card.

8. Click **Save**.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Microsoft Clarity
URL: https://sweetcode.com/docs/pmw/plugin-configuration/clarity
# Microsoft Clarity
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
Microsoft Clarity is a free analytics tool that captures heatmaps, session recordings, and user-behavior insights. Once a project ID is configured, the Pixel Manager loads the Clarity tag and sends e-commerce signals so you can analyze the full shopping experience.
## Setup
1. Log in to your [Microsoft Clarity](https://clarity.microsoft.com/) account and select your project.
2. Open **Settings → Setup** and copy your **Project ID**. It's the identifier in your Clarity tracking code, which looks like this:
```html
```
In this example the project ID is `q9zk3x7p2w`.
3. In the Pixel Manager, open **Tracking Pixels → Microsoft Clarity**, paste the project ID into the **Project ID** field, and save.
## Supported Events
Alongside Clarity's automatic heatmaps and session recordings, the Pixel Manager sends these e-commerce events to Clarity via its [client API](https://learn.microsoft.com/en-us/clarity/setup-and-installation/clarity-api):
- **Add to cart**: sent when a product is added to the cart.
- **Begin checkout**: sent when the customer starts the checkout.
- **Purchase**: sent on the order received page, tagged with the order ID, value, and currency.
Matching sessions are also flagged with Clarity's session "upgrade" so they are prioritized for recording. The events and tags show up in Clarity's **Filters**, **Dashboard**, and **Recordings**.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Contentsquare
URL: https://sweetcode.com/docs/pmw/plugin-configuration/contentsquare
# Contentsquare
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
Contentsquare is a digital experience analytics platform — zone-based heatmaps, session replay, and journey analysis. Once a tag ID is configured, the Pixel Manager loads the Contentsquare tag and sends e-commerce events so you can analyze the full shopping experience.
## Setup
1. Log in to your Contentsquare account.
2. Open your project settings and copy your **Tag ID**. It's the numeric identifier in your Contentsquare tag URL, which looks like this:
```html
```
In this example the tag ID is `123456789`.
3. In the Pixel Manager, open **Tracking Pixels → Contentsquare**, paste the tag ID into the **Tag ID** field, and save.
## Supported Events
Alongside Contentsquare's automatic page and interaction tracking, the Pixel Manager sends these e-commerce events to Contentsquare's [e-commerce tag](https://docs.contentsquare.com/en/web/ecommerce-tag/):
- **Add to cart** — sent when a product is added to the cart.
- **Purchase** — sent on the order received page, including the transaction value, currency, and line items.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# CrazyEgg
URL: https://sweetcode.com/docs/pmw/plugin-configuration/crazyegg
# CrazyEgg
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
:::info
Available from version `1.56.0` of the Pixel Manager.
:::
### CrazyEgg Account Number
> Setting up the CrazyEgg pixel is very simple. You can either paste the **account number** directly, or paste the **entire tracking script** and the Pixel Manager will automatically extract the account number for you.
#### Option 1: Paste the Account Number
1. Log in to your CrazyEgg account
2. Go to your tracking code settings
3. Find your 8-digit account number (e.g., `01319772`)
4. Paste it into the plugin
#### Option 2: Paste the Tracking Script
1. Log in to your CrazyEgg account
2. Go to your tracking code settings
3. Copy the entire tracking script, which looks like this:
```html
```
4. Paste it into the plugin – the Pixel Manager will automatically extract the account number (`01319772`)
:::tip
The account number format is 8 digits. In the CrazyEgg script URL, it appears split as `XXXX/YYYY` (e.g., `0131/9772`), but you can paste it in any format – the plugin handles the conversion automatically.
:::
## Supported Events
CrazyEgg is used for heatmaps, session recordings, and A/B testing. It doesn't track traditional e-commerce events.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Criteo
URL: https://sweetcode.com/docs/pmw/plugin-configuration/criteo
# Criteo
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
[Criteo](https://www.criteo.com/) is a commerce media and retargeting platform. Its OneTag logs the shopping journey on your site so Criteo can build audiences, retarget visitors with the products they looked at, and attribute sales to your campaigns. Once an account ID is configured, the Pixel Manager loads the Criteo OneTag and sends all shopping journey events automatically.
## Setup
1. Get your Criteo account ID (also called partner ID). You can find it in Criteo Commerce Growth under **Event Tracking**, or request it from your Criteo representative. It is a numeric ID that looks similar to this: `12345`
2. In the Pixel Manager, open **Tracking Pixels → Criteo**, paste the ID into the **Account ID** field, and save.
That's it. There is no need to manually add the Criteo OneTag loader or event snippets to your site. The Pixel Manager loads the OneTag and sends the events automatically.
:::note
Criteo matches the product IDs in the tracking events against your Criteo product feed (catalog). Make sure the [product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier) setting in the Pixel Manager matches the IDs in the feed you submitted to Criteo.
:::
## Supported Events
The Pixel Manager sends these Criteo OneTag events:
- **viewHome**: sent when a visitor views the homepage.
- **viewList**: sent on product listing pages (shop, category, tag, and search results pages), with the IDs of the products the visitor saw.
- **viewItem**: sent on product detail pages, with the product ID.
- **addToCart**: sent when a product is added to the cart, with the product ID, price, and quantity.
- **viewBasket**: sent on the cart page, with all cart items including product ID, price, and quantity.
- **trackTransaction**: sent on the order received page, with the order ID and all purchased items including product ID, price, and quantity.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
## Advanced Matching
With advanced matching enabled, the Pixel Manager sends the SHA-256 hashed email address of logged-in customers and purchasers to Criteo along with the events. This improves Criteo's ability to match visitors across devices and browsers, which increases audience match rates and attribution accuracy.
The email address is hashed before it leaves your server. Criteo receives only the hash, never the plain email address.
You can enable advanced matching in the Criteo advanced settings section of the Pixel Manager.
---
# General Settings
URL: https://sweetcode.com/docs/pmw/plugin-configuration/general-settings
# General Settings
## Exclude User Roles from Tracking
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
With this pro feature, you can exclude certain users' roles from being tracked by the pixels.
PMW detects custom roles that were added to the shop. Those can be excluded from tracking too.
You can find this setting in the Pixel Manager under **General → General**, labelled **Disable tracking for user roles**.

## Scroll Tracker
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
The Scroll Tracker dispatches a scroll event when a certain scroll depth (in percent) is reached.
You can find this setting in the Pixel Manager under **General → General** in the **Scroll tracker thresholds** field.
The scroll depth thresholds setting is a comma separated list like so: `25,50,75,100`
Currently, the scroll depth is automatically sent to Google Analytics (GA3 and GA4) as a custom event with the name `scroll` and the value of the scroll depth that has been reached.

:::caution
If a specified scroll depth is visible in the viewport when the page loads, the trigger will fire even though the user has not physically scrolled the page.
:::
## Lazy Load the Pixel Manager
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
### How it works
When enabling lazy loading for the Pixel Manager, all tracking scripts will only be loaded after the first visitor interaction with the website. This will generally improve page speed scores on various page speed measuring services.
You can find this setting in the Pixel Manager under **General → General**, labelled **Lazy-load the Pixel Manager**.
First visitor interaction is typically one of the following:
- Pressing a button on the keyboard
- Moving the mouse
- Using the mouse wheel
- Clicking a mouse button
- Touching a mobile phone screen
Once an interaction is detected on each page, all tracking scripts load.
### Exceptions
#### Pages
The exceptions are all cart and checkout pages. To ensure tracking works 100% accurately once a visitor enters the checkout funnel, the tracking scripts always get loaded immediately on those pages (`cart`, `checkout`, `purchase confirmation` pages).
### Risks
#### Slow loading
There is a small risk that events don't get tracked before or while tracking scripts get loaded.
We have minimized the risk wherever possible.
The user interaction detector should capture 100% of all interactions. We compiled the interaction detector with options that should make it work under the broadest range of conditions. But, there is a chance that under rare conditions (e.g., very old browsers), it doesn't always work.
Loading the scripts introduces a short tracking delay (until the tracking scripts are fully loaded). Without any optimizations tracking scripts already load quite fast. The Pixel Manager preloads and caches the tracking scripts to improve load times even further.
JavaScript optimizers might break the lazy loader. We have tested the lazy loader with a range of JavaScript optimizers, and it works well. But not all JavaScript optimizers are the same, and we can't test all of them. So you should test lazy loading the Pixel Manager in your setup properly before relying on it.
### Test
Please test lazy loading the Pixel Manager in your setup properly. We have tested the lazy loader under various conditions, but we can only account for some possible setups. So you need to test the lazy loader on your system and setup before relying on it.
## Maximum Compatibility Mode (removed)
:::danger[This setting has been removed]
**Maximum Compatibility Mode no longer exists in the Pixel Manager and cannot be enabled.** The setting was removed, so there is nothing to turn on and it should not be suggested as a fix.
You no longer need to do anything to get this compatibility. The Pixel Manager now applies the required JavaScript optimization exclusions (minification, combination, and delaying JS on critical cart and checkout pages) **automatically** for all supported caching and performance plugins.
:::
If a caching, minification, or optimization plugin is altering the Pixel Manager's output, see the [Plugin Compatibility](https://sweetcode.com/docs/pmw/plugin-compatibility) page. The compatibility fixes described there are applied automatically, with no manual setting to switch on.
If your optimizer is not one of the automatically supported ones (NitroPack, for example), [Caching and Optimization Exclusions](https://sweetcode.com/docs/pmw/caching-and-optimization) lists the exact scripts, paths and endpoints to exclude by hand.
### History
This section is kept for reference only and describes a setting that no longer exists.
Maximum Compatibility Mode used to be an optional setting. Over time and through many support requests, we found specific third-party plugins that caused issues with the Pixel Manager. One typical example was caching and minification plugins that adjusted the Pixel Manager's output, sometimes breaking the scripts and stopping the tracking pixels from working. Broken scripts led to hours of debugging, many support requests, and, consequently, unhappy users.
We identified the exact settings in those third-party plugins which caused those issues. The mode changed those settings to values that made the third-party plugins compatible with the Pixel Manager, only touching settings that were not critical, and displayed a warning notification in the back-end where critical settings would have to be touched.
The setting was **removed** because this handling is now built in and applied automatically for all supported performance plugins. See the [changelog](https://sweetcode.com/docs/pmw/changelog/free) for details.
## Track PageView Events Server-to-Server
:::info
- Available since version `1.49.0`
- This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
Some advertising platforms support tracking `PageView` events through their server-side APIs. This increases the reliability of the `PageView` tracking and helps to minimize issues with browser-based tracking.
Currently, the following advertising platforms support server-side `PageView` tracking:
- Meta (Facebook)
- Snapchat
When enabled in the Pixel Manager, the plugin will send server-side `PageView` events to all platforms where the server-side tracking is enabled.
You can find this setting in the Pixel Manager under **Server-Side → General**, labelled **Send PageView events server-to-server**.

:::info
The Pixel Manager by default sends all other conversion events (such as `AddToCart`, `InitiateCheckout`, `Purchase`) through the server-to-server API. It is only the `PageView` event that is disabled by default.
:::
:::danger[Warning]
- Sending `PageView` events through the server-side endpoint will increase stress on your server significantly. This is because the Pixel Manager will send a `PageView` event for every page load.
- To minimize the impact on your server, we bundle all `PageView` events into a single request that is sent to the server-side endpoint. Plus, the Pixel Manager sends the request through the REST API, which only loads the WordPress core and is approximately two times faster than loading the full WordPress environment.
:::
## Always Send Server-Side Events
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
Normally the Pixel Manager fires its server-side (server-to-server / Conversions API) events as a complement to the browser pixels. When **Always Send Server-Side Events** is enabled, the server-side events are sent **even when the browser pixels never loaded** — for example when a consent banner or an ad blocker prevented the browser-side tracking from running.
You can find this setting in the Pixel Manager under **Server-Side → General**, labelled **Always send server-side events**.
Browser tracking is unaffected: the server-side events fire independently on your server, so you don't get double counting where the Pixel Manager's [order duplication prevention](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#marketing-value-logic) and event deduplication apply.
Use this to recover conversions on platforms that support cookieless / limited-data server integrations (such as Meta CAPI). It is most useful on stores where a large share of visitors block the browser pixels.
:::info[Since version 1.62.0]
Server-side **purchase** events honor the visitor's consent choice by default: when a visitor declines consent, the purchase event is not sent server-side. Google Analytics 4 requires **statistics** consent, and the ad platforms (Meta, TikTok, Snapchat, Pinterest, Reddit, OpenAI) require **marketing** consent. Read the details in the [announcement post](https://sweetcode.com/blog/server-side-purchase-events-honor-visitor-consent).
**Always Send Server-Side Events** is the override: when enabled, all server-side events, including purchases, are sent regardless of the consent state.
The payment gateway accuracy report shows how many orders were excluded because the visitor declined all consent categories, and their share of all orders in the selected period, so you can judge the impact on your store before deciding whether to enable this setting.
:::
:::caution
Because enabling this setting sends server-side events regardless of the visitor's consent choice, make sure you are legally permitted to do so in your jurisdiction. This assessment is the shop merchant's responsibility.
:::
## Load Deprecated Functions
:::info
Available since version `1.53.0`
:::
The Pixel Manager has evolved over time, and some function names and event names have been renamed to follow a more consistent naming convention. To ensure backward compatibility for users who have custom front-end code that relies on older function and event names, the Pixel Manager provides a toggle to load deprecated functions.
You can find this setting in the Pixel Manager under **General → General**, labelled **Load deprecated functions**.
**This option is only necessary if you have custom front-end code that uses one of the deprecated Pixel Manager functions or event names.** If you've never added custom JavaScript code that interacts with the Pixel Manager, you don't need this enabled.
### When to Enable
Enable this option only if you have custom front-end JavaScript code that relies on older Pixel Manager function or event names. The deprecated functions module acts as a compatibility layer that forwards calls to the new functions while displaying a deprecation warning in the browser console.
### When to Disable
If you're not using any custom front-end code that relies on the old function or event names, you can safely disable this option. **Disabling this option reduces the amount of front-end JavaScript code that needs to be downloaded**, resulting in faster page loads and improved performance for your visitors.
:::tip[Performance Optimization]
For sites that don't rely on legacy integrations, disabling this option is a simple way to optimize your front-end performance by reducing the JavaScript bundle size.
:::
## Delete Plugin Data on Uninstall
By default the Pixel Manager keeps its data even if you remove the plugin, so that reinstalling restores your previous configuration. The **Delete all plugin data on uninstall** setting controls what happens to that data.
You can find this setting in the Pixel Manager under **Support → Plugin data**.
When **enabled**, deleting the plugin also removes all of its data from the database — settings, settings backups, and any other stored data. When **disabled** (the default), your configuration is preserved so you can reinstall later without reconfiguring.
:::info
This only takes effect when you **delete** the plugin (Plugins → Delete), not when you merely **deactivate** it. Deactivating never removes data.
:::
:::caution
Enabling this is irreversible once the plugin is deleted — there is no undo. If you want to keep a copy of your configuration, export a [settings backup](https://sweetcode.com/docs/pmw/troubleshooting) before deleting.
:::
---
# Google
URL: https://sweetcode.com/docs/pmw/plugin-configuration/google
# Google
## Google User ID
:::info
This is a feature only available for users of the Pro version. Get the Pro version [here](https://sweetcode.com/plugins/pmw?utm_source=wpm-docs&utm_medium=cta&utm_campaign=google-user-id#pricing-section).
:::
The Google User ID feature enables cross-device attribution for logged-in users. When enabled, the Pixel Manager passes the WordPress user ID to Google services, allowing Google to associate the same user across different devices and sessions.
This improves conversion measurement accuracy because Google can attribute conversions to the correct user even when they switch between devices (e.g., browsing on mobile, purchasing on desktop).
### Which Google services receive the User ID?
When enabled, the User ID is sent to:
- **Google Analytics 4 (GA4)** — browser-side via the `gtag` config and server-side via the GA4 Measurement Protocol
- **Google Ads** — browser-side via conversion and remarketing events
### Setup
1. Make sure you have **GA4 and/or Google Ads** active in the Pixel Manager.
2. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)** and turn on **User ID Feature**.
That's it. The Pixel Manager will automatically send the User ID for all logged-in users.
:::note
The User ID is only sent for logged-in users. Guest checkouts do not include a User ID.
:::
### Activate User-ID in Google Analytics 4
To take full advantage of the User ID data, you should also activate the User-ID feature in your GA4 property:
https://support.google.com/analytics/answer/9213390
This unlocks the **User-ID Exploration** report in GA4, which provides cross-device insights for your logged-in users.
:::note
The User ID is not a replacement for the GA4 `client_id`, and it does not affect which client ID the Pixel Manager sends. For how the client ID is selected for server-side events, see [GA4 `anon_*` client IDs](https://sweetcode.com/docs/pmw/ga4-anon-client-id).
:::
## How Pixel Manager selects the GA4 client ID for server-side events
For server-side GA4 Measurement Protocol events (purchase and refunds), the Pixel Manager reads the visitor's GA4 client ID from the `_ga` cookie at checkout and stores it on the order. If no client ID could be captured, it falls back to a generated `anon_*` value so the purchase and its revenue still reach GA4, at the cost of session attribution.
The fallback is used only when no browser client ID is available. See [GA4 `anon_*` client IDs](https://sweetcode.com/docs/pmw/ga4-anon-client-id) for the full selection logic, the effect on "(not set)" attribution, and how to check which identifier a specific order used.
## Enhanced Conversions
:::info
This is a feature only available for users of the Pro version. Get the Pro version [here](https://sweetcode.com/plugins/pmw?utm_source=wpm-docs&utm_medium=cta&utm_campaign=google-enhanced-conversions#pricing-section).
:::
:::info
The diagnostics report in Google is delayed. If it shows one or several warnings, please wait a few days, sometimes up to two weeks, and recheck before contacting our support.
:::
Enhanced Conversions is a feature that can improve the accuracy of your conversion measurement. It supplements your existing conversion tags by sending hashed first-party conversion data from your shop in a privacy-safe way.
### Setup
Setup instructions:
1. Enable Google Enhanced Conversions in the Pixel Manager.

2. Activate Enhanced Conversions in your Google account.
This can be done either in Google Ads and/or GA4.
A. Activation in GA4: https://support.google.com/analytics/answer/14078702
B. Activation in Google Ads: https://support.google.com/google-ads/answer/9888656
:::info
You'll find more info from Google about Enhanced Conversions [here](https://support.google.com/google-ads/answer/9888656), [here](https://support.google.com/google-ads/answer/9888145) and [here](https://support.google.com/adspolicy/answer/7475709).
:::
### Validate your implementation
To verify if your enhanced conversions implementation is working correctly, navigate to your conversion page (you may have to complete a test order to do this), and follow these steps.
1. Right click on your web page.
2. Select Inspect.
3. Select the Network tab.
4. Enter your conversion ID or conversion label into the search bar.
5. Find the network request that's going to "googleadservices.com/pagead/conversion/" (or "google.com/pagead/1p-conversion/" on some browsers).
6. In the Headers part of the Network request, scroll to “Query String Parameters”. Here, you should find that there is a parameter “em” with a hashed string as the value. If you see the "em" parameter, this means that the enhanced conversions tag is correctly picking up and hashing the enhanced_conversion_data object.

## Google Tag Gateway for advertisers
:::info
This feature is available for all users of the free and the Pro version from version `1.48.0` and up. The built-in local proxy is available from version `1.53.0` and up.
:::
Google Tag Gateway for advertisers lets you deploy a Google tag using your own first-party infrastructure, hosted on your website's domain. By serving tags from your own domain, you can significantly improve the accuracy and resilience of your measurement signals. [According to Google](https://support.google.com/google-ads/answer/16214371), advertisers who configured Google Tag Gateway for advertisers saw an **11% uplift in signals**. Read more about the Google Tag Gateway for advertisers [here](https://support.google.com/google-ads/answer/16214371).
### How it works
The Pixel Manager includes a built-in local proxy that makes setting up the Google Tag Gateway simple — no external CDN or special server configuration required. Just set a measurement path in the Pixel Manager settings, and you're done.
If you want to reduce server load, you can optionally use Cloudflare, which handles all requests at the CDN level — meaning no requests hit your server at all.
**Automatic handler detection:** The Pixel Manager automatically detects the best available handler and uses it in the following priority order:
| Priority | Handler | How it works | Performance |
|----------|---------|--------------|-------------|
| 1 | **CDN Proxy (Cloudflare)** | Requests handled at CDN edge, no server load | ⚡ Fastest |
| 2 | **Standalone Local Proxy** | Standalone PHP file, bypasses WordPress core | 🚀 Fast |
| 3 | **WordPress Proxy** | WordPress core request processing | 🐢 Slower |
**Automatic fallback:** If the CDN proxy (Cloudflare) is not available, the Pixel Manager automatically falls back to the standalone local proxy. If that fails, it falls back to the WordPress proxy. If for any reason none of these work, the Pixel Manager falls back to the standard Google CDN. This ensures your tracking is never impaired.
:::note[CDN Proxy Detection]
When you enable or disable a CDN proxy (such as Cloudflare), it may take up to 24 hours before the Pixel Manager detects the change. The handler detection is cached for performance. During this period, the Pixel Manager will continue using the previously detected handler.
:::
:::info[Not all traffic is routed through your domain]
The Google Tag Gateway for advertisers doesn't route all traffic through your domain. It will still use the Google domain for some traffic. Most events will be routed through your domain. Google words it as *"some measurement requests will be sent to Google using your first-party domain"* and does not publish a list of which requests are covered. (This is documented by Google [here](https://developers.google.com/tag-platform/tag-manager/gateway/setup-guide?setup=manual). [Screenshot](https://cln.sh/nz8rSpL4)).
In practice, the request most often seen going to Google directly is the GA4 collection hit, to `region1.google-analytics.com`, or to `region1.analytics.google.com` when Google Signals is enabled. This is particularly common for shops in the EU, where the Google tag sends its hits to a regional endpoint regardless of the gateway.
Seeing those requests in your browser's network tab does **not** mean the gateway is misconfigured. Google decides per request which path is used, and neither the Pixel Manager nor your CDN can override that. To confirm the gateway itself is working, use the health check described below rather than looking for the absence of Google domains.
:::
### Basic setup (local proxy)
Setting up the Google Tag Gateway is simple:
1. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)** and locate the **Tag Gateway measurement path** field (under **Show advanced settings**).
2. Choose a path that is not already in use on your site. For example, `/metrics`.
3. Save the settings.
Done! The Google Tag Gateway for advertisers is now active on your website using the built-in local proxy.
:::tip[Optimized for Performance]
The Pixel Manager uses a **standalone proxy** by default, which runs as a standalone PHP file and bypasses WordPress entirely. This means each tracking request uses minimal memory (~1-2 MB) compared to WordPress core (~15-25 MB).
For **high-traffic sites** or **budget hosting**, consider using the [Cloudflare setup](#optional-setup-using-cloudflare) instead, as it handles all requests at the CDN level without touching your server at all.
:::
### Optional: Setup using Cloudflare
If you want to reduce server load even further, you can use Cloudflare to handle all Google Tag Gateway requests at the CDN level. This is optional but recommended for high-traffic sites.
:::warning[Important Requirement]
Cloudflare must be set up in proxy mode (orange cloud enabled). If you are using Cloudflare in DNS-only mode (grey cloud), the Google Tag Gateway for advertisers will not work through Cloudflare's native integration.
:::
[Wistia video d3ehc3lurt]
1. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)** and locate the **Tag Gateway measurement path** field (under **Show advanced settings**).
2. Choose a path that is not already in use on your site. For example, `/metrics`.
3. Copy the path.
4. Go to your Cloudflare account: https://dash.cloudflare.com/
5. If you have multiple accounts, select the account that you want to use.
6. Don't select a specific domain yet. Just select the account. On the left side, you will see a menu. Click on **Tag Management > Google Tag Gateway**.
7. Then click on the domain you want to set up the Google Tag Gateway for advertisers for.
8. Click the **Configure** button.
9. Paste the path you copied from the Pixel Manager into the **Measurement Path** field.
10. Go back to the Pixel Manager and copy the **Google tag ID**.
11. Go back to Cloudflare and paste the Google tag ID into the **Google tag ID** field.
12. Keep the rest of the settings as they are. **Don't** enable `Set up tag`
13. Click the **Save** button.
Done! The Google Tag Gateway for advertisers is now set up to use Cloudflare.
### Google tag ID
The Pixel Manager will provide you with a Google tag ID. This is the ID that you need to use in your CDN, load balancer, or web server. You can find the Google tag ID in the Pixel Manager under **Tracking Pixels → Google (Ads & GA4)** in the **Google Tag ID** field (under **Show advanced settings**).
The Google tag ID may look different depending which Google products you have activated in the Pixel Manager.

:::info
If you need to override the Google tag ID in the Pixel Manager, you can do this using the following filter: [Google tag ID filter](https://sweetcode.com/docs/pmw/developers/php-filters#google-tag-id).
:::
:::info
If you ever change the Google settings and disable/enable Google Ads or GA4, check if the Google tag ID is still correct. If you're using Cloudflare, you'll need to update it there as well.
:::
### Measurement path
You must reserve a path on your website domain for serving the tag. This path is set in the Pixel Manager under **Tracking Pixels → Google (Ads & GA4)** in the **Tag Gateway measurement path** field (under **Show advanced settings**). If you're using Cloudflare, you'll also need to set the same path in Cloudflare.
Choose any path that isn't already in use on your site. To reduce the likelihood of conflicting with a path already on the site, you can choose any combination of letters and numbers, or if you want a more readable path, you can choose to use a word such as `/metrics`, `/securemetric`, `/analytics`, or any other word you want.
**Requirements for the path:**
- The path must not already be in use on your site.
- The path must not be the root path `/`.
- It may not exceed 100 characters.

### Health Check
The health check in the settings shows if the Google Tag Gateway is set up correctly.
**Don't worry if the health check fails.** The Pixel Manager will automatically fall back to the regular Google tag. This means your tracking will keep working, but you won't benefit from the Google Tag Gateway until the issue is resolved.
Once the issue is fixed, simply refresh the page in the Pixel Manager and the health check will be re-run.

:::info
The health check only works if outgoing requests are allowed. If something is blocking outgoing requests, such as custom configuration, a plugin, or your hosting provider, the health check may show as failed even if everything is set up correctly. You can do the health check manually by going to the following path in your browser: `https://yourdomain.com/your-measurement-path/healthy`. If the page shows the text `ok`, the Google Tag Gateway is working correctly.
:::
### Verify
There are several ways to verify if the Google Tag Gateway for advertisers is working correctly.
#### Check network requests
Open the developer tools in your browser and check the network requests. Set a filter for the path you set in the Pixel Manager. For example, if you set the path to `/metrics`, set a filter for `/metrics`. Then reload the page and check if any requests are going to the path you set in the Pixel Manager.

#### Use the Pixel Manager Console Debugger
Open your website and append `?pmwloggeron` to the URL like so `https://yourdomain.com/?pmwloggeron`. This will enable the Pixel Manager Console Debugger.
Then open the developer tools in your browser and check the console. You should see two messages.
The first one shows from which path the Google tag is loaded like this: `Pixel Manager: Loading Google gtag.js from https://yourdomain.com/metrics`.
The second message shows if the script was loaded successfully like this: `Pixel Manager: Successfully loaded primary script: /metrics/`.
If you see both messages, the Google Tag Gateway for advertisers is working correctly.

#### Google Tag Assistant
You can also use the Google Tag Assistant to verify if the Google Tag Gateway for advertisers is working correctly.
Open the Google Tag Assistant https://tagassistant.google.com/ and click on the **Add domain** button. Enter your domain and click **Connect**. Your domain will automatically be loaded in a separate tab.
Find a PageView event in the list and click on it.

It will show that it was loaded through your measurement path. (e.g. `/metrics/`).

---
# Google Ads
URL: https://sweetcode.com/docs/pmw/plugin-configuration/google-ads
# Google Ads
## Create a new conversion in Google Ads
> How to set up a purchase conversion in Google Ads
:::info
Skip this step, if you've already created a purchase conversion in Google Ads
:::
:::info
We highly recommend setting up the native Google Ads conversion action instead of importing GA4 conversions. Here's why: [Use Google Ads conversion tracking instead of importing GA4 events](https://sweetcode.com/docs/pmw/faq#which-is-better-to-use-google-ads-native-conversion-actions-or-imported-ga4-conversions)
:::
[Wistia video vcuj59kbm6]
1. Open Conversions in Google Ads

2. Initiate a new conversion creation

3. Choose conversion type `Conversion on a website`.
Add the URL of your website.
(Remove all other checkboxes)

4. Scan your domain

5. Choose the `Google tag` only

6. Save and continue

7. Choose `Purchase` as the conversion category

8. Configure the Google Ads conversion settings
Use the following default settings. Only change if you know what you're doing.
- Create new conversion action: **Set up manually using code**
- Action optimization: **Primary action used for bidding optimization**
- Conversion name: **Purchase**
- Value: **Use different values for each conversion**
- Set up using: **Event snippet** (not Google tag)
- Default value: **zero**
- Count: **Every**

## Configure the plugin
How to find and set the conversion ID and conversion label
[Wistia video and34arrgg]
1. Get the conversion ID and conversion label
Open the purchase conversion in Google Ads.

Copy the purchase conversion ID and label from the Google Tag Manager tab.

2. Set the conversion ID and label in the plugin

## Using the Google for WooCommerce plugin at the same time
The Pixel Manager works together with the **Google for WooCommerce** plugin (formerly named **Google Listings & Ads**). As soon as Google Ads tracking is active in the Pixel Manager, it automatically switches off Google for WooCommerce's own tracking, so no duplicate conversions or remarketing events are sent.
Google for WooCommerce keeps doing everything else: the Merchant Center connection, the product feed sync, and campaign management. This also applies if you connect Google for WooCommerce to Merchant Center only and not to Google Ads.
If Google for WooCommerce generates your product feed, set the product identifier in the Pixel Manager to **Post ID with `gla_` prefix** so the tracked IDs match the feed. See [Product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier) and [Plugin Compatibility](https://sweetcode.com/docs/pmw/plugin-compatibility#google-for-woocommerce).
## Conversion Cart Data
> This feature adds another level of detail to the purchase conversion. Along with the conversion value, it sends the individual items that were sold. In return, Google Ads reports revenue, cart size and item level performance for your Shopping campaigns.
Your **Google Merchant Center ID** is the numeric ID of your Google Merchant Center account. In the Pixel Manager it has exactly one job: saving it under **Tracking Pixels → Google (Ads & GA4) → Merchant Center ID** switches on **Conversion Cart Data** for Google Ads. There is no separate on/off toggle, and the feature is available in the free version.
**Benefits**
- Detailed reporting on items sold
- A clear measure of revenue (and gross profit, if you supply cost of goods sold) generated by Shopping Ads
- Detailed reporting on cart size and average order value
Google support article on [conversions with cart data](https://support.google.com/google-ads/answer/9028254).
### What the Google Merchant Center ID is
Google also calls it the Merchant Center account ID. It is the numeric identifier of the Merchant Center account that holds your product feed. It has 6 to 12 digits and looks like `123456789`.
Google Ads uses it to work out which product catalog the item IDs in your purchase conversion belong to, so it can match the items you sold against the products in your feed.
It is an account identifier, not a credential. It is not an API key, a token or a secret.
#### Don't confuse it with the other Google IDs
The Google setup asks you for several identifiers that look interchangeable but are not:
| ID | What it is | Where it goes in the Pixel Manager |
|---|---|---|
| **Merchant Center ID** (`123456789`) | Your Merchant Center **account** ID | **Google (Ads & GA4) → Merchant Center ID** |
| **Google Ads Conversion ID** (`AW-123456789`) | Identifies your Google Ads account for conversion tracking | **Google (Ads & GA4) → Conversion ID** |
| **Conversion Label** (`AbC-D_efG…`) | Identifies one specific conversion action | **Google (Ads & GA4) → Conversion Label** |
| **GA4 Measurement ID** (`G-XXXXXXX`) | Identifies a GA4 web data stream | **Google (Ads & GA4) → Measurement ID** |
| **GA4 Property ID** (`123456789`) | Identifies a GA4 property for the Data API | **Google (Ads & GA4) → Data API Property ID** |
| **Google Ads customer ID** (`123-456-7890`) | Your Google Ads account number | Not used by the Pixel Manager |
The Merchant Center ID and the GA4 Property ID are both plain numbers, so they are the easiest pair to mix up. The Merchant Center ID comes from [merchants.google.com](https://merchants.google.com/), the GA4 Property ID comes from Google Analytics.
### Find your Google Merchant Center ID
Sign in to the [Google Merchant Center](https://merchants.google.com/). The account ID is in your browser's address bar, in the `a` URL parameter, and it is there on every page of the account:
```
https://merchants.google.com/mc/overview?a=123456789
^^^^^^^^^
Merchant Center ID
```

Copy only the digits after `a=`. Don't copy the whole URL, and don't include the `a=` itself.
:::tip[Why the URL and not a settings screen?]
Google reorganizes the Merchant Center interface regularly, and the ID has moved between screens over the years. The `a` URL parameter has stayed put through every version, so it is the one place we can point you to that keeps working.
:::
:::info[If you manage more than one Merchant Center account]
The `a` parameter always shows the account you currently have open. If you work with several accounts, or with sub accounts under an advanced (multi client) account, switch to the account that holds the feed for **this** shop first, then read the ID from the URL. Entering the ID of a different account means Google Ads cannot match your items and the cart data reports stay empty.
:::
### Add the Merchant Center ID in the Pixel Manager
1. In WordPress, open the Pixel Manager.
2. Go to **Tracking Pixels → Google (Ads & GA4)**.
3. Open **Show advanced settings** in the Google Ads section.
4. Paste the number into the **Merchant Center ID** field.
5. Save.

The field accepts 6 to 12 digits and nothing else. If you paste a full URL, a value with spaces or an ID with dashes, the Pixel Manager rejects it, restores the previous value and shows the message *"You have entered an invalid merchant ID. It only contains 6 to 12 digits."*
### What needs to be in place
Conversion Cart Data only goes live when all of these are true:
- **A Google Ads purchase conversion is configured in the Pixel Manager.** Both the **Conversion ID** and the **Conversion Label** must be set. See [Configure the plugin](#configure-the-plugin). The Merchant Center ID on its own does nothing.
- **The Merchant Center ID is saved.**
- **Your Merchant Center account is linked to your Google Ads account.** This is done on Google's side. See [Link a Google Ads account to Merchant Center](https://support.google.com/google-ads/answer/12499498).
- **The product IDs the Pixel Manager sends match the `id` attribute in your Merchant Center feed.** This is the single most common reason cart data reports stay empty. Set the matching value under [Product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier). If Google for WooCommerce generates your feed, use **Post ID with `gla_` prefix**.
### What the Pixel Manager sends
Once the feature is active, the Google Ads purchase conversion carries these extra parameters on top of the usual transaction ID, value and currency:
| Parameter | Value |
|---|---|
| `aw_merchant_id` | The Merchant Center ID you saved |
| `aw_feed_country` | The visitor's country |
| `aw_feed_language` | The shop's language, derived from the WordPress locale |
| `discount` | The order's total discount |
| `items` | One entry per line item, with the product `id`, the price excluding tax, the quantity and the business vertical |
The `id` of each item comes from your [Product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier) setting, which is why that setting has to match your feed.
### What you get in Google Ads
The cart data metrics appear in Google Ads under the **Conversions** column group, in the statistics tables at campaign, ad group and product level. Google also provides two predefined reports, **Cart items sold** and **Cart items advertised**.
Note on profit: revenue, orders, cart size and average order value come from the cart data alone. **Gross profit and gross profit margin additionally require the `cost_of_goods_sold` attribute in your Merchant Center feed.** Without COGS in the feed, Google Ads has no cost side to subtract and the profit columns stay empty. See [Metrics available with conversions with cart data](https://support.google.com/google-ads/answer/16564103).
**What entering the Merchant Center ID does not do.** It does not replace the Conversion ID and Conversion Label setup, it does not create or upload a product feed, it does not get your products approved in Merchant Center, and it does not switch on dynamic remarketing. Dynamic remarketing is a separate feature, configured through the [Business Vertical](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#google-business-vertical) and the product identifier.
### Verify the setup
1. **Check the plugin.** Open the Pixel Manager **Dashboard** and look at the **Automatically activated features** card. **Conversion cart data** shows as `active` once the conversion ID, the conversion label and the Merchant Center ID are all set. If it still shows `inactive`, the card tells you what is missing.
2. **Check the actual event.** Place a [test order](https://sweetcode.com/docs/pmw/testing#test-order) with the [Console Logger](https://sweetcode.com/docs/pmw/developers/console-logger) enabled and look at the `Google Ads: conversion event sent` entry in the browser console. The payload must contain `aw_merchant_id` and an `items` array. Compare an item `id` against the same product in your Merchant Center feed. They have to be identical, character for character.
3. **Check Google Ads.** Cart data metrics need conversions to be processed first. Give it a day or two before concluding that something is wrong, and make sure the report's date range covers the day of the ad click.
### Troubleshooting
**I can't find my Merchant Center ID.** Sign in at [merchants.google.com](https://merchants.google.com/) and read the number after `a=` in the address bar. If the URL has no `a` parameter, you are most likely on the account chooser rather than inside an account. Open an account first.
**The field won't accept my ID.** The field takes 6 to 12 digits only. Remove spaces, dashes, quotes and any surrounding URL, then paste just the number.
**I entered the ID but see no cart data in Google Ads.** Work through [What needs to be in place](#what-needs-to-be-in-place) in order. In practice the cause is almost always one of two things: the Merchant Center and Google Ads accounts are not linked, or the product IDs the Pixel Manager sends don't match the `id` attribute in the feed. Step 2 of [Verify the setup](#verify-the-setup) tells the two apart, because it shows you the exact IDs being sent.
**I see revenue but the profit columns are empty.** Gross profit needs the `cost_of_goods_sold` attribute in your Merchant Center feed. Add it there, and the profit metrics start filling in.
**I also use Google for WooCommerce.** That is fine, the two plugins work side by side. Google for WooCommerce keeps the Merchant Center connection and the feed sync, the Pixel Manager does the Google Ads tracking. Set the product identifier to **Post ID with `gla_` prefix** so the IDs match the feed it generates. See [Using the Google for WooCommerce plugin at the same time](#using-the-google-for-woocommerce-plugin-at-the-same-time).
## Phone Conversion Number
> Google Ads allows tracking calls to a phone number on a website. It does this by automatically swapping the actual phone number with a Google number which will redirect the call to the actual phone number.
You can test the phone swapping by appending the following URL parameter on one of the pages where your phone number appears: `#google-wcc-debug`
The URL would then look like this: `https://example.com/#google-wcc-debug`
:::info
You'll find more info about phone call conversion tracking on the Google support pages [here](https://support.google.com/google-ads/answer/6095883).
:::
:::tip[Multiple store locations]
The setting above tracks a single number. To track a different phone number and conversion label per store location, see the recipe [Track phone conversions for multiple store locations](../developers/recipes/track-phone-conversions-for-multiple-store-locations.md).
:::
## Conversion Adjustments
:::info
This is a feature only available for users of the Pro version. Get the Pro version [here](https://sweetcode.com/plugins/pmw?utm_source=wpm-docs&utm_medium=cta&utm_campaign=google-ads-enhanced-conversions#pricing-section).
:::
:::warning[Expected warnings (known Google issue)]
When Google Ads processes your conversion adjustment upload, it will show errors for orders that didn't originally come from a Google Ads click. For example, orders from organic search, direct visits, email campaigns, or other ad platforms. Since the Pixel Manager includes **all** refunded and cancelled orders in the feed (not just Google Ads orders), Google reports errors for the ones it can't match to a Google Ads conversion.
This is exactly what [Google recommends](https://support.google.com/google-ads/answer/7686447) and **can be safely ignored**. The adjustments for actual Google Ads conversions will be applied correctly.
The error messages you'll see are:
- *"This conversion does not exist. Double-check all the parameters."*
- *"The conversion action specified in the adjustment request cannot be found. Make sure it's available in this account."*
**Google may also send email notifications and show campaign-level warnings** about these errors. Despite how alarming they look, they are triggered by the same expected errors described above. This is an inconsistency on Google's side. Their warning system flags behavior that their own documentation tells you to expect. You can safely ignore these notifications as long as your upload report shows a mix of successful and failed rows.
If **all** rows fail (not just some), then something is misconfigured. Double-check that the conversion name in the Pixel Manager matches the Google Ads conversion name **exactly** (including capitalization and spacing), and that the upload schedule runs from the same Google Ads account that owns the conversion action.
For a detailed explanation, read our blog post: [Why Google Ads Shows Errors for Conversion Adjustment Uploads](https://sweetcode.com/blog/google-ads-conversion-adjustment-warnings).
:::
### General Info
Google Ads Conversion Adjustments allow you to restate or retract conversions after they've been sent to Google Ads. This is particularly useful when orders get canceled, partially and fully refunded after the initial purchase.
The Pixel Manager generates a CSV file with all necessary data that can be consumed by Google Ads every night.
To learn more about Conversion Adjustments, read the following Google Ads Help article: https://support.google.com/google-ads/answer/7686447
### Set up conversion adjustments
1. Copy the conversion name of the purchase conversion in Google Ads.
1. Open Google Ads
2. Open > Goals > Conversions > Summary > Goals
3. Open the purchase conversion

4. Copy the conversion name

2. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)** and paste the conversion name into the **Conversion Adjustments: Conversion Name** field (under **Show advanced settings**). The name has to match **exactly**.

3. Copy the conversion adjustments feed name from the Pixel Manager.

4. Set up a nightly upload of the conversion adjustments in Google Ads.
1. Open Google Ads
2. Open > Goals > Conversions > Uploads > Schedules
3. Create a new schedule

Settings:
- Protocol: HTTPS
- Source URL: The feed URL you copied from the Pixel Manager
- Frequency: Every 24 hours
- Time: 3:00 AM

4. Click ***Save & Preview***
5. Done
From now onward, Google Ads will download new conversion adjustments every night.
### Additional Info
The Pixel Manager generates a list of adjustments that are between 2 and 4 days old. This is Google's [recommended way how to upload conversion adjustments](https://support.google.com/google-ads/answer/7686280?hl=en&ref_topic=3119146#:~:text=Note%3A%20If%20you,with%20a%20conversion.). The reason why it should not generate a list of adjustments right after they happen is the following: Google Ads can take up to 24 hours to process the initial purchase conversions. So if we upload conversion adjustments before Google Ads processes the initial conversions, Google Ads would throw an error.
The following is a report of what a regular conversion adjustments upload looks like:

## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
## Custom Variables
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
:::info
Available from version 1.43.5 of the Pixel Manager
:::
Google Ads allows you to track [Custom Variables](https://support.google.com/google-ads/answer/9964350).
With the following filter you can add Custom Variables to the purchase conversion event:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_ads_order_custom_variables', function ($custom_variables, $order) {
$custom_variables['example_variable'] = 'example_string';
$custom_variables['color'] = 'example_blue';
$custom_variables['product_name'] = 'example_name';
return $custom_variables;
}, 10, 2);
```
---
# Google Analytics
URL: https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics
# Google Analytics
## Connect an existing Google Analytics 4 property
[Wistia video rcc3qzb25l]
Open the admin interface of your Google Analytics account and select your Google Analytics 4 property
**Step 1**

**Step 2**

**Step 3**

## GA4 API secret
:::note
Setting the GA4 API secret will enable the measurement protocol for GA4.
:::
:::info
While the purchase count and total amount are tracked much more accurately using the GA4 Measurement Protocol it still has several limitations. At this point GA4 is not at par with the former Google Universal Analytics, especially when using the Measurement Protocol.
Enabling the GA4 Measurement Protocol is optional and it comes with tradeoffs. It will give you more accurate order purchase counts and total amounts. But on the other side, several other metrics and dimensions will be missing or inaccurate. Here are some of the tradeoffs:
- The realtime order events will not be available.
- Orders will only show up after 24 hours.
- The geographic information on orders will be missing.
For a more complete list and more details about the tradeoffs read the [GA4 Measurement Protocol limitations](https://sweetcode.com/docs/pmw/faq#ga4-measurement-protocol-limitations) FAQ.
:::
1. Open the admin interface for the GA4 property

2. Open the website data stream

3. Open the API secret setup menu

4. Start creating a new API secret

5. Give the new API secret a name. Use the plugin name. It will help you to associate which API key is being used by which app.

6. Copy the new API secret

7. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)**, paste the new API secret into the **API Secret** field, and save.

## GA4 Data API
The Pixel Manager is able to connect to the GA4 Data API and retrieve reporting data through it.
The first report available is the order source attribution report. It shows the order source attribution using the connected GA4 accounts attribution method, which is data-driven by default.
:::info
GA4 can take up to 24 hours to process the attribution before it is available on a specific order.
:::


### GA4 Property ID
[Wistia video 5np5zu7j07]
1. Open the GA4 admin settings and then the property settings.

2. Copy the property ID from the top right.

3. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)** and paste the property ID into the **Data API Property ID** field.

### GA4 Data API Credentials
Enabling access to the GA4 property from which you want to retrieve data is a two-part process.
In the first part, we need to create access credentials, download them to the computer and upload them into the Pixel Manager. This part is quite lengthy, but it is a one-time setup. We will also provide a link to a video that shows the process in detail.
In the second part, we need to add the `client_email` from the access credentials to the GA4 property, which will authorize the retrieval of data from that GA4 property.
:::info
Theoretically, you can use the same credentials for multiple websites. But, for long-term setup, we recommend creating separate credentials for each website. If you ever decide in the future to delete one of the credentials, because of a change of ownership or any other reason, only that particular website credentials will have to be recreated.
:::
:::info
When creating the access credentials, they will be enabled on your personal Google account. That's why it is recommended that the credentials are created by the owner of the website. If you are working for an agency or if you are a freelancer, ask the owner of the website to create the credentials and upload them into the Pixel Manager.
:::
[Wistia video sm0n75srdu]
1. **Open the Google Cloud Console**: [Google Cloud Console](https://console.cloud.google.com/)
2. Create a new project by clicking the **'Select a project'** dropdown.

3. Click the **'NEW PROJECT'** button.

4. Give the project a name such as `GA4 data API for website`.
If necessary, adjust the organization settings.
Then click `Create`.

5. Select the new project from the dropdown list.

6. Open the **API & Services** button.

7. Click the **Enable APIs and services** button.

8. Search for the **Google Analytics Data API**.

9. Click the `Google Analytics Data API` card.

10. Click the **Enable** button.

11. Open the **Credentials** menu.

12. Click the **Manage service accounts** button.

13. Click the **Create Service Account** button.

14. Give the service account a name such as `GA4 data API for website`.
Click the **Create** button.
Click the **Done** button.

15. Click on the name of the new service account to proceed.

16. Click the **Keys** menu.

17. Click the **Add Key** button and then the **Create new key** button.

18. Select the **JSON** key type and click the **Create** button.

19. The JSON key will be downloaded to your computer.

20. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)** and import the **Data API Credentials**.
Choose the JSON file that was downloaded from the Google Cloud Console.

21. Copy the **`client_email`** from the credentials settings.

22. Go to your **GA4 admin settings** and open the **Property Access Management**.

23. **Click the big plus sign** to add a new user.

24. **Paste** the `client_email` into the email addresses box. Make sure to only give it the **Viewer** role. And finally, click **Add** to add this new user to this GA4 property.

25. Done
## Page Load Time Tracking
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
:::info
GA4 doesn't offer an integrated way to measure page speed load times like Google Analytics Universal did. This feature is a workaround that allows you to measure page load times in seconds and send them to GA4 as a custom metric.
:::
We support the following four metrics in the event parameters of the `page_load_time` event:
- `connection_time`: The time it took to establish a connection to the server in milliseconds.
- `dns_time`: The time it took to resolve the domain name in milliseconds.
- `document_processing`: The time it took to process the document in milliseconds.
- `dom_complete`: The time it took to load the DOM in milliseconds.
- `dom_content_loaded`: The time it took to load the DOM content in milliseconds.
- `dom_interactive`: The time it took to load the DOM interactive in milliseconds.
- `load_complete`: The time it took to load the complete page in milliseconds.
- `page_load_time`: The time it took to load the page in milliseconds.
- `page_load_time_seconds`: The time it took to load the page in seconds.
- `redirect_count`: The number of redirects that occurred during the page load.
- `redirect_time`: The time it took to complete the redirects in milliseconds.
- `response_time`: The time it took to receive the response from the server in milliseconds.
- `total_page_load`: The total time it took to load the page in milliseconds.
- `ttfb`: The time to first byte in milliseconds.
Here's how to set it up using the example of the `page_load_time_seconds` event parameter, which is the total time it took to load the page in seconds.
Bear in mind that other timing metrics may be reported in milliseconds, so you may need to adjust the custom metric accordingly.
1. Enable the GA4 Page Load Time Tracker in the Pixel Manager.
2. Go to _GA4 > Admin > Custom Definitions > Custom Metrics_ and click **Create custom metrics**.

3. Set the following fields:
- Metric Name: `Page Load Time`
- Event parameter: `page_load_time_seconds` (or any other metric you want to track, such as `load_complete`, `dom_interactive`, etc.)
(This will not be available in the drop down list. Simply write, or copy and paste it into the field.)
- Unit of measurement: `Seconds` (Adjust this if you are using a different metric, such as `page_load_time` which is in milliseconds.)

## Enhanced Link Attribution
Enhanced Link Attribution helps Google Analytics tell apart **multiple links on the same page that point to the same URL**. Without it, GA4's in-page analytics (and the legacy Page Analytics overlay) can't distinguish, for example, a navigation link and a footer link that both lead to `/cart` — they're reported as one. With it enabled, each link is attributed individually, giving you more accurate in-page and link-level reports.
Enabling it in the Pixel Manager is all that's required — the plugin sets the corresponding flag on the Google tag for you. It has no downside for standard setups, so it's safe to leave on.
:::info
This setting only affects GA4's link-level / in-page reporting. It does not change which events are sent or the conversion data delivered to your ad platforms.
:::
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
## Account Created Event Tracking
:::info
This is a pro feature available since version 1.56.1. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section).
:::
The Pixel Manager can track when a new WooCommerce account is created and send an `account_created` event to GA4. This works for all account creation methods:
- **Registration page** (My Account form)
- **Checkout** (when "Create an account" is checked)
- **Block Checkout** (WooCommerce Blocks)
- **Delayed account creation** (order confirmation page)
The event is automatically deduplicated — it only fires once per account creation, even if the user reloads the page.
Since `account_created` is a custom event (not a GA4 recommended event), you need to set it up as a custom event in GA4. It will appear in your GA4 **Events** report automatically after the first event fires, which usually takes up to 24 hours. From there you can mark it as a key event or use it in audience definitions.
---
# GroundTruth
URL: https://sweetcode.com/docs/pmw/plugin-configuration/groundtruth
# GroundTruth
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
[GroundTruth](https://www.groundtruth.com/) is a location-based advertising platform. Its Web Engagement Pixel measures what visitors do on your site after interacting with your GroundTruth ads, with omnichannel attribution across mobile, desktop, CTV, and audio campaigns. Once a GTID is configured, the Pixel Manager loads the GroundTruth pixel and sends e-commerce signals so GroundTruth can attribute cart activity and purchases to your campaigns.
:::note
The GroundTruth Pixel is currently in beta at GroundTruth. While in beta, reporting is available from GroundTruth upon request.
:::
## Setup
1. Request your unique identifier (GTID) from your GroundTruth representative, or by contacting [selfservehelp@groundtruth.com](mailto:selfservehelp@groundtruth.com).
You only need one GTID per Ads Manager account. All websites and campaigns of the account, whether CTV, Audio, or Display, use the same identifier.
2. In the Pixel Manager, open **Tracking Pixels → GroundTruth**, paste the identifier into the **GTID** field, and save.
That's it. There is no need to manually add the GroundTruth base code or custom event snippets to your site. The Pixel Manager loads the pixel and sends the events automatically.
## Supported Events
The GroundTruth pixel automatically tracks engagement signals like page views, scrolls, clicks, and time on site once it is loaded. On top of that, the Pixel Manager sends these e-commerce events:
- **Pageview**: explicitly tracked on every page load, as recommended by GroundTruth.
- **Cart**: sent when a product is added to the cart, with the value of the added products.
- **Purchase**: sent on the order received page, with the order total.
GroundTruth uses a last-touch attribution model: the credit for a site visit or conversion goes to the most recent ad the user saw or clicked before visiting your site.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Hotjar
URL: https://sweetcode.com/docs/pmw/plugin-configuration/hotjar
# Hotjar
### Hotjar site ID
[Wistia video z9tjk5eia7]
> Setting up the Hotjar pixel is very simple. After you open your Hotjar account for your site, you only need to click on the `Tracking`button in the top right and copy the `ID`. This is the `Hotjar site ID` which you'll set in the Pixel Manager under **Tracking Pixels → Hotjar** in the **Site ID** field.
1. Open you Hotjar account
2. Click on the `Tracking` button on the top right
3. Copy the `ID` and paste it into the **Site ID** field in the Pixel Manager under **Tracking Pixels → Hotjar**

## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Hyros
URL: https://sweetcode.com/docs/pmw/plugin-configuration/hyros
# Hyros
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
[Hyros](https://hyros.com/) is an ad attribution and tracking platform. Its Universal Script follows visitors across your funnel and ties every step back to the ad, email, or organic source that brought them in. The Pixel Manager loads the Universal Script for you, consent-aware and on every page, and tags the shopping funnel milestones on the visitor journey.
:::note
The Hyros integration is currently in beta.
Available from version `1.64.0` of the Pixel Manager.
:::
## Setup
### Product hash
Hyros identifies your account through the product hash, the `ph` value of your Universal Script.
1. Log in to [Hyros](https://app.hyros.com/) and open **Tracking → Universal Script**.
2. Copy the Universal Script.
3. In the Pixel Manager, open **Tracking Pixels → Hyros** and paste it into the **Product Hash** field, then save.
You do not have to hunt for the hash inside the snippet. Paste the whole script tag, or just the script URL, and the Pixel Manager extracts the `ph` value for you. If you already know the bare hash, you can enter that instead.
That is the whole setup for the tracking script. Do not also paste the Universal Script into your theme header or a header-scripts plugin: the Pixel Manager already loads it, and a second copy would make Hyros count every visit twice.
### Connect WooCommerce to Hyros for sales data
The Universal Script tracks the visitor journey. It does not report your revenue. Hyros reads your orders directly from WooCommerce, so you also need its native WooCommerce connection:
1. In WordPress, go to **WooCommerce → Settings → Advanced → REST API** and create a key with read permission.
2. In Hyros, open **Settings → Integrations**, find **WooCommerce**, click **Configure**, and enter the consumer key, consumer secret, store name, and domain.
Without this step Hyros sees the traffic but no sales, and the attribution reports stay empty. See the [Hyros WooCommerce guide](https://hyros-docs.vercel.app/docs/install/v1/woocommerce.txt) for the details, including sales mapping and cash on delivery.
## Application tag
Hyros attributes a tag to every visitor the moment they land on a tracked page. By default that tag is `!clicked`, and it is configured in Hyros under **Tracking → Universal Script** in the **Application Tag** field.
If you changed it there, mirror the same value in the Pixel Manager under **Tracking Pixels → Hyros → Advanced → Application Tag**. Leave the field empty to use the Hyros default.
This is worth changing when the same Hyros account tracks several funnels and you want the shop traffic separated from the rest. Only letters, digits, underscores, dashes, and the leading exclamation mark are allowed.
## Supported Events
The Universal Script records page visits and the landing tag on its own. On top of that, the Pixel Manager adds these action tags to the visitor journey, so you can see the shopping funnel as a chain of checkpoints in the Hyros journey view:
| Milestone | Hyros action tag |
|----------------------|-------------------|
| Product added to cart | `!add_to_cart` |
| Checkout started | `!begin_checkout`|
| Purchase completed | `!purchase` |
These tags mark journey milestones. They carry no order values and no line items, and they do not create the sale in Hyros. The sale itself comes from the [WooCommerce connection](#connect-woocommerce-to-hyros-for-sales-data) described above.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
## Consent Management
Hyros belongs to the Pixel Manager's **Attribution** category. Attribution pixels follow the **statistics** consent category: with [Explicit Consent Mode](https://sweetcode.com/docs/pmw/consent-management/overview) enabled, the Universal Script only loads, and the funnel tags are only sent, after the visitor grants statistics consent.
## Testing
1. Open your shop with the browser console on and the [Pixel Manager logger enabled](https://sweetcode.com/docs/pmw/testing) (append `?pmwloggeron` to the URL). You should see `Hyros: pixel loaded`.
2. In the network tab, look for a request to `t.hyros.com/v1/lst/universal-script`. It carries your product hash as `ph`, your application tag as `tag`, and the current page URL as `ref_url`.
3. Add a product to the cart and complete a test order. The console logs `Hyros: !add_to_cart tag sent` and `Hyros: !purchase tag sent`.
4. In Hyros, open the journey of that visitor. The action tags appear ordered by attribution time, with the most recent event on top.
If the script does not load, check that Hyros is enabled in the Pixel Manager, that the product hash is correct, and that your consent banner grants statistics consent.
---
# LinkedIn
URL: https://sweetcode.com/docs/pmw/plugin-configuration/linkedin
# LinkedIn
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
:::info
Available from version `1.39.0`
:::
## Basic Setup
[Wistia video vvyiav46ft]
1. Open the LinkedIn Campaign Manager: https://www.linkedin.com/campaignmanager/
2. In the left sidebar, click on **Data** > **Signals Manager** > **Insight Tag**.
Then click on **I will use a tag manager**. Then copy the `partner ID`.
3. In the Pixel Manager, open **Tracking Pixels → LinkedIn** and paste the `partner ID` into the **Partner ID** field.
4. Click on **Save**.
## Event Setup
[Wistia video zrrp8aq4g0]
We'll show how to set up the **Purchase** event. The same steps apply to all other events.
1. Open the LinkedIn Campaign Manager: https://www.linkedin.com/campaignmanager/
2. In the left sidebar, click on **Data** > **Website actions**. Then click on **Create Conversion**.
3. Fill out the form:
- **Name**: `Purchase`
- **Category**: `Purchase`
- **Value**: `Use a dynamic value`
- **Default value**: `0`
- **Timeframe**
- **Clicks**: `90 days`
- **Views**: `1 day`
- **Attribution model**: `Last Touch - Each campaign`
Then click on **Next step**.
4. Click **Manual conversions setup**.
5. Click on **Event-specific**. Copy the `conversion_id`. Click **Create**.
6. In the Pixel Manager, open **Tracking Pixels → LinkedIn** and paste the `conversion_id` into the *Purchase event ID* field.
7. Click on **Save**.
8. Repeat the same steps for all other events.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Meta (Facebook)
URL: https://sweetcode.com/docs/pmw/plugin-configuration/meta
# Meta (Facebook)
## Find the pixel ID
Follow this guide by Meta (Facebook) [Create and install a Meta (Facebook) pixel](https://www.facebook.com/business/help/952192354843755?id=1205376682832142)
## Multiple Meta (Facebook) pixels
> Available in version 1.64.0 and above
The **Pixel ID** field in the settings holds one pixel, and for the vast majority of shops that is all that is needed. If you run campaigns from several Meta (Facebook) ad accounts, the recommended solution is still to [share one pixel with the other ad accounts](https://www.facebook.com/business/help/352686481592916?id=1205376682832142) instead of installing a second one, because a single data source keeps all conversions, audiences and learnings together.
When sharing is not possible, for example because an agency cannot be added to your Business Manager, a partner brand needs its own data source, or you are running an old and a new pixel in parallel during a migration, additional pixels can be added programmatically with the [`pmw_facebook_pixel_identifiers` filter](https://sweetcode.com/docs/pmw/developers/php-filters#additional-facebook-pixels).
Here is what the Pixel Manager does with those pixels:
- **Browser events:** every pixel is initialized separately, and every browser event, from page views to add to cart and the purchase, is sent to all of them. There is no event or page that only reaches the main pixel.
- **Conversion API (Pro):** an additional pixel that carries its own Conversion API access token also receives all server-side events, including purchases, the generic server-side events and the subscription lifecycle events, each with its own optional test event code. A pixel without a token receives browser events only.
- **Server-Side Proxy (Pro):** if the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview) is active, the additional pixels are part of the configuration that the Pixel Manager syncs to SweetCode Cloud, and the proxy sends each event to every pixel.
- **Deduplication:** browser and server-side events share one event ID per event, and Meta deduplicates per pixel. So each pixel records every event exactly once, no matter how many pixels you add.
- **Advanced matching and consent:** the [advanced matching](#meta-facebook-advanced-matching) identifiers and your consent settings apply to all pixels alike. Access tokens stay on the server and are never exposed in the browser.
- **Diagnostics:** the debug info and the [Meta Business Category Event Restrictions](#business-category-event-restrictions) and Meta Event Setup Tool checks cover every configured pixel, not only the one from the settings.
:::caution
Each additional pixel multiplies the requests to Meta. A second pixel doubles the browser requests, and if it carries a Conversion API token, it also doubles the server-side requests and the load they cause on your server. Only add the pixels you really need, and consider the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview) to move the server-side load off your shop server.
The mobile bridge for hybrid mobile apps (`mobileBridge`) is only set up for the pixel that is configured in the settings.
:::
## Implemented events
Meta (Facebook) event | e-commerce | WooCommerce | implemented
--- | --- | --- | ---
**Add payment info** | ✔️ | ✔️ | ✔️
**Add to cart** | ✔️ | ✔️ | ✔️
**Add to wishlist** | ✔️ | ✔️ | ✔️
**Complete registration** | | |
**Contact** | | |
**Customise product** | | |
**Donate** | | |
**Find location** | | |
**Initiate checkout** | ✔️ | ✔️ | ✔️
**Lead** | | |
**Purchase** | ✔️ | ✔️ | ✔️
**Schedule** | | |
**Search** | ✔️ | ✔️ | ✔️
**Start trial** | | |
**Submit application** | | |
**Subscribe** | ✔️ | ✔️ | ✔️ (pro)
**View content** | ✔️ | ✔️ | ✔️
## Business category event restrictions
:::warning
Meta blocks conversion events for pixels that belong to a business category it treats as sensitive. Health and wellness is the most common one: medical devices, medical alert systems, supplements, pharmacies, clinics, therapy services and similar shops are affected.
For a restricted pixel, Meta's own `fbevents.js` library silently discards events such as `AddToCart`, `InitiateCheckout`, `AddPaymentInfo` and `Purchase`, while `PageView` and `ViewContent` keep working. There is no error message, and the Conversions API does not bypass the restriction. This looks like a plugin problem but cannot be fixed on the website side. It has to be resolved in Meta Events Manager.
The Pixel Manager (1.64.0 and higher) detects this and names the blocked events in the browser console and in the debug report under **Meta Business Category Event Restrictions**.
Full diagnosis and solution: [Meta silently drops AddToCart, InitiateCheckout and Purchase (restricted business category)](https://sweetcode.com/docs/pmw/troubleshooting#meta-silently-drops-addtocart-initiatecheckout-and-purchase-restricted-business-category).
:::
## Meta (Facebook) Conversion API (CAPI)
> Available in version 1.10 and above
> This is a feature only available for users of the Pro version. Get the Pro version [here](https://sweetcode.com/plugins/pmw?utm_source=wpm-docs&utm_medium=cta&utm_campaign=facebook-capi#pricing-section).
:::info
The Meta (Facebook) Conversion API (CAPI) is Meta's (Facebook's) server side event reporting mechanism. It complements the browser pixel and helps to measure events that under certain circumstances can get lost by the browser pixel. Since accurate event reporting is helpful for campaign optimization, Meta (Facebook) CAPI is an important tool for performance marketers. You'll find more info about CAPI in the official documentation [here](https://developers.facebook.com/videos/2020/conversion-api-capi-external-implementation/) and [here](https://developers.facebook.com/docs/marketing-api/conversions-api/).
:::
:::info
Using the Meta (Facebook) Conversion API (CAPI) will increase the load on your server. Regular Meta (Facebook) pixel implementations don't require interaction with the shop server on every Meta (Facebook) event. The browser sends all of those directly to Meta (Facebook). But, the Meta (Facebook) Conversion API is different. In addition to every browser API call each event (`AddToCart`, `ViewItem`, `Purchase`, etc.) has also to be sent by the shop server to the Meta (Facebook) servers. This leads to a significantly higher load on the server. If you're required to use the Meta (Facebook) Conversion API and your server comes to its limits (increased rate of server errors) then you will have to upgrade your server capacity.
:::
:::tip[Server-Side Proxy]
You can offload Meta CAPI events from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
### Setting up Meta (Facebook) CAPI
1. Get a Meta (Facebook) CAPI access token: [instruction](https://developers.facebook.com/docs/marketing-api/conversions-api/get-started#access-token)
2. In the Pixel Manager, open **Tracking Pixels → Meta** and paste the access token into the **Conversions API Token** field.
Once the access token has been saved into the configuration, Meta (Facebook) CAPI is active.
### User Transparency Settings
> By default, the Pixel Manager sends the minimum required amount of data to Meta (Facebook) with each CAPI hit. (Read more about the `fbp` cookie [here](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/fbp-and-fbc/)). You can change those settings in accordance with your shop policy and the laws under which your shop has to operate.
### Why the first server-side event can be sent with a short delay
If you watch the network traffic very closely, you may notice that the very first server-side (CAPI) event of a brand-new visit can be sent with a small delay, up to one second, while every other event is sent right away. This is intentional, and it is worth understanding why.
When the Meta pixel loads in the browser, Meta's own script (`fbevents.js`) creates a small first-party browser cookie called `_fbp`. This cookie is one of the strongest matching signals Meta has: it lets Meta connect a server-side event back to the same browser that Meta already recognizes, which directly improves your Event Match Quality and attribution. The Pixel Manager reads this cookie and attaches it to the server-side events it sends to Meta.
On almost every page view, the `_fbp` cookie already exists, so there is no delay at all. The cookie is only missing in two situations:
- The very first page view of a brand-new visitor, in the brief moment before Meta's script has finished setting the cookie.
- Sessions where the browser does not keep the cookie, for example a fresh Chrome Incognito window, or a browser with strict privacy settings or certain ad blockers.
In those cases, the Pixel Manager waits up to one second for the cookie to appear before sending the **server-side** event, so it can include the `_fbp` identifier and give Meta the best possible match. This wait only ever affects the invisible server-side (CAPI) send. It never holds back the browser pixel or any other tracking. Your browser-side events, page view, add to cart, purchase, and so on, always fire immediately.
A few points worth knowing if you track this meticulously:
- The wait is capped at one second. If the cookie still has not appeared by then (for example because the browser blocks it entirely), the server-side event is still sent, just without the `_fbp` identifier. No event is ever dropped because of this.
- The delay is a one-time thing per visit. Once the `_fbp` cookie exists, every following server-side event is sent instantly with the cookie included.
- For deduplication and attribution, missing `_fbp` on a single first event is harmless. Meta matches the browser event and the server event using a shared event ID, and the cookie is present on the rest of the visit.
In short: the only thing that can be affected is the timing of the first server-side event in a session where the Facebook cookie is not yet (or not at all) available, and even then the event is always sent. This is a deliberate trade-off in favor of the highest possible match quality for Meta CAPI.
### Testing
:::info
The test event code filter hast been deprecated and replaced by a settings field in the plugin settings from version `1.25.1`
:::
:::info
The `test_event_code` can suddenly change. So make sure to double-check if the right one is set for each testing session.
:::
In order to test the events using the [Test Events Tool](https://developers.facebook.com/docs/marketing-api/conversions-api/using-the-api/#testEvents) the Pixel Manager offers a settings field to save the latest test event code, in the Pixel Manager under **Tracking Pixels → Meta** in the **CAPI Test Event Code** field.

In case you suspect that something is wrong with the API call to the Meta (Facebook) server, or you simply want to see the response from the Meta (Facebook) server, the following filter is for you. It will output the API request response into the WooCommerce log file for Meta (Facebook) CAPI. You can view the log file under WooCommerce > Status > Logs > wpm-facebook-capi. Or you can open the file on the server. It is saved under `/wp-content/uploads/wc-logs/`.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_send_http_api_facebook_capi_requests_blocking', '__return_true');
```
### Data Processing Options
> Data Processing Options are a way to control how the data is used in the Meta (Facebook) systems and better support shop owners with their California Consumer Privacy Act (CCPA) compliance efforts. You'll find more information in the official [documentation](https://developers.facebook.com/docs/marketing-apis/data-processing-options).
The following filter is a simple way to add the necessary fields to each CAPI hit. Below settings are just an example. You need to make sure that you are using settings which are inline with your shops' policy regarding CCPA.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_facebook_capi_data_processing_options', function () {
return [
'data_processing_options' => ['LDU'],
'data_processing_options_country' => 1,
'data_processing_options_state' => 1000,
];
}, 10, 2);
```
## Meta (Facebook) Advanced Matching
When this option is enabled, the Pixel Manager will additionally send several visitor identifiers to Meta (Facebook), such as IP address, shop ID and email. It is optional and will increase the likelihood that Meta (Facebook) will match the hit to an existing Meta (Facebook) user profile. For security reasons the Pixel Manager will hash the data where possible. More info about hashing and visitor identifiers [here](https://developers.facebook.com/docs/marketing-api/audiences/guides/custom-audiences/#example_sha256) and [here](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters).
### Send Facebook Login ID
> Available in version 1.64.1 and above
> This is a feature only available for users of the Pro version. Get the Pro version [here](https://sweetcode.com/plugins/pmw?utm_source=wpm-docs&utm_medium=cta&utm_campaign=facebook-login-id#pricing-section).
Right below Advanced Matching sits **Send Facebook Login ID**. When it is enabled, the Pixel Manager adds Meta's `fb_login_id` to the Conversions API events of customers who signed in to your shop with their Facebook account. Unlike the hashed email address, that identifier is deterministic: it was issued by Meta in the first place, so there is no matching guesswork involved.
The Pixel Manager does not add social login to your shop. It reads the identifier out of the social login plugin you already run, and seven of them are supported. The setting is off by default, follows the Advanced Matching setting, and only helps when the Facebook app of your login plugin lives in the same Meta Business Manager as your pixel.
Full details, the list of supported plugins and the honest picture of what it does for your Event Match Quality score: [The Facebook Login ID](https://sweetcode.com/docs/pmw/features/facebook-login-id).
## Microdata Tags for Catalogues
:::danger[Deprecation Notification]
This feature has been deprecated from version 1.25.1 and upwards.
The reason is that Facebook still doesn't fully support product variations with microdata tags. We have been in communication with Facebook support about this. But the parsing for product variations through microdata tags still has not been implemented by Facebook. Therefore we decided to remove that feature for now. It will stay active and will keep working on shops that have activated microdata tags in the Pixel Manager.
We will bring back microdata tags as soon as Facebook implements a proper way to handle product variations.
In the meantime, please use one of the various feed plugins to upload the Facebook product feed. Most, if not all of them fully support product variations.
:::
> A very convenient way to populate the product catalog within Meta (Facebook) is using microdata tags. It uses the Meta (Facebook) pixel and additional tags on product pages to upload the product data to Meta (Facebook). Each time a person visits a product page the product data is uploaded and updated. Additionally, to that Meta (Facebook) crawls the website and retrieves remaining data from the website. More information about this over [here](https://www.facebook.com/business/help/887775018036966?id=725943027795860).
In comparison to creating a dedicated feed, this method has several advantages:
- It is much simpler to set up. Therefore, less errors can happen.
- Creating the tags takes only a low amount of server resources.
- The tags are cache friendly. No additional cache settings need to be made.
On the other hand dedicated feed plugins have several disadvantages:
- Feed plugins sometimes fail running. E.g. if WP Cron has problems.
- They can run into timeout issues for shops with many products.
- They are harder to debug.
- If no proper cache exclusions are being set, the server will always deliver cached versions of the feed.
As always, using one or the other method has trade-offs. Using microdata tags relies on constant traffic to the product pages or the Meta (Facebook) crawler to crawl the products in order to keep an updated catalog. If this is not a big concern for the person running the ads, then microdata tags are the better solution.
### Setup
1. Within the plugin open the advanced settings for Meta (Facebook) and activate the Microdata Tags for Catalogues.
2. Head over to your Meta (Facebook) [commerce manager](https://www.facebook.com/commerce_manager) and select your catalogue.
3. Open the **Catalogue** tab and select **Data sources**.
4. (Select **Add items**.) If a drop-down appears, select **Add multiple items**.
5. Select **Pixel** and select **Next**.
6. Select the pixel you want to connect and then **Next**.
7. If you wish, select **Add filters** to limit the items that your pixel updates. Select **Next**. (Usually its best not to limit the items. Therefore, don't use the filter unless you have a good reason to.)
8. Select **Add trusted websites** and enter the website domains that you trust to use as sources for your item information. Don't include the http:// or www. For example, enter jaspersmarket.com. If you want your pixel to use multiple country-specific websites, enter each one. Select **Save** and then **Next**.
9. Select your default currency. This is the currency that your catalogue will use if prices for items on your website don't include a 3-letter [ISO 4217 currency code](https://en.wikipedia.org/wiki/ISO_4217#Active_codes), such as USD or EUR. Select **Next**.
Your connected pixel now appears in **Data sources**. It may take up to 24 hours to be ready. When the pixel is ready, it updates your catalogue each time someone interacts with a product page on your website, typically within 15 minutes of the interaction. If you remove any items from your website, they'll be deleted from your catalogue after seven days.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
## Domain Verification
Meta (Facebook) may require to verify your domain in order to use the Meta (Facebook) Conversion API. You can do this by adding a meta tag to the header of your website. The Pixel Manager will automatically add the required meta tag to the header of your website. In general it is recommended to verify your domain in order to use the Meta (Facebook) tracking features fully.
1. Go to your [business settings](https://business.facebook.com/settings/).
2. Select **Brand safety** and then **Domains**.
3. Select **Add** and enter your domain name.
4. Select **Add domain**.
5. Select **Meta-tag verification** and copy the meta tag.
6. In the Pixel Manager, open **Tracking Pixels → Meta** and paste the meta tag into the **Domain Verification ID** field.
7. Select **Verify**.
8. Flush the cache of your website. The meta tag needs to be available on the front end of your website in order for Meta (Facebook) to verify it.
9. Once the domain is verified, you can use the Meta (Facebook) Conversion API.
---
# Microsoft Advertising (Bing Ads)
URL: https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising
# Microsoft Advertising (Bing Ads)
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Setting up the UET tag
:::info
Microsoft Ads requires setting up a UET tag and a purchase conversion separately. You can skip this step, if you already have an active UET tag set up. We only need one active UET tag.
:::
1. Log into your Microsoft Advertising account.
2. In the menu click > Tools > Conversion tracking > UET tag.
3. Click > create UET tag.
4. Give it some meaningful name like `UET tag 1`.
5. Save it.
6. In the next window Microsoft asks how you want to set up tagging. Choose `Install the tag yourself`.
7. Then click `next` until the new tag shows up in the UET tag list.
8. Copy that `UET tag ID`. In the Pixel Manager, open **Tracking Pixels → Microsoft**, paste it into the **UET Tag ID** field, and save.

## Setting up the purchase conversion
> We will set up a new purchase conversion goal, using a purchase **event**. It is different in the way, that we don't use a destination URL (like in most setup guides), but by using a purchase event. It is much less error-prone and works equally well.
1. In the menu click > Tools > Conversion tracking > Conversion goals.
2. Click > Create conversion goal.

3. What kind of conversions do you want to track? > `Website`

4. What type of goal do you want to set? > `Purchase`

5. Goal Type > `Event`

6. Edit event goal
- Name: `purchase`
- Revenue: `Conversion action value may vary` `0` `USD` (or the currency of your shop)
Keep the default settings for the advanced settings.

7. Enhanced Conversions
- Choose `Turn on Enhanced Conversions` and check the box if you want to pass the email and phone number to Microsoft Ads.
In the Pixel Manager, open **Tracking Pixels → Microsoft** and turn on **Enhanced Conversions**, then save.
This is optional.

- Choose `I don't want to turn on Enhanced Conversions` if you don't want to pass the email and phone number to Microsoft Ads.

8. Set up tagging
1. Choose the tag that you've set up earlier.
2. Choose > `Yes, the UET tag was already installed on all website pages when you created another conversion goal or audience list.`
3. Click **Save and next**

9. Choose **Manual installation**

10. Custom event parameters
1. Set **equals to** and **purchase**
2. Set **track event on inline action**
3. Click **Save and next**

11. Done
## Enhanced Conversions
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
Enhanced Conversions for Microsoft Ads improves conversion attribution accuracy by sending hashed first-party customer data (such as email addresses) to Microsoft. This helps Microsoft match conversions more reliably, especially in cross-device and cookieless scenarios.
### Benefits
- **Better attribution**: Match conversions that would otherwise be lost due to cookie restrictions or cross-device journeys.
- **Privacy-safe**: Customer data is hashed using SHA-256 before being sent to Microsoft.
- **Improved bidding**: More accurate conversion data leads to better automated bidding performance.
### How to Enable
1. In Microsoft Ads, when creating or editing a conversion goal, select **Turn on Enhanced Conversions** (see step 7 in the setup guide above).
2. In the Pixel Manager, open **Tracking Pixels → Microsoft**.
3. Turn on **Enhanced Conversions**.
4. Save the settings.

Once enabled, the Pixel Manager will automatically send hashed customer data (email, phone number if available) with conversion events to improve attribution accuracy.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Mixpanel
URL: https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel
# Mixpanel
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
[Mixpanel](https://mixpanel.com/) is a product analytics platform. It is built around events and the people who trigger them, which makes it strong at funnels, retention and cohort analysis. Once a project token is configured, the Pixel Manager loads the Mixpanel JavaScript SDK and sends the whole shopping funnel to Mixpanel automatically.
Mixpanel does not prescribe an e-commerce schema, so the Pixel Manager follows Mixpanel's own naming convention: Title Case event names in the past tense, such as `Product Viewed` and `Order Completed`, and snake_case property names.
## Setup
1. Open Mixpanel: https://mixpanel.com/
2. Browse to **Settings** > **Project Settings**
3. Copy the **Project Token**. It is a 32 character hexadecimal string that looks similar to this: `a1b2c3d4e5f60718293a4b5c6d7e8f90`
4. In the Pixel Manager, open **Tracking Pixels → Mixpanel**, paste the token into the **Project Token** field, and save.
That's it. There is no need to add the Mixpanel snippet or any event code to your site. The Pixel Manager loads the SDK and sends the events automatically.
## Data residency
Mixpanel hosts projects in three regions: the United States (the default), the European Union and India. Each region has its own API host, and **Mixpanel does not ingest events that are sent to the wrong region**. It does not report an error either, so a mismatch looks exactly like a shop with no traffic.
Check which region your project lives in by looking at the Mixpanel URL:
| Mixpanel URL starts with | Region |
|--------------------------|----------------|
| `mixpanel.com` | United States |
| `eu.mixpanel.com` | European Union |
| `in.mixpanel.com` | India |
Select the matching region in the **Data Residency** setting in the Mixpanel advanced settings section of the Pixel Manager. It routes both the browser SDK and the server-side events to the right host.
## Ingestion API
The Ingestion API is an optional addition that reports purchases to Mixpanel server-side, through Mixpanel's [`/track` endpoint](https://docs.mixpanel.com/reference/track-event). It has two advantages over browser-side reporting:
- Purchases that ad blockers or browser restrictions keep from the browser still reach Mixpanel. Purchases are triggered directly by WooCommerce order events, so they are also tracked when the customer never returns to the order confirmation page.
- **Refunds are reported as well.** A refund happens in the WooCommerce backend, long after the customer has left, so the browser never sees it. Without the Ingestion API, Mixpanel keeps counting revenue that was given back.
No additional credential is needed: Mixpanel authenticates `/track` with the project token, which the Pixel Manager already has.
You can enable the Ingestion API in the Mixpanel advanced settings section of the Pixel Manager.
### Purchases are reported once, not twice
With the Ingestion API enabled, the purchase is reported **server-side only** and the browser stops sending it. This is deliberate. Mixpanel treats two events as duplicates only when the event name, the `distinct_id`, the timestamp and the `$insert_id` all match, and the server cannot guarantee the same timestamp as the browser, so reporting from both sides would count every order twice.
The server-side event is the better of the two anyway: it carries the final order totals, and it is the only one that can report refunds.
### One customer, not two
Mixpanel identity lives in the browser: the SDK assigns a `distinct_id` and stores it in a first-party cookie. A server-side purchase that does not know that ID would land on a separate anonymous Mixpanel user, and every funnel that ends in a purchase would break.
The Pixel Manager therefore reads the `distinct_id` out of Mixpanel's own cookie while the customer is checking out and stamps it onto the order, so the server-side purchase joins the same Mixpanel user as the visitor's funnel events. When no browser identity was captured, it falls back to the WordPress user ID (if [user identification](#user-identification) is enabled) and finally to a per-order ID, so the revenue reaches Mixpanel either way.
### Testing
Mixpanel has no test mode, so server-side events go into your project as real events.
1. Place a test order in your shop
2. Open **Events** in Mixpanel and look for the `Order Completed` event
3. Check the `order_id` property against the WooCommerce order
:::tip[Server-Side Proxy]
You can offload the Mixpanel Ingestion API calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
## Session replay and heatmaps
Mixpanel can record browsing sessions and collect heatmap data through the same SDK. With the setting enabled, the Pixel Manager initializes the SDK with session recording and heatmap collection turned on.
Session replay also has to be enabled in the Mixpanel project itself, under **Settings** > **Project Settings** > **Session Replay**. Mind that session replay records what your customers do on your shop, so check it against your privacy policy before enabling it.
You can enable session replay and heatmaps in the Mixpanel advanced settings section of the Pixel Manager.
## Autocapture
Mixpanel's autocapture records clicks, form submissions and input changes on its own, on top of the e-commerce events the Pixel Manager sends. It is useful for interactions that have no dedicated e-commerce event, and it needs no tracking code.
It is off by default, for two reasons: it produces a lot of events, and it captures interaction context from pages that may hold personal data, such as the checkout. Enable it deliberately.
You can enable autocapture in the Mixpanel advanced settings section of the Pixel Manager.
## User identification
With user identification enabled, the Pixel Manager identifies logged-in customers in Mixpanel by their WordPress user ID and writes these properties to their Mixpanel user profile:
- `$email`
- `$first_name` and `$last_name`
- `$phone`
- `$city`, `$region` and `$country_code`
This stitches a customer's sessions across devices and browsers into one Mixpanel user, which is what makes retention and cohort reports accurate.
Unlike the advanced matching of the ad platforms, these values are **not** hashed. Mixpanel is a first-party analytics tool that shows you your own customer records, and a hash would make the profile useless to you. That also means real personal data is sent to Mixpanel, so check it against your privacy policy and your Mixpanel data processing agreement before enabling it.
The profile is written once per browser session, not on every page view.
You can enable user identification in the Mixpanel advanced settings section of the Pixel Manager.
## Supported Events
The Pixel Manager sends these Mixpanel events:
- **Page Viewed**: sent on every page. The SDK's own page view tracking is disabled, so pages are never counted twice.
- **Product List Viewed**: sent on product listings, with all products of the listing in one event.
- **Product Clicked**: sent when a product in a listing is clicked.
- **Product Viewed**: sent on product detail pages, with the product details.
- **Product Added to Cart**: sent when a product is added to the cart, with the product details, price and quantity.
- **Cart Viewed**: sent on the cart page, with the cart value and items.
- **Checkout Started**: sent when the checkout is started, with the cart value and items.
- **Shipping Info Added** and **Payment Info Added**: sent when the customer completes those checkout steps.
- **Products Searched**: sent on search result pages, with the search term.
- **Order Completed**: sent when an order is placed, with the order ID, the revenue, the currency and all purchased items.
- **Order Refunded**: sent when an order is refunded. Requires the [Ingestion API](#ingestion-api), because a refund never reaches the browser.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
The event names can be changed with the [event filters](https://sweetcode.com/docs/pmw/developers/event-filters), if your Mixpanel project already uses a different taxonomy.
---
# Nextdoor
URL: https://sweetcode.com/docs/pmw/plugin-configuration/nextdoor
# Nextdoor
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
[Nextdoor](https://business.nextdoor.com/) is the neighborhood advertising platform. Its Universal Pixel tracks the standardized conversion events Nextdoor uses for attribution and campaign optimization. Once a pixel ID is configured, the Pixel Manager loads the Nextdoor Universal Pixel and sends all conversion events automatically.
## Setup
1. Open the Nextdoor Ads Manager: https://ads.nextdoor.com/
2. Browse to **Assets** > **Pixels** and create a pixel if you don't have one yet
3. Copy the **Pixel ID**. It is a UUID that looks similar to this: `550e8400-e29b-41d4-a716-446655440000`
4. In the Pixel Manager, open **Tracking Pixels → Nextdoor**, paste the ID into the **Pixel ID** field, and save.
That's it. There is no need to manually add the Nextdoor base code snippet or event snippets to your site. The Pixel Manager loads the Universal Pixel and sends the events automatically.
## Conversion API (CAPI)
The Conversion API is an optional addition to your Nextdoor pixel that sends conversion data to Nextdoor in real time through Nextdoor's server-to-server protocol. This provides more accurate conversion tracking, especially for events that might be missed by browser-based tracking due to ad blockers or privacy settings. Purchases are triggered directly by WooCommerce order events, so they are tracked even when the customer never returns to the order confirmation page.
The Pixel Manager sends every event with a shared event ID to both the browser pixel and the Conversion API, so Nextdoor automatically deduplicates the two channels. The Nextdoor click ID (`ndclid`) is captured on the landing page and attached to the server-side events for attribution.
Find more information on the Conversion API in the [Nextdoor documentation](https://developer.nextdoor.com/reference/conversion-api).
1. Open the Nextdoor Ads Manager: https://ads.nextdoor.com/
2. Open the **Ads API** settings: https://ads.nextdoor.com/v2/manage/api
3. Click **Generate token** to create a new access token
4. Copy the generated token
5. In the Pixel Manager, open **Tracking Pixels → Nextdoor**, paste the token into the **Conversion API Token** field, and save.
### Testing
To test the Conversion API events without polluting your real conversion data, the Pixel Manager offers a settings field where you can enter a test event code. While it is set, all Conversion API events are flagged as test events in Nextdoor.
1. In the Pixel Manager, open **Tracking Pixels → Nextdoor**, enter a test event code (e.g. `TEST1234`) into the **Conversion API Test Event Code** field, and save
2. Verify the events arrive in Nextdoor Ads Manager
3. Remove the test event code after testing
:::tip[Server-Side Proxy]
You can offload Nextdoor Conversion API calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
## Advanced Matching
With advanced matching enabled, the Pixel Manager sends the SHA-256 hashed email address of logged-in customers and purchasers to Nextdoor along with the events. Server-side purchase events additionally carry the hashed phone number, name, and location fields. This improves Nextdoor's ability to match visitors, which increases match rates and attribution accuracy.
All personal data is hashed before it leaves your server. Nextdoor receives only the hashes, never the plain values.
You can enable advanced matching in the Nextdoor advanced settings section of the Pixel Manager.
## Supported Events
The Pixel Manager sends these Nextdoor events:
- **PAGE_VIEW**: sent on every page, the basis for Nextdoor's conversion event configuration.
- **VIEW_CONTENT**: sent on product detail pages, with the product details.
- **ADD_TO_CART**: sent when a product is added to the cart, with the product details, price, and quantity.
- **INITIATE_CHECKOUT**: sent when the checkout is started, with the cart value and items.
- **SEARCH**: sent on search result pages.
- **PURCHASE**: sent when an order is placed, with the order ID, order value, and all purchased items.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
:::note
Nextdoor matches the product IDs in the tracking events against your product catalog in Nextdoor. Make sure the [product identifier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier) setting in the Pixel Manager matches the IDs in the catalog you submitted to Nextdoor.
:::
---
# OpenAI
URL: https://sweetcode.com/docs/pmw/plugin-configuration/openai
# OpenAI
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Setup instruction
1. Open the OpenAI Ads Manager and go to the **Conversions** tab.
2. Create a new pixel and copy its **Pixel ID**.
3. In the Pixel Manager, open **Tracking Pixels → OpenAI**, paste the pixel ID into the **Pixel ID** field, and click **Save**.
## Conversions API (CAPI)
:::info
Available from version `1.60.0` of the Pixel Manager.
:::
The Conversions API is an optional addition to your OpenAI pixel that sends conversion data to OpenAI in real time through OpenAI's server-to-server protocol. This provides more accurate conversion tracking, especially for events that might be missed by browser-based tracking due to ad blockers or privacy settings.
Find more information on the Conversions API in the [OpenAI documentation](https://developers.openai.com/ads/conversions-api).
1. Open the OpenAI Ads Manager and go to the **Conversions** tab.
2. Create an **API key** for your pixel and copy it.
3. In the Pixel Manager, open **Tracking Pixels → OpenAI** (under **Show advanced settings**), paste the key into the **OpenAI Conversions API token** field, and save the settings.
:::note
OpenAI does not use a test event code. Events are validated against your pixel and API key automatically, so there is no separate test field to configure.
:::
:::tip[Server-Side Proxy]
You can offload OpenAI Conversions API calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
### ChatGPT click reference (oppref)
:::info
Available from version `1.64.0` of the Pixel Manager.
:::
When a visitor arrives from ChatGPT, the landing page URL carries an `oppref` parameter, OpenAI's click reference that lets OpenAI trace the visitor from the ChatGPT interaction to the final purchase. The Pixel Manager captures the click reference automatically on the landing page, preserves it through checkout, and attaches it to all Conversions API events, including the purchase event. No configuration is needed.
## Advanced Matching
Advanced Matching is an optional addition to your OpenAI pixel that matches conversion data with the person responsible for the conversion. Advanced Matching sends hashed customer identifiers (such as the email address) to OpenAI to match site events. This also lets you track cross-device checkouts, which cannot be done otherwise. As a result, you can see conversions reported in OpenAI Ads Manager more accurately.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Optimizely
URL: https://sweetcode.com/docs/pmw/plugin-configuration/optimizely
# Optimizely
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
Optimizely is an experimentation platform for A/B testing and feature experimentation. Once a project ID is configured, the Pixel Manager loads the Optimizely snippet on your store so you can run experiments.
## Setup
1. Log in to your Optimizely account.
2. Open your project settings and copy your **Project ID**. It's the numeric identifier in your Optimizely snippet URL, which looks like this:
```html
```
In this example the project ID is `12345678`.
3. In the Pixel Manager, open **Tracking Pixels → Optimizely**, paste the project ID into the **Project ID** field, and save.
## Supported Events
Optimizely is used for A/B testing and experimentation. It doesn't track traditional e-commerce events through the Pixel Manager — once loaded, Optimizely runs its own experiment tracking.
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Outbrain
URL: https://sweetcode.com/docs/pmw/plugin-configuration/outbrain
# Outbrain
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Setup instruction
### Basic setup
[Wistia video 56u98s3rh6]
1. Open your Outbrain account page: https://my.outbrain.com/
2. In the left side menu, click on **Conversions**, then on the three dots in the **Manual website pixel** and then on **View the Outbrain Pixel**.

3. Select and copy the `OBV_ADV_ID` value.

4. In the Pixel Manager, open **Tracking Pixels → Outbrain**, paste the `OBV_ADV_ID` value into the **Advertiser ID** field, and save.
### Event setup
Each event needs to be set up in Outbrain individually. The following events are supported:
- `search`
- `content_view`
- `add_to_cart`
- `checkout`
- `purchase`
The events need only to be set up within Outbrain. No additional configuration is required in the Pixel Manager plugin.
If you need to ajust the event names that the Pixel Manager sends to Outbrain, you can do so by using the following filter: [Outbrain event name filter](https://sweetcode.com/docs/pmw/developers/php-filters#adjust-outbrain-event-name-mapping)
[Wistia video sj8aig7b6q]
1. Open your Outbrain account page: https://my.outbrain.com/
2. In the left side menu, click on **Conversions**, then on the three dots in the **Manual website pixel** and then on **View the Outbrain Pixel**.

3. Set the following fields:
- **Type**: `Event-Based Conversion`
- **Category**: `Purchase`
- **Name**: `purchase` (All lowerase)
- **Window**: `30` (Most common value, but can be changed to any other value)

4. Click on **Save**.
5. Repeat the steps 2-4 for each event you want to track.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Pinterest
URL: https://sweetcode.com/docs/pmw/plugin-configuration/pinterest
# Pinterest
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Setup instruction
### Set up a conversion in the Pinterest Ads Manager and copy the new tag ID into the Pixel Manager
1. Open the Ads Manager in Pinterest
2. Browse to > **Ads** > **Conversions**

3. Click **Get started**

4. Enter the shop URL and check it. Then you'll get a tag ID at the top right. In the Pixel Manager, open **Tracking Pixels → Pinterest**, paste that into the **Pixel ID** field, and save. Then **Skip** to the next page. You can click through each page now and keep all the standard settings.

5. **Continue** to the next page

6. **Continue** to the next page

7. Finish by clicking **Done**

## Enhanced Match
Enhanced Match is an optional addition to your Pinterest browser tag that matches conversion data with the person responsible for the conversion. Enhanced Match sends hashed emails to Pinterest to match site events when there’s no Pinterest cookie present. Enhanced Match also lets you track cross-device checkouts, which cannot be done otherwise. As a result, you can accurately see conversions reported in Ads Manager.
:::info
More information on Enhanced Match can be found in the [Pinterest documentation](https://help.pinterest.com/en/business/article/enhanced-match).
:::
## API for Conversions
The API for Conversions is an optional addition to your Pinterest tag that sends conversion data to Pinterest in real time through Pinterest's server-to-server protocol. As a result, you can see conversions reported in Ads Manager more accurately.
Find more information on the API for Conversions in the [Pinterest documentation](https://help.pinterest.com/en/business/article/the-pinterest-api-for-conversions).
### Ad Account ID
The ad account ID is a unique identifier for your Pinterest Ad Account. Open the Ads Manager in Pinterest: https://ads.pinterest.com/
You can find the ad account ID in the URL of the Ads Manager.

### API for Conversions Token
1. Open the Ads Manager in Pinterest: https://ads.pinterest.com/
2. Browse to > **Ads** > **Conversions**

3. Click **Conversion access token**

4. Click **Generate new token**

5. Copy the token

6. In the Pixel Manager, open **Tracking Pixels → Pinterest**, paste the token into the **Conversions API Token** field, and save
:::tip[Server-Side Proxy]
You can offload Pinterest API for Conversions calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
### Advanced Matching
Advanced matching is an addition to the API for Conversion. It sends hashed PII, such as email addresses, first and last names, and phone numbers to Pinterest to match site events when there’s no Pinterest cookie present. As a result, you can see conversions reported in Ads Manager more accurately.
:::info
More information on Advanced Matching can be found in the Pinterest documentation [here](https://developers.pinterest.com/docs/conversions/updated/) and [here](https://developers.pinterest.com/docs/conversions/event/).
:::
## Tag Helper
You can get the Pinterest Tag Helper from the Chrome web store: [Pinterest Tag Helper](https://chromewebstore.google.com/detail/pinterest-tag-helper/gmlcbajhgoaaegmlbaclmmmhpmfdajmp)
It will help you to verify that the pixel fires correctly.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Reddit
URL: https://sweetcode.com/docs/pmw/plugin-configuration/reddit
# Reddit
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Basic Setup
[Wistia video 3cr5pwksrf]
1. Open the Reddit Ads Manager: https://ads.reddit.com/
2. Browse to the top left menu dropdown > **Ads** > **Event Manager**

3. Copy the **Pixel ID**

4. In the Pixel Manager, open **Tracking Pixels → Reddit**, paste the pixel ID into the **Advertiser ID** field, and save

## Conversions API (CAPI)
:::info
Available from version `1.52.0` of the Pixel Manager.
:::
The Conversions API is an optional addition to your Reddit Pixel that sends conversion data to Reddit in real time through Reddit's server-to-server protocol. This provides more accurate conversion tracking, especially for events that might be missed by browser-based tracking due to ad blockers or privacy settings.
Find more information on the Conversions API in the [Reddit documentation](https://business.reddithelp.com/s/article/Conversions-API).
1. Open the Reddit Ads Manager: https://ads.reddit.com/
2. Browse to the top left menu dropdown > **Ads** > **Event Manager**
3. Click on the **Conversion API** tab for your pixel
4. In the **Conversions API** section, click **Generate token** to create a new access token
5. Copy the generated token
6. In the Pixel Manager, open **Tracking Pixels → Reddit**, paste the token into the **Conversions API Token** field, and save.
### Testing
:::info
The `test_event_code` can change between testing sessions. Make sure to double-check if the correct one is set for each testing session.
:::
In order to test the Conversions API events, Reddit provides a Test Events tool in the Event Manager. The Pixel Manager offers a settings field where you can enter the test event code to validate that your server-to-server events are being received correctly.
1. In the Reddit Ads Manager, go to **Event Manager** > **Event testing**
2. Look for the **Test Conversion API** section and copy the test event code
3. In the Pixel Manager, open **Tracking Pixels → Reddit**, paste the test event code into the **CAPI Test Event Code** field, and save
Once configured, your CAPI events will appear in Reddit's Test Events view, allowing you to verify the integration is working correctly before going live.
:::tip[Server-Side Proxy]
You can offload Reddit Conversions API calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
## Advanced Matching
Advanced Matching is an optional addition to your Reddit tag that matches conversion data with the person responsible for the conversion. Advanced Matching sends hashed emails to Reddit to match site events. Advanced Matching also lets you track cross-device checkouts, which cannot be done otherwise. As a result, you can see conversions reported in Ads Manager more accurately.
## Pixel Helper
You can get the Reddit Pixel Helper from the Chrome web store: [Reddit Pixel Helper](https://chrome.google.com/webstore/detail/reddit-pixel-helper/ebgpcjlgganlidigifggjjiglghjnjcj)
It will help you to verify that the pixel fires correctly.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Shop Settings
URL: https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings
# Shop Settings
## Marketing Value Logic
The marketing value logic controls the output of the marketing total value, which is sent to the marketing pixels (Google Ads, Facebook Ads, etc.). This setting excludes statistics pixels, such as Google Analytics, that will always receive the full total cart value, including taxes and shipping.
You can change this setting in the Pixel Manager under **General → Order configuration** using the **Marketing value logic** field.
### Order Subtotal (default)
The order subtotal reports your **product revenue only**. Starting from the order total, it leaves out the shipping costs and the taxes, and it deducts the discounts, the refunds, and, if available, payment processor fees like PayPal or Stripe fees.
It is the default setting in the plugin.
:::info
**Surcharges are not part of the order subtotal.** If your shop adds an amount to the order as a WooCommerce order fee (a gift wrap fee, a cash on delivery surcharge, a small order fee, or a deposit instalment), that amount is not product revenue, so it is not included in the reported value. It is not deducted either: the WooCommerce order subtotal only ever contained the product line items, so there is nothing to deduct.
This is different from payment processor fees (Stripe, PayPal). Those are a cost that your payment provider keeps out of your payout, the customer never pays them, and they are not part of any WooCommerce order figure, which is why they are deducted.
If you want surcharges reported as revenue, use the [marketing conversion value filter](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter) to add them, or switch to **Order Total**.
:::
:::info
**Refunds** are deducted by their product share. Refunding only the shipping or only a fee therefore leaves the reported value unchanged, because neither was part of it in the first place.
WooCommerce lets you issue a refund either per line item or as a plain amount. A plain amount records nothing but the amount, so the Pixel Manager cannot tell which part of the order came back and attributes the whole amount to the products. The reported value then errs on the low side. Refund per line item if you want the value to be exact.
:::
### Order Total
The order total is what the customer paid and includes the shipping costs and taxes.
### Profit Margin
:::info
This setting requires one of the following Cost of Goods Sold sources to be active:
- **WooCommerce built-in COGS** — Enable in WooCommerce → Settings → Advanced → Features → Cost of Goods Sold (available since WooCommerce 9.5, no additional plugin required)
-
- [Cost of Goods for WooCommerce (WPFactory)](https://wordpress.org/plugins/cost-of-goods-for-woocommerce/)
You may also use a custom postmeta field for the COGS. Read further down below on how to enable it.
:::
The Pixel Manager will calculate the profit margin on the order and send that to the marketing pixels. It is the order total paid by the customer, minus shipping costs, taxes, discounts, refunds, payment processor fees, and the cost of goods for each product.
If cost of goods has not been set on a particular product, the Pixel Manager will use a value of zero for that product.
:::info
Refunds are reversed per order item, so the cost of goods of the returned items is added back to the margin along with the refunded revenue. This needs the refunded quantity, which WooCommerce only records when you refund **per line item**. If you refund a plain amount instead, nothing records which items came back, so the Pixel Manager cannot add the cost of goods back and deducts the whole refunded amount from the margin. The reported margin then errs on the low side.
:::

#### Use a custom postmeta field for the COGS
Using the following filter you can instruct the Pixel Manager to retrieve the Cost Of Goods Sold from a custom product postmeta field. Once the filter is active you'll also be able to choose and enable the Profit Margin logic in the settings. The Pixel Manager will then use the custom product postmeta field to calculate the profit margin on each order.
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_custom_cogs_meta_key', function () {
return 'NAME_OF_THE_CUSTOM_PRODUCT_POSTMETA_KEY';
});
```
:::info
The Pixel Manager will try to subtract payment gateway fees as well. WooCommerce has no standard place for them, so each gateway plugin stores them differently: some write them to their own order meta field, and many do not store them at all. The Pixel Manager therefore reads them from the order meta of the popular gateways.
For now, the Pixel Manager can only subtract payment gateway fees for the following plugins:
- [Stripe for WooCommerce](https://woocommerce.com/products/stripe/)
- [WooCommerce PayPal Payments](https://woocommerce.com/products/woocommerce-paypal-payments/)
- [WooCommerce PayPal Checkout Payment Gateway](https://wordpress.org/plugins/woocommerce-gateway-paypal-express-checkout/)
If you use a different payment gateway plugin, you can supply the fees yourself with the [order fees filter](https://sweetcode.com/docs/pmw/developers/php-filters#order-fees-filter). You are also welcome to reach out to us and we will try to add support for that plugin as soon as possible.
This applies to the **Order Subtotal** option as well, which deducts the same payment gateway fees.
:::
## Dynamic Remarketing
### General Information
:::info
In order for the dynamic remarketing to work, you need to either upload your products into the platform catalog (Google Merchant Center for Google Ads, Meta (Facebook) Catalog for Facebook, etc.) Google Merchant Center, or upload a custom business feed into your Google Ads account.
:::
:::info
We strongly recommend uploading the products with post ID as identifier. Using the SKU can lead to much more issues and more difficult situations to debug.
:::
1. Check your Product Identifier setting and adjust if necessary.
**The product identifier must match the product identifiers that have been uploaded to the catalog.**
2. The output for variations is enabled by default. This requires that you upload the product variations with your product feed as well, including the `item_group_id`. Depending on the feed plugin you use, this might be enabled or disabled by default. So make sure to double-check. We recommend including the variations into the upload.
### Product Identifier
The **Product Identifier** setting controls *which* product ID the Pixel Manager sends to the advertising platforms (Google Ads, Meta, Microsoft Advertising, etc.) for dynamic remarketing and cart data events.
You can find this setting in the Pixel Manager under **General → Product data** in the **Product identifier** field.
**The identifier you pick here must match the product IDs in your product catalog or feed.** If the two don't match, the advertising platform can't map the products it receives from your site back to your catalog. Dynamic remarketing then stops working, and you may see "item ID not found" or "product not found" errors in the platform.
Choose the option that matches the feed plugin you use to upload your products to the platform. If you don't use a dedicated feed plugin, leave it on **Post ID**, which is the WooCommerce default.
| Setting | What gets sent | Choose this when |
| --- | --- | --- |
| **Post ID** *(default)* | The plain WooCommerce product (post) ID, e.g. `123`. | You upload your products with their plain WooCommerce IDs. This is the default and the recommended choice for most shops. |
| **SKU** | The product's SKU. Falls back to the post ID if the product has no SKU. | Your catalog/feed is keyed by SKU. See the caution below before choosing this. |
| **Post ID with `woocommerce_gpf_` prefix** | The post ID prefixed with `woocommerce_gpf_`, e.g. `woocommerce_gpf_123`. | You use the [Google Product Feed by WooCommerce.com](https://woocommerce.com/products/google-product-feed/) plugin, which prefixes the IDs in its feed this way. |
| **Post ID with `gla_` prefix** | The post ID prefixed with `gla_`, e.g. `gla_123`. | You use the [Google Listings & Ads (Google for WooCommerce)](https://woocommerce.com/products/google-listings-and-ads/) plugin, which prefixes the IDs in its feed this way. |
:::tip
We strongly recommend the **Post ID** option. It is the most robust choice and the easiest to debug. Using the SKU can lead to many more issues and harder-to-debug situations, because SKUs are optional, can be duplicated, and often differ between the store and the feed.
:::
:::caution
Whichever option you pick, it must produce the **exact** identifiers that exist in your catalog/feed. After changing this setting, re-check (or re-upload) your feed so the IDs on both sides match.
:::
### Variations Output
The **Variations Output** setting controls whether the Pixel Manager sends variation-level product information or parent product information for variable products. This setting is **enabled by default** and is the **recommended configuration** for most shops.
You can find this setting in the Pixel Manager under **General → Product data**, labelled **Output product variations as separate items**.
#### How It Works
When a customer interacts with a variable product (e.g., a t-shirt with different sizes and colors), the Pixel Manager needs to decide which product ID to send with tracking events:
- **Variations Output Enabled (Recommended)**: Sends the specific variation ID (e.g., "Blue T-Shirt, Size M") with all tracking events.
- **Variations Output Disabled**: Sends the parent product ID (e.g., "T-Shirt") regardless of which variation the customer selected.
#### Affected Events
This setting affects all product-related tracking events across all advertising platforms:
- `view_item` – When viewing a product page (including variation selection)
- `add_to_cart` – When adding a product to the cart
- `remove_from_cart` – When removing a product from the cart
- `view_item_list` – When viewing category or search result pages
- `search` – When viewing search results
- `purchase` – When completing an order
#### Affected Platforms
This setting affects all marketing pixels supported by the Pixel Manager equally.
#### When to Enable (Recommended)
Enable Variations Output when your product catalog/feed includes all product variations as separate items. This is the recommended approach because it:
- Enables more precise retargeting (showing customers the exact variation they viewed)
- Allows better audience segmentation at the variation level
- Provides more accurate conversion tracking for specific product variants
:::tip
When uploading variations to your product feed, ensure your feed plugin includes the grouping field that links all variations to the same parent product. For Google Merchant Center, this is the `item_group_id` field. Other platforms may use different field names for the same purpose.
:::
#### When to Disable
Disable Variations Output only if your product catalog/feed contains only parent products for variable products. This might be the case if:
- Your feed plugin doesn't support exporting variations
- You have a very large catalog and want to reduce feed complexity
- The advertising platform you're using has limitations with variation-level tracking
:::caution
Disabling this setting when your feed contains variations (or enabling it when your feed only contains parent products) will cause a mismatch between the product IDs sent by the Pixel Manager and the IDs in your product catalog. This breaks dynamic remarketing and can result in "product not found" errors in your advertising platforms.
:::
### Google Ads
There are several ways to upload your products to the Google Merchant Center. The easiest one is to use a feed plugin. So far, we can recommend the following two:
#### Google Merchant Center Feed
- [Google Product Feed by WooCommerce.com](https://woocommerce.com/products/google-product-feed/)
- Relatively easy to use
- Has difficulties handling large feeds
- Only good for Google Ads and Microsoft Ads
- [WooCommerce Product Feed Manager by WPMarketingRobot](https://www.wpmarketingrobot.com/)
- Many options, but comparably difficult to set up
- Handles large feeds very well
- Supports many marketing channels
#### Custom Business Feed
For countries where the Google Merchant Center is not available, you can upload your product using a custom business feed. [Create a feed](https://support.google.com/google-ads/answer/6077139)
You will also need to set the [Google Business Vertical](https://support.google.com/google-ads/answer/7305793#zippy=%2Ccustom) to 'custom'. This is available in the Pro version of the Pixel Manager.
### Google Business Vertical
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
The **Business Vertical** tells Google which kind of catalog your dynamic remarketing events belong to. Google uses it to match the IDs the Pixel Manager sends against the right catalog/feed, so the value you choose here **must match the vertical of the feed you uploaded** (Google Merchant Center retail feed, custom business feed, etc.).
You can find this setting in the Pixel Manager under **Tracking Pixels → Google (Ads & GA4)** (under **Show advanced settings**) in the **Business vertical** field.
The Pixel Manager offers these verticals:
- **Retail** *(default)* — standard online stores selling physical products. This is the right choice for almost all WooCommerce shops using a Google Merchant Center retail feed.
- **Education**
- **Hotels and Rentals**
- **Jobs**
- **Local Deals**
- **Real Estate**
- **Travel**
- **Custom** — use this when you upload a [custom business feed](#custom-business-feed) (for example in countries where the Google Merchant Center isn't available).
:::tip
If your products are uploaded through a standard Google Merchant Center retail feed, keep this on **Retail**. Only switch to **Custom** when you've set up a custom business feed in Google Ads, and make sure the vertical matches on both sides — a mismatch breaks dynamic remarketing matching.
:::
#### Setting Up Dynamic Remarketing Audiences in Google Ads
Within Google Ads browse to > Shared Library > Audience Manager > Audience Sources.
1. Click on **Setup Tag**

2. Configure basic settings

3. Finish setup

After finishing the setup, Google Ads will automatically create four new dynamic remarketing audiences.

## Subscription Value Multiplier
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
By default, the conversion value for subscriptions transmitted to the paid ads conversion pixels only contains the value of the first subscription. But, a subscription may yield a much higher effective conversion value or customer lifetime value (CLV) because a subscription usually creates more than one automatic order in the future. Unfortunately, all those future conversion values can't be captured by the paid ads conversion pixels because they don't require checkout by the visitor using the browser.
Therefore, we implemented the subscription value multiplier into the Pixel Manager. It multiplies the subscription value to closely match the effective conversion value or customer lifetime value generated by a subscription.
The default value of the setting is `1.00`. You can set any multiplier larger than `1.00`.
You can find this setting in the Pixel Manager under **General → Subscriptions** in the **Subscription value multiplier** field.

### How to determine an appropriate multiplier
There is no general multiplier that can be used for all shops. The multiplier entirely depends on how long a subscription lasts on average for a specific shop.
A good approach is to average how often a subscription renews before the customer cancels it.
To calculate this, take the total count of subscription orders (initial and renewal orders) and divide it by initial subscriptions. This will give you an average number of times a subscription is renewed. And that is the number that you can use as a multiplier. Feel free to use a slightly lower number to stay on the more conservative side to account for fluctuations in the effective renewal multiplier over time.
## Lifetime Value Calculation
The Pixel Manager can calculate the lifetime value (LTV) of a customer based on the total order value and the marketing value of all orders. The value is then available on the order details page and can be used by marketing pixels to optimize ad campaigns.
### Active Lifetime Value Calculation
1. In the Pixel Manager, open **General → Customer lifetime value**.
2. Turn on **Calculate LTV on orders**.
3. Save.

### Lifetime Value Calculation Recalculation
The lifetime value (LTV) of a customer is calculated automatically each time that customer places an order, and refunds and cancellations update the affected customer automatically as well. A recalculation across **all** customers is a manual operation that you start yourself.
The Pixel Manager calculates different types of lifetime values:
- Total order value LTV: This LTV is the sum of all total order values of a customer.
- Marketing value (LTV): The marketing value LTV is the sum of all order marketing values. The marketing values are based on your [order total logic](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#marketing-value-logic) setting. It will take the value calculated by the order total logic for each order and sum them up. If you use a custom [marketing conversion value](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter) filter, then the marketing value LTV will be based on that value.
#### When to run a full recalculation
The lifetime value is stored cumulatively on each order, so if the value of one past order changes, every later order of that customer carries the old figure until it is recalculated. Run a full recalculation after you change something that affects the value of orders that have **already been placed**:
- After changing the [order total logic](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#marketing-value-logic) setting.
- After adding or changing a [marketing conversion value filter](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter) or another value filter in your theme or a plugin.
- After importing or migrating historical orders.
:::note
The Pixel Manager does not detect these changes on its own, by design. A value filter lives in your theme's `functions.php` or in a plugin, so there is no setting change or other event the Pixel Manager could watch to notice it. The only way to detect that values have shifted is to recalculate them, which is exactly the expensive operation being avoided. Earlier versions attempted this autodetection and it caused serious performance problems on shops with a large order history, so it was removed. Recalculation is now always something you trigger deliberately.
:::
#### Running the recalculation
In the Pixel Manager, open **General → Customer lifetime value → Manual LTV recalculation**.

1. Click **Schedule LTV recalculation**. The run is scheduled for 2:00 AM in your site's local time, so it stays out of your busiest hours.
2. While it is scheduled, two more options appear. **Run it now instead** starts the recalculation immediately, and **Stop all LTV calculations** cancels it again.
**Stop all LTV calculations** also clears the per-customer recalculations that are queued by refunds and cancellations, so use it when you want the Pixel Manager to stop all lifetime value work, not just the scheduled full run.
Bear in mind that recalculating the LTVs for all customers can take a long time and take up a lot of server resources. Unless you need the new figures right away, prefer the scheduled overnight run.
:::info
The Pixel Manager uses the [Action Scheduler](https://actionscheduler.org/) to run the recalculation in the background. It may trigger timeout messages in the log files. Those can be ignored. The Pixel Manager handles them internally and ensures that the recalculation is completed.
:::
## Extra Order Data Output
The Pixel Manager can output extra order data that helps you to debug and understand that data that is sent to the marketing pixels.
In the Pixel Manager, open **General → Extra order data output** and turn on **Output extra order data on order pages**.

Now you will see the extra order data on each order details page.

**Order URL**: When opening this special link the Pixel Manager will be instructed to output all the data that is sent to the marketing pixels in a human-readable format in the dev console.
The recommended way is to right-click on the order URL and open it in an incognito window. Then in that window open the dev console. You will see the data that is sent to the marketing pixels in a human-readable format.

---
# Snapchat
URL: https://sweetcode.com/docs/pmw/plugin-configuration/snapchat
# Snapchat
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Snapchat Pixel
:::info
In order to be able to create the Snapchat pixel you need a Snapchat ad account. You can use an existing one, otherwise create a new ad account in the [Snapchat business manager](https://business.snapchat.com/).
:::
1. Open the Snapchat business manager at [business.snapchat.com](https://business.snapchat.com/)
2. Open **Pixels** in the menu on the left and then click **Create Pixel**

3. Give it a descriptive name and click **Create**.

4. Select the ad account and copy the pixel ID.

5. In the Pixel Manager, open **Tracking Pixels → Snapchat**, paste the pixel ID into the **Pixel ID** field, and save.

6. Optionally, enable automated matching in the Snapchat pixel.


## Conversions API
:::info
Available from version `1.43.0` of the Pixel Manager.
:::
The Conversions API is an optional addition to your Snapchat tag that sends conversion data to Snapchat in real time through Snapchat's server-to-server protocol. As a result, you can see conversions reported in Ads Manager more accurately.
Find more information on the Conversions API in the [Snapchat documentation](https://docs.snap.com/api/marketing-api/Conversions-API/Introduction).
1. Open the Snapchat business manager at [business.snapchat.com](https://business.snapchat.com/)
2. Open the **Business Details**

3. Scroll down to the **Conversions API Tokens** section and click **Generate Token**

4. Hover next to the token and click to **Copy**

5. In the Pixel Manager, open **Tracking Pixels → Snapchat**, paste the token into the **Conversions API Token** field, and save.

:::tip[Server-Side Proxy]
You can offload Snapchat Conversions API calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
## Advanced Matching
Advanced Matching is an optional addition to your Snapchat tag that matches conversion data with the person responsible for the conversion. Advanced Matching sends hashed emails and phone numbers to Snapchat to match site events.
## Pixel Helper
You can get the Snap Pixel Helper from the Chrome web store: [Snap Pixel Helper](https://chromewebstore.google.com/detail/snap-pixel-helper/hnlbfcoodjpconffdbddfglilhkhpdnf)
It will help you to verify that the pixel fires correctly.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Taboola
URL: https://sweetcode.com/docs/pmw/plugin-configuration/taboola
# Taboola
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Setup Instruction
### Basic Setup
[Wistia video fw6rwcw1sf]
1. Open the Taboola Ads tracking page: https://ads.taboola.com/tracking
2. Copy the account ID from the top left of the tracking page.

3. In the Pixel Manager, open **Tracking Pixels → Taboola**, paste the account ID into the **Taboola account ID** field, and save.
### Event Setup
Each event needs to be set up in Taboola individually. The following events are supported:
- `search`
- `view_content`
- `add_to_wishlist`
- `add_to_cart`
- `start_checkout`
- `make_purchase`
The events need only to be set up within Taboola. No additional configuration is required in the Pixel Manager plugin.
If you need to ajust the event names that the Pixel Manager sends to Taboola, you can do so by using the following filter: [Taboola event name filter](https://sweetcode.com/docs/pmw/developers/php-filters#adjust-taboola-event-name-mapping)
[Wistia video q3hhvz9mgt]
Here is an example of the `purchase` event setup:
1. Open the Taboola Ads tracking page: https://ads.taboola.com/tracking
2. Click on the `+ New Conversion` button.

3. Set up the fields as follows:
- **Conversion Name**: `Make Purchase`
- **Conversion Type**: `Event`
- **Conversion Category**: `Make Purchase`
- **Event Name**: `make_purchase` (Keep the default value. In doubt, check the list of supported events above)

4. Scroll to the bottom of the page and click **Create**.

5. Repeat the steps above for each event you want to track.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# TikTok
URL: https://sweetcode.com/docs/pmw/plugin-configuration/tiktok
# TikTok
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Create a TikTok Pixel
1. Open the TikTok Ads Manager and in the menu click **Assets** > **Event**
2. Select **Manage** under Web Events
3. Click Set Up **Web Events**
4. Give your new pixel a **Pixel Name** and select **TikTok Pixel** as your connection method, then **Next**.

5. Choose **Manually Install Pixel Code** and **Next**

6. As Event Setup Mode choose **Custom Code**, then **Next**

7. On the next screen click **Next**

8. On the next screen click **Next**

9. Done
## Get the TikTok pixel ID and set it up in the Pixel Manager
1. Open the TikTok Ads Manager
2. In the menu choose > **Assets** > **Events**
3. Choose to manage **Web Events**

4. Copy the TikTok pixel ID. In the Pixel Manager, open **Tracking Pixels → TikTok**, paste it into the **Pixel ID** field, and save.

5. Done. You are ready. The Pixel Manager will now send e-commerce events to the TikTok advertising platform.
## TikTok Events API
The Pixel Manager fully supports the TikTok Events API with browser and server [event deduplication](https://ads.tiktok.com/help/article?aid=10012410).
### Access Token
The TikTok Ads Manager account Admin or Operator can generate an access token directly under the pixel Settings tab.
Steps:
1. In TikTok Ads Manager, **navigate to Assets > Events**, and **click Manage** in the Web Events section.
2. Find the pixel object that you want to use for reporting events, and click its name to view its settings. If you need to create a new pixel object, remember to select Manually install pixel code and Developer Mode.
3. In the Settings tab, **click Generate Access Token**. The token will be generated immediately. You can then copy the access token and, in the Pixel Manager, open **Tracking Pixels → TikTok**, paste it into the **Conversions API Token** field, and save. You can then start to make API requests.

:::tip[Server-Side Proxy]
You can offload TikTok Events API calls from your WooCommerce server to the edge using the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview). This reduces server load and improves tracking accuracy by routing events through a first-party subdomain.
:::
## Advanced Matching
When this option is enabled, the Pixel Manager will additionally send several visitor identifiers to TikTok, such as IP address and email. It is optional and will increase the likelihood that TikTok will match the hit to an existing TikTok user profile. For security reasons, the Pixel Manager will hash the data where possible.
Make sure that enabling this option adheres to your local regulation.
## Pixel Helper
You can get the TikTok Pixel Helper from the Chrome web store: [TikTok Pixel Helper](https://chromewebstore.google.com/detail/tiktok-pixel-helper/aelgobmabdmlfmiblddjfnjodalhidnn)
It will help you to verify that the pixel fires correctly.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# Triple Whale
URL: https://sweetcode.com/docs/pmw/plugin-configuration/triple-whale
# Triple Whale
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
[Triple Whale](https://www.triplewhale.com/) is an e-commerce analytics and attribution platform. Its Triple Pixel tracks the visitor journey across your site and connects it to your ad spend, so you can see which channels and campaigns actually drive your orders. The Pixel Manager loads the Triple Pixel, sends the relevant e-commerce events, and can sync full order records (including refunds) to Triple Whale server-side.
:::note
The Triple Whale integration is currently in beta.
Available from version `1.63.0` of the Pixel Manager.
:::
## Setup
Triple Whale does not use a pixel ID. It identifies your shop by its domain, so activation is a single toggle:
1. In the Pixel Manager, open **Tracking Pixels → Triple Whale**, switch on **Enable Triple Whale**, and save.
2. Make sure the domain matches: Triple Whale identifies your shop by the site domain (the "TripleName"). It must match the **Shop URL** configured in Triple Whale under **Settings → Store**. If they match, you are done and events will show up in Triple Whale automatically.
3. Optionally, add an [Orders API key](#orders-api) so the Pixel Manager syncs your order records to Triple Whale server-side. Triple Whale requires the order records for attribution, so this step is strongly recommended.
### Shop identifier mismatch
If the Shop URL configured in Triple Whale differs from your WordPress site URL (for example after a domain migration, or with a staging or proxy setup), you can override the derived shop identifier with the `pmw_triple_whale_shop` filter:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_triple_whale_shop', function ($shop) {
return 'example.com'; // must match the Shop URL in Triple Whale under Settings → Store
});
```
## Consent Management
Triple Whale is the first pixel in the Pixel Manager's **Attribution** category. Attribution pixels follow the **statistics** consent category: with [Explicit Consent Mode](https://sweetcode.com/docs/pmw/consent-management/overview) enabled, the Triple Pixel only loads, and the Orders API only syncs, after the visitor grants statistics consent.
## Supported Events
The Triple Pixel automatically tracks page loads and the visitor journey once it is loaded. On top of that, the Pixel Manager sends these e-commerce events:
- **AddToCart**: sent when a product is added to the cart.
- **checkoutStarted**: sent when the customer starts the checkout. Triple Whale requires an email address or phone number on this event, so it is only sent for visitors the Pixel Manager can identify (typically logged-in customers).
- **purchase**: sent on the order received page, with the order ID and customer details so Triple Whale can stitch the order to the visitor journey.
The purchase event alone does not create the order in Triple Whale. The matching order record is synced server-side through the [Orders API](#orders-api).
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
## Orders API
The Orders API key lets the Pixel Manager push your order records directly to Triple Whale, server-to-server. Triple Whale matches these order records with the browser events from the Triple Pixel to complete the attribution.
This replaces Triple Whale's native WooCommerce integration: there is no need to connect your store's REST API to Triple Whale or install Triple Whale's own plugin. The Pixel Manager sends the order data itself, and no store credentials leave your site.
1. Log in to [Triple Whale](https://app.triplewhale.com/) and open **Data → APIs**.
2. Create an **API key** with the scope **Orders: Write** and copy it.
3. In the Pixel Manager, open **Tracking Pixels → Triple Whale**, paste the key into the **Orders API Key** field, and save.
Once configured, the Pixel Manager sends an order record for every new order, including the line items, customer details, shipping, taxes, and discount codes. When an order is refunded, the updated order record including the refund details is sent again, so refunds are reflected in Triple Whale automatically.
---
# X (Twitter)
URL: https://sweetcode.com/docs/pmw/plugin-configuration/twitter
# X (Twitter)
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## X (Twitter) Tracking Setup
### Pixel ID
1. Log into your ads account at [ads.x.com](https://ads.x.com)
2. Under **Tools**, select **Events Manager**.
If you have created a Pixel before you’ll be able to see the X (Twitter) Pixel in the left column list and you can skip to step 3.
:::info
Not seeing a Tools tab in your account? This is likely because a credit card hasn’t been added to your account. Find how to add one [here](https://business.x.com/en/help/account-setup/billing-basics).
:::
If you have never created a Pixel on X (Twitter) before, you will need to add an event source. In “Events Manager” click on “Install with Pixel code”.

3. Copy the X (Twitter) pixel ID.

4. In the Pixel Manager, open **Tracking Pixels → X**, paste the X (Twitter) pixel ID into the **Pixel ID** field, and save.

5. In the following section you need to create a new event for each e-commerce event that you want to track.
:::info
If you previously set up events using the Universal Website Tag or Single Event Tags, they will appear as events here. X (Twitter) recommends upgrading their pixel code and enabling event parameters where relevant.
:::
### Event setup
1. Under **Tools**, select **Events Manager**.
2. You will need to add an event for each event that you want to track. Here are the events that the Pixel Manager supports.
- Content View
- Search
- Add to Cart
- Add to Wishlist
- Checkout Initiated
- Add Payment Info
- Purchase
3. Click the “Add events” button.
4. Follow these steps on the **Event details** page.
1. Give the event the name of the first event you want to add. E.g. "Add to cart".
2. Choose the same event from the drop-down list.
3. Enable audience collection.
4. Click **Next**.

5. On the **Setup method** screen, you will be able to choose how you want to define your event.
Select ***Define event with code*** and click **Next**.

6. You can skip this and simply finish by saving this new event. Click **Save**.
The Pixel Manager will handle all the event output automatically for you once the setup is finished.

7. Now the new event appears on the event overview page.
1. Copy the new event code.
2. In the Pixel Manager, open **Tracking Pixels → X** (under **Show advanced settings**), paste the event code into the matching per-event ID field (for example **Add to Cart Event ID**), and save.


8. Repeat the steps 3 to 7 for each event that you want to add.
9. Done
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# VWO
URL: https://sweetcode.com/docs/pmw/plugin-configuration/vwo
# VWO
:::info
This is a pro feature. Get the pro version [here](https://sweetcode.com/plugins/pmw#pricing-section)
:::
## Setup
[Wistia video 9besn6q7h0]
1. Open the VWO general settings page: https://app.vwo.com/#/settings/accounts/general
2. Copy the account ID from the top left of the tracking page.

3. In the Pixel Manager, open **Tracking Pixels → VWO**, paste the account ID into the **VWO account ID** field, and save.
## Supported Events
Here's a list of [supported events](https://sweetcode.com/docs/pmw/features/events#general-and-e-commerce-events).
---
# FAQ
URL: https://sweetcode.com/docs/pmw/server-side-proxy/faq
# FAQ
:::info
This is a feature only available in the pro plans of the Pixel Manager for WooCommerce purchased on [sweetcode.com](https://sweetcode.com). It is not available in the woocommerce.com version of the plugin.
:::
Frequently asked questions about the Server-Side Proxy.
## Which events are proxied?
All browser-originated server-side events are routed through the proxy. This includes:
- **PageView**
- **ViewContent** (product page views)
- **AddToCart**
- **InitiateCheckout**
- **Search**
- **Subscribe**
- And other non-purchase e-commerce events
**Purchase events** are also routed through the proxy. If the proxy is unreachable, purchase events automatically fall back to direct sends from your WooCommerce server on a per-platform basis, ensuring no revenue data is lost.
## Why isn't GA4 proxied?
Google Analytics 4 (GA4) Measurement Protocol only sends purchase events server-side. Since GA4 doesn't send browser-originated events through a server-side API (it uses `gtag.js` exclusively for those), there is nothing to proxy. The Pixel Manager continues to handle GA4 purchase events directly.
## What happens if the proxy goes down?
This depends on your **Proxy Failure Behavior** setting:
- **Fall back to PMW internal event router** (default): The Pixel Manager sends events directly from your WooCommerce server. No data is lost — you temporarily lose the performance benefit, but tracking continues uninterrupted.
- **Drop server-side events**: Events are silently dropped until the proxy recovers.
The default fallback option is recommended for most shops.
## Is my data secure?
Yes. Your ad platform credentials (CAPI tokens, pixel IDs) are:
- Transmitted over HTTPS (TLS 1.3)
- Encrypted at rest in SweetCode Cloud using AES-GCM encryption
- Never logged or exposed in plaintext
- Masked in the SweetCode Cloud portal UI (only last 4 characters are shown)
For full details, see the [SweetCode Cloud Security & Privacy documentation](https://sweetcode.cloud/guides/security-privacy).
## How do I update my CAPI tokens?
Just update them in the Pixel Manager settings as you normally would. The Server-Side Proxy automatically detects credential changes and pushes the updated configuration to SweetCode Cloud. No manual sync is needed — though you can always click **Sync Now** to force an immediate update.
## Do I need to change anything in the ad platform dashboards?
No. The Server-Side Proxy is transparent to the ad platforms. Events arrive at their APIs in the same format as they would from a direct server-side send. Your existing pixel configurations, audiences, and campaigns continue to work without changes.
## Can I use the proxy with only some platforms?
The Server-Side Proxy proxies events for all destinations that have a CAPI token and pixel ID configured in the Pixel Manager. If you only have Meta CAPI configured, only Meta events will flow through the proxy. There is no per-platform toggle — the proxy handles whatever destinations are active.
## Does the proxy affect browser-side pixel tracking?
No. Browser-side tracking (JavaScript pixels) continues to work independently. The Server-Side Proxy only handles the server-side component of event tracking (Conversion APIs). Both browser and server events are still sent with proper deduplication event IDs.
## What is the free plan limit?
SweetCode Cloud includes a free tier with a limited number of monthly events. You can view the current plan limits on the [SweetCode Cloud pricing page](https://sweetcode.cloud/#pricing).
The monthly event limit applies **only to events routed through the SweetCode Server-Side Proxy** — it is not a limit on tracking in general. Once you exceed the limit, what happens to your server-side events depends entirely on your **Proxy Failure Behavior** setting (see the next question).
## What happens when I exceed my monthly event limit?
Exceeding your SweetCode Cloud monthly event limit only affects the **proxy layer**. Everything else keeps tracking normally:
- ✅ **Browser-side pixel tracking** continues unaffected.
- ✅ **Direct server-side (CAPI) sends** continue — see below.
- ⚠️ **The proxy stops accepting new events** until your billing cycle resets or you upgrade.
When the proxy is no longer accepting events, the Pixel Manager applies your **Proxy Failure Behavior** setting:
- **Fall back to PMW internal event router** (default): Server-side events are sent **directly from your WooCommerce server** to the ad platforms, exactly as they were before you enabled the proxy. **No events are lost** — but the CAPI workload returns to your server, so you temporarily lose the proxy's server-offloading benefit until the quota resets or you upgrade.
- **Drop server-side events**: Server-side events are silently dropped until the proxy recovers. Choose this only if you specifically do not want any direct server-side calls.
:::info
By **default**, exceeding the quota does **not** drop your server-side events — they fall back to direct sends from your WooCommerce server. Events are only dropped if you have explicitly selected **Drop server-side events** in the Proxy Failure Behavior setting.
:::
The setting is evaluated **per visitor session**, so each new visitor gets a fresh check once the proxy is reachable again. See [Proxy Failure Behavior](https://sweetcode.com/docs/pmw/server-side-proxy/management#proxy-failure-behavior) for details.
## Can I use a custom subdomain?
Yes. The default subdomain prefix is `ssp` (resulting in `ssp.yourshop.com`), but you can customize it when adding your domain in the SweetCode Cloud portal. For example, you could use `data.yourshop.com` or `track.yourshop.com`.
## Can I use the proxy with multiple domains on a single WordPress install?
Yes. If your single WordPress installation serves multiple domains (without WordPress Multisite), you can connect each domain to its own SSP proxy endpoint. This requires:
1. Creating a separate domain in the [SweetCode Cloud portal](https://portal.sweetcode.cloud) for each additional domain
2. Adding the `pmw_ssp_additional_domains` filter to your child theme's `functions.php`
The Pixel Manager will automatically output the correct proxy URL for visitors on each domain and keep all domains synced with your CAPI configuration.
See the [SSP Additional Domains filter documentation](https://sweetcode.com/docs/pmw/developers/php-filters#ssp-additional-domains) for setup instructions.
## I upgraded my plan but events still aren't going through the proxy. Why?
After upgrading (or after the billing cycle resets), the Pixel Manager needs to learn that the quota is no longer exceeded. This happens via a sync — either automatic (daily at 3:15 AM, or triggered by SweetCode Cloud) or manual (save your Pixel Manager settings or click **Sync Now**).
However, even after a successful sync, **page caches** on your WooCommerce site may still serve stale HTML that contains the old `quota_exceeded` flag. This is the most common reason the proxy doesn't resume after a quota recovery.
Additionally, the Pixel Manager's JavaScript stores the SSP state in the browser's **sessionStorage**. Visitor sessions that already encountered the quota-exceeded state will continue using fallback for the rest of that tab's session. This resolves automatically when visitors open new tabs — no manual action is needed.
**To restore proxy routing:**
1. Trigger a resync (save settings, click **Sync Now**, or wait for auto-sync)
2. Flush **all** page caches (caching plugin, hosting cache, CDN, Cloudflare, Varnish)
3. Verify in a new browser tab by checking the Network tab for requests to your proxy subdomain
See the [Quota Exceeded troubleshooting section](https://sweetcode.com/docs/pmw/server-side-proxy/management#quota-exceeded) for the full recovery checklist.
## Does the proxy work with Cloudflare?
Yes. If your domain uses Cloudflare DNS, you need to set the CNAME record to **Proxied** (orange cloud enabled). See the [Setup Guide](https://sweetcode.com/docs/pmw/server-side-proxy/setup#step-3-configure-dns) for details.
---
# Management
URL: https://sweetcode.com/docs/pmw/server-side-proxy/management
# Management
:::info
This is a feature only available in the pro plans of the Pixel Manager for WooCommerce purchased on [sweetcode.com](https://sweetcode.com). It is not available in the woocommerce.com version of the plugin.
:::
Once the Server-Side Proxy is activated, you can monitor its status, manage the connection, and configure its behavior directly from the Pixel Manager settings.
## Status Panel
The status panel in the Pixel Manager under **Server-Side → SweetCode Server-Side Proxy** shows the current state of your proxy connection.
### Routing Status
The routing status reflects whether your DNS is correctly configured and the proxy domain is active.
| Status | Meaning |
|--------------|--------------------------------------------------------------|
| **Active** | DNS is verified and the proxy is routing traffic |
| **Pending DNS** | Domain was added in the portal, but the CNAME is not yet verified |
| **Disabled** | Domain was disabled in the SweetCode Cloud portal |
| **Deleted** | Domain was removed from the SweetCode Cloud portal |
### Config Status
The config status reflects whether the Pixel Manager's destination credentials are synced to SweetCode Cloud.
| Status | Meaning |
|---------------------|------------------------------------------------------|
| **Synced** | Credentials were successfully pushed to SweetCode Cloud |
| **Waiting for Config** | Domain exists in SweetCode Cloud but no config has been pushed yet |
| **Sync Error** | The last config push failed — check the error message for details |
### Overall Active Status
The proxy is fully operational (shown as **Active**) only when **all four** conditions are met:
1. The proxy is **enabled** in the Pixel Manager
2. A **sync token** is saved
3. The routing status is **Active**
4. The config status is **Synced**
If any condition is not met, the status badge shows **Inactive** and events will not be routed through the proxy.
### Plan & Usage
The status panel also displays:
- **Plan name** — Your current SweetCode Cloud plan (Free, Pro, Business, or Scale)
- **Usage** — Number of events sent this billing period vs. your monthly limit
- **Usage percentage** — Visual indicator of how much of your quota has been used
## Enable / Disable
You can temporarily disable the proxy without losing the connection:
- **Disable:** Click the **Disable** button. The proxy stops routing events, but all connection data (sync token, domain config) is preserved.
- **Re-activate:** Click the **Re-activate** button. The proxy resumes routing events using the existing connection — no need to re-enter the sync token.
This is useful for debugging or temporarily reverting to direct server-side sends.
## Sync Now
Click **Sync Now** to manually push your current destination configuration to SweetCode Cloud. This sends all configured pixel IDs and API tokens for Meta, TikTok, Pinterest, Snapchat, Reddit, OpenAI, Nextdoor and the Google Analytics 4 Measurement Protocol, including any additional Meta pixels added with the [`pmw_facebook_pixel_identifiers` filter](https://sweetcode.com/docs/pmw/developers/php-filters#additional-facebook-pixels).
**When to use Sync Now:**
- After changing a CAPI token or pixel ID (though this normally auto-syncs)
- After adding or changing pixels in a filter-based snippet, if you don't want to wait for the automatic detection
- If the config status shows **Sync Error** and you want to retry
- After troubleshooting a connection issue
## Auto-Sync
The Pixel Manager automatically syncs your configuration to SweetCode Cloud in four ways:
1. **On credential change:** When you save a CAPI token, pixel ID, or other synced setting in the Pixel Manager, an async sync is triggered automatically.
2. **On filter-driven config change:** Destination credentials that come from a filter instead of the settings, such as additional Meta pixels added with the [`pmw_facebook_pixel_identifiers` filter](https://sweetcode.com/docs/pmw/developers/php-filters#additional-facebook-pixels), never touch the settings, so there is nothing to save. The Pixel Manager therefore compares the effective destination configuration against the last pushed one (at most once every five minutes) and triggers a sync when it has changed. In practice the new configuration is live within a few minutes of the snippet change.
3. **Daily sync:** A scheduled sync runs once daily (at 3:15 AM local server time) to ensure the configuration stays current.
4. **Portal-initiated resync:** The SweetCode Cloud portal can request a resync from the Pixel Manager (e.g. after a plan change).
## Test Connection
Click **Test Connection** to verify that your WooCommerce server can reach the proxy endpoint through the configured subdomain. This confirms that DNS, SSL, and the Cloudflare Worker are all functioning correctly.
## Proxy Failure Behavior
This setting controls what happens when the Server-Side Proxy is unavailable — whether because of a temporary outage or because you have **exceeded your monthly event quota**:
| Option | Behavior |
|--------|----------|
| **Fall back to PMW internal event router** (default) | The Pixel Manager sends events directly from your WooCommerce server to the ad platforms — exactly as it did before the proxy was enabled. **No events are lost.** The tradeoff is that the CAPI workload returns to your server, so you temporarily lose the proxy's server-offloading benefit until the proxy is reachable again (or your quota resets). |
| **Drop server-side events** | Events are silently dropped. Use this only if you prefer no direct server calls under any circumstance — for example, if keeping load off your WooCommerce server matters more to you than capturing every server-side conversion during an outage. |
The setting is evaluated **per visitor session**, so each new visitor gets a fresh check — sessions automatically resume routing through the proxy as soon as it is reachable again.
:::tip
The default **fallback** option is recommended for most shops. It ensures conversion data is never lost, even during proxy outages or after you exceed your monthly quota. Note that fallback means the server-side events run on your WooCommerce server again, so the server load that the proxy normally offloads returns until the proxy resumes.
:::
## Quota Warnings
SweetCode Cloud plans include a monthly event limit. The Pixel Manager monitors your usage and alerts you as you approach the limit:
- **At 80% usage:** An opportunity card appears in the Pixel Manager dashboard suggesting you consider upgrading your plan.
- **At 100% usage (quota exceeded):** A high-priority notification appears. The proxy stops accepting new events until the next billing cycle or until you upgrade. Your server-side events are **not** lost by default — they fall back to direct sends from your WooCommerce server (see [Proxy Failure Behavior](#proxy-failure-behavior)). They are only dropped if you have explicitly chosen the **Drop server-side events** option.
You can view your current usage in the status panel or in the [SweetCode Cloud portal](https://portal.sweetcode.cloud).
## Disconnect
:::caution
Disconnecting is **permanent and destructive**. All connection data (sync token, domain configuration, callback tokens) will be wiped from the Pixel Manager. You will need to re-activate with a new sync token from the SweetCode Cloud portal.
:::
To disconnect:
1. Click the **Disconnect** button in the Server-Side Proxy section
2. Confirm the action in the dialog
After disconnecting, the Pixel Manager reverts to sending all server-side events directly from your WooCommerce server.
## Troubleshooting
### Routing Status Shows "Pending DNS"
- Verify that the CNAME record was added correctly: `ssp.yourshop.com → ssp.sweetcode.cloud`
- If using Cloudflare, ensure the record is set to **Proxied** (orange cloud)
- DNS propagation can take up to 24-48 hours in rare cases — try clicking **Verify DNS** in the [SweetCode Cloud portal](https://portal.sweetcode.cloud)
### Config Status Shows "Sync Error"
- Check the **Last Sync Error** message in the status panel for details
- Click **Sync Now** to retry
- Ensure your server can make outgoing HTTPS requests to `ssp.sweetcode.cloud`
- Check if a firewall or security plugin is blocking outgoing requests
### Events Not Appearing in the Portal
- Verify the overall status shows **Active** (all four conditions met)
- Flush all caches on your WooCommerce site
- Check the browser's developer tools Network tab for requests to your proxy subdomain
- Try using the **Test Connection** button to verify connectivity
### Quota Exceeded
When your SweetCode Cloud monthly event limit is reached, the proxy returns a `403` error and triggers a resync callback to the Pixel Manager. The Pixel Manager sets a `quota_exceeded` flag in its options and renders it into the JavaScript data layer on every page. This causes the frontend to stop routing events through the proxy — depending on your [Proxy Failure Behavior](#proxy-failure-behavior) setting, events will either fall back to direct sends from your WooCommerce server or be dropped.
#### Recovery Checklist
After upgrading your plan or waiting for the billing cycle to reset, follow these steps to restore proxy routing:
1. **Trigger a resync** — Do one of the following:
- Save your Pixel Manager settings (this automatically pushes a sync)
- Click **Sync Now** in the Server-Side Proxy section
- Click **Resync** on the domain detail page in the [SweetCode Cloud portal](https://portal.sweetcode.cloud)
- Or simply wait for the daily auto-sync (runs at 3:15 AM server time)
2. **Flush all page caches** — This is the most commonly missed step. Clear caches in:
- Your caching plugin (WP Rocket, LiteSpeed Cache, W3 Total Cache, WP Super Cache, etc.)
- Your hosting provider's cache (SiteGround, Kinsta, WP Engine, Cloudways, etc.)
- Cloudflare or any CDN in front of your site
- Varnish or any reverse proxy cache
3. **Verify** — Open a new browser tab (or incognito window), visit your store, and check the browser's Network tab for requests to your proxy subdomain (e.g. `ssp.yourshop.com`)
:::caution[Why flushing caches is critical]
The Pixel Manager renders the `quota_exceeded` flag directly into the HTML of every page. Even after a successful resync clears the flag server-side, **cached pages still contain the old flag** in their HTML output. Until those caches are flushed, visitors continue to see the stale state and events won't flow through the proxy.
Additionally, the Pixel Manager's JavaScript caches the SSP state in the browser's **sessionStorage** per tab. Existing visitor sessions that already saw the quota-exceeded state will continue using fallback until they open a new tab. This resolves automatically as sessions rotate — no manual action is needed for this part.
:::
For additional troubleshooting, see the [SweetCode Cloud Troubleshooting Guide](https://sweetcode.cloud/guides/troubleshooting).
---
# Server-Side Proxy
URL: https://sweetcode.com/docs/pmw/server-side-proxy/overview
# Server-Side Proxy
:::info
This is a feature only available in the pro plans of the Pixel Manager for WooCommerce purchased on [sweetcode.com](https://sweetcode.com). It is not available in the woocommerce.com version of the plugin.
:::
The Server-Side Proxy offloads server-side ad tracking events from your WooCommerce server to [SweetCode Cloud](https://sweetcode.cloud) — an edge network powered by Cloudflare Workers. Instead of your shop's PHP server sending every conversion API call to ad platforms (adding latency and CPU load), events are routed through a first-party subdomain (e.g. `ssp.yourshop.com`) to a Cloudflare Worker that fans them out to the ad platform APIs on your behalf.
## Why Use It
### Reduce Server Load
Every Conversion API (CAPI) event — `AddToCart`, `ViewContent`, `InitiateCheckout`, `PageView`, and more — normally requires your WooCommerce server to make an HTTP request to the ad platform's API. With the Server-Side Proxy, these browser-originated server-side events are handled at the edge, freeing your server's CPU and memory for serving customers.
### Improve Tracking Accuracy
Events are sent through a first-party subdomain on your own domain. Because the requests originate from your domain rather than a third-party tracking domain, they are significantly less likely to be blocked by ad blockers and browser privacy features.
### Automatic Failover
If the proxy is temporarily unreachable, the Pixel Manager can automatically fall back to sending events directly from your WooCommerce server — ensuring no conversion data is lost.
## How It Works
1. **Configuration sync:** The Pixel Manager securely pushes your ad platform credentials (pixel IDs and API tokens) to SweetCode Cloud, where they are encrypted at rest with AES-GCM.
2. **Browser events:** When a visitor triggers a tracking event (e.g. adds an item to the cart), the Pixel Manager sends the server-side event through your first-party subdomain (`ssp.yourshop.com`) instead of directly from your WooCommerce server.
3. **Edge fanout:** The Cloudflare Worker receives the event, decrypts the stored credentials, and forwards the event to all configured ad platform APIs simultaneously.
4. **Purchase events:** Purchase conversion events are also routed through the proxy, with automatic per-platform fallback to direct sends if the proxy is unreachable.
## Supported Platforms
| Platform | Browser Events | Purchase Events |
|------------|:--------------:|:---------------:|
| Meta (Facebook) | ✔️ | ✔️ |
| TikTok | ✔️ | ✔️ |
| Pinterest | ✔️ | ✔️ |
| Snapchat | ✔️ | ✔️ |
| Reddit | ✔️ | ✔️ |
:::info
Google Analytics 4 (GA4) is not proxied through the Server-Side Proxy. GA4's Measurement Protocol only sends purchase events server-side, and these are handled directly by the Pixel Manager.
:::
## Requirements
- Pixel Manager for WooCommerce **Pro** (version 1.57.0 or above)
- At least one server-side destination configured (e.g. Meta CAPI token + pixel ID)
- DNS access to your shop's domain (to add a CNAME record)
- A [SweetCode Cloud](https://sweetcode.cloud) account (free tier available)
## Next Steps
- [Setup Guide](https://sweetcode.com/docs/pmw/server-side-proxy/setup) — Step-by-step activation instructions
- [Management](https://sweetcode.com/docs/pmw/server-side-proxy/management) — Monitoring, syncing, and troubleshooting
- [FAQ](https://sweetcode.com/docs/pmw/server-side-proxy/faq) — Common questions and answers
---
# Setup
URL: https://sweetcode.com/docs/pmw/server-side-proxy/setup
# Setup
:::info
This is a feature only available in the pro plans of the Pixel Manager for WooCommerce purchased on [sweetcode.com](https://sweetcode.com). It is not available in the woocommerce.com version of the plugin.
:::
This guide walks you through activating the Server-Side Proxy from start to finish. The process involves creating a SweetCode Cloud account, setting up a proxy domain, configuring DNS, and connecting it to the Pixel Manager.
## Prerequisites
Before you begin, make sure you have:
- **Pixel Manager for WooCommerce Pro** installed and activated (version 1.57.0+)
- **At least one server-side destination** configured in the Pixel Manager (e.g. a Meta CAPI access token and pixel ID, a TikTok Events API token, etc.)
- **DNS access** to the domain where your WooCommerce shop is hosted
- A valid **email address** to sign up for SweetCode Cloud
## Step 1: Create a SweetCode Cloud Account
1. Go to [portal.sweetcode.cloud](https://portal.sweetcode.cloud)
2. Enter your email address and click **Sign In**
3. Check your inbox for the magic link and click it to access the dashboard
SweetCode Cloud uses passwordless authentication — no password to remember or manage.
:::info
A free plan is included by default. You can [upgrade](https://sweetcode.cloud/#pricing) at any time if you need higher request limits.
:::
## Step 2: Add Your Domain in the Portal
1. In the SweetCode Cloud dashboard, navigate to **Domains** in the sidebar
2. Click **Add Domain**
3. Enter your shop's domain (e.g. `yourshop.com`)
4. Optionally customize the subdomain prefix (default: `ssp`, resulting in `ssp.yourshop.com`)
5. Click **Add**
The portal will show you the CNAME record you need to add in the next step.
## Step 3: Configure DNS
Add a **CNAME record** in your domain's DNS settings:
| Type | Name | Target |
|-------|-------|-------------------------|
| CNAME | `ssp` | `ssp.sweetcode.cloud` |
Replace `ssp` with your chosen subdomain prefix if you customized it in the previous step.
:::caution[Cloudflare Users]
If your domain uses Cloudflare DNS, make sure the CNAME record is set to **Proxied** (orange cloud enabled). This is required for the proxy to work correctly with Cloudflare.
:::
After adding the DNS record:
1. Go back to the SweetCode Cloud dashboard
2. Click **Verify DNS** on your domain
DNS propagation can take a few minutes. If verification fails, wait a few minutes and try again.
:::info
For detailed DNS instructions for specific registrars (Cloudflare, Namecheap, GoDaddy, Vercel, and others), see the [SweetCode Cloud Domain Setup Guide](https://sweetcode.cloud/guides/domain-setup).
:::
## Step 4: Connect the Pixel Manager
1. In the SweetCode Cloud dashboard, go to your domain and copy the **Sync Token**
2. In the Pixel Manager, open **Server-Side → SweetCode Server-Side Proxy**
3. Paste the sync token into the **Sync token** field
4. Click **Activate**
The Pixel Manager will:
- Validate the sync token with SweetCode Cloud
- Fetch your domain configuration
- Automatically push all configured destination credentials (pixel IDs and API tokens) to SweetCode Cloud
On success, the status panel will appear showing your connection status. No manual sync is needed — your destinations are pushed automatically during activation.
:::caution[Important]
After activation, **flush all server-side caches** on your WooCommerce site:
- **Object cache** (Redis, Memcached, etc.)
- **Page cache** (WP Super Cache, W3 Total Cache, LiteSpeed, etc.)
- **Full-page caching** at the hosting level (Cloudflare, Varnish, etc.)
The Pixel Manager needs to output updated JavaScript configuration to the frontend. Cached pages will still contain the old configuration until the cache is cleared.
:::
## Step 5: Verify
After activation and cache clearing, verify that everything is working:
1. **Check the PMW status panel:** In the Pixel Manager, open **Server-Side → SweetCode Server-Side Proxy** and confirm:
- **Routing Status** shows **Active**
- **Config Status** shows **Synced**
- The overall status badge shows **Active**
2. **Check the SweetCode Cloud portal:** Navigate to **Events** > **Live** to see real-time event flow from your shop
3. **Browse your shop:** Visit a few product pages and add an item to the cart. Events should appear in the SweetCode Cloud portal within seconds.
:::tip
If you don't see events flowing, check the [Management & Troubleshooting](https://sweetcode.com/docs/pmw/server-side-proxy/management) page for common issues and solutions.
:::
## What Happens After Activation
Once activated, the Server-Side Proxy works automatically:
- **Browser events** (PageView, ViewContent, AddToCart, InitiateCheckout, etc.) are routed through your first-party subdomain to SweetCode Cloud, which forwards them to the configured ad platform APIs.
- **Purchase events** are also routed through the proxy, with automatic fallback to direct sends if the proxy is unreachable.
- **Config auto-sync** keeps your credentials up to date — when you change a CAPI token or pixel ID in the Pixel Manager, the new credentials are automatically pushed to SweetCode Cloud. A daily sync also runs to ensure everything stays in sync.
---
# Settings Reference
URL: https://sweetcode.com/docs/pmw/settings-reference
# Settings Reference
This page lists every setting of the Pixel Manager for WooCommerce under the exact name shown in the plugin's settings, with a short explanation and a link to the detailed documentation. Settings marked *Pro* require a [pro plan](https://sweetcode.com/plugins/pmw#pricing-section).
## Tracking Pixels
### Google (Ads & GA4) → Google Ads
[Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#configure-the-plugin).
- **Conversion ID** — Your Google Ads conversion ID (starts with AW-). In Google Ads go to Goals → Conversions → your conversion action → Tag setup. Required to track conversions. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#configure-the-plugin).
- **Conversion Label** — The conversion label for your Purchase action, shown beside the conversion ID in the same Google Ads tag setup. It pairs with the conversion ID to attribute purchases. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#configure-the-plugin).
Advanced settings:
- **Merchant Center ID** — Your numeric Google Merchant Center account ID, 6 to 12 digits. Find it in the Merchant Center URL, after a=. Enables Conversion Cart Data, which sends the items sold along with your Google Ads purchase conversions. Not the same as the Google Ads Conversion ID. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/#conversion-cart-data).
- **Business Vertical** *(Pro)* — Your store's category for Google dynamic remarketing. Options: “Retail”, “Education”, “Hotels and Rentals”, “Jobs”, “Local Deals”, “Real Estate”, “Travel”, “Custom”. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#google-business-vertical).
- **Phone Conversion Number** *(Pro)* — The phone number shown on your site, for Google call-conversion tracking. Use the same format displayed to visitors. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#phone-conversion-number).
- **Phone Conversion Label** *(Pro)* — The conversion label for your Google Ads call/phone conversion action. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#phone-conversion-number).
- **Conversion Adjustments: Conversion Name** *(Pro)* — The exact Google Ads conversion action name used for conversion adjustments (e.g. correcting or retracting values after refunds). [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments).
- **Conversion Adjustments: Feed URL** *(Pro, read-only)* — Read-only. Copy this URL into Google Ads → Tools → Conversions → conversion adjustments as the data source, so the Pixel Manager can supply adjustment data. Active once the conversion name above is set. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments).
### Google (Ads & GA4) → Google Analytics 4
[Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#connect-an-existing-google-analytics-4-property).
- **Measurement ID** — Your GA4 Measurement ID (starts with G-). In Google Analytics go to Admin → Data Streams → your web stream. Required to send data to GA4. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#connect-an-existing-google-analytics-4-property).
Advanced settings:
- **API Secret (for Measurement Protocol)** *(Pro)* — Measurement Protocol API secret for server-side GA4 events. Create it in the same Data Stream → Measurement Protocol API secrets. Leave it in place once set: while it is empty, purchases are sent from the browser instead, and orders paid in that window are recorded at the time they reach a paid status rather than their order date. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-api-secret).
- **Data API Property ID** *(Pro)* — Your numeric GA4 property ID (Admin → Property settings), used by the Data API to read attribution data back into your orders. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-property-id).
- **Data API Credentials** *(Pro)*
- **Page Load Time Tracking** *(Pro)* — Measures page load time and sends it to GA4 as an event — useful for spotting slow pages that hurt conversions. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#page-load-time-tracking).
- **Enhanced Link Attribution** — Lets GA4 distinguish multiple links pointing to the same URL in in-page analytics, for more accurate link reports. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#enhanced-link-attribution).
### Google (Ads & GA4) → Shared Google settings
Used by both Google Ads and Google Analytics. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google#google-tag-gateway-for-advertisers).
- **Enhanced Conversions** *(Pro)* — Sends hashed first-party data (e.g. email) with conversions to improve match rates and recover conversions lost to cookie limits. Requires accepting Google's enhanced-conversions terms. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google#enhanced-conversions).
- **User ID Feature** *(Pro)* — Sends a logged-in customer's User ID to GA4 so their sessions across devices are stitched into one user. Requires User-ID reporting enabled in GA4. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google#google-user-id).
- **Google Tag ID** *(read-only)* — The shared Google tag (gtag.js) ID used across Google Ads and Analytics. Read-only — derived automatically from your Google Ads Conversion ID (or your GA4 Measurement ID when no Ads ID is set). [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google#google-tag-gateway-for-advertisers).
- **Tag Gateway measurement path** *(beta)* — First-party path for the Google Tag Gateway, which serves Google's tags from your own domain to improve measurement resilience against ad blockers. Advanced — leave blank unless you've set up the gateway. Format: a leading slash + letters/numbers, e.g. /metrics. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/google#google-tag-gateway-for-advertisers).
### Meta → Meta (Facebook)
[Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/meta#find-the-pixel-id).
- **Pixel ID** — Your Meta (Facebook) Pixel ID. In Meta Events Manager go to Data Sources → your pixel → Settings. Required for Meta tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/meta#find-the-pixel-id).
Advanced settings:
- **Conversions API Token** *(Pro)* — Conversions API access token for sending events to Meta server-side — more reliable against ad blockers and iOS limits. Generate it in Events Manager → your pixel → Settings → Conversions API. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/meta/#meta-facebook-conversion-api-capi).
- **CAPI Test Event Code** *(Pro)* — Temporary code from Events Manager → Test Events to confirm your server-side events arrive. Remove it once verified. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/meta#testing).
- **Advanced Matching** *(Pro)* — Sends extra hashed customer identifiers with events to improve match quality and attribution. Data is hashed before it leaves your server. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/meta#meta-facebook-advanced-matching).
- **Send Facebook Login ID** *(Pro)* — Adds the Facebook Login ID (fb_login_id) to Conversions API events for customers who signed in with Facebook, which is a deterministic identifier and can improve your Event Match Quality score. Requires one of the supported social login plugins: Nextend Social Login, miniOrange Social Login, UsersWP Social Login, Super Socializer, Wapu Auth, Heateor Login or Easy Social Login. Meta can only match the ID when that plugin's Facebook app lives in the same Business Manager as this pixel. [Documentation](https://sweetcode.com/docs/pmw/features/facebook-login-id).
- **Domain Verification ID** *(Pro, beta)* — The domain-verification value from Meta Business Manager, output as a meta tag to verify ownership of your domain. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/meta#domain-verification).
### TikTok
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok).
- **Pixel ID** *(Pro)* — Your TikTok Pixel ID. In TikTok Ads Manager go to Assets → Events → Web Events → your pixel. Required for TikTok tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok).
Advanced settings:
- **Events API Token** *(Pro)* — TikTok Events API token for server-side events. Generate it in the same web-events pixel under Events API. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok#access-token).
- **EAPI Test Event Code** *(Pro)* — Test code from TikTok Events Manager to verify your server-side events. Remove it after testing. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok#access-token).
- **Advanced Matching** *(Pro)* — Sends extra hashed customer identifiers to improve TikTok event matching and attribution. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok#advanced-matching).
### Microsoft (Advertising & Clarity) → Microsoft Advertising
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising#setting-up-the-uet-tag).
- **UET Tag ID** *(Pro)* — Your Microsoft Advertising UET tag ID. In Microsoft Advertising go to Tools → UET tag. Required for conversion tracking and remarketing. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising#setting-up-the-uet-tag).
Advanced settings:
- **Enhanced Conversions** *(Pro)* — Sends hashed first-party customer data with conversions to improve match rates in Microsoft Advertising. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising#enhanced-conversions).
### Microsoft (Advertising & Clarity) → Microsoft Clarity
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/clarity).
- **Project ID** *(Pro)* — Your Microsoft Clarity project ID, from Clarity → Settings → Setup (it's the value in the tracking URL, e.g. clarity.ms/tag/q9zk3x7p2w). Enables Clarity heatmaps and session recordings. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/clarity).
### LinkedIn
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/linkedin#basic-setup).
- **Partner ID** *(Pro)* — Your LinkedIn Insight Tag partner ID. In Campaign Manager go to Account Assets → Insight Tag. Required for LinkedIn tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/linkedin#basic-setup).
Advanced settings:
- **View Content Conversion ID** *(Pro)* — The LinkedIn conversion ID for the View Content event, from Campaign Manager → Conversions. Maps this store event to the matching LinkedIn conversion. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/linkedin#event-setup).
- **Add to Cart Conversion ID** *(Pro)* — The LinkedIn conversion ID for the Add to Cart event, from Campaign Manager → Conversions. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/linkedin#event-setup).
- **Purchase Conversion ID** *(Pro)* — The LinkedIn conversion ID for the Purchase event, from Campaign Manager → Conversions. The key one for conversion reporting. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/linkedin#event-setup).
### Pinterest
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest).
- **Tag ID** *(Pro)* — Your Pinterest Tag ID. In Pinterest Ads go to Conversions → Pinterest tag. Required for Pinterest tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest).
Advanced settings:
- **Ad Account ID** *(Pro)* — Your Pinterest ad account ID, required to send events via the Conversions API. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest#ad-account-id).
- **Conversions API Token** *(Pro)* — Pinterest Conversions API token for server-side events. Generate it in Pinterest Ads → Conversions → API. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest#api-for-conversions-token).
- **Enhanced Match** *(Pro)* — Sends a hashed email with browser events to improve attribution (Pinterest Enhanced Match). [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest#enhanced-match).
- **Advanced Matching** *(Pro)* — Sends additional hashed customer data with Conversions API events to improve matching. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest#advanced-matching).
### Snapchat
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/snapchat).
- **Pixel ID** *(Pro)* — Your Snapchat Pixel ID. In Snapchat Ads Manager go to Events Manager → your pixel. Required for Snapchat tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/snapchat).
Advanced settings:
- **Conversions API Token** *(Pro)* — Snapchat Conversions API token for sending events server-side, improving reliability against browser limits. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/snapchat#conversions-api).
- **Advanced Matching** *(Pro)* — Sends extra hashed customer identifiers to improve Snapchat event matching. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/snapchat#advanced-matching).
### OpenAI
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/openai#setup-instruction).
- **Pixel ID** *(Pro)* — Your OpenAI pixel ID. Create it in the conversions tab of OpenAI Ads Manager. Required for OpenAI tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/openai#setup-instruction).
Advanced settings:
- **Conversions API Token** *(Pro)* — OpenAI Conversions API token (API key) for sending events server-side. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/openai#conversions-api-capi).
- **Advanced Matching** *(Pro)* — Sends extra hashed customer identifiers to improve OpenAI event matching. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/openai#advanced-matching).
### X → X (Twitter)
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#pixel-id).
- **Pixel ID** *(Pro)* — Your X (Twitter) Pixel ID. In X Ads go to Tools → Events Manager. Required for X conversion tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#pixel-id).
Advanced settings:
- **View Content Event ID** *(Pro)* — The X event ID for the View Content event, created in X Events Manager. Maps this store event to the matching X conversion. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
- **Search Event ID** *(Pro)* — The X event ID for the Search event, from X Events Manager. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
- **Add to Cart Event ID** *(Pro)* — The X event ID for the Add to Cart event, from X Events Manager. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
- **Add to Wishlist Event ID** *(Pro)* — The X event ID for the Add to Wishlist event, from X Events Manager. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
- **Initiate Checkout Event ID** *(Pro)* — The X event ID for the Initiate Checkout event, from X Events Manager. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
- **Add Payment Info Event ID** *(Pro)* — The X event ID for the Add Payment Info event, from X Events Manager. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
- **Purchase Event ID** *(Pro)* — The X event ID for the Purchase event, from X Events Manager. This is the key one for conversion reporting. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/twitter#event-setup).
### Reddit
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/reddit#basic-setup).
- **Advertiser ID** *(Pro)* — Your Reddit Pixel (advertiser) ID. In Reddit Ads go to Events Manager. Required for Reddit tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/reddit#basic-setup).
Advanced settings:
- **Conversions API Token** *(Pro)* — Reddit Conversions API token for sending events server-side. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/reddit#conversions-api-capi).
- **CAPI Test Event Code** *(Pro)* — Test code to verify your Reddit server-side events. Remove it after testing. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/reddit#testing).
- **Advanced Matching** *(Pro)* — Sends extra hashed customer identifiers to improve Reddit event matching. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/reddit#advanced-matching).
### Hotjar
[Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar#hotjar-site-id).
- **Site ID** — Your Hotjar Site ID, from Hotjar → Sites & Organizations. Enables Hotjar heatmaps and session recordings. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar#hotjar-site-id).
### Crazy Egg
*(Pro)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/crazyegg#crazyegg-account-number).
- **Account Number** *(Pro)* — Your Crazy Egg account number, found in your Crazy Egg install script/account. Enables Crazy Egg heatmaps and recordings. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/crazyegg#crazyegg-account-number).
### AdRoll
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/adroll#advertiser-id-and-pixel-id).
- **Advertiser ID** *(Pro)* — Your AdRoll advertiser ID, from AdRoll → Settings → Pixel. Both the advertiser ID and pixel ID are required. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/adroll#advertiser-id-and-pixel-id).
- **Pixel ID** *(Pro)* — Your AdRoll pixel ID, shown next to the advertiser ID in AdRoll → Settings → Pixel. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/adroll#advertiser-id-and-pixel-id).
### Outbrain
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/outbrain).
- **Advertiser ID** *(Pro)* — Your Outbrain marketer/advertiser ID, from the Outbrain Amplify dashboard. Required for Outbrain conversion tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/outbrain).
### Taboola
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/taboola).
- **Account ID** *(Pro)* — Your Taboola account ID, from Taboola Ads → Tracking → your pixel. Required for Taboola conversion tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/taboola).
### Contentsquare
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/contentsquare).
- **Tag ID** *(Pro)* — Your Contentsquare tag ID, from your Contentsquare project settings. Enables Contentsquare experience analytics. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/contentsquare).
### AB Tasty
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/ab-tasty).
- **Account ID** *(Pro)* — Your AB Tasty account ID, from your AB Tasty tag/account settings. Enables AB Tasty experimentation. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/ab-tasty).
### Optimizely
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/optimizely).
- **Project ID** *(Pro)* — Your Optimizely project ID, from your Optimizely snippet/project settings. Enables Optimizely experimentation. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/optimizely).
### VWO
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/vwo).
- **Account ID** *(Pro)* — Your VWO account ID, from VWO → Settings → SmartCode. Enables VWO testing and optimization. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/vwo).
### Triple Whale
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/triple-whale).
- **Enable Triple Whale** *(Pro)* — Loads the Triple Pixel for visitor journey tracking and attribution. Triple Whale identifies the shop by its domain — it must match the Shop URL in Triple Whale under Settings → Store. No pixel ID is required. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/triple-whale).
Advanced settings:
- **Orders API Key** *(Pro)* — Triple Whale API key with the "Orders: Write" scope, from Triple Whale under Data → APIs. When set, order records (including refunds) are synced server-side to the Triple Whale Orders API, which Triple Whale requires for attribution. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/triple-whale#orders-api).
### GroundTruth
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/groundtruth).
- **GTID** *(Pro)* — Your GroundTruth unique identifier (GTID), provided by your GroundTruth representative. One GTID covers all campaigns of your Ads Manager account. Enables omnichannel engagement and conversion tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/groundtruth).
### Criteo
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/criteo).
- **Account ID** *(Pro)* — Your Criteo account ID (partner ID), a numeric ID. Find it in Criteo Commerce Growth under Event Tracking, or request it from your Criteo representative. Required for Criteo OneTag tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/criteo).
Advanced settings:
- **Advanced Matching** *(Pro)* — Sends the SHA-256 hashed email address of logged-in customers and purchasers to Criteo to improve match rates and attribution. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/criteo#advanced-matching).
### Nextdoor
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/nextdoor).
- **Pixel ID** *(Pro)* — Your Nextdoor pixel ID, a UUID. Find it in Nextdoor Ads Manager under Assets > Pixels. Required for Nextdoor Universal Pixel tracking. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/nextdoor).
Advanced settings:
- **Conversion API Token** *(Pro)* — Nextdoor Conversion API bearer token for sending events server-side. Generate it in Nextdoor Ads Manager under the Ads API settings. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/nextdoor#conversion-api-capi).
- **Conversion API Test Event Code** *(Pro)* — Marks Conversion API events as test events in Nextdoor. Remove it after testing. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/nextdoor#testing).
- **Advanced Matching** *(Pro)* — Sends the SHA-256 hashed email address of logged-in customers and purchasers to Nextdoor to improve match rates and attribution. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/nextdoor#advanced-matching).
### Hyros
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/hyros).
- **Product Hash** *(Pro)* — The ph value of your Hyros Universal Script, from Hyros under Tracking → Universal Script. You can paste the whole script snippet, the product hash is extracted automatically. Loads the Universal Script and tags the add to cart, checkout and purchase milestones on the visitor journey. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/hyros).
Advanced settings:
- **Application Tag** *(Pro)* — The tag Hyros attributes to a visitor on landing, set in Hyros under Tracking → Universal Script in the Application Tag field. Leave empty to use the Hyros default of !clicked. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/hyros#application-tag).
### Mixpanel
*(Pro, beta)* [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel).
- **Project Token** *(Pro)* — Your Mixpanel project token, a 32 character hexadecimal string, from Mixpanel under Settings → Project Settings → Project Token. Sends the shop's e-commerce funnel to Mixpanel as events. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel).
Advanced settings:
- **Data Residency** *(Pro)* — The region your Mixpanel project is hosted in. Mixpanel does not ingest events sent to the wrong region. EU projects have a Mixpanel URL starting with eu.mixpanel.com, Indian projects with in.mixpanel.com. Options: “United States (default)”, “European Union”, “India”. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel#data-residency).
- **Ingestion API** *(Pro)* — Sends purchases and refunds to Mixpanel server-side through the Mixpanel Ingestion API, which recovers purchases lost to ad blockers and reports refunds Mixpanel would otherwise never see. The project token authenticates the requests, so no extra credential is needed. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel#ingestion-api).
- **Session Replay And Heatmaps** *(Pro)* — Records browsing sessions and heatmap data through the Mixpanel SDK. Session replay also has to be enabled in the Mixpanel project itself. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel#session-replay-and-heatmaps).
- **Autocapture** *(Pro)* — Lets Mixpanel capture clicks, form submissions and input changes on its own, on top of the e-commerce events the Pixel Manager sends. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel#autocapture).
- **User Identification** *(Pro)* — Identifies logged-in customers by their WordPress user ID and writes their email address, name and phone number to their Mixpanel user profile, which stitches sessions across devices into one Mixpanel user. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/mixpanel#user-identification).
## General
### General (General tab)
Settings that apply site-wide, regardless of your store platform.
- **Lazy-load the Pixel Manager** *(Pro)* — Defers the tracking library until the visitor's first interaction (click, scroll, key, touch), improving page-speed scores. Cart, checkout and order-received pages always load it immediately so conversions aren't missed. Small risk that very early events go untracked — leave off if in doubt. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#lazy-load-the-pixel-manager).
- **Load deprecated functions** — Keeps older Pixel Manager function and event names available for backward compatibility. Turn this off to ship less JavaScript — only keep it on if your custom front-end code relies on the old names. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#load-deprecated-functions).
## WooCommerce shop
### Order configuration (General tab)
- **Marketing value logic** — The conversion value reported to your ad platforms (Google Ads, Meta, …); statistics pixels always receive the full order value. Subtotal is the most conservative: it reports your product revenue only, so tax, shipping and surcharges added as an order fee are left out, and discounts, refunds and payment processor fees (Stripe, PayPal) are deducted. Total is what the customer paid. Profit margin reports only margin and needs a cost-of-goods source. Options: “Order subtotal — excl. tax & shipping (default)”, “Order total — incl. tax & shipping”, “Profit margin (Pro)”. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#marketing-value-logic).
- **Order duplication prevention** — Stops the same order being counted again if the order-received page is reloaded or revisited, keeping conversion counts accurate. Leave on; disable only for testing (it re-enables automatically after 6 hours). [Documentation](https://sweetcode.com/docs/pmw/shop#order-duplication-prevention).
- **Show tracking info in the order list** — Adds a Pixel Manager column to the WooCommerce orders list so you can see at a glance which orders were tracked — handy for spot-checking without opening each order. [Documentation](https://sweetcode.com/docs/pmw/diagnostics#order-list-info).
### Product data (General tab)
- **Product identifier** — Which product ID is sent to the ad platforms for dynamic remarketing. It must match the IDs in your product catalog/feed or remarketing won't match products — pick the option that matches your feed plugin (Post ID is the WooCommerce default). The gla_ option is for the Google for WooCommerce plugin, formerly named Google Listings & Ads. Options: “Post ID (default)”, “SKU”, “Post ID with woocommerce_gpf_ prefix (Google Product Feed)”, “Post ID with gla_ prefix (Google for WooCommerce)”. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#product-identifier).
- **Output product variations as separate items** — Reports the specific variation the customer viewed or bought (e.g. “Blue T-shirt, M”) for precise remarketing. Turn off only if your product feed contains parent products only, to avoid catalog mismatches. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#variations-output).
### Subscriptions (General tab)
- **Subscription value multiplier** *(Pro)* — Multiplies the initial subscription's value to reflect revenue from future renewals, so your ROAS accounts for lifetime value. Set it to your average number of orders per subscription (1.00 = no adjustment). [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#subscription-value-multiplier).
### Customer lifetime value (General tab)
- **Calculate LTV on orders** *(Pro, beta)* — Calculates each customer's cumulative lifetime value and includes it in the order data, the basis for value-based bidding and high-value-customer audiences. Refunds and cancellations update the affected customer automatically. After changing value or order-logic settings, or a value filter in your theme, run a recalculation below. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#active-lifetime-value-calculation).
### Extra order data output (General tab)
- **Output extra order data on order pages** *(Pro, beta)* — Displays the data sent to the marketing pixels on the order details page (and via the order URL in the browser console), to help you debug and understand your tracking. It does not send any extra data to the pixels. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#extra-order-data-output).
## Consent
### Google Consent Mode v2 (Consent tab)
Control how Google tags behave based on the visitor's consent state.
- **Enable Google Consent Mode v2 with standard settings** — Google tags honour the visitor's consent. When consent is denied, Google still receives cookieless, anonymised pings it can use for conversion modelling — recovering a large share of otherwise-lost conversions. [Documentation](https://sweetcode.com/docs/pmw/consent-management/google#google-consent-mode).
- **Enable Google TCF support** *(Pro)* — IAB Transparency & Consent Framework support for Google tags. [Documentation](https://sweetcode.com/docs/pmw/consent-management/google#google-tcf-support).
### Microsoft Ads Consent Mode (Consent tab)
- **Enable Microsoft Ads Consent Mode with standard settings** *(Pro)* — Microsoft tags check the visitor's consent (ad_storage granted/denied) before using cookies. There is no fallback modelling — unconsented conversions aren't tracked — so it's especially important in regions with mandatory consent (EU, UK, CH). [Documentation](https://sweetcode.com/docs/pmw/consent-management/microsoft#microsoft-ads-consent-mode).
### Explicit consent (Consent tab)
Require explicit opt-in before any tracking fires.
- **Enable Explicit Consent Mode** — While active, no pixels fire until the visitor gives consent. [Documentation](https://sweetcode.com/docs/pmw/consent-management/overview#explicit-consent-mode).
- **Enable Explicit Consent Mode** and **Restricted consent regions** work together: the regions field (shown as *Explicit Consent Regions* in the documentation) limits Explicit Consent Mode to the selected countries. [Documentation](https://sweetcode.com/docs/pmw/consent-management/overview#explicit-consent-regions).
## Server-Side
### General (Server-Side tab)
These settings apply to all server-side (server-to-server) events.
- **Send PageView events server-to-server** *(Pro)* — Sends PageView events to Meta and Snapchat from your server, making PageView tracking more reliable when browser-side tracking is blocked. Because it runs on every page load it adds server load — enable it when browser PageViews are unreliable and your server can handle the traffic. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#track-pageview-events-server-to-server).
- **Always send server-side events** *(Pro)* — Sends server-side events to the ad platforms even when the browser pixels never loaded (e.g. blocked by a consent banner or ad blocker). Browser tracking is unaffected — the server events fire independently. Use it to recover conversions on platforms that support cookieless / limited-data server integrations. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#always-send-server-side-events).
The Server-Side tab also manages the **SweetCode Cloud server-side proxy (SSP)**, which offloads server-side tracking events from your WooCommerce server to an edge network. [Documentation](https://sweetcode.com/docs/pmw/server-side-proxy/overview).
## Support
### Logger (Support tab)
Plugin logging for debugging.
- **Enable logger** — Records the plugin's activity to a log file you can download below — turn it on when diagnosing a tracking issue or before contacting support. [Documentation](https://sweetcode.com/docs/pmw/developers/logs#logger-activation).
- **Log level** — How much detail to record. Use Error/Warning for normal use; switch to Info or Debug while reproducing a problem. Options: “Error”, “Warning”, “Info”, “Debug”. [Documentation](https://sweetcode.com/docs/pmw/developers/logs#log-levels).
- **Log HTTP requests** *(Pro)* — Also records the outgoing server-side requests to the ad platforms — useful for debugging server-side (CAPI) delivery. [Documentation](https://sweetcode.com/docs/pmw/developers/logs#log-http-requests).
### Plugin data (Support tab)
Control what happens to the plugin's data when you delete the plugin.
- **Delete all plugin data on uninstall** — When enabled, deleting the plugin also removes all of its settings, backups, and stored data from the database. Leave off to keep your configuration if you reinstall later. This only takes effect when you delete (not just deactivate) the plugin. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#delete-plugin-data-on-uninstall).
## Other settings
- **Disable tracking for user roles** *(Pro)* (General tab) — Logged-in users in a checked role won't be tracked, keeping your own staff and admin visits out of your analytics and ad data. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#exclude-user-roles-from-tracking).
- **Scroll tracker thresholds** *(Pro)* (General tab) — Fires an engagement event in Google Analytics when visitors reach the configured scroll depths, e.g. 25, 50, 75, 100. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#scroll-tracker).
- **Restricted consent regions** *(Pro)* (Consent tab) — Countries where cookie-based tracking only activates after the visitor gives consent; requires Explicit Consent Mode. Documented as Explicit Consent Regions. [Documentation](https://sweetcode.com/docs/pmw/consent-management/overview#explicit-consent-regions).
- **Manual LTV recalculation** *(Pro, beta)* (General tab) — Recalculates the customer lifetime value across all customers on demand. [Documentation](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#lifetime-value-calculation-recalculation).
---
# Plugin Installation
URL: https://sweetcode.com/docs/pmw/setup/plugin-installation
# Plugin Installation
1. Upload the plugin into your plugins directory /wp-content/plugins/
2. Activate the plugin through the ‘Plugins’ menu in WordPress
3. Get the Google Ads conversion ID and the conversion label. You will find both values in the Google Ads conversion tracking code. Get the conversion ID and the conversion label
4. In the Pixel Manager, open **Tracking Pixels → Google (Ads & GA4)**, then enter the conversion ID and the conversion label into the **Conversion ID** and **Conversion Label** fields, and save.
---
# Requirements
URL: https://sweetcode.com/docs/pmw/setup/requirements
# Requirements
## Versions
:::caution
We only support the most current versions of WooCommerce, WordPress, and PHP.
:::
There is some backward compatibility, but if things break you will need to make sure that you're running the most current versions of WooCommerce, WordPress, and PHP.
We won't provide support for old versions of WooCommerce, WordPress, or PHP.
The minimum recommended requirements for WordPress and WooCommerce are here:
- [WordPress minimum requirements](https://wordpress.org/about/requirements/)
(The lowest PHP version that WordPress runs on is [hard coded in the source code](https://github.com/WordPress/WordPress/blob/b90c2adb7f65b610c84db80fa35b66cc036e1a66/wp-includes/version.php#L40).)
- [WooCommerce minimum requirements](https://woocommerce.com/document/server-requirements/)
## Payment gateways
**The plugin is 100% compatible with all payment gateways that redirect buyers to the payment confirmation page after a purchase.**
Generally this is the case for on-site payment gateways.
Off-site payment gateways on the other hand cause problems.
:::caution
We generally recommend **avoiding off-site payment gateways** because they can impair the conversion tracking significantly. We've seen conversion tracking drops to just 20% of what should have been measured. Such low tracking accuracy also impairs campaign optimization.
:::
Why do off-site payment gateways impair conversion tracking so much?. Here are the main reasons:
- The conversion tracking happens on the purchase confirmation page.
- The off-site payment gateway needs to be configured properly in order to redirect to the WooCommerce purchase confirmation page after a payment. If that redirect doesn't work, no conversions can be tracked at all.
- Some off-site payment gateways don't automatically redirect back to the purchase confirmation page, but only after a click on a button by the buyer. Many buyers don't click that button.
- Buyers may stop automatic redirects to the purchase confirmation page after they see that the purchase has been confirmed by the payment provider.
### What are off-site and on-site payment gateways?
- **Off-site payment gateways** redirect the visitor away from the shop domain to a domain belonging to the payment provider. They usually try to redirect the visitor back to purchase confirmation page of the WooCommerce shop after the payment has been confirmed. But this doesn't always work.
- **On-site payment gateways** keep the visitor on the shop domain for checkout and usually automatically redirect to the WooCommerce purchase confirmation page once the payment has been confirmed.
### General recommendations
**Please avoid the PayPal standard payment gateway that comes pre-installed with WooCommerce.**
WooCommerce has list of available payment gateways . Make sure to choose an on-site payment gateway.
---
# Script Blockers
URL: https://sweetcode.com/docs/pmw/setup/script-blockers
# Script Blockers
> Script blockers can cause issues when using the plugin in the back-end. As consequence the settings page can appear broken.
Everyone who is reading this article knows that the plugin's purpose is to track visitors and their actions on a WooCommerce shop. In order to achieve this, the plugin injects tracking pixels provided by popular advertising platforms like Google or Meta (Facebook).
On the other hand, ad and script blockers have emerged due to annoying ads and privacy concerns and user tracking.
Because of the plugin's purpose it was added to some privacy filter lists which are being used by some ad and script blockers.
While this is totally fine for visitors on the front-end of a shop, it can cause issues on the back-end of a shop. The plugin uses a few admin scripts in the back-end in order to make the interface faster and easier to use. But if those scripts are blocked, the interface may appear broken.
:::info
The simplest way to fix issues with the plugin in the WooCommerce back-end, caused by script blockers, is to disable the script blocker, or whitelist the shop domain in the script blocker.
:::
We tested the most popular ad and script blockers with the plugin. Most of them work fine with the plugin, but some block the admin scripts. Where possible, we've whitelisted the plugin admin scripts.
Ad or script blocker | compatible | whitelisted
--- | --- | ---
**Adblock** | ✔️ |
**Adblock Plus** | ✔️ |
**AdBlocker Ultimate** | ❌ |
**AdGuard AdBlocker** | ✔️ |
**Fair AdBlocker** | ✔️ |
**Ghostery** | ✔️ |
**uBlock Origin** | ✔️ | ✔️
---
# Shop
URL: https://sweetcode.com/docs/pmw/shop
# Shop
## Order Duplication Prevention
> The order duplication prevention logic uses several methods to prevent orders to be double counted. Without that logic Google Analytics, Meta (Facebook) and other pixels would often count the same order twice.
The toggle is in the Pixel Manager under **General → Order configuration**, labelled **Order duplication prevention**. It should stay enabled; only turn it off temporarily for testing (it re-enables automatically after 6 hours).
Order duplication is more common than expected. In average revenue reports can become inflated by 10% to 20%, sometimes even more. This is not within tolerable limits. Therefore, we implemented a few smart methods to prevent purchase conversion pixels to be fired more than once.
### Basic Cookie Based Duplication Prevention
The basic order duplication prevention uses cookies and the browser storage to detect if a browser tries to send the same conversion more than once. When a conversion is fired, that conversion is saved within the same browser. If the visitor reloads the page, or revisits the page after a while, the Pixel Manager prevents the conversion pixels to be fired again. This method alone brings the inflated revenue down to 2% - 4%.
Better, right? We can do even more!
### Advanced Server Based Duplication Prevention
The advanced order duplication prevention (which is available for pro users only, available [here](https://sweetcode.com/plugins/pmw#pricing-section)) adds one more layer of duplication prevention. Once the browser based duplication prevention has run, we also store that event in the WooCommerce order database. No matter on which device the purchase confirmation is re-opened, this method will prevent the conversion to be fired ever again.
### Exception
The only exception on how duplication prevention works is Google Ads. Since the Pixel Manager sends the transaction ID with every order, Google does its own deduplication on the side of Google Ads. That sometimes takes several hours. So it can happen that some conversions show as duplicates on the same day but will be removed over night. This has no negative impact on the bidding algorithm, as Google only uses deduplicated data for optimization.
### Ignore Failed Orders
The Pixel Manager detects orders with failed payments and doesn't fire the conversion pixels in order to increase measurement accuracy.
## Lifetime Value
The Pixel Manager tracks the lifetime value (LTV) of your customers. This is a very important metric for your business. It tells you how much revenue a customer has generated over his lifetime on your shop.
The Pixel Manager calculates two different LTVs:
- **Total Order Value LTV**: This is the **sum of the total order value** of all orders of a customer with the same billing email address.
- **Marketing Order Value LTV**: This is the **sum of the marketing order value** of all orders of a customer with the same billing email address. The marketing order value is based on what you set in the [Marketing Value Logic](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#marketing-value-logic). This can be the order total, the order subtotal (without shipping, taxes, etc.), the profit margin or whatever you define in the [marketing conversion value filter](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter).
The Pixel Manager uses this LTV to send to the marketing pixels (for the ones that support LTV).
### View the Lifetime Values
The Pixel Manager comes with an order modal that shows the LTVs of a customer. It is available on the order edit page.

### Why are there two different total order value LTVs?
The total order value LTV is calculated by the Pixel Manager is different from the total order value LTV that you see in the WooCommerce customer history modal.

The reason is that the Pixel Manager uses the billing email address to calculate the LTV. WooCommerce on the other hand uses the customer ID to calculate the LTV. That should be the same, right? Unfortunately, it is not. Existing customers sometimes may log in to do another purchase, sometimes they don't and use the guest checkout. When they use the guest checkout WooCommerce doesn't save the order under the same customer ID. But it is save to assume that the customer is the same if the billing email address is the same.
That's why the Pixel Manager uses the billing email address to calculate the LTV.
Is the Pixel Manager's approach the correct one?
There are arguments for both approaches. Both have their pros and cons. Considering all pros and cons we think that the Pixel Manager's approach is closer to reality.
---
# Testing
URL: https://sweetcode.com/docs/pmw/testing
# Testing
## Console Logger (Recommended)
The **Pixel Manager Console Logger** is the fastest way to debug and verify your tracking setup. It shows real-time information about all tracking events, pixel calls, and system status directly in your browser's developer console.
**Quick Start:**
1. Add `?pmwloggeron` to any page URL
2. Open browser DevTools (F12) → Console tab
3. Interact with your site (add to cart, checkout, etc.)
4. See detailed tracking information in real-time
[Learn more about the Console Logger →](developers/console-logger.md)
---
## Test order
> In order to find out if the conversion tracking works, the best way is to test it by placing an order and wait until conversion is reported. Please follow the instructions **exactly**. All steps are important in order to ensure a valid test.
1. Turn off any kind of caching and / or minification plugins (because they can break the tracking code)
2. In the Pixel Manager, open **General → Order configuration** and turn off **Order duplication prevention** (remember to re-enable order duplication prevention once done with testing)
2. Log out of the shop
3. Turn off any kind of ad or script blocker in your browser (because they can disable the tracking code)
4. Search for one of your keywords and click on one of your ads
5. Purchase an item from your shop
6. Wait up to 48 hours until the conversion shows up in Google Ads. (usually it takes only a few hours). When you look at the report in Google Ads make sure the date range includes the dates of the ad click and the current date.
:::info
The plugin by default prevents duplication of orders on the order confirmation page. This logic can be turned off in the Pixel Manager under **General → Order configuration** via the **Order duplication prevention** toggle for temporary testing. Sometimes it is more convenient to keep the setting enabled and use the URL parameter `nodedupe` on the purchase confirmation page. When added to the purchase confirmation URL, all deduplication logic will be turned off. Example: Take the order confirmation URL `https://example.test/checkout/order-received/123/?key=wc_order_123abc` add a `&` and then add `nodedupe`. You should end up with this URL: `https://example.test/checkout/order-received/123/?key=wc_order_123abc&nodedupe`
:::
## Test with Google Tag Assistant
> Install Google Tag Assistant from here [Google Tag Assistant Extension](https://chrome.google.com/webstore/detail/tag-assistant-by-google/kejbdjndbnbjgmefkgdddjlbokphdefk)
1. In the Pixel Manager, open **Support → Debug report**
2. Look at the debug report and copy the "Last order URL"

3. Log out of the shop
4. Open the "Last order URL" in a new tab or window
5. Enable the Google Tag Assistant for this page

6. Reload the page
7. Check the conversion tag

:::info
Checking the conversion tag this way will only confirm that the tag fires correctly, and that data is transmitted to Google. But, if you haven't set the correct conversion ID and label, the conversion will never reach your Google Ads account. Make sure to set the correct conversion ID and label too.
:::
## Confirm if the Google Ads Pixel is sending data
1. Open Google Ads
2. Go to > Tools & Settings > Measurement > Conversions
3. Hover over the tracking status of the purchase conversion

>If the `last seen` date is a recent date, or if the date is the date of the last purchase registered in WooCommerce, then tracking works fine.
:::info
The `last conversion recorded` date indicates the date of the last conversion **that was triggered by an ad**. This can be a much older date then the `last seen` date.
:::
## Testing Tools
> This is a set of testing tools. They can help you to verify and inspect the events that the pixels emit while you are interacting with the website.
- Google: [Google Tag Assistant Chrome extension](https://chrome.google.com/webstore/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk) (legacy) or the new [tagassistant.google.com](https://tagassistant.google.com) with the [Tag Assistant Companion Chrome extension](https://chrome.google.com/webstore/detail/tag-assistant-companion/jmekfmbnaedfebfnmakmokmlfpblbfdm)
The legacy Chrome extension is a bit easier to use, but sometimes shows unnecessary warnings or simply can freeze from time to time.
The new [tagassistant.google.com](https://tagassistant.google.com) reports event data more reliably, but is more difficult to use.
- Meta (Facebook): [Meta (Facebook) Pixel Helper Chrome extension](https://chrome.google.com/webstore/detail/facebook-pixel-helper/fdgfkebogiimcoedlicjlajpkdmockpc)
- Microsoft Ads (formerly Bing): [UET Tag Helper Chrome extension](https://chrome.google.com/webstore/detail/uet-tag-helper-by-microso/naijndjklgmffmpembnkfbcjbognokbf)
- Twitter: [Twitter Pixel Helper Chrome extension](https://chrome.google.com/webstore/detail/twitter-pixel-helper/jepminnlebllinfmkhfbkpckogoiefpd)
- Pinterest: [Pinterest Tag Helper Chrome extension](https://chrome.google.com/webstore/detail/pinterest-tag-helper/gmlcbajhgoaaegmlbaclmmmhpmfdajmp)
- Reddit: [Reddit Pixel Helper Chrome extension](https://chromewebstore.google.com/detail/reddit-pixel-helper/ebgpcjlgganlidigifggjjiglghjnjcj)
- Snapchat: [Snap Pixel Helper Chrome extension](https://chrome.google.com/webstore/detail/snap-pixel-helper/hnlbfcoodjpconffdbddfglilhkhpdnf)
- TikTok: [TikTok Pixel Helper Chrome extension](https://chrome.google.com/webstore/detail/tiktok-pixel-helper/aelgobmabdmlfmiblddjfnjodalhidnn)
---
# Troubleshooting
URL: https://sweetcode.com/docs/pmw/troubleshooting
# Troubleshooting
## First Step: Use the Console Logger
Before troubleshooting manually, enable the **Console Logger** to see exactly what's happening with your tracking:
1. Add `?pmwloggeron` to your page URL
2. Open browser DevTools (F12) → Console tab
3. Look for Pixel Manager output showing events, pixel calls, and errors
The Console Logger will immediately show you:
- ✅ Which events are firing (or not firing)
- ✅ What data is being sent to each pixel
- ✅ Consent status and script loading issues
- ✅ Detailed error messages
[Complete Console Logger Guide →](developers/console-logger.md)
---
## General
### Where can I report a bug or suggest improvements?
Please post your problem in the WordPress support forum for this plugin: [Support forum](https://wordpress.org/support/plugin/woocommerce-google-adwords-conversion-tracking-tag)
Alternatively, you can send a request to [support@sweetcode.com](mailto:support@sweetcode.com). If you do, in the Pixel Manager open **Support → Debug report**, click **Generate debug report**, then copy and paste it into the email.

### The most common issues in case the pixels don't work
- Caching: If you run some caching layer, the server might still serve cached versions of the pages. You will need to delete the cache.
- Minification, combination, and concatenation: Some minification and combination plugins mangle up the injected JavaScript code to an extent, that the tracking pixels stop working. You will need to turn minification, combination, and concatenation off and try again.
If you need the exact scripts, paths and endpoints to exclude in your caching or optimization plugin, see [Caching and Optimization Exclusions](https://sweetcode.com/docs/pmw/caching-and-optimization).
If only *some* events are missing while others still work, the cause is usually more specific than the two above. For the Meta pixel in particular, if `PageView` arrives but `AddToCart`, `InitiateCheckout` and `Purchase` never do, see [Meta silently drops AddToCart, InitiateCheckout and Purchase (restricted business category)](#meta-silently-drops-addtocart-initiatecheckout-and-purchase-restricted-business-category). In that case, Meta is blocking the events and no website-side change can fix it.
### Is pmw_get_cart_items slowing down my website?
Short answer: **No**
Long answer:
First some information on what `pmw_get_cart_items` is doing.
> While a visitor is browsing a shop he might add some products to the cart. Each time he uses the minicart to modify his selection, by adding or removing products, we need to make sure to have all product information handy in order to send pixel events with all relevant data to Google, Meta (Facebook), etc. Unfortunately, it is not possible to include this information on page load within the HTML code, because caching mechanisms could serve outdated data to the browser. That's why we need a mechanism like `pmw_get_cart_items` that will fetch all the current product data for the minicart from the server.
And now to the question *if* `pmw_get_cart_items` is slowing down the website.
Some users have noticed in the network tab of their browsers that the `pmw_get_cart_items` call adds one more request, which on slow servers can take even more than a second to fulfill. It is using the standard WordPress Ajax function to fetch the product data.
But is this **not** slowing down the website?
The `pmw_get_cart_items` call happens **after** the browser has signaled the `load` event, *which happens after all content has already been successfully loaded*.
:::info
The load event is fired when the whole page has loaded, including all dependent resources such as stylesheets and images.
:::
Reference: [Mozilla MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/Window/load_event)
:::info
PageSpeed measures the loading time of your page starting from the initial request to when the last embedded resource (JS, CSS, images, etc.) has finished loading. So that’s essentially when $(window).load() is triggered.
:::
Reference: [Lèse Majesté's answer on Stackoverflow](https://webmasters.stackexchange.com/a/39512/51846)
So the `pmw_get_cart_items` doesn’t slow down the download or rendering of a WooCommerce shop in any way.
### My theme shows a script code on the front end that shouldn't be there
The Pixel Manager uses a script output to track products in a way that works with every caching system.
It outputs that code wrapped in a `` tags which is fully compliant HTML code.
Because the code is wrapped in `` tags the theme should ignore the code and not output it visibly to the front end.
There is nothing we can do from our side. You have to ask the theme developer to update the theme to ignore all code that’s wrapped in `` tags.
### Elementor Related Products and Upsell Products Widgets
:::info
This has been fixed in version 3.9.0 of Elementor Pro. Please update to that version (or higher).
:::
In its current version the Elementor Related Product and Upsell Product Widgets don't properly process the ``. All those HTML elements **are invisible elements by definition** and should not be visibly rendered. However, some JavaScript helper libraries don't account for those invisible elements and render some or all of them visibly nonetheless.
This needs to be fixed by the developers of those render libraries. The Pixel Manager cannot work around this issue.
### Product grids that show the code as text
**Problem**
The code shows up as visible text inside the product cards of a product grid, for example on the shop page, on category pages or in a grid you built with a page builder.
The Pixel Manager adds a hidden marker element and a small inline `
```
Replace `YOUR_PIXEL_ID_HERE` with the actual pixel ID. The call queues onto `fbq` before the Pixel Manager initializes the pixel; when `fbevents.js` processes the queue, it honors the `autoConfig` setting and skips loading the server-delivered configuration that drives automatic event detection.
If you run [additional Meta pixels](https://sweetcode.com/docs/pmw/developers/php-filters#additional-facebook-pixels) through the `pmw_facebook_pixel_identifiers` filter, the `autoConfig` setting is per pixel. Repeat the `fbq('set', 'autoConfig', 'false', ...)` line once for every pixel ID you want to cover.
:::warning
Solution 2 is more aggressive than Solution 1. While Solution 1 turns off only the automatic event detection feature, Solution 2 disables the **entire** server-delivered plugin configuration from Meta. This also turns off:
- **Automatic Advanced Matching DOM scraping** — Meta's pixel scanning the page for additional matching keys such as emails in forms. The Pixel Manager's own advanced matching from order data continues to work.
- **Meta-managed CAPI Gateway / `openbridge`** — if the pixel is configured to send a server-side copy through Meta's managed gateway. Users who rely on the Pixel Manager's built-in [Server-to-Server / Conversions API](https://sweetcode.com/docs/pmw/plugin-configuration/meta) feature are **not** affected, because that is a separate code path. Users who relied (sometimes unknowingly) on Meta's managed CAPI Gateway would see that data stream stop.
- **Microdata-derived enrichment** of legitimate events (extra `custom_data` fields scraped from page markup). For Pixel Manager users this is usually negligible because the Pixel Manager already supplies rich event data.
- **`SubscribedButtonClick` and microdata events** (auto-fired engagement events that some advertisers use for audience building).
- **Future Meta pixel features** delivered through `pluginConfig` will not reach the pixel until you update the snippet or remove the `autoConfig` disable.
Because of these broader side effects, Solution 1 is preferred for most users. Solution 2 is documented because it is sometimes necessary, but the two are not equivalent.
:::
**If neither solution stops the duplicates**
If you've already disabled automatic event detection (Solution 1) or disabled `autoConfig` in code (Solution 2) and duplicate `Purchase` events still appear, the cause is most likely a separate, well-known intermittent bug in Meta's `fbevents.js` tracking library itself — not the automatic event detection feature. Continue to the [next entry](#duplicate-events-persist-even-with-automatic-event-detection-disabled-fbeventsjs-library-bug) and run the one-URL test described there to confirm and fix it.
**Why the Pixel Manager doesn't auto-fix this**
The duplicate is fired from within Meta's `fbevents.js` after the Pixel Manager has already handed off to it, so the Pixel Manager cannot intercept it from its own code path. The Pixel Manager could expose an `autoConfig`-disable toggle, but the broader side effects listed above mean it would not be safe to enable by default for all users. The Pixel Manager already uses standard event ID conventions (`pmw_` for purchases and `pmw_` for other events), which is what makes these Meta-generated duplicates easy to identify in the first place.
### Duplicate events persist even with automatic event detection disabled (`fbevents.js` library bug)
:::info
**When to use this entry:** Use this when you have already ruled out the more common causes — no other Meta pixel implementations on the site, and **Track Events Automatically Without Code** is already turned off in Meta Events Manager (see [the previous entry](#duplicate-purchase-event-caused-by-metas-automatic-event-detection)) — and duplicates still appear. This is a known intermittent bug in Meta's `fbevents.js` tracking library. The fix is to load an older, known-good version of `fbevents.js`. There is a one-URL test you can run on the order confirmation page to confirm the cause in under a minute.
:::
It has proven to be difficult to convince Meta (Facebook) support to fix this. Luckily the Pixel Manager has a built-in workaround.
**Quick test: load an older `fbevents.js` from the URL**
You can confirm whether this bug is the cause by loading an older version of Meta's `fbevents.js` library just for one page load, by appending a query parameter to the URL of the page where you see duplicates (typically the order confirmation page, e.g. `/checkout/order-received/...`).
1. Pick an older version to test against. Version `2.9.84` has proven to work in our tests. We track a few historical versions in this repository: https://github.com/alewolf/fbqevent.js
2. Append `fbevents-version=2.9.84` to the page URL — for example:
`https://example.com/checkout/order-received/12345/?key=...&fbevents-version=2.9.84`
3. Open the page and watch Meta Events Manager or the browser Network tab. If the duplicate `Purchase` events stop, you have confirmed it is a tracking-library bug. If they continue, it is something else — go back and re-check duplicate pixel implementations on the site, or the [automatic event detection entry](#duplicate-purchase-event-caused-by-metas-automatic-event-detection).
**Permanent fix**
Once the URL test confirms the cause, use the following filter to force the Pixel Manager to always load that older `fbevents.js` version for every visitor:
```php title="/wp-content/themes/your-theme/functions.php"
add_filter('pmw_facebook_fbevents_script_version', function () {
return '2.9.84';
});
```
:::info
Make sure to clear all server-side cache (caching plugin, page cache, CDN) after adding the filter, otherwise visitors will keep getting the cached page with the current `fbevents.js` URL.
:::
:::tip
Even when automatic event detection is already off in Events Manager, this URL test is worth running early in any duplicate-events investigation — it takes seconds and rules in or out the most common remaining cause.
:::
### Extra events caused by Meta's Event Setup Tool rules
:::info
**Quick summary:** If Meta Events Manager shows extra `Purchase`, `AddToCart`, `InitiateCheckout`, or other standard events that fire when a visitor clicks a button — with no event ID and usually no value — the events are fired by point-and-click **Event Setup Tool** rules stored on the pixel in Meta Events Manager, not by the Pixel Manager. Remove the rules in Events Manager under **Data sources → select your pixel → Settings → Event setup → Manage**.
The Pixel Manager (version 1.64.0 and higher) detects these rules automatically and shows a warning in the **Opportunities** tab and in the debug report when active rules are found on your pixel.
:::
**Symptom**
Event counts in Meta Events Manager are inflated, and purchase values are wrong or missing. Looking closer, extra standard events fire whenever a visitor clicks a specific button — for example a `Purchase` event on every click of the place-order button, even when the payment fails and no order is created. The extra events carry no event ID, so Meta cannot deduplicate them against the correctly tracked events the Pixel Manager sends, and they usually carry no value or a value scraped from the page.
**Why this happens**
Meta's **Event Setup Tool** lets anyone with access to the pixel define events by pointing and clicking on elements of the website — typically "fire a `Purchase` when a button containing this text is clicked". These rules were often set up long ago, by an agency, or during an earlier tracking setup attempt, and merchants rarely know they still exist.
The rules are not stored on your website. They are stored on the pixel itself and delivered to every browser through the pixel's public configuration file at `https://connect.facebook.net/signals/config/`, as `estRules` (event rules) and `iwlExtractors` (value extraction rules that scrape amounts out of the page's HTML). When a rule matches, `fbevents.js` fires the event directly, completely outside the Pixel Manager's code path.
Because these rule-based events have no event ID, deduplication is impossible. The result is systematic double counting: one correct, deduplicated event from the Pixel Manager, plus one rogue event from the rule. A `Purchase` rule bound to the place-order button is the worst case, because it fires on every click attempt, including failed payments, and typically without the order value.
**How to identify this specific cause**
- **Pixel Manager 1.64.0 and higher:** open the Pixel Manager and check the **Opportunities** tab. If active Event Setup Tool rules are found on your pixel, a warning card lists the affected event names per pixel. The same information appears in the debug report under **Meta Event Setup Tool**.
- **Manually:** open `https://connect.facebook.net/signals/config/` (replace `` with your pixel ID) in a browser and search the file for `estRules`. Rules with `"rule_status":"ACTIVE"` and a `"derived_event_name"` fire the named event. Also search for `iwlExtractors`, which lists value extraction rules.
- **In the Network tab:** on the page where the extra event fires, open Chrome DevTools, filter for `facebook.com/tr`, and click the button in question. Rule-fired requests carry a `cd[cs_est]=true` parameter and no `eid` in the Pixel Manager's `pmw_` format.
**Solution: remove the rules in Meta Events Manager**
1. Sign in to Meta Business Manager and open **Events Manager**.
2. In the left sidebar, select **Data Sources** and click the relevant pixel.
3. Click the **Settings** tab.
4. Scroll to the **Event setup** section and click **Manage**.
5. Delete or deactivate all rules listed there. The Pixel Manager already tracks all shop events with deduplication and accurate values, so none of these rules are needed.
After a short propagation delay (usually minutes, at most until the configuration cache expires), the pixel configuration no longer contains the rules and the rogue events stop.
:::tip
The `autoConfig` snippet from [Solution 2 of the automatic event detection entry](#duplicate-purchase-event-caused-by-metas-automatic-event-detection) also stops Event Setup Tool rules, because it prevents `fbevents.js` from loading the server-delivered configuration that carries them. Removing the rules in Events Manager is still the better fix, because it stops the rogue events for every site and integration that uses the pixel.
:::
### Facebook Ads Manager shows more conversions than WooCommerce orders
This is one of the most common questions we receive. Before anything else, establish the ground truth: **Ads Manager applies attribution modeling (attribution windows, view-through credit, delayed restatements) on top of the raw events, so only Meta Events Manager can tell you whether an event actually fired more than once.** Pick one known order, find its `Purchase` events in Events Manager (match by time and value), and count them. Exactly one deduplicated event per order means the tracking is correct and the discrepancy is Ads Manager reporting behavior. More than one event means real duplication; work through the following checklist in order:
1. **Check for duplicate pixel implementations.** Make sure only *one* plugin or code snippet fires the Meta pixel on your site. If you're running Pixel Manager alongside another Meta tracking plugin or have manual pixel code in your theme, remove the duplicates. Use Meta Events Manager → Test Events to verify.
2. **Disable Automatic Events in Meta Events Manager.** Go to Events Manager → your Pixel → Settings → turn off **Automatic Events** (sometimes labeled **Track Events Automatically Without Code**). This Meta feature fires events on top of your existing pixel implementation and can inflate conversion numbers. If you can pattern-match the duplicate event ID against the format `pmw_<16 chars>_`, this is almost certainly the cause — see [the dedicated entry](#duplicate-purchase-event-caused-by-metas-automatic-event-detection) for the full diagnosis.
3. **Remove Event Setup Tool rules.** Point-and-click rules stored on the pixel fire extra events on button clicks, without an event ID and usually without a value. The Pixel Manager (1.64.0+) warns about these in the Opportunities tab — see [the dedicated entry](#extra-events-caused-by-metas-event-setup-tool-rules).
4. **Verify CAPI deduplication.** If you're using both the browser pixel and the Conversions API, check that events in Events Manager show as "Deduplicated." If they don't, ensure that one plugin handles both sides. The Pixel Manager automatically generates matching `event_id` values for proper deduplication. Splitting browser pixel and CAPI between different tools is a common cause of double-counting. See also: [Facebook CAPI Deduplication and Match Key Parameters](https://sweetcode.com/blog/facebook-capi-deduplication-and-match-key-parameters).
5. **Check which events you're counting as conversions.** In Ads Manager, if your campaign counts both AddToCart and Purchase as conversions, both events appear in the "Conversions" column. Make sure to look at only purchase conversions in Ads Manager, not the aggregate "Conversions" or "Results" column, which may include other events like AddToCart or form submissions.
Keep in mind that Facebook purchase conversions should always be **lower** than the total number of WooCommerce orders, because Facebook only attributes conversions to ad interactions. If Facebook is reporting more purchase conversions than your total WooCommerce orders, that's a clear signal of a technical issue.
For a comprehensive explanation of all causes, see our blog post: [Why Facebook Shows More Conversions Than WooCommerce Orders](https://sweetcode.com/blog/facebook-conversion-discrepancies).
### Meta silently drops AddToCart, InitiateCheckout and Purchase (restricted business category)
:::info
**Quick summary:** If Meta Events Manager receives `PageView` and `ViewContent` but never `AddToCart`, `InitiateCheckout`, `AddPaymentInfo` or `Purchase`, and there is no error anywhere, then Meta is most likely blocking those events because of the **business category** your pixel is classified under. Health and wellness is by far the most common category affected. The block is enforced inside Meta's own `fbevents.js` library, and the Conversions API (CAPI) does not bypass it. No plugin, snippet or setting on your website can send these events while the restriction is active. It has to be resolved on Meta's side, in Events Manager, by getting the business category corrected or reviewed.
The Pixel Manager (version 1.64.0 and higher) detects the restriction automatically and names the blocked events in the browser console and in the debug report under **Meta Business Category Event Restrictions**.
:::
**Symptom**
Tracking looks broken, but only for the lower part of the funnel:
- `PageView` and `ViewContent` arrive in Meta Events Manager as usual.
- `AddToCart`, `InitiateCheckout`, `AddPaymentInfo` and `Purchase` never arrive, not in Events Manager, not in the Test Events tool, not even for a test purchase you make yourself.
- The browser console shows no error. The Pixel Manager console logger (`?pmwloggeron`) reports that it fired the event.
- In the browser Network tab there is **no** request to `facebook.com/tr` for the missing events, while the requests for `PageView` and `ViewContent` are there.
- Switching Meta plugins, reinstalling, clearing caches, disabling consent management, or enabling the Conversions API changes nothing.
Because add to cart and purchase are exactly the events shop owners care about, this looks like a plugin bug. It is not. The Pixel Manager calls `fbq('track', 'AddToCart', ...)` normally, Meta's library accepts the call without complaint and then discards it.
**Why this happens**
Meta restricts what data it will accept from advertisers in sensitive verticals. When a pixel belongs to a business that Meta has categorized as restricted, most commonly **health and wellness** (for example medical devices, medical alert systems, supplements, pharmacies, clinics, therapy and mental health services, medical test kits), Meta blocks the lower-funnel conversion events for that pixel and keeps only the more generic ones.
The restriction lives on the pixel, not on your website. Meta delivers it to every browser through the pixel's public configuration file at `https://connect.facebook.net/signals/config/`, as an `eventValidation` entry that lists the blocked event names in `restrictedEventNames`. Meta's `fbevents.js` library reads that list and, whenever your site tracks one of those events, drops it before it is sent. Nothing reaches Meta, and nothing is logged as an error.
Two consequences are worth spelling out, because both are frequently assumed to be workarounds and neither is:
- **The Conversions API does not help.** The restriction is applied to the data source (the pixel and the domain), not to the transport. Server-side events for a restricted event name are received by Meta and then discarded, so sending `Purchase` through CAPI does not get it counted. Buying a Pro version of any plugin for the sake of CAPI will not fix this.
- **Renaming or faking the events does not help either.** Sending the data as a custom event with a different name may get the event through, but it will not be usable as a standard conversion event for optimization, and misrepresenting restricted data can put the ad account at risk. The correct path is to fix the categorization with Meta.
Pixels in restricted categories often also carry a `protectedDataMode` entry in the same configuration file, which strips custom parameters from the events that *are* allowed through. So even the surviving events can arrive with less data than you sent.
**How to identify this specific cause**
- **Pixel Manager 1.64.0 and higher:** open any shop page with `?pmwloggeron` appended to the URL and look at the browser console. If the pixel is restricted, the Pixel Manager logs a warning that names every blocked event. The same information is in the debug report (**Support → Debug report**) under **Meta Business Category Event Restrictions**.
- **Manually, in the pixel configuration:** open `https://connect.facebook.net/signals/config/` in a browser (replace `` with your own pixel ID) and search the file for `restrictedEventNames`. If you find a non-empty list, those event names are the ones Meta blocks. Example of what a restricted pixel looks like:
```json
{"unverifiedEventNames":[],"restrictedEventNames":["AddPaymentInfo","AddToCart","AddToWishlist","InitiateCheckout","Purchase"]}
```
- **Manually, at runtime:** on any page of your shop, in the browser console, run:
```js
JSON.stringify(fbq.instance.pluginConfig.get('', 'eventValidation'))
```
- **Control test:** in the browser console, track one event from the restricted list and one event that is *not* on the list, then compare. Only the unrestricted one produces a request to `facebook.com/tr`:
```js
fbq('track', 'Purchase', {value: 1, currency: 'USD'}) // on the restricted list: no request is sent
fbq('track', 'Search', {search_string: 'test'}) // not on the list: request is sent
performance.getEntriesByType('resource').filter(r => r.name.includes('facebook.com/tr')).map(r => r.name)
```
This is the definitive test. It proves that the events are being handed to Meta's library correctly and that the library is the one dropping them.
**Solution: check the category and event blocking in Meta Events Manager**
The restriction is applied to the data source (your pixel and domain), so it has to be resolved in Meta Events Manager. Meta moves its interface around regularly, so treat the labels below as a guide rather than a fixed path:
1. Sign in to Meta Business Manager and open **Events Manager**.
2. Select **Data sources** and click the affected pixel.
3. Open the **Settings** tab and look for **Manage data source categories** (click **Manage**). This is where the business category Meta has assigned to your data source is shown, and where you can self-categorize it.
4. Still in **Settings**, look for **Manage event blocking** (click **Review**). This lists the events Meta currently blocks for this data source. The list should match what the Pixel Manager reports in the console and the debug report.
5. If the categorization is wrong for your shop, correct it there and, where Meta offers it, request a review. If the categorization is correct, the restriction is a policy decision by Meta and it applies to every tracking solution you could use, including Meta's own.
6. While the restriction is active, optimize campaigns on the events Meta still accepts (for example `PageView`, `ViewContent`, `Search`, or lead events), and use your shop reporting, GA4 or the Pixel Manager's accuracy reports for actual revenue numbers.
Meta applies these restrictions in tiers. The common one blocks the standard conversion events (`Purchase`, `AddToCart`, `Lead` and similar) while leaving the rest working, which produces exactly the symptom described here. A stricter tier stops all event sharing for the domain, in which case even `PageView` disappears. Ads can keep running and stay approved the whole time, which is why the blocking is so easy to mistake for a broken tracking setup.
Meta's own references: [About data source categories in Meta Events Manager](https://www.facebook.com/business/help/1402913027039332) and [How to manage data source categories in Meta Events Manager](https://www.facebook.com/business/help/467621355878794).
:::tip
This is worth checking early whenever a shop in a sensitive vertical reports that "the pixel only tracks page views". It takes one look at `restrictedEventNames` in the pixel configuration to rule in or out, and it saves days of chasing a plugin, theme or consent problem that does not exist. A useful sanity signal: if the missing events are missing for *everyone*, including a test purchase you make yourself with no ad blocker, and the successful events still work, the cause is almost never on the website.
:::
## Incompatible Plugins
### WC Custom Thank You
> Plugin homepage: [link](https://wordpress.org/plugins/wc-custom-thank-you/)
:::info
The plugin creates a custom order thank-you page for WooCommerce but doesn't follow the WooCommerce standard for the order confirmation page. In order for conversion pixels to fire on the WooCommerce order confirmation page, every WooCommerce theme must implement the correct output for the `is_order_received_page()` conditional. This is valid for plugins that modify the purchase confirmation page too. On top of that, the WC Custom Thank You plugin has not been updated in a long time and the developer has stopped to answer support requests.
:::
## Google Ads
### Misconfigured Bidding Strategy
> It can happen that Google Ads throws the warning "**Misconfigured bidding strategy**". The hover text shows "**Your campaign is running with limited performance. Set up conversion tracking for your account to improve your performance, spending and see reporting**".
:::info
Unfortunately, this warning sometimes is thrown even if conversion tracking is set up just fine.
:::
Typically, the warning is thrown on Smart Shopping campaigns. Additionally, conversion tracking for Smart Shopping campaigns has more requirements in order to run well. If those are not met, the same warning is thrown.
1. First make sure that conversion tracking has been set up correctly. Double-check the conversion ID and conversion label.
2. Make sure that the product ID type is the same as the one you use in Google Merchant Center. The product IDs must match.
3. Smart Shopping campaigns require at least 30 conversions within a time frame of the past 30 days. And, in order for them to be able to use the remarketing lists, there must be at least 100 visitors per list in the past 30 days. Once the requirements are matched, the warning will go away.
4. Make sure that the bidding strategy uses the the correct budget type. Depending on your settings you might have to use a different budget type. A single budget per campaign generally works fine. But if you're using shared budgets, you must make sure that all campaigns in the same shared budget use the same bidding strategy.
5. If you don't think you can match the requirements in the near future it is better to run a standard shopping campaign.
### Conversion Adjustment Upload Shows Errors
> When checking the conversion adjustment upload report in Google Ads, you see errors like *"This conversion does not exist"* or *"The conversion action specified in the adjustment request cannot be found."* You may also receive **email notifications** from Google or see **warnings on your campaigns** about conversion adjustment issues.
:::info
This is expected behavior. The Pixel Manager includes all refunded and cancelled orders in the conversion adjustment feed, not just orders that came from Google Ads. Google Ads will show errors for orders it can't match to a Google Ads conversion (e.g., orders from organic search, email, or other ad platforms). This is [exactly what Google recommends](https://support.google.com/google-ads/answer/7686447) and can be safely ignored.
Google has recently started sending email notifications and displaying campaign-level warnings about these expected errors. Despite looking alarming, they are triggered by the same expected behavior and can be safely ignored. This is an inconsistency on Google's side. Their warning system flags behavior that their own documentation tells you to expect.
**How to verify everything is working:** Open your upload report in Google Ads (Goals → Conversions → Uploads). You should see a mix of successful and failed rows. Successful rows confirm that adjustments for actual Google Ads conversions are being applied correctly.
If **all** rows fail, verify that the conversion name in the Pixel Manager matches the Google Ads conversion name exactly, and that the upload runs from the correct Google Ads account. See the [Conversion Adjustments setup guide](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments) for details.
For a detailed explanation, read our blog post: [Why Google Ads Shows Errors for Conversion Adjustment Uploads](https://sweetcode.com/blog/google-ads-conversion-adjustment-warnings).
:::
### Issue: ID never received
Sometimes Google Ads shows a warning saying the ID was never received. Unfortunately, that warning is shown even in cases, where everything works perfectly fine.
You can check yourself if IDs are being received in the audience report. Switch the graph to > Parameters > ID hits. If you see a graph like the following everything is ok, and you can dismiss the warning and don't need to continue reading further.

If you see incoming ID hits in the graph and still want to investigate the warning further, please ask Google support.
On the other hand, if you don't see ID hits in the graph, please continue reading.
It doesn't mean that Google Ads is always wrong when it comes to that warning. There are cases where the Google Ads warning can be right. Here is a list of possible causes:
- You've set the wrong conversion ID. Double-check and correct it if necessary.
- When setting up the remarketing audiences you've enabled `retail` **and** the `custom` audience. The plugin can only send the signal for one or the other, not for both (which would not make sense anyway). So one of those verticals never receives an ID (usually `custom`), in which case you will see that warning show up regularly, but usually can dismiss it. Unfortunately the `custom` vertical can not be turned off once enabled.
- There is some reason that is blocking the remarketing script from sending events correctly, usually some kind of JavaScript optimization plugin.
Make sure that none of the above reasons are causing this problem.
The best way to check if the ID is being sent is to use the [Google Tag Assistant](https://tagassistant.google.com/)
Here's how to check:
1. Open the Google Tag Assistant: [tagassistant.google.com](https://tagassistant.google.com/)
2. In Google Tag Assistant instruct to open one of your product pages.
3. If the product page is a variable product, select the drop-down(s) to choose one variation.
4. Then switch back to the Google Tag Assistant tab.
5. In the middle pane click on dataLayer.

6. In the left sidebar click on the view_item event. If you've also set up Google Analytics, you will see several view_item events. Click through each of those until you see in the dataLayer the event that is sending events to your Google Ads conversion ID.
7. Once you find the correct event, check if the ID is being sent. If so, all is good. You have proof that the ID **is** being sent and the warning is wrong. You can dismiss it.

8. If you like you can also take those results and ask Google Ads support to fix that warning. (It would be a great help for us because we investigate way too many of those false positive warnings.)
### The measured conversion value is too high in Google Ads
Situation: The measured conversion value is too high in Google Ads. When comparing the conversion value of each transaction in the Google Ads website report with the actual transaction value in WooCommerce, the Google Ads conversion value is higher than the actual transaction value.
Here's how that might look in the Google Ads website report. When comparing the conversion value with the actual transaction value in WooCommerce, the Google Ads conversion value is higher than the actual transaction value:

This can be explained by one or several of the following reasons:
- **You've enabled one or several campaigns to bid higher for new customers:** In that case, Google Ads will increase the conversion value for new customers by the set value. This is a feature of Google Ads and not a bug.

You might experience this only while using using the Pixel Manager. The reason is that the Pixel Manager is one of the few tracking code managers that is able to distinguish between new and existing customers and sends the `new_customer` parameter to Google Ads as described in the [Google Ads documentation](https://support.google.com/google-ads/answer/12080169).
- **You are using the Pixel Manager [conversion value filter](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter) to increase the conversion value:** In that case, the conversion value will be increased by the conversion value determined by the filter. This is a feature of the Pixel Manager and not a bug. Read more about the conversion value filter [here](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter).
### Tag not placed correctly warning
Google Ads, under certain circumstances, throws a warning that the tag is not placed correctly. Here are the most common reasons for this warning:
- Pixel Manager Lazy Loading: The Pixel Manager pro version offers lazy loading of the tracking scripts. This is great to speed up the website. The tracking scripts get immediately loaded upon interaction with the website (mouse movement, scrolling, keyboard input, etc.). However, that also means that the tracking scripts are not loaded immediately when the Google bot crawls the website. This can cause the warning. If you see this warning, you can safely ignore it, or you can disable the lazy loading feature in the Pixel Manager under **General → General** via the **Lazy-load the Pixel Manager** toggle.
- Third-party plugins: Some JavaScript optimization plugins can change the loading order of the Pixel Manager und thus cause the warning.
We haven't seen any measurable impact on the tracking quality when using the Pixel Manager lazy loading feature. We can't speak for third-party plugins. In general we would say, if you see the warning, but everything else is working fine, you can safely ignore it.
If you however feel better without the warning, you can disable the lazy loading feature in the Pixel Manager under **General → General** via the **Lazy-load the Pixel Manager** toggle, or disable the third-party plugin that causes the warning.
## GA4
### Unassigned traffic in GA4
GA4 may show transactions coming from unassigned traffic. The most common reason for this is when you're using the GA4 Measurement Protocol.
Using the GA4 Measurement Protocol has one main advantage. It tracks all transactions with the correct revenue value. You should see the revenue match the revenue in WooCommerce very closely.
The trade-off is channel attribution. The Measurement Protocol also captures orders from visitors whose browser-side GA4 tag never ran, for example because of an ad blocker, a consent banner, or a payment gateway redirect. Those orders arrive in GA4 with the correct revenue, but without a channel, so GA4 files them under Unassigned.
#### Why this happens
A Measurement Protocol event carries no traffic source of its own. GA4 attributes it by joining it to a session that the visitor's browser already created. The Pixel Manager reads the `client_id` from the `_ga` cookie and the `session_id` from the `_ga_` cookie, and sends both along with the order.
- If the browser-side GA4 tag ran at some point during the visit, that session exists. GA4 joins the purchase to it, and the purchase inherits the channel of that session.
- If the browser-side GA4 tag never ran, there is no session to join to. GA4 receives a purchase that it cannot place in any channel, and reports it as Unassigned.
The share of Unassigned purchases is therefore a rough measure of how often your browser-side GA4 tag is being blocked. The lever that reduces it is making the browser-side tag more resilient, not changing what the server sends.
:::tip
When no `client_id` could be read, the Pixel Manager sends a generated fallback that looks like `anon_76413.1786483870`. If you are investigating specific orders in the logs and want to know which identifier was actually sent, and why, see [GA4 `anon_*` client IDs](https://sweetcode.com/docs/pmw/ga4-anon-client-id). That page also explains why an `HTTP 204` response and a set `wpm_google_analytics_4_mp_purchase_hit` flag do not prove that GA4 attributed the purchase.
:::
#### Why the GCLID cannot be sent instead
A common assumption is that the Pixel Manager could attach the Google Ads click ID (the `GCLID`, stored in the `_gcl_aw` cookie) to the Measurement Protocol event through a parameter such as `session_traffic_source_last_click.google_ads_campaign.gclid`, and that GA4 would then attribute the purchase to Paid Search.
That is not possible. `session_traffic_source_last_click` is a field in GA4's [BigQuery export and reporting schema](https://support.google.com/analytics/answer/7029846), which means it is something GA4 writes as the *result* of its own attribution. It is not a parameter that the [Measurement Protocol](https://developers.google.com/analytics/devguides/collection/protocol/ga4) accepts on incoming events. The Measurement Protocol reference documents no traffic source or click ID input at all, and [Google's documented remedy](https://support.google.com/analytics/answer/9900444) for unattributed server-side events is the one described above: send the `session_id` of the visitor's existing session.
There is consequently no setting for this in the Pixel Manager, no filter to enable it, and no workaround through a WooCommerce hook. Adding the GCLID to the payload would simply have no effect, because GA4 ignores the parameter.
:::info
Your **Google Ads** conversions are not affected by any of this. The Pixel Manager stores the click ID on the order and uses it for Google Ads attribution independently of GA4's channel reports. An order that shows up as Unassigned in GA4 can still be attributed correctly in Google Ads.
:::
#### What you can do
- **Make the browser-side GA4 tag harder to block.** Since every attributed purchase needs a browser session, anything that helps the browser-side tag run also reduces Unassigned. [Google Tag Gateway for advertisers](https://sweetcode.com/docs/pmw/plugin-configuration/google#google-tag-gateway-for-advertisers) serves the Google tag from your own domain and is the most effective measure here.
- **Check your consent setup.** If visitors are not granting statistics consent, the browser-side tag cannot run and those purchases cannot be attributed.
- **Accept the trade-off.** Unassigned purchases still carry the correct revenue. Your totals stay accurate, only the channel breakdown is incomplete.
- **Or turn the Measurement Protocol off.** You can disable it in the Pixel Manager under **Tracking Pixels → Google (Ads & GA4)** by clearing the **API Secret (for Measurement Protocol)** field. Keep in mind that this also gives up the accurate transaction and revenue tracking, and GA4 will then report fewer orders than WooCommerce.
It is worth mentioning that there are other limitations using the GA4 Measurement Protocol. Some of the limitations are listed in the following support article: [GA4 Measurement Protocol limitations](https://sweetcode.com/docs/pmw/faq#ga4-measurement-protocol-limitations)
---
# Videos
URL: https://sweetcode.com/docs/pmw/videos
---
# OpenAI Ads Tracking for WooCommerce: Measure Your ChatGPT Campaigns
URL: https://sweetcode.com/blog/openai-ads-tracking-woocommerce
Date: 2026-07-29
Tags: pixel-manager, openai, chatgpt, conversion-api, capi, woocommerce, conversion-tracking, server-side-tracking

ChatGPT has become a place where people decide what to buy, and OpenAI now sells ads inside those conversations. Six months ago, joining that program meant a six-figure spending commitment. Today the minimum is gone, the sign-up is self-serve, and any WooCommerce store in a supported country can run a campaign.
The Pixel Manager tracks those campaigns end to end. Not just a page view, but the full shopping funnel, purchases sent server-side, and the ChatGPT click reference that connects a conversation in ChatGPT to the order it produced.
## TL;DR
- The Pixel Manager supports the **OpenAI (ChatGPT) measurement pixel** and the **OpenAI Conversions API**, available from version **1.60.0** (Pro).
- **There is no minimum spend to advertise in ChatGPT anymore.** The gates today are a supported country, business verification, and a payment method.
- **Conversion tracking is a hard prerequisite** for OpenAI's conversion-optimized (oCPC) campaigns, and it has to be standard events, not custom ones.
- The Pixel Manager covers **all five points** on OpenAI's own "how to improve measurement quality" checklist, including the one almost everybody misses: preserving the click reference through redirects.
- Setup is two fields: your pixel ID and, optionally, a Conversions API token.
## Who Can Advertise in ChatGPT Right Now
This changed fast, so it is worth getting the current state on the record.
### The budget barrier is gone
When OpenAI first tested ads in ChatGPT in early 2026, it worked with a hand-picked group of advertisers. OpenAI never published a price of entry, but the trade press reported minimum commitments in the low hundreds of thousands of dollars: [eMarketer put the figure at roughly $200,000](https://www.emarketer.com/content/chatgpt--200k-minimums-ad-beta-signals-openai-s-push-monetize-scale), citing Adweek proposals in the $100,000 to $250,000 range for campaigns running February through March.
On [May 5, 2026, OpenAI announced](https://openai.com/index/new-ways-to-buy-chatgpt-ads/) the beta self-serve Ads Manager, CPC bidding, and pixel plus Conversions API measurement. [Digiday reported](https://digiday.com/marketing/openai-opens-up-chatgpt-ads-manager-to-the-u-s-while-promising-third-party-measurement-cpa-bidding/) that the $50,000 minimum spend requirement was dropped at the same time, opening the platform to advertisers of all sizes.
Today, neither OpenAI's [Ads Manager documentation](https://help.openai.com/en/articles/20001206-ads-manager-beta-overview) nor its [budget](https://help.openai.com/en/articles/20001413-daily-budgets) or [FAQ](https://help.openai.com/en/articles/20001220-frequently-asked-questions) pages mention a minimum spend or a minimum daily budget at all. You set an average daily budget and OpenAI paces against it.
### What you actually need today
Per OpenAI's own [account setup documentation](https://help.openai.com/en/articles/20001213-ads-manager-beta-account-setup), the real gates are administrative rather than financial:
- **A business in a supported country.** As of this writing the [Ads Manager is available](https://help.openai.com/en/articles/20001245-ads-manager-availability) in Australia, Canada, Japan, Korea, New Zealand, the United Kingdom, and the United States. Outside those markets you can register interest through OpenAI's advertiser interest form.
- **An OpenAI account plus business details:** business name, website, logo, and industry.
- **Identity and business verification** through Persona, followed by an account review. OpenAI assesses whether your products or services are eligible under its Ads Policies. Reviews run in a rolling queue and take time, and OpenAI states it cannot expedite them.
- **Billing set up before delivery:** a billing profile and a credit card. Ads will not serve without them.
- **Your account name and logo filled in.** They appear in the ad unit, and ads do not serve until this step is complete.
- **Ad review.** Each ad has to be approved before it can serve.
One detail worth planning around: the country, billing currency, and time zone you pick at account creation **cannot be changed later**. Getting them wrong means creating a new advertiser account.
### Who will see your ads
OpenAI does not show ads to users on Plus, Pro, or any Business plan, nor to users it believes are under 18. Ads appear below ChatGPT responses as a single sponsored unit with an advertiser name, favicon, headline, description, image, and landing page.
Buying is CPM (the Reach objective), CPC (the Clicks objective), or conversion-optimized CPC (the Conversions objective), settled in a relevance-weighted second-price auction. For CPC campaigns, OpenAI currently [recommends starting with a maximum bid of $3 to $5 per click](https://help.openai.com/en/articles/20001207-ads-in-chatgpt-the-basics).
### The one eligibility requirement that is about tracking
Here is the part that matters most for this article, and the reason we are writing it now.
Conversion tracking is not required to run a plain CPM or CPC campaign. But it **is** a hard prerequisite for OpenAI's [conversion-optimized (oCPC) campaigns](https://help.openai.com/en/articles/20001412-conversion-optimized-campaigns), the ones that actually optimize delivery toward purchases instead of clicks. OpenAI's requirements before you can create one:
- Conversion tracking set up for the ad account, via the Conversions API, the JavaScript pixel, or both.
- **At least one supported standard conversion event** available. Custom conversion events are not supported for oCPC.
- A decision on which event the campaign should optimize toward. It cannot be changed afterwards, and an existing CPM or CPC campaign cannot be converted to oCPC.
Read that second point twice, because it is where homegrown tracking setups fall down. Firing a custom event called `woo_purchase` does not qualify. OpenAI wants `order_created`, `items_added`, `checkout_started` and the rest of [its standard taxonomy](https://developers.openai.com/ads/supported-events), with the right event type and the right value format. The Pixel Manager sends exactly those, which we will come to in a moment.
Practically speaking: get tracking healthy **before** you want to run conversion campaigns, not after. The event history you accumulate now is what those campaigns will optimize against.
## OpenAI's Measurement Quality Checklist, Point by Point
OpenAI publishes a list of five things advertisers should do to [improve measurement quality](https://help.openai.com/en/articles/20001409-conversion-measurement). It is a remarkably good specification, and it is the honest way to evaluate any tracking plugin, ours included. Here is the list, and what the Pixel Manager does about each item:
| OpenAI's recommendation | What the Pixel Manager does |
| --- | --- |
| Install the pixel across relevant pages and send conversion events when the action occurs | Loads the pixel shop-wide and fires the standard events from real WooCommerce hooks, with product data, values, and currency filled in |
| Preserve the click reference (`oppref`) through redirects and landing-page navigation | Reads it from OpenAI's first-party cookie, with its own landing-page capture as a fallback, and stores it on the order |
| Include the click reference with server-side events when available | Attaches it as a top-level field to every Conversions API event, including purchases and subscription events |
| Provide eligible advanced matching data where permitted | Optional Advanced Matching sends normalized, SHA-256 hashed customer identifiers |
| Use the pixel and Conversions API together, with the same event ID for the same conversion | Browser and server events share one event ID, so OpenAI deduplicates them into a single conversion |
Five for five. The interesting one is the second.
## The ChatGPT Click Reference (oppref)
When a visitor arrives from ChatGPT, the landing page URL carries an `oppref` parameter: OpenAI's privacy-preserving click reference. It is what lets OpenAI connect a purchase back to the specific ChatGPT interaction that started it. OpenAI's [Conversions API documentation](https://developers.openai.com/ads/conversions-api) is explicit that the API will not find this value for you. You capture it and pass it along yourself.
Between the landing page and the purchase event, there is a lot of room for that value to get lost:
- The customer browses for a week before buying.
- They leave your site to pay at PayPal, Klarna, or a bank redirect, and come back on a fresh page load.
- They pay by bank transfer and the order is only marked paid three days later, long after the browser session ended.
The Pixel Manager reads the click reference from OpenAI's first-party cookie and, as a fallback, from the landing page URL it captured itself. That belt-and-braces approach is deliberate: the cookie does not persist on every site configuration and does not survive every cross-domain redirect, and our own capture covers those cases. The value is then stored with the order and attached to every Conversions API event, so delayed payments are covered too, because the reference lives on the order rather than in a browser session.
You do not configure any of this. It happens automatically. It shipped in version **1.64.0**.
## The Rest of the Integration
### The measurement pixel
The Pixel Manager loads OpenAI's measurement SDK and fires the standard events across your shop. No template edits, no manual event snippets, no theme hooks. Here is how your WooCommerce funnel maps onto OpenAI's taxonomy:
| Shop event | OpenAI event | Event type |
| --- | --- | --- |
| Page view | `page_viewed` | contents |
| Product view | `contents_viewed` | contents |
| Add to cart | `items_added` | contents |
| Checkout start | `checkout_started` | contents |
| Purchase | `order_created` | contents |
| Subscription trial start | `trial_started` | plan_enrollment |
| Subscription sign-up | `subscription_created` | plan_enrollment |
| Lead (via shortcode) | `lead_created` | customer_action |
Order values are converted into the integer minor units OpenAI expects, including the currencies people usually get wrong: Japanese Yen has no decimals, Bahraini Dinar has three. Send `129.99` where OpenAI expects `12999` and your reported revenue is off by two orders of magnitude.
### The Conversions API
The browser pixel alone is the fragile half of any measurement setup. Ad blockers remove it, tracking protection restricts it, and a customer who closes the tab the moment their payment provider confirms the order never loads the thank-you page at all.
The Conversions API sends the same events from your server, and in the Pixel Manager **purchase conversions always go server-side**, whether or not you route them through SweetCode Cloud. If you do run [SweetCode Cloud](https://sweetcode.com/docs/pmw/server-side-proxy/overview), events are delivered from the edge instead of your web server, which takes the outbound HTTP calls off your checkout path entirely.
One small convenience: OpenAI does not use a test event code the way Meta or Snapchat do, so there is no extra field to fill in and nothing to remember to remove before going live.
### Consent is respected
The OpenAI pixel belongs to the **marketing** consent category. If a visitor declines marketing consent, no OpenAI events fire in the browser, and since version 1.62.0 the [server-side purchase event is withheld as well](https://sweetcode.com/blog/server-side-purchase-events-honor-visitor-consent). Every withheld event is written to the logger, so you can always see why something was not sent. OpenAI's own guidance asks advertisers to send conversion data only where permitted and with the necessary consents in place.
## Setting It Up
Two fields, five minutes.
1. In the OpenAI Ads Manager, open the **Conversions** tab and create a pixel, which is your data source. Copy its **Pixel ID**.
2. In WordPress, go to **WooCommerce → Pixel Manager → Tracking Pixels → OpenAI**, paste the pixel ID, and save.
3. For server-side tracking, create an **API key** for the pixel in the OpenAI Ads Manager, then paste it into the **OpenAI Conversions API token** field under **Show advanced settings**.
That is it. The events, the click reference, the deduplication, and the value conversion are all handled for you. The full walkthrough is in the [OpenAI setup documentation](https://sweetcode.com/docs/pmw/plugin-configuration/openai).
## What We Would Do First
If you are considering ChatGPT ads, the sequence that makes sense to us:
1. **Start the account verification now.** OpenAI reviews applications in a rolling queue and will not expedite them, so this is the long pole, not your tracking setup.
2. **Install the measurement before the first campaign.** Set up the pixel and the Conversions API while the numbers do not matter yet. A channel you start measuring after you start spending gives you a first month of data you cannot trust, and no event history for conversion campaigns to learn from.
3. **Turn on the Conversions API, not just the pixel.** Browser-only tracking on a new channel with a small budget will under-report, and under-reporting on a small budget looks exactly like a channel that does not work.
4. **Enable Advanced Matching.** It costs nothing and it is what makes cross-device purchases show up.
5. **Verify one real order end to end** before you scale. The Pixel Manager's logger shows you exactly what was sent.
## Availability
OpenAI ads tracking is a **Pro** feature of the Pixel Manager. The pixel, the Conversions API, and Advanced Matching are available from version **1.60.0**. The ChatGPT click reference shipped in version **1.64.0**, so be on that version or later before you start spending.
On OpenAI's side, ChatGPT Ads is still a beta that is expanding gradually. You can check your eligibility and sign up at [ads.openai.com](https://ads.openai.com/).
Not on Pro yet? Have a look at [what Pro unlocks](https://sweetcode.com/docs/pmw/features/why-upgrade-to-pro) or go straight to the [pricing](https://sweetcode.com/plugins/pmw#pricing-section).
Happy tracking! 🎯
---
# Server-Side Purchase Events Now Honor Visitor Consent
URL: https://sweetcode.com/blog/server-side-purchase-events-honor-visitor-consent
Date: 2026-07-02
Tags: pixel manager, consent, server-side tracking, conversion api
Starting with Pixel Manager version 1.62.0, server-side purchase events (server-to-server / Conversions API) respect the consent choice your visitors make in the browser. If a visitor declines consent, the purchase event is no longer sent to the ad and analytics platforms through the server.
This is a behavior change for stores that use explicit consent management, and we want you to understand exactly what changes, why we made this decision, and what to do if your situation requires the previous behavior.
## What Changes
Until now, the Pixel Manager handled consent differently on the two tracking paths:
- **Browser pixels** have always honored consent. When a visitor declines, no browser pixel fires. That does not change.
- **Server-side purchase events** were sent for every order, regardless of the visitor's consent choice. That changes now.
With version 1.62.0, the Pixel Manager captures the visitor's consent state during checkout and stores it with the order. When the purchase event is later sent from your server, even days later for delayed payment methods like bank transfer, the stored consent decides whether the event goes out.
The check is category-aware per destination:
So if a visitor accepts statistics but declines marketing, your GA4 revenue data stays complete while the ad platforms correctly receive nothing.
## Why We Made This Change
Enabling a Conversions API is about recovering conversions that are **technically** lost: ad blockers, browser privacy features, or a thank-you page that never finished loading. It was never meant to be a way around a visitor's explicit "no".
Three reasons drove the decision:
1. **It is what the law expects.** Consent obligations like the GDPR attach to the processing of personal data, not to the transport. A declined consent does not become irrelevant because the request originates from your server instead of the visitor's browser.
2. **It is what the platforms require.** Meta's terms and Google's EU User Consent Policy both require a lawful basis for the data you send them. Sending purchase data of visitors who declined consent violates those policies too.
3. **It is what you would expect.** The browser side always honored consent. The server side behaving differently was surprising, and surprises in compliance are the worst kind.
## Who Is Affected
The change is only noticeable on stores that run the Pixel Manager in **explicit consent mode** together with a consent management platform. Visitors who decline consent on those stores no longer produce server-side purchase events.
Stores using implicit consent are practically unaffected, because consent is granted by default unless the visitor opts out.
Orders without a stored consent state, such as manually created orders, marketplace imports, or orders placed before the update, are sent exactly as before.
## Your Reports Stay Honest
Two details we took care of so your numbers keep making sense:
- **Tracking accuracy**: Orders from visitors who declined all consent categories are excluded from the payment gateway accuracy statistics. They cannot be tracked by any pixel, so counting them would only make your accuracy look worse than it is. These orders are marked accordingly on the order itself.
- **Refunds**: If a purchase event was withheld because of consent, the matching refund event is withheld too. The platforms never receive a refund for a purchase they never saw.
Every withheld event is also written to the Pixel Manager logger, so you can always see exactly why an event was not sent.
### See the Impact on Your Store
The payment gateway accuracy report shows you exactly how many orders came from visitors who declined all consent, and what share of your total order volume that is, for any period you select. The report's chart also shows the affected orders per day.
This turns the decision below into an informed one: if the share is negligible, you accept it and move on. If it is significant, you know precisely how many conversions are at stake.
## If You Need to Send Events Regardless of Consent
Some merchants operate in jurisdictions or under legal assessments where sending server-side events independently of the visitor's consent choice is permissible. That decision belongs to you as the data controller, not to us.
For that case the existing setting [Always Send Server-Side Events](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#always-send-server-side-events) is the override: when enabled, server-side events, including purchases, are sent regardless of the consent state. If you have server-side tracking active and this setting is off, the Pixel Manager will also show you an opportunity card so you can make a deliberate choice.
## For Developers
Two filters give you fine-grained control:
- `pmw_s2s_require_consent_snapshot`: return `true` to also suppress purchase events for orders that have no stored consent state (strict mode).
- `pmw_skip_s2s_purchase_event`: unchanged, still lets you skip the server-side purchase event for specific orders.
The consent snapshot is stored on the order in the `_pmw_consent_snapshot` meta field, and withheld events are recorded in `_pmw_s2s_purchase_consent_suppressed`.
## Available in Version 1.62.0
The new behavior ships with Pixel Manager version 1.62.0 and applies automatically. There is nothing to configure: honoring your visitors' choice is the default, and the override exists for those who need it.
Happy (and compliant) tracking! 🎯
---
# Introducing Nova: The New Pixel Manager Interface
URL: https://sweetcode.com/blog/introducing-nova-new-pixel-manager-interface
Date: 2026-06-11
Tags: pixel manager, nova, admin interface
The Pixel Manager has a brand-new face. Starting with version 1.59.0, **Nova** is the new default admin interface: faster, cleaner, and built to get you from "installed" to "tracking accurately" in minutes instead of hours.

## Why We Built Nova
The Pixel Manager has grown a lot over the years. What started as a simple Google Ads tracking plugin now manages dozens of pixels, server-side conversion APIs, consent management, and diagnostics. The old interface served us well, but it was starting to show its age: long settings pages, full page reloads on every save, and no quick way to find the one setting you were looking for.
So we rebuilt the entire admin interface from the ground up. Three goals drove the redesign:
- **Speed**: Settings save instantly in the background, navigation is immediate, and the whole interface loads as one lightweight bundle.
- **Clarity**: Instead of one endless settings page, Nova organizes everything into focused tabs: Dashboard, Opportunities, Tracking Pixels, General, Consent, Server-Side, Diagnostics, and Support.
- **A native WordPress feel**: Nova is built on WordPress's own component library, the same one WordPress uses for its block editor. It looks and behaves like a natural part of wp-admin, stays consistent with future WordPress design updates, and avoids shipping a heavy third-party UI framework.
## The New Dashboard
The first thing you'll notice is the new dashboard. It answers the most important question at a glance: **is my tracking healthy?**
- **Optimization score**: A single percentage that shows how much of your tracking potential you're using, based on open opportunities.
- **Key stats at a glance**: Active pixels, server-side tracking status, Consent Mode status, and your license, all in one row.
- **Payment gateway health**: The dashboard shows whether all your payment gateways are tracking purchases accurately, with a direct link to the full diagnostics report.
- **Automatically activated features**: See which features the Pixel Manager has enabled for you behind the scenes.
## Opportunities: Your Tracking To-Do List
The Opportunities tab takes everything the Pixel Manager knows about your setup and turns it into an actionable, prioritized list. Each opportunity is labeled by impact (high, medium, or low), explains why it matters, and links directly to the setting or documentation you need.

Dismissed an opportunity that doesn't apply to your store? No problem, it moves to a collapsible section and stops counting against your optimization score.
## Tracking Pixels: Easier to Find, Filter, and Set Up
This is the part we're most excited about. The Pixel Manager supports a lot of pixels and conversion APIs, and finding the right one used to mean a lot of scrolling. Not anymore.

The new Tracking Pixels tab gives you:
- **One-click filters**: Show all pixels, just the popular ones, only active or inactive ones, or filter by purpose: Marketing, Statistics, or Optimization.
- **Instant search**: Type a few letters and the list narrows down in real time, across pixel names and vendors.
- **Status badges**: Every vendor card shows how many of its pixels are active, so you can see your setup at a glance.
- **Collapsible vendor cards**: Each vendor (Google, Meta, TikTok, LinkedIn, and many more) expands to reveal its settings right in place, no page navigation required.
Looking for your Google settings? Just type "google" and everything else gets out of the way:

## More Goodies Throughout
Nova isn't just a fresh coat of paint. A lot of new functionality shipped alongside it:
- **Instant saving**: Settings are saved via the REST API in the background, with inline save indicators. No more "Save Changes" button at the bottom of a long page.
- **Settings export and import**: Copy your entire configuration as JSON and move it between staging and production, or keep it as a backup.
- **Built-in backups**: Restore a previous configuration if something goes wrong.
- **Debug report**: Generate a complete environment and connectivity snapshot with one click and paste it into a support request.
- **Payment gateway accuracy report**: The Diagnostics tab shows per-gateway tracking accuracy with a historical trend chart, so you can spot tracking gaps before they cost you ad budget.
- **Deep links that just work**: Every tab has its own URL, so the browser back and forward buttons behave exactly as you'd expect, and you can bookmark or share a direct link to any tab.
## Prefer the Classic Interface?
Nova is now the default, but we're not forcing anyone to switch overnight. If you want to go back to the previous interface, head to the **Support** tab and switch to the Classic interface in the Interface section. Your choice is remembered, and you can switch back to Nova at any time.
The Classic interface will be retired in a future release, so we'd love for you to give Nova a real try. If something feels off or you're missing a feature, [let us know](https://sweetcode.com/support/), your feedback directly shapes what we build next.
## Try It Now
Nova ships with Pixel Manager version 1.59.0. Update the plugin, open **WooCommerce → Pixel Manager**, and enjoy the new experience.
Happy tracking! 🎯
---
# Migrating from PixelYourSite: Recreate the Advanced Marketing Events in the Pixel Manager
URL: https://sweetcode.com/blog/replicate-pixelyoursite-advanced-marketing-events
Date: 2026-06-10
Tags: pixel-manager, pixelyoursite, woocommerce, facebook, meta, custom-events, migration
A shop owner recently wrote to our support while switching from PixelYourSite to the [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/):
> "We had the Advanced Marketing Events active and made audiences based on them, and after that, lookalikes. These audiences were dynamically populated based on the advanced event. Now our ads environment remains without these audiences and events. Can we somehow replicate or migrate them over?"
Short answer: yes, all of them, with one small code snippet. And you don't even have to write it yourself, because our chatbot will write it for you.
## What the Advanced Marketing Events are
PixelYourSite ships a feature called [Advanced Marketing Events](https://www.pixelyoursite.com/docs/woocommerce-advanced-marketing-events): a set of custom events that fire on the purchase confirmation page when a customer crosses a certain threshold, so you can segment buyers by quality rather than just by action:
- **FirstTimeBuyer**: the customer's first purchase
- **ReturningCustomer**: the customer has bought before
- **FrequentShopper**: at least X transactions (e.g. 2)
- **VIPClient**: at least X transactions *and* an average order value of at least Y (e.g. 200)
- **BigWhale**: a lifetime value of at least X (e.g. 5,000)
These events are popular for a good reason: they make excellent seeds for Meta custom audiences and lookalikes. A lookalike built from `VIPClient` buyers usually outperforms one built from all purchasers, and excluding `ReturningCustomer` from new-customer campaigns saves wasted spend.
The Pixel Manager intentionally doesn't ship these as toggles. Every shop defines "VIP" differently, so instead of a fixed list of switches, the Pixel Manager exposes a small API that can express *any* segment, including all five PixelYourSite events with the exact thresholds you had configured.
## How it works in the Pixel Manager
Two building blocks are all you need:
1. The Pixel Manager emits a `pmw:purchase` browser event on the purchase confirmation page (once per order, duplicate prevention included).
2. The function `pmw.trackCustomFacebookEvent("EventName", custom_data)` sends any custom event to Meta. If Meta CAPI is enabled in the pro version, it automatically goes out server-side too.
The full snippet calculates the customer's transaction count, average order value and lifetime value from their WooCommerce order history, then fires every segment event the customer qualifies for. The pattern looks like this:
```js
window._pmwq = window._pmwq || [];
window._pmwq.push(function () {
jQuery(document).on("pmw:purchase", function () {
// Values calculated in PHP from the customer's order history
var custom_data = {
transaction_count: 3,
aov : 240.50,
ltv : 721.50,
};
pmw.trackCustomFacebookEvent("ReturningCustomer", custom_data);
pmw.trackCustomFacebookEvent("FrequentShopper", custom_data);
pmw.trackCustomFacebookEvent("VIPClient", custom_data);
});
});
```
The complete, copy-paste-ready snippet for `functions.php`, including the PHP that computes the thresholds, lives in our documentation:
👉 **[Replicate PixelYourSite's Advanced Marketing Events](https://sweetcode.com/docs/pmw/developers/tipps-and-tricks#replicate-pixelyoursites-advanced-marketing-events)**
A nice bonus over the original: each event carries `transaction_count`, `aov` and `ltv` as custom data, so you can build Meta audience rules on the values themselves (e.g. `ltv > 10000`) instead of being locked to the thresholds you picked at install time.
In Meta, your audiences then populate dynamically going forward, exactly like before. (Past purchases can't be backfilled through pixel events. That limitation applied to PixelYourSite as well.)
## We didn't write that code. Our chatbot did.
Here's the part that makes this migration genuinely easy: the snippet in our docs is, almost character for character, what [our chatbot](https://sweetcode.com/help) produced when we gave it this prompt:
> please create me custom events for functions.php that are sent to facebook using the following information
…followed by the content of PixelYourSite's Advanced Marketing Events documentation page, pasted as context.
That's the whole trick. The chatbot knows the Pixel Manager's API, so it translated "FrequentShopper fires when the client has at least 2 transactions" into working code on the first try.
This generalizes well beyond PixelYourSite. If you're migrating from any tracking plugin and there's a custom event you miss, paste that plugin's documentation into the chatbot and describe what you want. It will tailor the thresholds, add segments the original plugin never offered (`LapsedCustomer`? `SecondPurchase`?), or send the same events to GA4 and other platforms.
## Wrapping up
Switching tracking plugins shouldn't mean losing the audiences that drive your best campaigns. With the Pixel Manager's custom event API, the PixelYourSite Advanced Marketing Events take a few minutes to recreate, and our chatbot writes the code for you.
If you're still weighing the switch, our [in-depth comparison of the Pixel Manager and PixelYourSite](https://sweetcode.com/blog/pixel-manager-for-woocommerce-vs-pixelyoursite) covers the rest of the picture. And if you hit anything during your migration, [our support](https://sweetcode.com/support/) is happy to help.
---
# How the Pixel Manager tracks WooCommerce Subscriptions
URL: https://sweetcode.com/blog/woocommerce-subscriptions-tracking
Date: 2026-05-27
Tags: pixel-manager, woocommerce, subscriptions, facebook, meta, capi, ga4, google-ads, server-side-tracking
Tracking subscriptions is harder than tracking one-off purchases, and not because of the code. It is hard because the ad platforms themselves disagree about what a subscription even is. Meta has a full lifecycle event model. Google Ads has nothing. GA4 sits somewhere in the middle. A real WooCommerce store that runs subscriptions needs an implementation that respects what each platform actually accepts, and reports value in a way that reflects the customer lifetime value (CLV), not just the first month's charge.
This post explains exactly how the Pixel Manager for WooCommerce handles WooCommerce Subscriptions, what fires where, and which knobs you can turn.
## TL;DR
1. **Initial subscription orders** fire as normal purchase events on every connected pixel (browser + server-side), just like any other order.
2. **Meta (Facebook) CAPI** additionally fires Meta's official subscription lifecycle events: `Subscribe` on the first charge, `RecurringSubscriptionPayment` on each renewal, `CancelSubscription` when a subscription is cancelled.
3. **GA4 Measurement Protocol** sends a server-side `purchase` event on each renewal so renewals show up in Google Analytics 4 even though the customer's browser is not involved.
4. **Google Ads and other ad platforms** do not have a subscription-specific event, so renewals are not reported to them by default; the **Subscription Value Multiplier** (premium) lets you inflate the initial conversion value to approximate the CLV, which is what those platforms actually need for optimisation.
5. **Full customisation** is available via the `pmw_marketing_conversion_value_filter` (overwrite the conversion value entirely) and a set of toggle filters to disable renewal tracking globally or per platform.
## What fires when
```mermaid
flowchart TD
A[Customer buys subscription] --> B[Initial purchase event fires on all pixels]
B --> C{Meta CAPI active?}
C -- yes --> D[Subscribe event via Meta CAPI]
A --> E[WooCommerce Subscriptions creates renewal order]
E --> F[GA4 MP renewal purchase event]
E --> G[Meta CAPI RecurringSubscriptionPayment]
H[Customer cancels] --> I[Meta CAPI CancelSubscription]
```
### Initial subscription order
When a customer buys a subscription product for the first time, WooCommerce creates a parent order exactly as it would for any other purchase. The Pixel Manager treats this as a normal purchase: the browser-side conversion pixels fire on the thank-you page, and the server-side pipelines (Meta CAPI, TikTok Events API, Pinterest Conversions API, Snapchat CAPI, Reddit Conversions API, GA4 Measurement Protocol) send their `Purchase` events.
This is the part most store owners are actually asking about when they say "is my subscription showing up?" The answer is yes, the initial order shows up in every ad platform's reporting as a regular purchase. Once those events land, Google Ads, Meta, TikTok and the rest have everything they need to attribute the conversion and feed their optimisers.
On top of that, Meta gets an extra event: `Subscribe`. The Pixel Manager hooks into WooCommerce Subscriptions' `woocommerce_subscription_payment_complete` action, checks that this is the first payment for the subscription, and fires Meta's official `Subscribe` lifecycle event server-side. This is the event Meta's documentation specifies for [subscription lifecycle tracking](https://developers.facebook.com/docs/marketing-api/conversions-api/subscription-lifecycle-events/).
### Renewals
Renewals are where most plugins stop. The Pixel Manager handles them in two places:
**Meta CAPI.** On `woocommerce_subscription_renewal_payment_complete`, the plugin sends Meta a `RecurringSubscriptionPayment` event tied to the original subscription ID, the renewal order, and the original customer identifiers persisted on the parent order. This means Meta can attribute the renewal back to the ad that originally acquired the customer, even though the customer's browser is nowhere near the transaction at renewal time.
**GA4 Measurement Protocol.** The plugin also sends a server-side GA4 `purchase` event for each renewal using GA4's Measurement Protocol, with the original client ID restored from the parent order. Renewals show up in GA4's reports without the customer ever loading a page.
For the other ad platforms (Google Ads, TikTok, Pinterest, Snapchat, Reddit), renewal events are intentionally **not** sent. Those platforms either do not have a subscription-renewal event in their conversion APIs (Google Ads, in particular, does not differentiate), or sending arbitrary renewal events to them just inflates the conversion count without giving the optimiser anything useful to optimise. The right answer there is value inflation at acquisition time, which is exactly what the Subscription Value Multiplier does (see below).
### Cancellations
When a subscription is cancelled (`woocommerce_subscription_status_cancelled`), Meta CAPI receives a `CancelSubscription` event. This lets Meta's lifecycle reporting reflect churn alongside acquisition and renewal.
Cancellations are deliberately not fired on subscription status flips to `on-hold` and back. WooCommerce flips subscriptions on-hold every time a payment is pending; treating that as a cancellation would generate a flood of false negatives in Meta's reporting.
## The Google Ads problem: there is no "subscription" event
Google Ads is the most common ad platform store owners run, and Google Ads does not have a server-side subscription lifecycle event. It has `purchase` and that is it. If you only report the first month's `19.99` to Google Ads, the optimiser will bid for traffic that converts at `19.99`. That is not how a subscription business makes money.
The classic fix is to inflate the conversion value at acquisition time so the number Google Ads sees matches the customer's actual lifetime value. The Pixel Manager ships this fix as a setting: the **Subscription Value Multiplier** (premium).
The multiplier works proportionally and only on the subscription portion of the order:
1. The plugin walks the line items of the order.
2. For each line item whose product is a subscription, the value is multiplied by the multiplier.
3. Non-subscription line items in the same order are left alone.
4. The resulting total replaces the original order total for marketing-pixel reporting.
So if a customer buys a `19.99/month` subscription plus a one-off `5` accessory, and the multiplier is set to `12` (representing a one-year expected lifetime), the value reported to Google Ads is `19.99 × 12 + 5 = 244.88`, not a naive `(19.99 + 5) × 12 = 299.88`. The non-subscription part is untouched.
This applies to every marketing conversion pixel: Google Ads, Meta, TikTok, Pinterest, Snapchat, Reddit, Bing/Microsoft, and so on. It deliberately does **not** affect statistics-only pixels like Google Analytics 4 statistics events; GA4 should reflect what actually happened in the shop.
The multiplier is off by default (set to `1`), and the plugin shows an opportunity card in the admin if it detects WooCommerce Subscriptions is active but the multiplier has not been raised.
### When the multiplier is not enough: full control via filter
Sometimes you need more than a single global multiplier. A common case: you have multiple subscription tiers with very different expected lifetimes, or you want to attribute the value based on a CLV calculation you do yourself.
The Pixel Manager exposes the final conversion value for every marketing pixel through a single filter:
```php
add_filter( 'pmw_marketing_conversion_value_filter', function ( $value, $order ) {
// $value is the value that would otherwise be sent to ad platforms
// (after the Subscription Value Multiplier, if any).
// Return whatever you want here.
return your_custom_clv_calculation( $order );
}, 10, 2 );
```
This filter is the single source of truth for the value sent to every marketing pixel. It runs after the Subscription Value Multiplier, so you can either replace the value entirely or build on top of the multiplier's output.
## Filters to disable renewal tracking
Some stores prefer to keep their reporting tied strictly to acquisition events and not flood their analytics with renewals. The Pixel Manager provides three escape hatches:
```php
// Disable subscription renewal tracking everywhere (Meta CAPI + GA4 MP).
add_filter( 'pmw_subscription_renewal_tracking', '__return_false' );
// Disable just the Meta CAPI renewal events.
add_filter( 'pmw_facebook_subscription_renewal_tracking', '__return_false' );
// Disable just the GA4 Measurement Protocol renewal events.
add_filter( 'pmw_google_analytics_subscription_renewal_tracking', '__return_false' );
```
Initial subscription orders are unaffected by these filters and continue to fire as normal purchases on every active pixel.
## Why is nothing showing up?
The most common reasons a store owner reports "I do not see any subscription data":
1. **You are looking at Google Ads.** Google Ads reports the initial order as a regular conversion; there is no separate "subscription" report to look at. If the initial conversion is showing up in Google Ads, subscription tracking is working. To make subscriptions visible *as subscriptions* in Google Ads, you need to raise the Subscription Value Multiplier so the conversion value reflects CLV.
2. **You are looking at Meta but Meta CAPI is not active.** The subscription lifecycle events (`Subscribe`, `RecurringSubscriptionPayment`, `CancelSubscription`) only fire when the Meta Conversions API is configured (premium). They never fire from the browser-side pixel.
3. **You are looking at GA4 renewals and the premium tier is not active.** The server-side renewal `purchase` events to GA4 require the Measurement Protocol integration, which is premium.
4. **You disabled renewal tracking with a filter.** Re-check your `functions.php`/snippets plugin for the filters above.
---
# What separates a production-grade WooCommerce Conversion API implementation from a toy one
URL: https://sweetcode.com/blog/woocommerce-conversion-api-quality
Date: 2026-05-10
Tags: pixel-manager, conversion-api, capi, woocommerce, facebook, meta, tiktok, pinterest, snapchat, reddit, ga4, server-side-tracking
On the surface, every WooCommerce plugin that talks about the Conversions API does the same thing: take an order, hash an email, POST a payload to an ad platform. In practice, the gap between "POSTs a payload" and "actually delivers reliable, deduplicated, attributable conversions across every payment gateway and edge case a real store throws at it" is enormous. This post is about that gap.
After processing many millions of events across hundreds of WooCommerce stores, we have catalogued dozens of edge cases that simply do not surface on a single test site. Each one is small. Together they decide whether a store's reporting is honest or fiction.
## TL;DR
A production-grade WooCommerce Conversions API implementation differs from a basic one on at least seven dimensions:
1. **Single abstract S2S base class** for every ad platform (Facebook, TikTok, Pinterest, Snapchat, Reddit, GA4 MP), so every fix applies everywhere.
2. **Three-tier identifier resolution** (live session → order meta → WooCommerce-stored fallbacks) plus a **server-side User-Agent detector** for Stripe, PayPal, Klarna, Mollie, Adyen, Square, and `wp-cron` callbacks.
3. **Per-platform purchase idempotency keys** (one meta flag per ad platform), not a single global flag that locks out every other platform after the first success.
4. **E.164 phone normalisation** with per-platform hashing rules.
5. **Edge-case coverage**: iframe checkouts, manual back end orders, pay-for-order links (priority 5 hook), the full WooCommerce Subscriptions lifecycle (`Subscribe` / `RecurringSubscriptionPayment` / `CancelSubscription`), and GA4 partial/full refunds.
6. **No synthetic `_fbp` inflation.** Sending a server-generated random value to inflate Meta's Event Match Quality dashboard does not produce real attribution, audience matching, or optimizer lift, and creates collision risk when the real pixel later sets a genuine cookie.
7. **Optional edge offload** via a Cloudflare Worker on a first-party subdomain to remove the per-order outbound HTTP load from the WooCommerce server.
The rest of this post explains each one in detail.
## A single architecture for every platform
The Pixel Manager implements the same server-to-server (S2S) interface for every supported ad platform: Facebook, TikTok, Pinterest, Snapchat, Reddit, and Google Analytics 4 Measurement Protocol. Every implementation extends a single abstract base class. The base class owns identifier collection, payment-gateway detection, idempotency, retry-safe status hooks, and payload assembly. The platform-specific subclasses only add what is genuinely platform-specific: the API endpoint, the auth header shape, and the event-name mapping.
This is not an aesthetic preference. It is the only way to make sure that a fix discovered in the Facebook integration (for example, "Klarna fires the order-paid hook from a server-side cron that has no `User-Agent`") is automatically applied to TikTok, Pinterest, Snapchat, and Reddit on the next release. Plugins that ship one bespoke S2S implementation per platform inevitably end up with five different definitions of "what counts as a paid order."
```mermaid
classDiagram
class S2S_Base {
<>
+collect_identifiers()
+detect_payment_gateway()
+resolve_user_agent()
+check_idempotency()
+build_payload()
+send_purchase()
#endpoint() *
#auth_header() *
#map_event_name() *
}
class Facebook_CAPI
class TikTok_Events_API
class Pinterest_Conversions_API
class Snapchat_CAPI
class Reddit_Conversions_API
class GA4_Measurement_Protocol
S2S_Base <|-- Facebook_CAPI
S2S_Base <|-- TikTok_Events_API
S2S_Base <|-- Pinterest_Conversions_API
S2S_Base <|-- Snapchat_CAPI
S2S_Base <|-- Reddit_Conversions_API
S2S_Base <|-- GA4_Measurement_Protocol
```
## Identifier resolution: the part nobody talks about
The single hardest problem in server-side tracking is reconstructing a real browser identity from a payment that arrived via a server-side webhook. By the time a Klarna, Mollie, Stripe redirect, PayPal IPN, Adyen, Square, or `wp-cron` callback marks an order as paid, the original customer's browser is long gone. There is no `_fbp` cookie in the request. There is no `User-Agent` in the request. There is no client IP that means anything (it is the gateway's IP, not the customer's).
Every server-side tracking event needs four things to land cleanly in an ad platform's match graph:
1. The browser identifier the platform set on the original visit (`_fbp`, `_ttp`, `_pin_unauth`, `_scid`, etc.).
2. The click identifier from the ad URL (`fbclid`, `ttclid`, `epik`, `ScCid`, `rdt_cid`, `gclid`).
3. The customer's User-Agent string from the browser that placed the order.
4. The customer's real IP address.
The Pixel Manager solves this with a three-tier resolution chain:
1. **Live session.** During checkout, the relevant cookies and click IDs are captured into the WooCommerce session.
2. **Order meta.** At order creation, those values are persisted onto the order itself, along with the browser's User-Agent and the customer's IP. They survive the customer closing the tab.
3. **WooCommerce-stored fallbacks.** When even the order-meta path is missing values (for example because a back end user marked an order paid manually), the plugin pulls WooCommerce's own stored UA and IP for that order.
On top of that, there is a server-side User-Agent detector for the cases where the order-paid hook fires from a context with no usable UA at all: Stripe webhooks, PayPal IPNs, Klarna server callbacks, Mollie webhooks, Adyen notifications, Square webhooks, and `wp-cron` runs are all explicitly recognised and handled so the resulting payload is not poisoned with a `User-Agent` that says "Stripe-Webhook" or "wp-cron".
```mermaid
flowchart TD
A[Order paid hook fires] --> B{Live WC session available?}
B -- yes --> C[Read fbp / fbclid / UA / IP from session]
B -- no --> D{Order meta has identifiers?}
D -- yes --> E[Read fbp / fbclid / UA / IP from order meta]
D -- no --> F[Read UA / IP from WooCommerce stored values]
F --> G{UA looks like a real browser?}
G -- no --> H[Apply server-side UA detector Stripe / PayPal / Klarna / Mollie / Adyen / Square / wp-cron]
G -- yes --> I[Build payload]
H --> I
C --> I
E --> I
I --> J[Hash & send to ad platform]
```
This sounds like plumbing. It is the difference between Meta's Event Match Quality reading 8.5 and reading 4.5 on the same store.
## Per-platform idempotency
Most plugins guard against duplicate purchase events with a single boolean meta key on the order: `_purchase_event_fired = 1`. This works fine until the store turns on a second platform. Now the same flag has to gate Facebook, TikTok, Pinterest, Snapchat, Reddit, and GA4 simultaneously, and the first platform that succeeds locks out the other five.
The Pixel Manager uses one meta key per platform: `_pmw_facebook_purchase_hit`, `_pmw_tiktok_purchase_hit`, `_pmw_pinterest_purchase_hit`, and so on. Each platform's pipeline can succeed, fail, retry, and recover independently. A Facebook outage does not silently break TikTok reporting.
## Phone numbers, properly
Every platform wants the phone number hashed. Some want SHA-256 of the full E.164 string. Some want it without the `+`. Some accept multiple formats. Some require the country code, others reject it.
The Pixel Manager normalises every phone number to E.164 using [libphonenumber](https://github.com/giggsey/libphonenumber-for-php) (the PHP port of Google's reference library), then applies the per-platform hashing rule. A store ships one phone field; it lands on six platforms in the format each one actually accepts. Stores that try to do this themselves usually pick one format, hash it, and silently destroy match rates on every platform that expects something different.
Email addresses get the same treatment, including platform-specific normalisations like Gmail alias stripping where the platform documents that it removes the `+suffix` and dots before hashing.
## Edge cases the abstract base class fixes for free
Because every platform inherits the same purchase pipeline, the following are handled identically across all of them:
- **Iframe checkouts.** Some payment plugins render the WooCommerce thank-you page inside an iframe. A naive browser pixel fires twice (parent and iframe) or zero times (no thank-you page reached). The plugin detects iframe context and corrects.
- **Manual orders.** Orders created in the WordPress back end and marked paid by a staff member never see the customer's browser. The CAPI pipeline still fires; the browser pipeline does not. Per-platform idempotency keeps everything consistent.
- **Pay-for-order links.** Customers paying an existing order via a `pay/` link hit the order-pay hook at priority 5, before WooCommerce's default handlers, so the conversion is attributed to the actual payment moment rather than to the order's original creation timestamp.
- **WooCommerce Subscriptions.** First charges fire as `Subscribe` (or the platform equivalent). Recurring renewals fire as `RecurringSubscriptionPayment`. Cancellations fire as `CancelSubscription`. Each one with the right product context, the right value, and the right idempotency key.
- **GA4 partial and full refunds.** When an order or specific line items are refunded, GA4 receives a properly-formed `refund` event with the correct items array.
None of these are exotic. All of them happen on every store eventually. Most of them are simply absent in competing plugins.
## Why our Facebook Match Quality Score is sometimes lower than the competition (and why that is a good thing)
This one deserves its own section because it is a deliberate design decision that costs us in benchmark screenshots and that we believe is the right call anyway.
Meta's Event Match Quality (EMQ) score rewards events that include a `_fbp` cookie value, because in normal use that value links the server-side event to a browser session Meta has already seen. The score does not, however, validate that the `_fbp` value corresponds to a real browser session. It just rewards the *presence* of a value.
Some competing WooCommerce tracking plugins exploit this. When they cannot find a real `_fbp` cookie on the request, they mint a synthetic one server-side, typically constructed from the current Unix timestamp and a random ten-digit number, then send it to Meta as if it were a genuine browser identifier. The pattern looks like this:
```php
'fb.1.' . time() . '.' . rand( 1000000000, 9999999999 )
```
The result is that the EMQ dashboard goes up. The result is *also* that:
1. **The synthetic value maps to no real Facebook user.** It contributes zero attribution lift, zero audience-matching uplift, zero advantage to campaign optimization. The number on the dashboard moves; the number that pays your bills does not.
2. **Collision risk.** When the real Facebook pixel later sets a genuine `_fbp` cookie on the same browser, the same browser is now associated with two different `_fbp` values. Per-browser deduplication and attribution stops working cleanly for that visitor.
3. **For ad-blocker users, the inflation is guaranteed to be useless.** The whole point of using a server-side identifier for ad-blocker users is to recover an identity Meta can match. A timestamp plus a random number cannot be matched to anything, ever, by definition.
This is also not what Meta's own SDK does. The official [Facebook PHP Business SDK](https://github.com/facebook/facebook-php-business-sdk)'s [`UserData::setFbp()`](https://github.com/facebook/facebook-php-business-sdk/blob/main/src/FacebookAds/Object/ServerSide/UserData.php) is a pure setter, and [`Util::getFbp()`](https://github.com/facebook/facebook-php-business-sdk/blob/main/src/FacebookAds/Object/ServerSide/Util.php) returns `null` when the cookie is not present. Inventing a value is a third-party choice, not something the platform's own tooling endorses. Meta's own [Conversions API documentation](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/customer-information-parameters) describes `fbp` as a value that "comes from the `_fbp` cookie" and gives no instructions for synthesising one.
We have considered shipping an opt-in toggle that mints synthetic `_fbp` values to inflate EMQ on demand for users who care about the score in isolation. We decided against it because we believe the people we owe an honest answer to are the people writing us cheques and judging the plugin by the conversions Meta's optimizer actually delivers, not by a number on a dashboard.
If you are comparing plugins by EMQ score in a side-by-side screenshot, the Pixel Manager will sometimes look worse. If you are comparing them by the number of conversions Meta's optimizer actually delivers from a fixed ad spend, the conclusion is different.
## The cherry on top: edge offload
Everything above is implemented in PHP and runs on the WooCommerce server. For stores where the additional CPU and outbound HTTP load of fanning out to five or six ad platforms per browser-side event becomes meaningful, the Pixel Manager integrates with the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview), which moves the fan-out to a Cloudflare Worker on a first-party subdomain of the store. Browser-side events skip the WooCommerce server entirely and go straight to the edge, where the Worker fans out to every ad platform. The events travel under your domain, so they are not blocked by browser privacy controls.
```mermaid
flowchart LR
subgraph Without["Without edge offload"]
direction TB
BR1[Browser] -->|event| WP1[WooCommerce PHP server]
WP1 -->|6 outbound HTTPS calls| FB1[Facebook]
WP1 --> TT1[TikTok]
WP1 --> PIN1[Pinterest]
WP1 --> SC1[Snapchat]
WP1 --> RD1[Reddit]
WP1 --> GA1[GA4]
end
subgraph With["With Server-Side Proxy"]
direction TB
BR2[Browser] -->|first-party event| EDGE[ssp.yourshop.com Cloudflare Worker]
EDGE --> FB2[Facebook]
EDGE --> TT2[TikTok]
EDGE --> PIN2[Pinterest]
EDGE --> SC2[Snapchat]
EDGE --> RD2[Reddit]
EDGE --> GA2[GA4]
end
```
With the Server-Side Proxy active, browser-side events never touch the WooCommerce PHP server: the browser posts directly to your first-party `ssp.yourshop.com` subdomain, and the Cloudflare Worker handles the fan-out to every platform. Purchase events (which need order data only the shop server knows) still go from PHP, but the high-volume traffic, PageView, AddToCart, ViewContent, etc., is fully off-loaded. It is a performance and accuracy multiplier on top of an already correct implementation, not a replacement for getting the implementation right in the first place.
## Where this leaves you
If you are running a single-platform, single-payment-gateway, single-checkout-style WooCommerce store, almost any tracking plugin will look like it works in your test orders. The cracks open when you add a second platform, or a customer pays via Klarna, or someone marks a manual order paid in the back end, or a subscription renews.
The Pixel Manager exists because we ran into every one of those cracks on real stores and decided to fix them once, in a shared base class, instead of patching them per-platform forever. If your store is at the size where each of those edge cases costs real money, this is the difference that matters.
[Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) is free to install and try, and the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview) is included with the paid tiers.
## Related reading
- [Pixel Manager for WooCommerce vs PixelYourSite: in-depth comparison](https://sweetcode.com/blog/pixel-manager-for-woocommerce-vs-pixelyoursite) — named head-to-head against the most common WooCommerce tracking alternative, including a full feature table and FAQ.
- [Status-driven Meta (Facebook) Conversion Tracking with the Conversions API](https://sweetcode.com/blog/status-driven-meta-capi-conversions) — how to make the Pixel Manager record Facebook conversions only when WooCommerce confirms an order is paid.
- [Server-Side Proxy overview](https://sweetcode.com/docs/pmw/server-side-proxy/overview) — documentation for the Cloudflare-Worker edge-offload integration.
---
# Checkout Summit 2026 in Palermo: A Recap
URL: https://sweetcode.com/blog/checkout-summit-2026-palermo-recap
Date: 2026-04-29
Tags: conference, checkout summit, woocommerce, community

I'm back from [#CheckoutSummit](https://checkoutsummit.com/) in Palermo, and I'm still smiling.
This was a special conference in many ways. The talks were excellent and highly relevant. The conversations were deep, open, and honest. I reconnected with friends I hadn't seen in a while, met new ones, and what stood out most was the feeling around it all.
Nothing felt forced. The connections felt real, human, and meaningful.
## A different kind of conference
A lot of conferences these days feel like networking marathons with a side of slides. Checkout Summit is the opposite: a deliberately small, focused event built around the people actually shipping checkout, payments, and conversion infrastructure for WooCommerce and beyond.
That focus changes everything. You don't need to "find" the right people in the hallway, because almost everyone in the room is the right person. By the second coffee break it stopped feeling like a conference and started feeling like a working group.

## The talks that stuck with me
Three sessions in particular kept coming up in conversations afterwards.
**James Kemp - "WooCommerce Unfiltered: Inside the Decisions Shaping the Platform"**
A candid look at how decisions actually get made inside WooCommerce, what trade-offs the team is wrestling with, and where the platform is heading. The "unfiltered" part wasn't marketing - James was genuinely open about the things that work and the things that don't, which is exactly the kind of conversation our ecosystem needs more of.
**Katie Keith - "ShopifyDiary 365: A Year Building Shopify Apps (And What WooCommerce Can Learn)"**
Katie spent a year building inside the Shopify ecosystem and brought back a stack of observations. The interesting part wasn't the "Shopify is better/worse" framing - it was the very concrete list of developer-experience and merchant-experience details that WooCommerce could simply adopt. Uncomfortable in the best way.
**Patrick Rauland - "An Apples-to-Apples Look at WooCommerce vs. Shopify After a Large-Scale Migration"**
Real numbers, real migration, real pain points. Patrick walked through the parts of WooCommerce that genuinely outperform Shopify, the parts where the gap is real, and where the difference is mostly perception. As someone who lives inside WooCommerce conversion tracking every day, this was the talk I was scribbling notes through.
The common thread: nobody was selling. People were sharing what they had actually learned by building.
## Palermo did its part
A conference is a conference. Palermo, on the other hand, was something else.
Sunshine, the sea, food that was almost unfairly good, and that relaxed Sicilian rhythm where dinner starts late and ends later. It made everything feel a little more generous.

I also achieved one of my favorite goals for the week: swimming in the sea every morning before sessions. There's something about starting the day in cold-ish water with the sun coming up that recalibrates you for everything that follows.
And then there was the food. I won't list everything, but I will mention this:

If you've never had a cartoccio within thirty kilometers of where it was invented, you've technically had a cartoccio. Just not _the_ cartoccio.

## Side events and community
Some of the best moments happened outside the conference room. A street-food gathering with long communal tables, dinners with the sun setting over the sea, late-night chats that drifted from technical deep-dives to family stories and back again.

We were happy to support the side events as one of the sponsors - alongside Mollie, Crucible CRM, LMPR and Wise. These events are where the real conversations happen, and being part of making them possible felt like the right way to give back to the community that's behind so much of what we build at [SweetCode](/).

## Thank you, and what's next
Huge thank you to **Rodolfo Melogli** and the whole organizing team for creating something with such a wonderful atmosphere. The level of care behind the scenes - the pacing, the venue, the small touches, the way side events were stitched together - was visible everywhere.

I'm grateful, inspired, and already craving more. I'm looking forward to **#CheckoutSummit2027**, and I'll support the next edition in every way I can.
If you build, sell, or care about checkout in the WooCommerce world, do yourself a favor and put it on your calendar. Keep an eye on [checkoutsummit.com](https://checkoutsummit.com/) for next year's dates.
See you in 2027.
---
# Status-Driven Meta (Facebook) Conversion Tracking with the Conversions API
URL: https://sweetcode.com/blog/status-driven-meta-capi-conversions
Date: 2026-04-21
Tags: pixel-manager, facebook, meta, conversion-api, capi, woocommerce, conversion-tracking
How to configure the Pixel Manager so Facebook (Meta) conversions are recorded only when WooCommerce confirms the order is in a paid state, using the Conversions API as the single source of truth.
## When you actually need this
WooCommerce orders move through three broad outcomes after checkout. Each one is handled differently by the standard tracking setup:
1. **Order fails immediately.** The payment gateway rejects the charge during checkout and the order goes straight to `failed`. The customer never reaches the thank-you page, the browser pixel does not fire, and CAPI is not triggered (it only listens to paid-status transitions). Nothing is sent to Meta. No action needed.
2. **Order is paid immediately.** Most stripe-style and PayPal-style integrations finalize payment during checkout. The order lands on the thank-you page already in `processing` (or `completed`), the browser pixel fires, CAPI fires, both share the same `event_id`, Meta deduplicates them, and the conversion is recorded once. This is the normal, ideal case. No action needed.
3. **Order goes to `processing` but may still fail or never get paid.** Bank transfers, invoices, BNPL, manual review flows, and some local payment methods land the order on the thank-you page in a state that *looks* successful but has not been confirmed by the gateway. The browser pixel fires immediately, so the conversion is recorded in Meta, even if the order is later cancelled or never gets paid.
The industry-standard behavior, including the Pixel Manager's default, is to track everything that does not immediately fail. The reason is simple: most stores' checkouts fall into category 2, and the small leakage from category 3 is usually outweighed by the cost of waiting (lost attribution, missed view-through windows, broken click-to-conversion paths in Meta's optimizer). Tracking on the thank-you page is fast, accurate for the common case, and matches what Meta expects.
The configuration in this article is for stores where category 3 is significant enough to distort their numbers and ad optimization, and they are willing to accept the tradeoffs to fix it.
### What the Conversions API is, and what it is not
The Conversions API was not built to enable status-driven conversion tracking. Its primary purpose is **tracking reliability**: it sends events from your server directly to Meta, bypassing ad blockers, browser extensions, network-level filters, and increasingly aggressive browser privacy controls that suppress the browser pixel. In the standard setup, CAPI runs alongside the browser pixel as a backup, and Meta deduplicates the two via `event_id`.
For this niche scenario, we repurpose CAPI: instead of running it as a backup to the browser pixel, we make it the *only* sender for purchase events, and rely on its built-in status-driven trigger to delay the conversion until the order is actually paid.
### Important limitation: the 7-day window
Meta's Conversions API only accepts events with an `event_time` within the **last 7 days**. If an order sits in `processing` for longer than 7 days before it is marked paid (or cancelled), the conversion can no longer be sent to Meta and is permanently lost from a tracking perspective. This is a hard cutoff on Meta's side, not something the Pixel Manager can work around.
For most payment methods this is a non-issue. For bank transfers, invoices, or other slow-confirming payments, it is a real constraint to weigh against the benefit of cleaner data.
## How the Pixel Manager handles purchase events by default
For Facebook, the Pixel Manager fires the purchase event from two places:
1. **Browser pixel** on the order received (thank-you) page, regardless of the order's payment status.
2. **Conversion API (CAPI)** registered on `woocommerce_payment_complete` and on every `woocommerce_order_status_{paid_status}` transition. Paid statuses come from WooCommerce's `wc_get_is_paid_statuses()` (typically `processing` and `completed`). A meta-key guard on the order prevents double-fires across these hooks.
Both events share the same `event_id` (`pmw_{order_id}`), which is how Facebook deduplicates the browser and server-side hits.
The implication is important: **CAPI is already status-driven**. Failed, cancelled, pending, or otherwise non-paid orders never reach Facebook through the CAPI pipeline. The only path that records non-paid orders as conversions is the browser pixel firing on the thank-you page.
So a "status-driven" setup reduces to one technical change: stop the browser pixel from firing the purchase event, and let CAPI deliver it instead.
## Required configuration
### 1. Enable Facebook CAPI
In the Pixel Manager settings, enable **Facebook Conversion API**. CAPI is what delivers the purchase event to Meta in this setup.
Enabling Facebook in the Pixel Manager also disables the tracking pixel from the *Meta for WooCommerce* plugin if it is installed. Catalog sync from *Meta for WooCommerce* is not affected, so product feeds keep working.
### 2. Suppress the Facebook browser pixel for purchase events
Add a JavaScript filter that returns `null` for `purchase` events on the Facebook pixel. Returning `null` from a `pmw_pixel_data_{pixel}` filter blocks that pixel from firing for the matched event. See the [Event Filters](https://sweetcode.com/docs/pmw/developers/event-filters) reference for the full filter pipeline.
```php title="/wp-content/themes/child-theme/functions.php"
add_action('wp_head', function() {
?>
get_status() !== 'completed') {
return null;
}
return $pixel_data;
}, 10, 3);
```
Returning `null` from this filter blocks the CAPI event for the matched pixel and event. See [PHP Filters](https://sweetcode.com/docs/pmw/developers/php-filters) for the full server-side pipeline.
## Custom order statuses (e.g. `partially-paid`)
The reverse case also comes up: a deposit or partial-payment plugin adds a custom order status that WooCommerce does not treat as paid, so the purchase conversion never fires for those orders. To register a custom order status as paid, use WooCommerce's `woocommerce_order_is_paid_statuses` filter (the filter behind `wc_get_is_paid_statuses()`). The Pixel Manager picks it up automatically and fires purchase conversion tracking when an order transitions into that status:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('woocommerce_order_is_paid_statuses', function($statuses) {
$statuses[] = 'partially-paid'; // status slug without the `wc-` prefix
return $statuses;
});
```
Note that this widens what WooCommerce itself considers paid (for example `$order->is_paid()`), not just the Pixel Manager's conversion trigger.
## Optional: manually re-fire CAPI for an order
If a custom workflow needs to push a CAPI purchase event for a specific order (for example from a custom hook), call the platform's static `send_purchase_hit()` method with the order object:
```php
\SweetCode\Pixel_Manager\Pixels\Facebook\Facebook_CAPI::send_purchase_hit($order);
```
This is an internal method and not part of the public Pixel Manager API. It can change between releases.
## Same pattern for other platforms
Every platform with a server-side counterpart in the Pixel Manager follows the same filter naming pattern. Replace the pixel slug in both filter names.
| Platform | JavaScript filter | PHP server-side filter |
|--------------------|-------------------------------------|------------------------------------------------------|
| Facebook / Meta | `pmw_pixel_data_facebook` | `pmw_server_event_payload_facebook_purchase` |
| TikTok | `pmw_pixel_data_tiktok` | `pmw_server_event_payload_tiktok_purchase` |
| Pinterest | `pmw_pixel_data_pinterest` | `pmw_server_event_payload_pinterest_purchase` |
| Snapchat | `pmw_pixel_data_snapchat` | `pmw_server_event_payload_snapchat_purchase` |
| Reddit | `pmw_pixel_data_reddit` | `pmw_server_event_payload_reddit_purchase` |
| Google Analytics 4 | `pmw_pixel_data_google_analytics` | `pmw_server_event_payload_google_analytics_purchase` |
For a condensed reference of these snippets, see the [Status-Driven Purchase Conversions recipe](https://sweetcode.com/docs/pmw/developers/recipes/status-driven-purchase-events).
---
# Development Update April 2026 (#14)
URL: https://sweetcode.com/blog/development-update-14
Date: 2026-04-14
Tags: pixel manager, development update, newsletter

## TLDR
- SweetCode Cloud (SSP) integration with Purchase Proxy and multi-domain support
- New CrazyEgg pixel integration
- WooCommerce Cost of Goods Sold (COGS) support for profit margin calculations
- Tracking Accuracy Analysis dashboard with automatic backfill
- Account Created event tracking, unified IP exclusion filter, and more new settings
- Numerous Google Tag Gateway Proxy improvements and stability fixes
- 50+ tweaks and 15+ bug fixes across 13 releases
## SweetCode Cloud (SSP) Integration ☁️
The biggest addition since our last update is the deep integration with **SweetCode Cloud** (our server-side proxy platform). If you're unfamiliar, SweetCode Cloud offloads server-side ad tracking from your WooCommerce server to Cloudflare's edge network - reducing server load and improving tracking accuracy by routing events through first-party subdomains.
### SSP Purchase Proxy
Starting with version 1.57.0, purchase conversion events can now be **routed through SweetCode Cloud** instead of being processed directly on your WooCommerce server. When a customer completes an order, the purchase data for all active conversion APIs (Facebook, TikTok, Pinterest, Snapchat, Reddit) is bundled into a single request and sent to your SSP endpoint. If the SSP is temporarily unavailable, the plugin automatically falls back to direct per-platform sends.
This is a significant performance improvement for high-traffic stores, especially during peak sales events.
### Multi-Domain Support
Version 1.58.0 introduced **multi-domain SSP support**. If you run multiple storefronts, you can now route events through additional domains using the `pmw_ssp_additional_domains` filter:
```php
add_filter('pmw_ssp_additional_domains', function ($domains) {
$domains[] = 'ssp.my-other-shop.com';
return $domains;
});
```
### Reliability & Performance
Across several releases, we've made the SSP integration more robust:
- **Tiered activation retry** for smoother first-time setup
- **Client-side blocklist** that silently drops events from known proxy origins (Google Translate, Google Cache) that would be rejected anyway
- **Eliminated the REST API preflight test** - saving one HTTP round-trip per browser session by using optimistic-try with AJAX fallback
- **Skipped redundant AJAX calls** when SSP is active (client IP geolocation, transient session identifiers)
- **Sync token domain validation** and **disconnect notifications** for better operational visibility
- Multiple config sync fixes to prevent flooding and stale Action Scheduler backlog issues
:::info[Pro Feature]
SweetCode Cloud integration is available with the Pro version of the Pixel Manager. [Learn more about SweetCode Cloud](https://sweetcode.com/docs/pmw/plugin-configuration/ssp-setup).
:::
## CrazyEgg Pixel 🔥
Version 1.56.0 added native support for [CrazyEgg](https://www.crazyegg.com/), the popular heatmap and user behavior analytics tool. Simply enter your CrazyEgg account number in the Pixel Manager settings, and the tracking script is loaded automatically - with full consent management support.
CrazyEgg helps you understand how visitors interact with your store through heatmaps, scroll maps, and session recordings - all valuable data for optimizing your conversion funnel.
## WooCommerce Cost of Goods Sold Support 💰
WooCommerce recently introduced its own built-in Cost of Goods Sold (COGS) feature, and version 1.58.1 adds full support for it. If you use WooCommerce's native COGS fields, the Pixel Manager now reads those values for **profit margin calculations** - giving you more accurate data for ad platform optimization without needing a third-party COGS plugin.
The COGS retrieval logic is smart about it - it only checks active sources, so there's no performance penalty if you're not using it.
## Tracking Accuracy Analysis 📊
Version 1.58.5 introduced the **Tracking Accuracy Analysis** dashboard - an event-driven tracking table that automatically backfills up to 3 months of historical data. This gives you a clear picture of how well your conversion tracking is performing across different platforms.
- **Automatic 3-month backfill** so you don't start from zero
- **Event-driven updates** that keep the data current without manual intervention
- **Improved performance and reliability** through optimized calculations
This makes it much easier to spot tracking discrepancies and take corrective action before they impact your ad spend.
## New Events & Settings ⚙️
### Account Created Event
Version 1.57.0 added tracking for the **account_created** event. When a visitor registers on your store, this event is now fired across all active pixels - useful for measuring the effectiveness of registration campaigns and building audience segments.
### Always Send Server-Side Events
Also in 1.57.0, a new **"Always Send Server-Side Events"** setting ensures S2S events are sent regardless of whether the browser-side pixel fired. This is especially useful for stores with high ad-blocker rates.
### Unified IP Exclusion Filter
Version 1.58.0 introduced the `pmw_ip_exclusion_list` filter, which lets you block specific IPs and CIDR ranges from being tracked - across all pixels at once:
```php
add_filter('pmw_ip_exclusion_list', function ($exclusions) {
$exclusions[] = '192.168.1.0/24'; // Block entire subnet
$exclusions[] = '10.0.0.5'; // Block single IP
return $exclusions;
});
```
This is handy for excluding internal traffic, staging environments, or known bot IPs from your conversion data.
## Google Tag Gateway Proxy Improvements ⚡
The Google Tag Gateway (GTG) Proxy - which routes Google tag requests through your own server for improved tracking - received significant improvements:
- **Browser-based detection** replaces server-side self-probing for GTG handler detection (faster and more reliable)
- **Apache redirect fix** - resolved AH00124 internal redirect loops that affected some hosting configurations
- **Suppressed tags support** for Google Ads and GA4 tags in the proxy
- **Google Ads conversion ID format** (AW-) now properly supported
- **Improved config file handling** and proxy URL management
If you haven't enabled the GTG Proxy yet, check out the [Google Tag Gateway documentation](https://sweetcode.com/docs/pmw/opportunities#google-tag-gateway) - it's one of the most impactful features for improving tracking resilience against ad blockers.
## S2S & Conversion API Updates 🔌
The server-side conversion API integrations received several accuracy and reliability improvements:
- **Facebook CAPI**: Purchase events now always include the customer's IP address for improved matching
- **TikTok Events API**: Renamed the purchase event from `CompletePayment` to `Purchase` to match TikTok's current specification
- **Pinterest Conversions API**: Fixed search event using the wrong field name
- **Reddit CAPI**: Fixed session identifiers not being captured and customer IP being overwritten with the webhook IP
- **Cross-tab session sync** (1.57.0) ensures consistent data when customers have multiple tabs open
- **Event ID prefixing** (1.58.9) - all event IDs now carry a `pmw_` prefix for easier debugging and source identification
- **Diagnostic logging** for consent decisions and cookie capture across the S2S identifier chain
:::info
Fixed an issue where S2S purchase events were sending the server's user agent and IP address instead of the customer's real browser data, especially affecting express checkout flows.
:::
## Admin & Developer Experience 🛠️
- **REST API for settings** (1.57.0) - settings are now saved via AJAX, making the admin UI more responsive
- **Abilities API** (1.57.0) - new internal API for feature capability detection
- **Modern opportunity cards** with impact indicators and improved styling
- **Consent decision logging** (1.58.8) - diagnostic output explaining why consent categories were set to their values, invaluable for debugging CMP issues
- **Improved admin interface** with various UX refinements
## Performance & Compatibility 🏎️
- **LTV recalculation redesign** (1.58.5) - uses in-memory batch processing, significantly faster for large shops
- **WP Rocket compatibility** - fixed JS minification and combination breaking webpack chunk loading
- **Action Scheduler cleanup** on plugin deactivation prevents leftover scheduled actions
- **WooCommerce Product Instance Caching** compatibility declared
- **Removed Maximum Compatibility Mode** setting - no longer needed with the improved architecture
- **PHPCS tooling updated** with all coding standards violations resolved
## Notable Bug Fixes 🐛
- Fixed a **PHP 8+ fatal error** caused by calling `count()` on a null value in Meta CAPI identifier collection
- Fixed **Termly CMP integration** ignoring actual visitor consent choices and always granting full consent
- Fixed **PHP 8.5 deprecation warnings** that were breaking GA4 tracking
- Fixed **WooCommerce HPOS compatibility** not being declared for inactive remnant PMW plugin folders
- Fixed **SSP daily sync** not running while DNS routing or config status were still pending
- Fixed duplicate `page_view` S2S events when consent was granted via Consent API
## By the Numbers
Since our last development update (#13) in January 2026, we've shipped:
- **13 releases** (1.55.1 through 1.58.9)
- **11 new features**
- **50+ tweaks and improvements**
- **15+ bug fixes**
- **1 new pixel integration** (CrazyEgg)
- **1 major platform integration** (SweetCode Cloud)
## Get Started
Ready to take advantage of these improvements?
Thank you for being part of the Pixel Manager community. Your feedback and support drive us to keep improving the best conversion tracking solution for WooCommerce!
Happy tracking! 🎯
---
# Why Google Ads Shows Errors for Conversion Adjustment Uploads (And Why You Can Safely Ignore Them)
URL: https://sweetcode.com/blog/google-ads-conversion-adjustment-warnings
Date: 2026-04-07
Tags: pixel-manager, google-ads, conversion-adjustments, conversion-tracking, troubleshooting
If you're using [Google Ads Conversion Adjustments](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments) with the Pixel Manager, you've likely noticed error messages in your Google Ads upload reports. Recently, Google has also started **sending email notifications** and **displaying warnings on campaigns** about these errors, even though the feature is working exactly as intended.
In this article, we'll explain why these warnings appear, why they're safe to ignore, and what your options are.
## What Are Conversion Adjustments?
Conversion Adjustments let you correct conversion data in Google Ads after the initial purchase event has been recorded. When a customer cancels an order, requests a partial refund, or returns a product, the Pixel Manager generates a feed that tells Google Ads to restate or retract those conversions.
This is a powerful feature that gives Google's bidding algorithms more accurate data, which leads to better campaign optimization and a higher return on ad spend (ROAS). Without conversion adjustments, Google continues to optimize based on the original (now incorrect) conversion values, including orders that were fully refunded or cancelled.
## Why Google Ads Shows Errors
Here's the core issue: **there is no way for you (or the Pixel Manager) to know which orders were originally attributed to a Google Ads click.** An order could have come from organic search, a direct visit, an email campaign, a Meta ad, or any other source. Google Ads only tracks conversions from its own clicks. The order data in WooCommerce doesn't tell you which ad platform (if any) drove the sale.
Google themselves acknowledge this in their [official setup guide](https://support.google.com/google-ads/answer/7686447):
> *"Since there's no way for you to tell in Google Ads if an order was attributed to a Google Ads click, we recommend that you upload all orders that you'd like to adjust. If the order was not attributed to a Google Ads click and therefore not in your Google Ads reports, you'll see an error message letting you know the conversion couldn't be found."*

So the Pixel Manager does exactly what Google recommends: it includes **all** refunded and cancelled orders in the conversion adjustment feed. Google Ads then matches the ones it can and reports errors for the rest.
The error messages you'll see in the upload report are:
- *"This conversion does not exist. Double-check all the parameters."*
- *"The conversion action specified in the adjustment request cannot be found. Make sure it's available in this account."*
**These errors are expected** for any order that didn't originally come from a Google Ads click.
## The New Problem: Google's Emails and Campaign Warnings
Until recently, the errors were limited to the upload report, easy to check and easy to ignore. But Google has recently changed their behavior:
1. **Email notifications**: Google now sends emails to advertisers warning them about "problems" with their conversion adjustment uploads.
2. **Campaign-level warnings**: Google Ads now shows warnings directly on campaigns, flagging issues with conversion data.

These notifications make the errors look like a serious problem that needs immediate attention. **They are not.** The underlying behavior hasn't changed. The same errors that were safely ignored in the upload report are now triggering alarmist notifications.
This is a bug on Google's side. Their system is generating warnings for behavior that their own documentation explicitly tells you to expect. We have no way to fix this, and unfortunately neither do you. Only Google can resolve this inconsistency between their recommended setup and their warning system.
## What You Should Do
### Check That Your Setup Is Correct
Before dismissing the warnings, confirm that your conversion adjustments are working for actual Google Ads conversions:
1. Open your conversion adjustment upload report in Google Ads (Goals → Conversions → Uploads).
2. Look at the results: you should see a **mix of successful and failed rows**.
- **Successful rows** = orders that Google Ads matched to a click (working correctly).
- **Failed rows** = orders from other sources (expected errors).

3. If **all** rows fail, something is misconfigured:
- Verify the conversion name in the Pixel Manager matches the Google Ads conversion name **exactly** (including capitalization and spacing).
- Confirm the upload schedule runs from the same Google Ads account that owns the conversion action.
If you see some successful rows, everything is working as intended.
### Understand Your Options
There are three paths forward:
| Option | Pros | Cons |
|--------|------|------|
| **Keep conversion adjustments enabled** (recommended) | More accurate conversion data, better bidding optimization, correct ROAS reporting | You'll see error notifications from Google |
| **Disable conversion adjustments** | No more error notifications | Google Ads continues to count refunded/cancelled orders as conversions, less accurate data |
| **Wait for Google to fix the bug** | Would be the ideal outcome | We have no control over Google's timeline, and this could take months or years (or never happen) |
### Our Recommendation
**Keep conversion adjustments enabled.** The value of accurate conversion data far outweighs the annoyance of Google's incorrect warnings. The errors don't affect your campaigns, your bidding, or your actual conversion data. They're purely cosmetic.
The alternative, disabling conversion adjustments, means that Google Ads will count every refunded and cancelled order as a valid conversion. This gives Google's bidding algorithm bad data, which can lead to worse campaign performance and inflated ROAS numbers that don't reflect reality.
## What We're Doing About It
We are aware of this issue and are monitoring it closely. We've documented the expected behavior in our [setup guide](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments) and [troubleshooting documentation](https://sweetcode.com/docs/pmw/troubleshooting#conversion-adjustment-upload-shows-errors).
If Google changes their system to allow filtering adjustments by source, or stops generating warnings for expected errors, we'll update the Pixel Manager accordingly.
In the meantime, if you receive an email from Google or see a campaign warning about conversion adjustment errors, you can safely ignore it, as long as your upload report shows a mix of successful and failed rows.
## Summary
- Google **recommends** uploading all orders as conversion adjustments, not just Google Ads orders.
- Errors for non-Google Ads orders are **expected** and documented by Google.
- Google has recently started sending **emails and campaign warnings** about these expected errors. This is a bug on their side.
- The Pixel Manager is working correctly. **No action is needed** on your part.
- Keep conversion adjustments enabled for the most accurate conversion data.
If you have questions, don't hesitate to [reach out to our support team](https://sweetcode.com/support/).
---
# Why Facebook Shows More Conversions Than WooCommerce Orders (And How to Fix It)
URL: https://sweetcode.com/blog/facebook-conversion-discrepancies
Date: 2026-02-06
Tags: pixel-manager, facebook, meta, conversion-tracking, capi, troubleshooting

"Facebook says I had 150 conversions last week, but WooCommerce only shows 95 orders. What's going on?" This is one of the most common questions we receive in support. If you've ever stared at your Facebook Ads Manager numbers and wondered why they don't match your WooCommerce order count, you're not alone.
Here's the key insight that many advertisers miss: **Facebook's conversion count is not designed to mirror your WooCommerce order count.** They measure fundamentally different things. Facebook's "conversions" represent the number of conversion events it attributes to your ads, while WooCommerce orders represent actual completed transactions. Understanding why these numbers differ, and when the gap indicates a real problem, is essential for evaluating your ad performance accurately.
In this article, we'll walk through every major cause of these discrepancies, show you how to identify real tracking issues vs. expected platform behavior, and give you a clear action plan to get your numbers as close as possible.
## The Two Categories of Discrepancies
Conversion discrepancies between Facebook Ads Manager and WooCommerce fall into two very different buckets, and telling them apart is the single most important diagnostic step:
1. **Technical tracking issues** that can be fixed: duplicate pixel implementations, broken deduplication, misconfigured automatic events, or a second event sender you forgot about.
2. **Attribution and reporting behavior** in Ads Manager that is working as designed, even though the numbers look inflated.
The tool that separates the two is **Meta Events Manager**. Ads Manager applies attribution modeling on top of the raw events, so its numbers can never tell you whether an event actually fired more than once. Events Manager shows the raw event stream, so it is the only source of truth for real duplication.
## Ads Manager Is Not an Event Log: Attribution Inflation
Before hunting for technical bugs, understand what Ads Manager actually reports. It does not count events; it counts *attributed conversions*, and several mechanics can make those numbers look inflated even when your tracking is flawless:
- **Attribution windows.** With the default 7-day-click / 1-day-view window, a purchase that happens days after the ad interaction still gets credited. Comparing "yesterday's" Ads Manager conversions to "yesterday's" WooCommerce orders compares two different sets of orders.
- **View-through credit.** A customer who merely *saw* an ad (never clicked) and later bought through another channel still counts as a conversion under the view-through window. These conversions feel like phantom duplicates when you cross-check against orders.
- **Breakdown rows can sum to more than the deduplicated total.** When you break reports down by ad set, placement, or time, Meta may show the same conversion in more than one row. Summing rows yourself overstates the real total.
- **Delayed and restated conversions.** Meta continues to attribute and restate conversions for hours or days after the purchase. A number that "grows" after the fact (one order showing correctly at first and doubling 30 minutes later) is often attribution catching up, not a second event.
- **Wrong column.** The aggregate "Results" or "Conversions" column may include other events (AddToCart, Lead, form submissions) depending on the campaign setup. Always customize columns to look at "Purchases" specifically.
**The decisive check:** open Meta Events Manager, find the `Purchase` events for one specific known order (match by time and value), and count how many raw events arrived and whether they show as deduplicated. If exactly one event landed per order, your tracking is fine and everything above is Ads Manager reporting behavior. If more than one landed, continue with the technical checklist below.
## Technical Issues: Fix These First
### Duplicate Pixel Implementations
The most impactful technical issue is having the Meta pixel fire more than once. This commonly happens when:
- You're running **multiple plugins** that each inject their own Meta pixel (e.g., Pixel Manager alongside another tracking plugin like PixelYourSite, or a marketing automation plugin that includes its own Meta pixel)
- You have **manual pixel code** in your theme's header or footer in addition to a plugin
- A **page builder or theme** includes its own Meta pixel integration
**How to diagnose:** Open [Meta Events Manager](https://business.facebook.com/events_manager2) and go to **Test Events**. Browse your store and check if the same event (e.g., `PageView`, `Purchase`) appears multiple times for a single page load. If you see duplicate events with *different* `event_id` values, or duplicate events where some are missing an `event_id` entirely, you have duplicate pixel implementations.
**How to fix:** Choose one single source of truth for your Meta pixel (ideally Pixel Manager) and disable all other pixel implementations. Remove any manual pixel code from your theme.
### Facebook Automatic Events Enabled
Meta's Events Manager has a feature called **Automatic Events** (sometimes called "automatic event configuration" or "codeless events") that fires events on top of whatever your pixel implementation already sends. If this is enabled, Facebook may be counting events twice.
**How to fix:**
1. Go to [Meta Events Manager](https://business.facebook.com/events_manager2)
2. Select your Pixel
3. Go to **Settings**
4. Find **Automatic Events** and turn it **off**
This is one of the most commonly overlooked settings and can significantly inflate your conversion numbers.
**How to recognize it:** the duplicate event carries an event ID in the format `pmw_<16 characters>_` (e.g. `pmw_xq9m1b4a3uqdcc61_26495490706760077`). That trailing counter is appended by Meta's own `fbevents.js` after it auto-detects the purchase, so the duplicate inherits the Pixel Manager's ID namespace even though the Pixel Manager did not send it. See the [dedicated troubleshooting entry](https://sweetcode.com/docs/pmw/troubleshooting#duplicate-purchase-event-caused-by-metas-automatic-event-detection) for the full diagnosis.
### A Bug in Meta's Own Tracking Library
If automatic events are already off and you still see duplicates from a single page load, you may be hitting a known intermittent bug in Meta's `fbevents.js` library itself. There is a one-minute test: load the order confirmation page with `?fbevents-version=2.9.84` appended to the URL, which makes the Pixel Manager load an older, known-good library version for that page view. If the duplicates stop, pin the older version permanently with the `pmw_facebook_fbevents_script_version` filter. Full steps: [fbevents.js library bug](https://sweetcode.com/docs/pmw/troubleshooting#duplicate-events-persist-even-with-automatic-event-detection-disabled-fbeventsjs-library-bug).
### Broken CAPI Deduplication
If you're using both the Meta browser pixel and the Conversions API (CAPI), which is the recommended setup, proper deduplication is critical. Here's why: the browser pixel sends a `Purchase` event from the visitor's browser, and the CAPI sends the same `Purchase` event from your server. If these two events don't share a matching `event_id`, Facebook counts them as **two separate conversions** for the same order.
This one issue alone can **double** your reported conversion count.
**How to diagnose:** In Meta Events Manager, look for your `Purchase` events and check the **Deduplication** status. If events show as "not deduplicated," there's a problem.
**How to fix:** Ensure that one plugin handles *both* the browser pixel and CAPI events. Pixel Manager manages both sides and automatically generates matching `event_id` values, so deduplication works correctly out of the box without any additional configuration. Problems arise when different tools manage each side (e.g., one plugin for the browser pixel and Stape or another tool for CAPI), because the `event_id` values generated independently by each tool won't match.
For a deeper dive into how CAPI deduplication works, read our article: [Facebook CAPI Deduplication and Match Key Parameters](https://sweetcode.com/blog/facebook-capi-deduplication-and-match-key-parameters).
### Counting Multiple Event Types as Conversions
This might not be a "technical" issue per se, but it trips people up frequently. In Facebook Ads Manager, when you set up a campaign, you choose which events to optimize for. If you configure your campaign to count both **AddToCart** and **Purchase** as conversion events, Facebook's "Conversions" column will include *both*.
A single customer who adds an item to their cart and then purchases generates two "conversions" in that scenario, even though you only have one order.
**How to check:** In Ads Manager, look at your campaign's **conversion settings**. Click on the "Columns" dropdown and customize your view to show individual events (e.g., "Purchases" specifically) rather than the aggregate "Conversions" column.
### Failed or Cancelled Orders
The Meta browser pixel fires on the order confirmation page. If a customer reaches that page but the payment ultimately fails or the order gets cancelled, the pixel has already fired a `Purchase` event. WooCommerce may not count this as a completed order, but Facebook already recorded the conversion.
Pixel Manager mitigates this by verifying order payment status before firing conversion events via CAPI, and through its built-in [order duplication prevention](https://sweetcode.com/docs/pmw/shop#order-duplication-prevention) mechanisms.
### Redirect-Based Payment Gateways
Payment methods that send the customer away to a bank or payment provider and back (iDEAL, BLIK, Przelewy24, PayNow, Klarna, bank transfers, and similar) create extra page loads around the order confirmation page: the return redirect, status polling pages, the back button, or the customer re-opening the confirmation link from the order email.
This is frequently *blamed* for duplicates, but with the Pixel Manager it is usually not the cause. The plugin's order duplication prevention already blocks repeat fires for the same order: the free version remembers tracked order IDs in the browser (so every repeat visit in the same browser is suppressed), and the Pro version additionally stores a server-side marker on the order itself, which also covers the customer opening the confirmation link on a *different device or browser* later.
Where redirect gateways *do* cause duplicates is in combination with a **second event sender that has no such guard**: a purchase tag in the theme, a GTM container, or the gateway's own return page firing a pixel on every load. The pattern to look for: different payment methods duplicating at different rates (e.g. one method 3x, another 2x), which matches "one extra sender per extra page load in that method's flow" rather than a plugin re-fire, since the Pixel Manager's guard is order-scoped and would block all repeats identically.
### Other Event Sources You May Have Forgotten
Events do not only come from your website. Check Events Manager for additional connections feeding the same pixel or dataset:
- **Offline conversion or CSV uploads** adding purchases on top of the pixel events
- **Catalog / Commerce Manager integrations** sending their own purchase events
- **A Conversions API Gateway or a partner integration** (Stape, a hosting-level integration, a previously configured connector) still sending server events in parallel with the plugin
- **Leftovers from a "deactivated" integration**: the Meta for WooCommerce plugin, PixelYourSite, or similar tools can leave behind connected assets in Events Manager even after deactivation on the WordPress side
## How to Diagnose the Gap: A Step-by-Step Checklist
Follow this checklist in order.
1. **Establish the ground truth in Events Manager.** Pick one known order and find its `Purchase` events in Meta Events Manager (match by time and value). Exactly one deduplicated event per order means your tracking is correct and the gap is Ads Manager attribution behavior; stop here and re-read the attribution section above. More than one event means real duplication; continue.
2. **Check for duplicate pixel implementations.** Use Meta Events Manager → Test Events. If you see duplicate events, remove the extra pixel source (second plugin, theme code, GTM tag, gateway page).
3. **Disable Automatic Events.** Meta Events Manager → Settings → Automatic Events → Off. Duplicates with event IDs like `pmw__` point here.
4. **Verify CAPI deduplication.** In Events Manager, confirm events show as "Deduplicated." If not, ensure one plugin (ideally Pixel Manager) handles both browser pixel and CAPI.
5. **Audit other event sources.** Offline uploads, catalog integrations, CAPI Gateways, and leftover connections from deactivated plugins all feed the same dataset.
6. **Check your campaign conversion events.** In Ads Manager, verify which events are being counted as conversions. Customize columns to view "Purchases (conversion)" specifically, rather than the aggregate "Results" column.
## What Can You Realistically Expect?
With a properly configured setup (no duplicate pixels, automatic events disabled, CAPI properly deduplicated, and only purchase events counted as conversions) Facebook's reported purchase conversions should be **lower** than your total WooCommerce order count.
This is because Facebook only attributes conversions to ad interactions (clicks or views). It cannot claim credit for orders that originated from channels unrelated to your Facebook ads, such as organic search, direct traffic, or email campaigns. So the number of Facebook purchase conversions can never be as high as the orders in WooCommerce.
If Facebook is reporting **more** purchase conversions than your total WooCommerce orders, that's a clear signal that something is wrong on the technical side. Work through the checklist above to identify the cause.
## How Pixel Manager Helps
The Pixel Manager for WooCommerce is specifically designed to address the technical causes of conversion discrepancies:
- **Built-in deduplication:** Pixel Manager handles both the Meta browser pixel and the Conversions API, automatically generating matching `event_id` values for proper deduplication. No need for separate CAPI tools.
- **Order duplication prevention:** Both [cookie-based and advanced server-based](https://sweetcode.com/docs/pmw/shop#order-duplication-prevention) mechanisms prevent the same order from being tracked twice.
- **Single source of truth:** By managing all your tracking pixels from one plugin, you eliminate the risk of overlapping pixel implementations.
- **Payment verification:** Purchase events sent via CAPI are verified against the actual order payment status, reducing false positive conversions from failed payments.
If you're currently running into conversion discrepancies, check out our [troubleshooting guide](https://sweetcode.com/docs/pmw/troubleshooting#facebook-ads-manager-shows-more-conversions-than-woocommerce-orders) for a quick-reference checklist, and our [Meta configuration guide](https://sweetcode.com/docs/pmw/plugin-configuration/meta) for setup instructions.
---
# Development Update January 2026 (#13)
URL: https://sweetcode.com/blog/development-update-13
Date: 2026-01-26
Tags: pixel manager, development update, newsletter

## TLDR
- Major codebase refactor: `wpm` renamed to `pmw` — developers using custom filters should update their code
- Two new Consent Management Platform integrations: Cookie Confirm & Beautiful and Responsive Cookie Consent
- Enhanced Opportunities dashboard with impact-level breakdown and statistics
- Improved Google Tag Gateway Proxy with better race condition protection
## Major Refactor: wpm → pmw 🏗️
Version 1.55.0 includes a **significant internal refactoring** that renames our codebase from `wpm` (WooCommerce Pixel Manager) to `pmw` (Pixel Manager for WooCommerce). While this is primarily an internal change, **developers using custom filters should take note**.
### What Changed?
The plugin's internal naming convention has been updated to better reflect our brand identity. This affects:
- Internal PHP class naming and file structure
- JavaScript object naming (the `pmw` object in the browser)
- Filter and action hook prefixes
### Do I Need to Update My Code?
If you're using custom filters or hooks with the old `wpm_` prefix, you should migrate them to use the new `pmw_` prefix. The old filters are still working via our deprecation layer, but we recommend updating them for future compatibility.
**Example migration:**
```php
// Old (deprecated)
add_filter('wpm_experimental_data_layer', 'my_custom_function');
// New (recommended)
add_filter('pmw_experimental_data_layer', 'my_custom_function');
```
:::info[For Developers]
The old `wpm_` prefixed filters continue to work through our deprecation layer, so there's no immediate action required. However, we recommend updating to the new `pmw_` prefix when convenient to ensure future compatibility.
:::
## Two New CMP Integrations 🔐
We've expanded our Consent Management Platform support with **two new integrations**, giving you more flexibility in how you handle user consent:
### Cookie Confirm
[Cookie Confirm](https://cookieconfirm.com/) is now fully supported out of the box. The Pixel Manager automatically detects Cookie Confirm and respects user consent choices for all tracking pixels.
### Beautiful and Responsive Cookie Consent
The [Beautiful and Responsive Cookie Consent](https://wordpress.org/plugins/beautiful-and-responsive-cookie-consent/) plugin is now integrated, providing another option for GDPR/CCPA compliance with an easy-to-use interface.
With these additions, the Pixel Manager now supports **15+ Consent Management Platforms** out of the box, making it easier than ever to maintain privacy compliance while still capturing accurate conversion data.
👉 See all supported CMPs in our [consent management documentation](https://sweetcode.com/docs/pmw/consent-management/platforms).
## Enhanced Opportunities Dashboard 📊
The Opportunities feature has received a significant upgrade with a **new impact-level breakdown** and **improved statistics tracking**.
### What's New?
- **Impact Level Breakdown**: Opportunities are now categorized by impact (High, Medium, Low), helping you prioritize which optimizations to tackle first
- **Statistics Header**: See at a glance how many opportunities are available and how many you've already dismissed
- **Improved Styling**: The dashboard has been visually refreshed for better readability
- **GTG Proxy Notification**: A new opportunity notification highlights the Google Tag Gateway Proxy feature for users who haven't enabled it yet
The impact levels help you understand which optimizations will have the biggest effect on your tracking accuracy and ad performance:
| Impact Level | What It Means |
|--------------|---------------|
| 🔴 **High** | Critical optimizations that can significantly improve conversion tracking |
| 🟠 **Medium** | Important improvements for better data quality |
| 🟢 **Low** | Nice-to-have enhancements for fine-tuning |
## Google Tag Gateway Proxy Improvements ⚡
The [Google Tag Gateway (GTG) Proxy](https://sweetcode.com/docs/pmw/opportunities#google-tag-gateway) has received several under-the-hood improvements to make it more robust and reliable:
- **Race Condition Protection**: Enhanced protection when renaming temporary config files prevents potential conflicts during high-traffic periods
- **Smarter Proxy URL Handling**: The proxy URL is now handled more intelligently based on the GTG handler type
- **Improved Detection Logic**: GTG handler detection now relies on session cache, removing unnecessary server-side checks for better performance
- **Better Cache Management**: Config cache handling has been improved on activation, with better config file management overall
These improvements ensure that your server-side Google tag proxying remains stable and fast, even under load.
## Revamped Rating Notice UI 🎨
We've completely redesigned the rating notice that appears after you've been using the plugin for a while. The new design is:
- **Cleaner and less intrusive**: A more polished look that fits better with the WordPress admin
- **Smarter timing**: Improved logic for when the notice appears
- **Better dismissal handling**: Your preference is remembered more reliably
We appreciate every review on WordPress.org — it helps other store owners discover the plugin and helps us continue development!
## Other Notable Changes
Here are additional improvements from version 1.55.0:
- **Flying Press Compatibility**: Updated script behavior for tracking on specific pages when Flying Press caching is active
- **Pixel Registry Updates**: Updated pixel registry adapter capabilities for consistency with our decentralized architecture
- **Cart Item Data Filter**: Added new filter `pmw_output_cart_item_data_inline_script` to control output for theme compatibility
- **Event Handling Refactor**: Refactored the internal event handling system for better maintainability
- **Product Variations**: Enhanced event handling for product variations with improved conditional triggers
- **Backup Styles**: Added backup section styles and improved table row highlighting in admin
- **Documentation Links**: Updated all documentation links to use the new path structure
### Bug Fixes
- **View Cart Event**: Restored the `view_cart` event listener that was accidentally removed
- **Free Orders**: Fixed a division by zero error for free orders (0 value) in order value calculations
:::info[Pro Feature]
The license expiration warning message has been updated for better clarity in version 1.55.0.
:::
## By the Numbers
Since our last development update (#12) in December 2025, we've shipped:
- **20+ tweaks and improvements**
- **2 bug fixes**
- **2 new CMP integrations**
- **1 major codebase refactor**
## Get Started
Ready to take advantage of these improvements?
Thank you for being part of the Pixel Manager community. Your feedback and support drive us to keep improving the best conversion tracking solution for WooCommerce!
Happy tracking! 🎯
---
# Launch of the Google Customer Reviews Plugin for WooCommerce
URL: https://sweetcode.com/blog/google-customer-reviews-plugin-launch
Date: 2026-01-07
Tags: plugins, google, customer reviews, seller ratings, woocommerce

## TLDR
- We launched the [Google Customer Reviews plugin for WooCommerce](https://sweetcode.com/plugins/gcr/)
- Collect authentic customer reviews through Google's official review program
- Display seller ratings in Google Search and Shopping ads
- Qualify for Google's [Top Quality Store](https://support.google.com/merchants/answer/13542655) status
- Available on [sweetcode.com](https://sweetcode.com/plugins/gcr/)
## Introduction
We're excited to announce the launch of the [Google Customer Reviews plugin for WooCommerce](https://sweetcode.com/plugins/gcr/). This plugin integrates Google's official Customer Reviews program with your WooCommerce store, enabling you to collect authentic customer feedback and display seller ratings in Google Search and Shopping ads.
Google Customer Reviews is a free program that lets you collect valuable feedback from customers who have made a purchase on your site. Once you've gathered enough reviews, your seller rating can appear alongside your ads, helping you stand out from competitors and increase click-through rates.
## What is Google Customer Reviews?
[Google Customer Reviews](https://support.google.com/merchants/answer/7188525) is Google's official review collection program. When a customer completes a purchase and opts in, Google sends them a survey asking about their shopping experience. These reviews contribute to your store's seller rating.
### Key Benefits
- **Seller Ratings in Ads** — Once you collect around 100 reviews, your seller rating can appear in Google Search and Shopping ads
- **Increased Click-Through Rates** — According to Google, seller ratings can increase click-through rates by up to 10%
- **Top Quality Store Status** — Qualify for Google's Top Quality Store badge, which displays on your free product listings
- **Trust & Credibility** — Google-verified reviews build customer confidence
- **Free Program** — Google Customer Reviews is completely free to use
## What the Plugin Does
Our plugin handles the technical integration between your WooCommerce store and Google's Customer Reviews program. Here's what it provides:
### Survey Opt-in Module
After customers complete their purchase, the plugin displays Google's official review survey opt-in on the order confirmation page. Customers can choose whether they want to receive an email survey from Google after their order is delivered.
The opt-in module is customizable — you can choose the dialog style (center dialog, bottom right popup, etc.) and configure the estimated delivery time that determines when Google sends the survey.
### Seller Rating Badge
Display your Google seller rating badge anywhere on your site. The plugin supports multiple placement options:
- Shortcode placement for precise positioning
- Footer positioning (inline or fixed)
- Light and dark badge variants
- Preview mode for testing before going live
### Product Ratings Support
The plugin can include product GTINs (Global Trade Item Numbers) with the review opt-in. This enables Google to collect product-level ratings that can appear in Google Shopping, giving customers more information about specific products.
### Full WooCommerce Compatibility
The plugin is built for modern WooCommerce stores:
- **WooCommerce Blocks Support** — Full compatibility with the block-based checkout
- **HPOS Compatible** — Built for High-Performance Order Storage from the ground up
- **Multi-language Support** — Automatic browser language detection or manual override
## Requirements
To use the Google Customer Reviews plugin, you'll need:
- WordPress 6.0 or higher
- WooCommerce 7.0 or higher
- A Google Merchant Center account enrolled in the [Google Customer Reviews program](https://support.google.com/merchants/answer/7188525)
- Products listed in Google Merchant Center (for product-level ratings)
## Getting Started
Setting up the plugin is straightforward:
1. Install and activate the plugin
2. Navigate to **WooCommerce > Customer Reviews** in your WordPress admin
3. Enter your Google Merchant Center ID
4. Enable the Survey Opt-in module
5. Optionally configure the Seller Rating Badge
Once configured, customers will start seeing the opt-in prompt on your order confirmation page. Google will send review surveys to opted-in customers a few days after their estimated delivery date.
## When Will My Seller Rating Appear?
Google requires a minimum number of reviews before displaying your seller rating. Typically, this requires:
- Around 100 unique reviews in the past 12 months
- An average rating that meets Google's quality threshold
- Reviews from the specific country where your ads are shown
Building up to 100 reviews takes time, but it's worth the investment. Once your seller rating appears, you'll benefit from increased visibility and click-through rates on your Google ads.
## Where to Get the Plugin
You can get the Google Customer Reviews plugin on [sweetcode.com](https://sweetcode.com/plugins/gcr/).
The plugin offers both free and pro versions. The free version includes all core features needed to integrate Google Customer Reviews with your WooCommerce store.
## Documentation
For detailed setup instructions and configuration options, visit our [documentation](https://sweetcode.com/docs/gcr/).
## Conclusion
If you're running Google Shopping campaigns or advertising on Google Search, integrating Google Customer Reviews can significantly improve your ad performance. Seller ratings provide social proof directly in your ads, helping you stand out from competitors and build trust with potential customers.
The setup is straightforward, the program is free, and the long-term benefits — better click-through rates, Top Quality Store status, and increased customer trust — make it a worthwhile addition to any WooCommerce store.
Give the [Google Customer Reviews plugin](https://sweetcode.com/plugins/gcr/) a try and start building your seller rating today.
---
# 7 Reasons Why NOT to Switch Your WooCommerce Store to Shopify or Wix
URL: https://sweetcode.com/blog/7-reasons-why-not-to-switch-woocommerce-to-shopify-or-wix
Date: 2025-12-18
Tags: woocommerce, shopify, wix, ecommerce, business strategy

**Spoiler: follow the money — Shopify eats your margin**
Starting an online store always comes with problems. It doesn't matter whether you use WooCommerce, Shopify, or Wix.
Every store owner has to learn the same core lessons:
- Building and maintaining a software setup
- Advertising and customer acquisition
- Handling customers, payments, and orders
Let's be honest upfront: Shopify and Wix are slightly easier at the very beginning. You sign up, pay a monthly fee, and your hosted shop is live.
But then reality kicks in.
To actually sell, you still install plugins (or "apps"), adjust themes, fix checkout issues, connect tracking, set up payments, optimize speed — and very often you still hire a developer.
With WooCommerce, the process is similar. You choose hosting, install WordPress + WooCommerce, add plugins, and build from there.
**In practice, the difference in effort is much smaller than people expect.**
When sales don't meet expectations, many store owners think:
> "It must be the software. If I switch to Shopify, sales will improve."
They won't.
**Customers care about price, product quality, and delivery speed — not about your platform.**
So before switching, here are 7 reasons why moving from WooCommerce to Shopify or Wix is often a mistake.
## 1. Transaction Fees, Platform Fees, and Negotiation Power
From a business perspective, platform choice directly impacts margins. Even small fee differences compound quickly as revenue grows.
As Eliyahu M. Goldratt explains in *The Goal*, the purpose of a business is simple: to make money — now and in the future.
Payment and platform fees directly affect throughput and operating expense.
### WooCommerce: Direct Contracts
With WooCommerce, you contract directly with payment providers like Stripe, PayPal, or local gateways.
**Example:**
| | Amount |
|---|---|
| Order value | $100 |
| Payment provider fee (1.9%) | $1.90 |
| Net payout | $98.10 |
| Platform fee | $0 |
### Shopify Payments
With Shopify Payments, Shopify acts as the payment processor.
**Example:**
| | Amount |
|---|---|
| Order value | $100 |
| Total payment fee (≈2.5%) | $2.50 |
| Net payout | $97.50 |
### Shopify + Third-Party Providers
If you use a third-party provider on Shopify, Shopify adds an extra transaction fee.
**Example:**
| | Amount |
|---|---|
| Order value | $100 |
| Provider fee (1.9%) | $1.90 |
| Shopify transaction fee (0.5%) | $0.50 |
| Net payout | $97.60 |
That difference looks small — until you scale.
### Negotiation Power at Scale
On open platforms, merchants negotiate directly with Stripe, PayPal, or local gateways.
| Scenario | Fees |
|---|---|
| $1,000,000 revenue at 2.5% | $25,000 |
| Renegotiated to 1.0% | $10,000 |
| **Difference** | **$15,000 per year** |
On Shopify, fees are largely tied to plans and platform rules. Negotiation flexibility is limited.
**At scale, this matters.**
## 2. Tracking Control and Data Quality
Accurate tracking is the foundation of profitable marketing.
WooCommerce gives full control over:
- Front-end scripts
- Backend event logic
- Server-side tracking
- Attribution models
Shopify and Wix provide standardized tracking that works for many stores — but customization is limited, especially in checkout and conversion logic.
For businesses investing seriously in paid ads, analytics quality directly affects ROI.
**Clean data → better decisions → better margins.**
## 3. Hosting Flexibility vs. Locked-In Hosting
WooCommerce lets you choose hosting based on:
- Performance
- Geography
- Compliance
- Cost
- Scalability
You can switch providers as your business grows.
Shopify and Wix manage hosting centrally. This simplifies operations — but removes control.
You can't:
- Tune server performance
- Manage backups your way
- Change infrastructure
- React independently during platform incidents
Even fully managed platforms experience outages or admin issues. When that happens, merchants have no control.
## 4. Long-Term Cost Structure
The monthly subscription model of Shopify and Wix looks simple at first. But costs compound:
- Monthly platform fees
- App subscription fees
- Transaction fees
- Theme costs
- Limited negotiation on any of these
With WooCommerce:
- One-time or annual plugin licenses
- Direct hosting costs (often lower at scale)
- No transaction fees from the platform itself
- Full cost transparency
**Over 3-5 years, the total cost of ownership often favors WooCommerce — especially for growing stores.**
## 5. Switching Software Doesn't Fix Operational Problems
Many store owners believe Shopify or Wix is "more stable".
What usually changes is not the platform — but process maturity.
Most operational mistakes are universal:
- Too many plugins
- Updating directly in production
- No staging environment
- Weak hosting decisions
These lessons are often learned on WooCommerce.
Once applied:
- Fewer plugins
- Staged updates
- Controlled deployments
**WooCommerce becomes stable and predictable.**
Open source requires discipline — but that discipline becomes leverage.
## 6. Ecosystem Size and Adaptability
WooCommerce runs on WordPress — the largest website ecosystem in the world.
That means:
- More developers
- Faster adoption of new standards
- Broader plugin innovation
**Example:** Accessibility and regulatory compliance are increasingly impacting online sales. WooCommerce adapts quickly because of its open ecosystem.
Closed platforms depend on centralized roadmaps.
## 7. Owning Your Business vs. Renting a Platform
There is a fundamental difference between owning your stack and renting it.
**With Shopify or Wix:**
- They own the platform
- They set the rules
- You operate within their limits
**With WooCommerce:**
- You own the code
- You own the data
- You choose the infrastructure
- You decide how the business evolves
This isn't ideology. It's long-term control.
**If your store succeeds, ownership matters.**
## Conclusion
Switching platforms often feels like the fastest way out of uncertainty.
But in most cases, that uncertainty comes from growth — not from WooCommerce itself.
With proper operational discipline, WooCommerce becomes:
- Stable
- Flexible
- Scalable
- Economically efficient
Before switching, ask the same question posed in *The Goal*:
> Does this decision help the business make more money — now and in the future?
For many stores, the answer is not changing platforms — it's running WooCommerce properly.
---
# Why Your Paid Ad Traffic Shows as Referral in Google Analytics (And How to Fix It)
URL: https://sweetcode.com/blog/utm-parameters-for-ad-platforms
Date: 2025-12-16
Tags: pixel manager, google analytics, facebook, tiktok, linkedin, pinterest, conversion tracking

You're running paid ads on Facebook, TikTok, or LinkedIn. You check Google Analytics expecting to see your campaigns driving traffic. Instead, you find `m.facebook.com / referral` or `l.instagram.com / referral` cluttering your reports.
**Sound familiar?** You're not alone — and the fix is simpler than you might think.
✅ **TL;DR**
- Google Ads auto-tags for GA4. Most other platforms (Meta, TikTok, LinkedIn, Pinterest) do **not**.
- Without UTM parameters, GA4 sees your paid traffic as generic referral traffic.
- Add UTM parameters to every ad — copy-paste templates below.
- Each platform uses different macro syntax — don't mix them up.
## 🔴 The Problem: Paid Traffic Showing as Referral
When someone clicks your Facebook ad and lands on your site, two things happen:
1. **Facebook adds `fbclid`** — a click ID that Facebook uses for its own attribution in Ads Manager.
2. **Google Analytics sees... nothing useful.** It just knows the visitor came from `m.facebook.com`.
The result? Your GA4 reports show:
| What you expect | What you get |
|-----------------|--------------|
| `facebook / cpc` | `m.facebook.com / referral` |
| `instagram / cpc` | `l.instagram.com / referral` |
| `tiktok / cpc` | `tiktok.com / referral` |
| `linkedin / cpc` | `linkedin.com / referral` |
Your paid campaigns look like organic social traffic, making it impossible to measure ROI properly.
## 💬 Real-World Example
Here's an actual support conversation we had recently:
> **Customer:** My problem is that in Google Analytics all my Meta traffic shows as referral `m.facebook.com` instead of paid Facebook and Instagram.
>
> **Support:** If your Facebook/Instagram ads do not use UTM parameters, GA4 has to guess the source/medium from the referrer. That often leads to `m.facebook.com / referral` instead of something clean like `facebook / cpc`.
>
> **Customer:** My Facebook ad link did not have any UTMs, could that be the reason?
>
> **Support:** Yes, that alone can absolutely be the reason.
>
> **Customer:** I don't recall adding them before.
>
> **Support:** That explains a lot. Without UTMs, GA4 never had a clear signal that this traffic was paid.
**The customer had been running ads for months without UTMs.** All that paid traffic was being misattributed as referral traffic in their analytics.
## 🟢 The Solution: UTM Parameters
UTM parameters are tags you add to your ad URLs that tell Google Analytics exactly where the traffic came from:
```
https://yourstore.com/product?utm_source=facebook&utm_medium=cpc&utm_campaign=summer-sale
```
When GA4 sees these parameters, it correctly attributes the session:
- **Source:** facebook
- **Medium:** cpc
- **Campaign:** summer-sale
## ⚙️ Which Platforms Auto-Tag vs Require Manual UTMs
Not all ad platforms are created equal when it comes to Google Analytics attribution:
| Platform | Auto-tags for GA4? | What you need to do |
|----------|-------------------|---------------------|
| **Google Ads** | ✅ Yes (`gclid`) | Nothing — auto-tagging works out of the box |
| **Microsoft Ads** | ✅ Yes (`msclkid`) | Use auto-tagging (recommended over manual UTMs) |
| **Meta (Facebook/Instagram)** | ❌ No | Add UTM parameters manually |
| **TikTok** | ❌ No | Add UTM parameters manually |
| **LinkedIn** | ❌ No | Add UTM parameters manually |
| **Pinterest** | ❌ No | Add UTM parameters manually |
:::info[Google Ads & Microsoft Ads]
These platforms have auto-tagging enabled by default. Their click IDs (`gclid` and `msclkid`) automatically populate source/medium in GA4 when your accounts are linked. **Stick with auto-tagging** — it's more reliable than manual UTMs for these platforms.
:::
:::warning[Google Merchant Center / Shopping Feeds]
**Do NOT add UTM parameters to your Google Shopping product feed URLs.** Google internally tags all Merchant Center traffic. Adding UTMs to feed URLs can cause duplicate or conflicting attribution data in GA4, making your reports less accurate rather than more.
:::
## 📋 Copy-Paste UTM Templates
Here are ready-to-use templates with dynamic macros that automatically insert campaign, ad set, and ad names:
### Meta (Facebook / Instagram)
```
utm_source=facebook&utm_medium=cpc&utm_campaign={{campaign.name}}&utm_content={{adset.name}}&utm_term={{ad.name}}
```
📖 [Meta Dynamic Parameters Documentation](https://www.facebook.com/business/help/2360940870872492)
---
### TikTok
```
utm_source=tiktok&utm_medium=cpc&utm_campaign=__CAMPAIGN_NAME__&utm_content=__AID_NAME__&utm_term=__CID_NAME__
```
📖 [TikTok UTM Parameters Documentation](https://ads.tiktok.com/help/article/track-offsite-web-events-with-utm-parameters)
:::tip[TikTok Auto-UTM Feature]
TikTok offers an option to automatically add `utm_source` and `utm_medium` to your ad URLs. Enable this in TikTok Ads Manager for a quick baseline, then add the campaign/ad group macros manually for full tracking granularity. [Learn more](https://ads.tiktok.com/help/article/how-to-add-url-parameters-to-your-website-url-in-tiktok-ads-manager)
:::
---
### LinkedIn
```
utm_source=linkedin&utm_medium=cpc&utm_campaign={{CAMPAIGN_NAME}}&utm_content={{AD_NAME}}
```
📖 [LinkedIn URL Tracking Parameters Documentation](https://www.linkedin.com/help/lms/answer/a5968064)
:::info[LinkedIn Hierarchy Update (October 2025)]
LinkedIn updated its entity naming in October 2025 — "campaigns" are now "ad sets" in some accounts. If you're using the new hierarchy, use `{{AD_SET_NAME}}` and `{{AD_NAME}}` instead of `{{CAMPAIGN_NAME}}` and `{{CREATIVE_NAME}}`. Check which version your Campaign Manager account uses.
:::
---
### Pinterest
```
utm_source=pinterest&utm_medium=cpc&utm_campaign={campaign_name}&utm_content={adgroup_name}
```
📖 [Pinterest Dynamic Tracking Documentation](https://help.pinterest.com/en/business/article/third-party-and-dynamic-tracking)
---
## ⚠️ Important: Macro Syntax Differs by Platform
Each platform uses **different delimiters** for dynamic macros. You cannot mix and match:
| Platform | Syntax Style | Example |
|----------|--------------|---------|
| **Meta** | `{{lowercase}}` | `{{campaign.name}}` |
| **TikTok** | `__UPPER_UNDERSCORE__` | `__CAMPAIGN_NAME__` |
| **LinkedIn** | `{{UPPER_CASE}}` | `{{CAMPAIGN_NAME}}` |
| **Pinterest** | `{single_curly}` | `{campaign_name}` |
**Use the exact syntax specified by each platform.** A TikTok macro won't work in Facebook, and vice versa.
## 📍 Where to Add UTM Parameters
In **Meta Ads Manager**, you add UTM parameters at the **ad level**:
1. Edit your ad
2. Scroll to the **Tracking** section
3. Find **URL Parameters**
4. Paste your UTM string

:::warning[Add to Every Ad]
UTM parameters are **not inherited** from the campaign or ad set level. You must add them to each individual ad. If you duplicate an ad, the UTMs carry over — but new ads start blank.
:::
## 🔧 Troubleshooting: UTMs Added But Still Seeing Referral?
If you've added UTM parameters but still see referral traffic in GA4, check these common issues:
### ✅ Checklist
- [ ] **Redirects stripping parameters** — If your site redirects from `http` to `https` or `www` to non-`www`, ensure the redirect preserves query parameters. Test by clicking your ad and checking the final URL in your browser's address bar.
- [ ] **Caching or optimization plugins** — Some aggressive caching or JavaScript optimization plugins can delay or strip URL parameters. Temporarily disable "delay JS" or "combine JS" features and test again.
- [ ] **Payment gateway returns** — If customers go to an external payment page (PayPal, Klarna, etc.) and return, GA4 may start a new session attributed to the payment provider. Add payment domains to GA4's referral exclusion list.
- [ ] **Multiple tracking implementations** — If you have Google Analytics installed via multiple methods (Pixel Manager + another plugin, or hard-coded), they may conflict. Ensure GA4 is implemented only once.
- [ ] **Consent not given** — If you use Explicit Consent Mode, tracking only starts after the visitor accepts cookies. Traffic from visitors who don't consent will appear with limited attribution.
## 📈 What to Expect After Adding UTMs
Once you've added UTM parameters to your ads:
| Before | After |
|--------|-------|
| `m.facebook.com / referral` | `facebook / cpc` |
| `l.instagram.com / referral` | `facebook / cpc` |
| `tiktok.com / referral` | `tiktok / cpc` |
| `linkedin.com / referral` | `linkedin / cpc` |
**Important:** This only affects new traffic. Historical data cannot be retroactively fixed — sessions already recorded as referral will stay that way. But going forward, your reports will finally show accurate paid attribution.
---
This article will be updated as we confirm UTM templates for additional platforms.
---
# Version 1.54: AdRoll, Outbrain, and Contentsquare Pixels Now Available
URL: https://sweetcode.com/blog/version-1-54-new-pixels-adroll-outbrain-contentsquare
Date: 2025-12-15
Tags: pixel manager, development update, adroll, outbrain, contentsquare

**Version 1.54.0 is here!** We're expanding the Pixel Manager ecosystem with three new advertising and analytics integrations: **AdRoll**, **Outbrain**, and **Contentsquare**.
✅ **TL;DR**
- New AdRoll pixel for retargeting campaigns
- New Outbrain pixel for native advertising tracking
- New Contentsquare pixel for digital experience analytics
- Enhanced LinkedIn event tracking with conversion types and values
- TikTok Events API improvements
- Admin UX improvements and enhanced reliability
## 🎯 New: AdRoll Pixel
[AdRoll](https://www.adroll.com/) is a powerful retargeting platform that helps you bring visitors back to your store. With the new AdRoll integration, you can:
- Track page views and product interactions automatically
- Build retargeting audiences based on visitor behavior
- Measure conversions from your AdRoll campaigns
- Attribute revenue to your retargeting efforts
Simply add your AdRoll Advertiser ID and Pixel ID in the Pixel Manager settings, and you're ready to launch retargeting campaigns that bring customers back.
:::info[Pro Feature]
The AdRoll pixel is a Pro feature, available with a [Pro license](https://sweetcode.com/plugins/pmw#pricing-section).
:::
## 📰 New: Outbrain Pixel
[Outbrain](https://www.outbrain.com/) is one of the world's leading native advertising platforms, helping you reach audiences through content recommendations on premium publisher sites.
With the new Outbrain pixel integration:
- Track conversions from your native advertising campaigns
- Optimize campaigns based on actual purchase data
- Build custom audiences for retargeting
- Measure the full customer journey from content discovery to purchase
Native advertising through Outbrain is excellent for brand awareness and reaching customers at the top of the funnel. Now you can track the complete conversion path.
:::info[Pro Feature]
The Outbrain pixel is a Pro feature, available with a [Pro license](https://sweetcode.com/plugins/pmw#pricing-section).
:::
## 📊 New: Contentsquare Pixel
[Contentsquare](https://contentsquare.com/) is a digital experience analytics platform that helps you understand how visitors interact with your website through session replays, heatmaps, and journey analysis.
The new Contentsquare integration enables:
- Automatic page view and event tracking
- E-commerce event data for purchase analysis
- Session recording with conversion context
- Deep insights into the customer experience
Understanding *how* customers shop is just as important as tracking *what* they buy. Contentsquare gives you that behavioral insight.
:::info[Pro Feature]
The Contentsquare pixel is a Pro feature, available with a [Pro license](https://sweetcode.com/plugins/pmw#pricing-section).
:::
## 🔧 Enhanced LinkedIn Event Tracking
We've improved our LinkedIn Insight Tag integration with enhanced event adaptation. The update adds:
- **Conversion types** for different events (lead, purchase, etc.)
- **Conversion values** to track revenue in LinkedIn Campaign Manager
- Better attribution for LinkedIn advertising campaigns
This means more accurate ROAS reporting and better campaign optimization directly in LinkedIn.
## ⚡ TikTok Events API Improvements
The TikTok Events API integration now includes:
- New opportunity class for better feature discovery
- Enhanced availability detection
- Improved event handling
## 🎨 Admin UX Improvements
We've made several improvements to the admin experience:
- **Scroll event trigger**: Scripts can now load on scroll in addition to other interaction triggers, giving you more control over when tracking initializes
- **Opportunity card sorting**: Cards are now sorted by impact level, showing you the most important optimizations first
- **Streamlined dismissed opportunities**: Easier management of dismissed suggestions
- **External object cache detection**: Better compatibility detection for sites using Redis, Memcached, or other object caches
## 🛡️ Enhanced Reliability
Version 1.54 includes several under-the-hood improvements:
- **Enhanced client IP handling**: More reliable IP detection for server-side events
- **Improved transient storage**: Better verification for sites using external object caches
- **Debugging improvements**: Enhanced debug info output for troubleshooting
## Full Changelog
### Version 1.54.0 (December 15, 2025)
**New Features:**
- Added the AdRoll pixel
- Added the Outbrain pixel
- Added the Contentsquare pixel
**Improvements:**
- Added TikTok Events API opportunity class with availability and card data methods
- Added scroll event to interaction triggers for script loading
- Enhanced LinkedIn event adaptation with conversion types and values
- Admin UX improvements in the settings page
- Refactored opportunity card output with impact-level sorting
- Enhanced client IP address handling
- Added external object cache detection
- Enhanced transient handling for improved reliability with external object caches
## Get Started
Ready to try the new integrations?
Thank you for your continued support. We're excited to bring you more advertising platform integrations and help you track conversions across all your marketing channels!
Happy tracking! 🎯
---
# New Module Toggle: Disable Deprecated Functions to Trim JavaScript Size
URL: https://sweetcode.com/blog/disable-deprecated-functions-module-reduce-javascript
Date: 2025-12-09
Tags: pixel manager, development update, performance

**Less code means faster pages.** With version `1.53.0`, Pixel Manager introduces a new toggle to disable the deprecated functions module entirely, trimming unnecessary JavaScript from your WooCommerce store.
✅ **TL;DR**
- New setting to disable deprecated functions module
- Reduces front-end JavaScript by removing legacy compatibility code
- Safe to disable if you don't use custom code relying on old event names
- Part of a new modular architecture for optional features
## What Are Deprecated Functions?
Over time, Pixel Manager has evolved its API. Event names have been standardized, consent functions have been reorganized, and naming conventions have become more consistent. To avoid breaking existing custom integrations, we've maintained backward compatibility through a **deprecated functions module**.
This module maps old event and function names to their modern equivalents:
| Old (Deprecated) | New (Current) |
|------------------|---------------|
| `wpmAddToCart` | `pmw:add-to-cart` |
| `wpmBeginCheckout` | `pmw:begin-checkout` |
| `wpmViewItem` | `pmw:view-item` |
| `wpmOrderReceivedPage` | `pmw:purchase` |
| `pmw.consentAcceptAll()` | `pmw.consent.api.acceptAll()` |
| `pmw.consentRevokeAll()` | `pmw.consent.api.revokeAll()` |
| ...and more | |
If you have custom JavaScript that listens to these old events or calls these old functions, the deprecated module ensures everything still works.
## The New Toggle
Starting with version `1.53.0`, you can now disable this module entirely:
**Location:** Pixel Manager → Advanced → General → **Load Deprecated Functions**
When **enabled** (default):
- Old event names and function names continue to work
- Full backward compatibility with custom integrations
- Slightly larger JavaScript bundle
When **disabled**:
- Deprecated functions module is not loaded
- Smaller JavaScript footprint
- Old event/function names will no longer work
## Should You Disable It?
**Safe to disable if:**
- You don't have any custom JavaScript using Pixel Manager events
- Your custom code already uses the modern `pmw:*` event format
- You're starting fresh with no legacy integrations
- You want to optimize for the smallest possible JavaScript size
**Keep enabled if:**
- You have custom tracking code using old event names like `wpmAddToCart`
- Third-party plugins integrate with Pixel Manager using deprecated APIs
- You're not sure what custom code exists on your site
- Backward compatibility is more important than a few KB of JavaScript
:::tip[Quick Test]
Not sure if you're using deprecated functions? Disable the toggle, clear your caches, and browse your site while watching the browser console. If anything breaks or logs errors about missing events, re-enable the toggle.
:::
## Part of a Larger Modular Architecture
This toggle is the first in a new **modules system** we're building into Pixel Manager. The architecture allows us to:
1. Make optional features truly optional (not loaded if disabled)
2. Load modules on demand using code splitting
3. Give you granular control over what JavaScript runs on your store
4. Continue adding features without bloating the core library
The deprecated functions module is now loaded as a separate chunk. When disabled, that chunk is never requested: zero bytes, zero network requests.
```javascript
// How it works under the hood
if (wpmDataLayer?.general?.modules?.load_deprecated_functions !== false) {
const { loadDeprecatedFunctions } = await import("./wpm/deprecated.mjs");
loadDeprecatedFunctions();
}
```
## Combined with Code Splitting
This module toggle works hand-in-hand with the [code splitting](https://sweetcode.com/blog/pixel-manager-code-splitting-faster-tracking-better-performance) introduced in version `1.50.0`. Together, these optimizations mean:
- Only active pixels load their JavaScript
- Only enabled modules load their JavaScript
- The base library stays lean
- Your pages load faster
Every kilobyte saved contributes to better Core Web Vitals and a snappier shopping experience.
## How to Enable/Disable
1. Go to **Pixel Manager → Advanced → General**
2. Find the **Load Deprecated Functions** checkbox
3. Uncheck to disable, check to enable
4. Click **Save Changes**
5. Clear any page caches
That's it. No code changes required.
## Looking Ahead
The modules system opens the door for more optional features in the future. We're evaluating which components make sense as toggleable modules, always with the goal of keeping Pixel Manager fast and flexible.
If you have suggestions for features that should be optional, [let us know](mailto:support@sweetcode.com).
---
*Questions about deprecated functions or the new modules system? Reach out at [support@sweetcode.com](mailto:support@sweetcode.com).*
---
# Google Tag Gateway Proxy: First-Party Tracking Built Right Into WordPress
URL: https://sweetcode.com/blog/google-tag-gateway-proxy-first-party-tracking-built-into-pixel-manager
Date: 2025-12-09
Tags: pixel manager, google, conversion tracking, development update

**What if you could route all your Google Analytics and Google Ads tracking through your own domain, without any external services, cloud infrastructure, or ongoing costs?**
Starting with version `1.53.0`, you can. Pixel Manager now includes a built-in **Google Tag Gateway Proxy** that makes your tracking truly first-party. Just set a measurement path, and you're done.
✅ **TL;DR**
- Route Google tracking through your own domain. No external services required.
- Bypass ad blockers and browser restrictions automatically
- Extend cookie lifetimes beyond Safari's 7-day ITP limit
- One setting to enable, multiple fallback mechanisms to ensure tracking never breaks
- Zero additional infrastructure costs
:::caution[Beta Feature]
This feature is currently in beta. While we've implemented multiple fallback mechanisms to ensure your tracking never breaks, we recommend testing thoroughly in a staging environment before deploying to production.
:::
## 🔴 The Problem: Third-Party Tracking Is Dying
If you've been running Google Analytics or Google Ads on your WooCommerce store, you've probably noticed your data getting worse. Here's what's happening:
| Threat | Impact |
|--------|--------|
| **Ad blockers** | Block requests to `googletagmanager.com` and `google-analytics.com` |
| **Safari ITP** | Limits third-party cookies to just 7 days |
| **Browser privacy features** | Increasingly aggressive at blocking cross-origin tracking |
| **CDN/Proxy services** | Can interfere with tracking scripts |
The result? Missing conversions. Incomplete attribution. Shrinking remarketing audiences.
## 🟢 The Solution: Make It First-Party
Google introduced First-Party Servers (FPS) to solve this. The concept is simple: route tracking through your own domain so browsers treat it as first-party.
**Previously, implementing this required one of two approaches:**
1. **Cloudflare Integration**: If you were already using Cloudflare, we offered a simple one-click setup. Great if you're on Cloudflare, but not everyone is.
2. **Complex Proxy Setup**: For everyone else, it required your hosting provider to configure a reverse proxy on the server. Most hosting providers don't offer this, and those that do often charge extra or require back-and-forth with support to get it set up correctly.
**Now?** One setting in Pixel Manager. No Cloudflare required, no complex infrastructure.
### What You Get
| Metric | Standard Tracking | With Proxy |
|--------|------------------|------------|
| First-party context | ❌ No | ✅ Yes |
| Ad blocker bypass | ❌ No | ✅ Yes |
| Cookie lifetime (Safari) | 7 days (ITP) | Full duration |
| Additional cost | $0 | $0 |
| Infrastructure needed | None | None |
## ⚡ How It Works
```
Before (Third-Party):
Browser → googletagmanager.com → Google
After (First-Party with Proxy):
Browser → yourstore.com/mtc/ → Pixel Manager → Google FPS
```
When the proxy is enabled, Pixel Manager:
1. Intercepts requests to your measurement path
2. Forwards them to Google's First-Party Servers (`*.fps.goog`)
3. Rewrites URLs in responses so the entire flow stays first-party
Your visitors never see requests to Google domains. To browsers and ad blockers, it's all happening on your site.
### Automatic Handler Detection
Pixel Manager automatically detects the best available handler and uses it in the following priority order:
| Priority | Handler | How it works | Performance |
|----------|---------|--------------|-------------|
| 1 | **CDN Proxy (Cloudflare)** | Requests handled at CDN edge, no server load | ⚡ Fastest |
| 2 | **Standalone Local Proxy** | Standalone PHP file, bypasses WordPress core | 🚀 Fast |
| 3 | **WordPress Proxy** | WordPress core request processing | 🐢 Slower |
This detection happens automatically on the server side and is cached for performance. You don't need to configure anything — Pixel Manager will always use the fastest available option.
:::note[CDN Proxy Detection]
When you enable or disable a CDN proxy (such as Cloudflare), it may take up to 24 hours before the Pixel Manager detects the change. The handler detection is cached for performance.
:::
## 🔧 Setup: One Setting, That's It
1. Go to **Pixel Manager → Advanced → Google → Tag Gateway**
2. Enter a measurement path (e.g., `/mtc`)
3. Click **Save**
Done. The proxy activates immediately. No additional configuration, no server setup, no DNS changes.
Pixel Manager automatically:
- Routes all Google tag requests through your domain
- Flushes WordPress rewrite rules when you change the path
- Starts proxying to Google's First-Party Servers
## 🛡️ Multiple Fallback Mechanisms
We've built this with reliability as the top priority. Your tracking should never break, even if something goes wrong with the proxy.
### Fallback Priority
The Pixel Manager tries handlers in this order until one succeeds:
| Priority | Handler | When used |
|----------|---------|----------|
| 1 | **CDN Proxy** | Cloudflare configured and responding |
| 2 | **Standalone Proxy** | Standalone PHP file accessible (bypasses WordPress) |
| 3 | **WordPress Proxy** | Fallback via WordPress REST API |
| 4 | **Google CDN** | Ultimate fallback if all proxies fail |
### Additional Safeguards
| Layer | What It Does |
|-------|--------------|
| **Health Check Endpoint** | `/mtc/healthy` returns `ok` for monitoring |
| **Proxy Error Handling** | Graceful degradation on upstream failures |
| **Empty Response Handling** | Returns proper error codes, browser retries |
| **Tag ID Validation** | Rejects invalid tag IDs before external requests |
| **Path Sanitization** | SSRF and path traversal protection |
If the proxy ever has issues, tracking automatically falls back to standard Google URLs. You can also disable the proxy instantly by clearing the measurement path.
## 📈 Performance: Minimal Overhead
### Bot Exclusion
Known bot user agents (Googlebot, Bingbot, etc.) are automatically excluded from the proxy. Instead of hitting your server, they're redirected to the standard `googletagmanager.com` endpoint. This prevents crawlers and monitoring tools from unnecessarily stressing your server while still allowing them to see the tracking scripts if needed.
## ⚖️ Trade-offs: Proxy Options Compared
The Pixel Manager automatically selects the best proxy for your setup. Here's how the options compare:
| Aspect | CDN Proxy (Cloudflare) | Standalone Local Proxy | WordPress Proxy |
|--------|------------------------|---------------------|------------------|
| **Performance** | ⚡ Fastest (edge) | 🚀 Fast (bypasses WP) | 🐢 Slower (WP core) |
| **Server load** | None | Minimal | Moderate |
| **Memory usage** | None | ~1-2 MB | ~15-25 MB |
| **Requires Cloudflare** | ✅ Yes | ❌ No | ❌ No |
| **Setup complexity** | Configure in Cloudflare | Automatic | Automatic |
**How it works:** The Pixel Manager detects which handlers are available and automatically uses the fastest one. If you have Cloudflare configured, it uses the CDN proxy. If not, it uses the standalone local proxy (a standalone PHP file that doesn't load WordPress). The WordPress proxy (which loads only WordPress core, not plugins/themes) is only used as a final fallback.
**Our recommendation:**
- **Already on Cloudflare?** Configure the [Cloudflare integration](https://sweetcode.com/docs/pmw/plugin-configuration/google#google-tag-gateway-for-advertisers). The Pixel Manager will automatically detect and use it.
- **Not on Cloudflare?** The standalone local proxy provides excellent performance. It bypasses WordPress entirely, so each tracking request uses minimal server resources.
## ✅ Compatibility
### Works With
- All major page caching plugins (WP Rocket, W3 Total Cache, LiteSpeed, etc.)
- Cloudflare and other CDNs
- Nginx and Apache
- WordPress Multisite
- WooCommerce checkout (classic and blocks)
- All consent management plugins supported by Pixel Manager
### Requirements
- PHP 5.6+
- WordPress 5.0+
- Pixel Manager `1.53.0+`
## 🧪 Testing Your Setup
### Verify the Proxy Works
1. Open DevTools → Network tab
2. Load a page on your site
3. Look for requests to your measurement path (e.g., `/mtc/?id=G-XXX...`)
4. Verify they return `200` with JavaScript content
### Check the Health Endpoint
```bash
curl https://yourstore.com/mtc/healthy
# Should return: ok
```
## 🚀 Why This Matters
The Google Tag Gateway Proxy brings enterprise-level first-party tracking to every WooCommerce store:
- **Better tracking accuracy**: Bypass ad blockers and browser restrictions
- **Longer cookie lifetime**: First-party cookies aren't limited by ITP
- **Zero additional cost**: Uses your existing WordPress hosting
- **Automatic fallbacks**: Tracking never breaks
- **Simple activation**: One setting, no configuration
No server-side GTM. No cloud infrastructure. No ongoing costs.
## 👉 Get Started
Update to Pixel Manager `1.53.0`, set your measurement path, and start capturing the conversions you've been missing.
---
*Questions or feedback about the beta? Reach out to us at [support@sweetcode.com](mailto:support@sweetcode.com).*
---
# Development Update December 2025 (#12)
URL: https://sweetcode.com/blog/development-update-12
Date: 2025-12-01
Tags: pixel manager, development update, newsletter

## TLDR
- Added the Reddit Conversions API
- New Event Filtering System
- Code Splitting for Better Performance
- Centralized Pixel Registry Architecture
## Reddit Conversions API 🚀
We're excited to announce that the Pixel Manager for WooCommerce now supports the **Reddit Conversions API**!
Building on top of our existing Reddit pixel integration, the Conversions API (CAPI) takes your Reddit Ads tracking to the next level by sending conversion data directly from your server to Reddit. This server-to-server connection provides several key advantages:
**Why Server-Side Tracking Matters:**
- **Improved Accuracy**: Server-side events aren't affected by ad blockers or browser restrictions, ensuring you capture more conversions.
- **Better Attribution**: Enhanced match rates mean Reddit can better attribute conversions to the right ad campaigns.
- **Privacy-First**: Server-side tracking works seamlessly with consent management platforms and privacy regulations.
- **Redundant Tracking**: Combined with browser-side pixel tracking, you get the best of both worlds through event deduplication.
The Reddit Conversions API automatically sends purchase events, add-to-cart events, and other key conversion signals directly to Reddit, giving you more complete data to optimize your campaigns.
:::info[Pro Feature]
The [Reddit Conversions API](https://sweetcode.com/docs/pmw/plugin-configuration/reddit) is a Pro feature, available with a [Pro license](https://sweetcode.com/plugins/pmw#pricing-section).
:::
## Event Filtering System 🎛️
Version 1.51.0 introduces a powerful new **Event Filtering System** that gives you granular control over which events are sent to which platforms.
This system allows you to:
- Filter out specific events from being sent to certain pixels
- Customize tracking behavior based on your business needs
- Fine-tune your data collection strategy
With the removal of direct anonymous hit processing in individual pixel APIs (Facebook, Pinterest, TikTok, and Snapchat), the event filtering system now provides a unified and more flexible approach to managing how events are handled across all platforms.
## Code Splitting: Faster Loading Times ⚡
Version 1.50.0 introduced **code splitting** (also known as chunking) to the Pixel Manager front-end library. This architectural improvement delivers significant performance benefits:
- **Up to 50% reduction** in front-end JavaScript size
- Each pixel loads only when it's actually active
- Faster page loads for your WooCommerce store
- Better Core Web Vitals scores
Previously, the tracking library was monolithic – every integration shipped together even if only a fraction was used. Now, unused pixels no longer slow down your site.
👉 Read our [detailed blog post](https://sweetcode.com/blog/pixel-manager-code-splitting-faster-tracking-better-performance) about code splitting for more information.
## Centralized Pixel Registry 🏗️
Behind the scenes, we've implemented a **centralized pixel registry** that unifies server-side and browser-side handling. This architectural refactoring:
- Provides improved management of all pixel integrations
- Enables automatic detection of active pixels
- Streamlines the codebase for easier maintenance and faster feature development
## Other Notable Changes
Here are some additional improvements from recent releases:
- **Improved Compatibility**: Fixed chunk loading compatibility with script optimization plugins like SiteGround Optimizer, Autoptimize, and WP Rocket
- **Better Error Handling**: Added error handling in the queue runner and improved null/undefined checks
- **Updated Facebook API**: Bumped Facebook CAPI API version to v24.0
- **Bot Detection Improvements**: Switched from IP-based to user-agent-based bot detection for better accuracy and smaller file size
- **WordPress 6.9 Compatibility**: Updated compatibility for the latest WordPress version
### By the Numbers
Since our last development update in July 2023, we've shipped:
- **15+ new features**
- **100+ tweaks and improvements**
- **25+ bug fixes**
## Get Started
Ready to take advantage of these new features?
Thank you for being part of the Pixel Manager community. We're committed to making your WooCommerce conversion tracking as powerful and efficient as possible!
Happy tracking! 🎯
---
# Google Tag Scanner Warnings: Why They're Wrong About Pixel Manager's gtag.js Placement
URL: https://sweetcode.com/blog/understanding-google-tag-scanner-warnings-pixel-manager-gtag-placement
Date: 2025-11-22
Tags: pixel-manager, google-analytics, troubleshooting

If you've recently checked Google's Tag Coverage Report, you may have seen warnings about your `gtag.js` implementation:
- **"Tag not placed correctly"**
- **"Tag loaded too late"**
- **"Tag not found in the `` section"**
- **"Certain pages are not tagged"**
If you're using **Pixel Manager for WooCommerce** in its default configuration, these warnings are **misleading and incorrect**. Here's why.
## The Root Cause: Google's Scanner Has Limitations
Google's Tag Coverage scanner primarily analyzes the **static HTML source code** of your pages. It looks for the `gtag.js` script tag directly in the HTML and checks whether it appears in the `` section.
**The problem?** Pixel Manager (and many modern tracking solutions) inject `gtag.js` **dynamically via JavaScript** during the page load. This is a **100% valid and technically correct** implementation method, but Google's scanner doesn't always recognize it properly.
### Why Dynamic Injection is Valid
Dynamic script injection is widely used across the web for good reasons:
1. **Consent Management Compliance** - Scripts can be loaded only after user consent
2. **Performance Optimization** - Critical content loads first, tracking scripts load asynchronously
3. **Flexibility** - Scripts can be conditionally loaded based on user behavior or settings
4. **Modern Web Standards** - JavaScript-based injection is a common pattern in modern web development
Google's own Tag Manager (GTM) works the exact same way—it injects tracking scripts dynamically through JavaScript. Yet Google's scanner sometimes flags implementations that use this approach.
## How Pixel Manager Loads `gtag.js` (By the Book)
Let's clarify exactly how Pixel Manager works in its **default configuration**:
### 1. Pixel Manager Loads in the `` Section
The Pixel Manager script itself is loaded with **high priority** directly in the `` section of your WordPress site, before most other scripts.
```html
...
```
### 2. `gtag.js` is Injected Dynamically in the ``
Once Pixel Manager executes, it **immediately injects the `gtag.js` script** into the same `` section where it was loaded. This happens before the DOM finishes loading, ensuring `gtag.js` is available as early as possible.
```javascript
// Pixel Manager dynamically creates this:
```
Because Pixel Manager runs in the ``, the `gtag.js` script is also injected **in the ``**—exactly where Google recommends.
:::tip[Verify This Yourself]
Enable the [Console Logger](https://sweetcode.com/docs/pmw/developers/console-logger) by adding `?pmwloggeron` to your URL. You'll see in real-time exactly when and where `gtag.js` loads, confirming it's injected in the `` during page load.
:::
### 3. Google Consent Mode is Always Honored
When [Google Consent Mode](https://sweetcode.com/docs/pmw/consent-management/google) is enabled (which it should be for GDPR compliance), `gtag.js` **still loads in the ``** but waits for user consent before sending data.
This is the recommended approach by Google itself:
- The tag loads early (in the ``)
- It initializes in "consent mode" with default settings
- Data transmission only happens after user consent
Pixel Manager handles this automatically and correctly.
## When Warnings Might Be Legitimate
While Google's scanner is often wrong about Pixel Manager's default behavior, there **are** scenarios where warnings could be valid—but only if you've deliberately changed Pixel Manager's settings or your site uses interfering third-party tools.
### Scenario 1: Script Lazy Loading is Enabled (Pro Version)
In **Pixel Manager Pro**, there's an optional feature to **lazy load** tracking scripts after user interaction (scroll, click, etc.). This is a deliberate performance optimization.
**If enabled:**
- `gtag.js` loads only after the user interacts with the page
- Google's scanner will flag this as "late loading"
- **This is intentional and has no measurable impact on tracking accuracy**
**Where to check:** WooCommerce → Settings → Pixel Manager → Shop → "Lazy load the Pixel Manager"
If this is enabled and you want to eliminate the warning, you can disable lazy loading. However, we've found no measurable tracking loss when this feature is used correctly.
### Scenario 2: Pixel Manager is Deferred (Custom Filter)
Developers can use a filter to defer the Pixel Manager script:
```php
add_filter('pmw_experimental_defer_scripts', '__return_true');
```
**If this filter is applied:**
- Pixel Manager loads later in the page lifecycle
- `gtag.js` injection is also delayed
- Google's scanner may flag this
**This is not a default setting.** Check your theme's `functions.php` or custom plugins to see if this filter has been added.
### Scenario 3: Third-Party Interference
Several types of tools can interfere with Pixel Manager's loading behavior:
#### JavaScript Optimizers
Plugins like **Autoptimize**, **WP Rocket**, or **Asset CleanUp** may:
- Bundle, minify, or defer Pixel Manager's script
- Change the loading order
- Delay script execution
**Solution:** Exclude Pixel Manager from optimization. Most optimization plugins have settings to exclude specific scripts.
#### Caching Plugins
Aggressive caching can sometimes serve outdated HTML that doesn't include dynamically injected scripts.
**Solution:** Clear cache after enabling tracking pixels and test in an incognito window.
#### Cookie Consent Platforms
Some consent management platforms (CMPs) **block** script loading entirely until consent is given, rather than using Google Consent Mode.
**Examples:**
- CookieYes (in certain configurations)
- Complianz (if not configured for Consent Mode)
- Custom consent solutions
If your CMP blocks scripts instead of using Consent Mode, `gtag.js` won't load until the user accepts cookies. This is a CMP configuration issue, not a Pixel Manager issue.
**Solution:** Configure your CMP to work with Google Consent Mode instead of blocking scripts entirely.
#### Page Builders & Theme Frameworks
Some page builders or theme frameworks inject their own head management logic that can interfere with script priorities.
**Solution:** Test with a default WordPress theme (like Twenty Twenty-Four) to rule out theme interference.
## The "Certain Pages Are Not Tagged" Warning
This is one of the most misleading warnings from Google's scanner.
**Why it appears:**
- Google's scanner looks for `gtag.js` in the static HTML source
- Dynamically injected scripts don't appear in the source
- The scanner concludes the page is "not tagged"
**The reality:**
- Pixel Manager injects `gtag.js` on **every page** of your WordPress site
- The script executes correctly and sends tracking data
- Google Analytics receives page views, events, and conversions properly
**How to verify it's working:**
**Method 1: Use Pixel Manager's Console Logger**
1. Add `?pmwloggeron` to any page URL on your site
2. Open your browser's Developer Tools (F12)
3. Go to the **Console** tab
4. You'll see detailed logs showing `gtag.js` loading and all tracking events firing
**Method 2: Use Google Tag Assistant**
1. Install the [Google Tag Assistant Chrome extension](https://chromewebstore.google.com/detail/tag-assistant-legacy-by-g/kejbdjndbnbjgmefkgdddjlbokphdefk)
2. Visit your site and click the extension icon
3. You'll see Google Analytics 4 listed with events being tracked
4. This confirms `gtag.js` is loaded and working correctly
If tracking data appears correctly in your Google Analytics reports and Tag Assistant shows events firing, **the Tag Coverage scanner warning is incorrect**.
## Why Google's Scanner Gets This Wrong
Google's Tag Coverage scanner is designed for simplicity, not accuracy. It uses a basic HTML parser that:
- Looks for static `

Hi, I'm Maria, an independent content writer. SweetCode asked me to dive into their plugin, Pixel Manager for WooCommerce, and compare it with the other big player in the space, PixelYourSite.
Now, I usually write blogs for SweetCode, but I _did_ test both plugins (the free versions) myself.
So, in this post, I'm sharing my honest thoughts on both of them. Let's see how they really stack up.
I will do my best to give you the following:
- An honest comparison of Pixel Manager for WooCommerce vs PixelYourSite
- A factual comparison of features (which features the plugins have)
- How happy the users are (based on the plugins' rating and the number of unanswered questions on the WordPress Plugin Directory)
- How easy it is to set up both plugins
## Introduction
Data tracking and analytics are the driving force behind high-performing marketing strategies and exceptional customer experiences.
Without the right data, you're guessing. With it, you're making informed decisions that can scale your business and maximize conversions.
For WooCommerce store owners, selecting the right tracking solution can significantly impact both performance and growth. Among the top contenders in this space are two powerful pixel tracking plugins - [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) and [PixelYourSite](https://www.pixelyoursite.com/).
In this article, we'll do an in-depth comparison of both plugins to help you decide which is best for your needs. We'll start with an overview of both plugins, and compare their features, usability, pricing, and support options.
By the time you're done reading, you'll have a clear understanding of which plugin is the best fit for your business needs and marketing goals.
:::info[🔧 Pro Tip]
Better Support = Better Conversions
Before diving into the comparison between Pixel Manager for WooCommerce and PixelYourSite, here's a quick win:
If you're running an online store, your support system can make or break conversions. Tools like [ThriveDesk](https://www.thrivedesk.com/) — a lightweight yet powerful customer support suite — help you deliver fast, personalized service that keeps shoppers coming back.
:::
## Overview of Pixel Manager for WooCommerce

[Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) is a robust plugin designed to streamline the integration of various tracking pixels into your WooCommerce store. Its primary goal is to enhance the accuracy of data collection, making it easier for store owners to leverage data-driven marketing strategies.
**Key Features:**
- **Accurate Data Collection**. Ensures reliable tracking of user interactions.
- **Wide Pixel Support**. Supports various tracking pixels, including Facebook and Google Analytics.
- **Payment Gateway Accuracy Diagnostics**. Features a built-in tool for identifying and fixing tracking discrepancies.
**Free vs Paid**
Pixel Manager for WooCommerce offers a free version with basic functionalities, while the paid plans (Starter, Business, Agency, Agency Plus) provide advanced features, additional pixel integrations, and support options.
## Overview of PixelYourSite

[PixelYourSite](https://www.pixelyoursite.com/) is another leading pixel-tracking plugin for WooCommerce. You can use it to set up and manage various tracking tools for marketing and analytics, including UTMs.
**Key Features**
- **Event Tracking**. Allows detailed tracking of specific user actions.
- **Customization Options**. Users can tailor tracking settings to meet specific needs.
- **Integrations**. Lets you integrate Meta Pixel, GA4, and Google Tag Manager into your WordPress site.
**Free vs Paid**
PixelYourSite also offers a free version, with paid plans including Starter, Advanced, and Agency tiers that offer additional functionalities.
## Pixel Manager for WooCommerce vs PixelYourSite
Next, let's dig deeper into the unique benefits, features, ease of use, and support structures each plugin offers.
### #1: Benefits
**Pixel Manager for WooCommerce**
Pixel Manager for WooCommerce is highly regarded for its precision in tracking, minimizing errors that can arise from manual setups.
One of its standout features, Automated Conversion Reporting (ACR), automatically tracks and records conversion events such as completed purchases or form submissions, eliminating the need for manual reporting and ensuring data accuracy. An example is how it instantly logs a sale when a customer completes a checkout, without any extra input from the user. So, even if they don't reach the “Thank You” page, their sale is recorded.
Furthermore, the plugin supports integration with a wide range of advertising platforms like Facebook, Google Ads, and more, making it a versatile and powerful tool for marketers looking to optimize their campaigns across multiple channels.
Another significant advantage is the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview), which offloads server-side ad tracking from your WooCommerce server to an edge network powered by Cloudflare Workers. Instead of your shop's PHP server handling every Conversion API call — adding latency and CPU load — events are routed through a first-party subdomain (e.g. `ssp.yourshop.com`) to a Cloudflare Worker that fans them out to ad platform APIs. This reduces server load, and because events travel through your own domain, they bypass ad blockers and browser privacy features, significantly improving tracking accuracy. PixelYourSite has no equivalent feature.
In my view, if you're running an ecommerce store and your priority is precise transaction tracking with automated reporting, Pixel Manager for WooCommerce is the best choice for your needs.
**PixelYourSite**
PixelYourSite can enhance marketing campaigns by offering effective event tracking and robust analytics, enabling businesses to optimize their strategies based on real-time data. Its event tracking capabilities allow for detailed monitoring of user actions - such as clicks, page views, or product interactions - providing valuable insights that are crucial for creating highly targeted marketing efforts.
However, setting it up is a hit or miss based on user behavior. Users on the WordPress Plugin Directory have reported that the purchase event is only sent to the pixel when the customer completes the transaction and views the last page of the order (such as the “Thank You” page). If your customers don't hang around after the transaction is complete, you'll get inaccurate data.
PixelYourSite also offers integration with a wide range of marketing and analytics platforms, such as Google Analytics, Facebook Ads, and more. Done right, this can help you get a comprehensive view of customer interactions across multiple channels.
### #2: Features
**Pixel Manager for WooCommerce**
Pixel Manager for WooCommerce is designed with automated features that prioritize data integrity, such as the Payment Gateway Accuracy Diagnostics tool, which ensures your tracking is always aligned with your actual sales data, reducing discrepancies.
I tested it out myself, and honestly, it just works - no fuss, no issues.
The platform also offers REST API access, unlocking advanced GA4 features and making it ideal for tech-savvy users who want to dive deep into their analytics for more granular insights.
In addition, Pixel Manager for WooCommerce provides detailed tracking accuracy reports, with customizable filters that allow users to drill down into specific metrics, enabling a more precise analysis of their performance and customer behavior.
**PixelYourSite**
PixelYourSite promises an easy setup for various tracking scripts, but the reality is a bit more complicated. While it claims to simplify adding tools like Facebook Pixel, Google Analytics, and others, the process can feel anything but straightforward. You might find yourself stumbling through settings and configurations, especially if you don't have technical expertise.
Event tracking for actions like purchases and sign-ups is available, but setting it up isn't always intuitive. Customizable settings are there, but getting everything to work just right can take more time and effort than expected. It offers flexibility, but that flexibility also means there's a lot to manage and fine-tune, making it less seamless than you might hope.
PixelYourSite also lets you track UTMs, traffic sources, and landing pages, and view data from the WooCommerce Reports screen.
### #3: Ease of Use
**Pixel Manager for WooCommerce**
Pixel Manager for WooCommerce is designed with a simple setup process that makes installation straightforward, even for users who aren't particularly tech-savvy. To further assist, the platform includes non-intrusive instructional videos directly within the WordPress back-end, guiding users step-by-step through the setup and key functionalities.

I particularly liked how it was immediately clear what I needed to do next i.e. enter the Meta Pixel ID and click the Save Changes button. I think developers and marketers would appreciate the simplicity and non-techy users can always click the YouTube icons next to each field to learn more without having to leave the WordPress back-end.
Whether you're a developer or a business owner, Pixel Manager for WooCommerce's intuitive interface and comprehensive resources ensure that it is user-friendly and accessible to individuals of all skill levels. This makes it easy to get started and fully utilize the platform's features.
**PixelYourSite**
When I installed the free version of the PixelYourSite plugin, I was immediately hit with a flood of ads pushing me to upgrade to the Pro version. On top of that, there were constant notifications that cluttered my screen. Setting up the plugin wasn't straightforward either. It wasn't clear where to start or what to do next.

To enter your Meta Pixel ID, you have to click a button that opens up the correct fields and settings. The button makes it seem like something will open an external link (and some buttons on this screen do open external links).
If this is your first time setting it up, you can expect to fiddle around the General settings page a bit and maybe even watch a YouTube video or two before entering your Meta Pixel ID and moving forth.
If you're new to pixel tracking, this might be useful. However, if you're an experienced marketer or developer, you'll likely see this as friction in the setup process.
### #4: Support and Documentation
**Pixel Manager for WooCommerce**
Pixel Manager for WooCommerce provides dedicated support staff available full-time to assist users with any issues they may encounter, ensuring timely and helpful solutions. The glowing reviews on the WordPress Plugin Directory are a clear testament to this.
In addition, the platform offers extensive documentation, including comprehensive guides and FAQs, to help users troubleshoot common problems independently and efficiently. The documentation is clearly labeled “Documentation” in the primary menu so it's easy to access.

This combination of expert support and self-service resources ensures that users always have access to the help they need, whether through direct assistance or by referencing detailed documentation.

I like the handy “Ask our custom ChatGPT” feature SweetCode has recently added to their website. I asked it where I could find the access token for setting up Meta (Facebook) CAPI and got clear, step-by-step instructions. My query was resolved in a single interaction.
**PixelYourSite**
PixelYourSite offers comprehensive documentation, providing extensive resources to ensure that users can easily find answers to their questions and troubleshoot any issues on their own. That said, the documentation isn't easy to find on their website. (Hint: if you go to the footer and click “PixelYourSite Professional Help”, you'll reach the documentation page.)

Despite the plugin's claim of "quick response times" user reviews and threads on the WordPress.org forums suggest otherwise. Many users have expressed frustration over slow support, with several complaints highlighting the need for PixelYourSite to hire additional support staff to address ongoing issues more efficiently.
At the time of this writing, the free version of the PixelYourSite plugin has 15 pages worth of unresolved topics (yikes!), most of which haven't received a response from plugin support yet.
To take things further, using a support platform like **ThriveDesk** can streamline how you handle customer interactions—improving speed, clarity, and overall satisfaction.
### #5: Server-Side Implementation Quality
Both plugins offer Conversions API support for Facebook (and PMW also does it for TikTok, Pinterest, Snapchat, Reddit, and GA4 Measurement Protocol). The phrase "supports CAPI" hides a huge amount of detail, though, and this is where the two plugins differ the most.
**Pixel Manager for WooCommerce** runs every server-side platform through a single abstract base class. That means the same identifier resolution chain (live session → order meta → WooCommerce stored values), the same server-side User-Agent detection for Stripe / PayPal / Klarna / Mollie / Adyen / Square / `wp-cron` callbacks, the same per-platform idempotency keys, and the same handling of iframe checkouts, manual orders, pay-for-order links, WooCommerce Subscriptions, and partial GA4 refunds applies to all of them. Fix one edge case, fix it everywhere.
**PixelYourSite** ships a per-platform implementation. The Free version also mints a synthetic `_fbp` cookie value (`'fb.1.' . time() . '.' . rand(...)`) when a real one is missing, which inflates Meta's Event Match Quality dashboard but maps to no real Facebook user, so it does not contribute attribution, audience matching, or optimizer lift. PMW deliberately does not do this. We wrote a full breakdown of the trade-offs and the dozens of edge cases that separate a production-grade CAPI implementation from a basic one in [What separates a production-grade WooCommerce Conversion API implementation from a toy one](https://sweetcode.com/blog/woocommerce-conversion-api-quality).
#### Where PixelYourSite is genuinely the right choice
No plugin is the right answer for every store, and PixelYourSite has real strengths that Pixel Manager does not match:
- **Non-WooCommerce WordPress sites.** PixelYourSite works on any WordPress site (blogs, membership sites, lead-gen sites, LMS plugins, BuddyPress, Easy Digital Downloads, etc.). Pixel Manager is WooCommerce-only by design. If your tracking needs are not centred on a WooCommerce shop, PixelYourSite is the more natural fit.
- **Click-based event tracking on arbitrary CSS selectors.** PYS lets non-developers attach tracking events to any clickable element via a settings UI. Pixel Manager favours a code-driven, event-filter API for the same use case, which is more powerful but less accessible for non-technical users.
- **UTM parameter rewriting and traffic-source persistence.** PYS includes built-in UTM tagging and traffic-source attribution that surface in WooCommerce reports. Pixel Manager focuses on pixel/CAPI tracking and leaves UTM tooling to dedicated plugins.
- **Longer market presence.** PixelYourSite has been around longer and has a larger installed base, which means more third-party tutorials, more YouTube walkthroughs, and a larger pool of agencies familiar with it.
If your store is a single-platform Facebook-only WooCommerce shop with PayPal as the only payment method and you mostly care about a high EMQ score in the Meta Events Manager, PixelYourSite Free will get you a higher number on that dashboard than Pixel Manager will. Whether that number translates to more revenue is the subject of the [dedicated technical comparison](https://sweetcode.com/blog/woocommerce-conversion-api-quality).
### #6: Plans and Pricing
**Pixel Manager for WooCommerce**
[Free Version](https://wordpress.org/plugins/woocommerce-google-adwords-conversion-tracking-tag/): Available with essential features.
You can see the [current pricing of the plugin here](https://sweetcode.com/plugins/pmw#pricing-section). As of this writing, the paid pricing plans are detailed below.
**PixelYourSite**
[Free Version](https://wordpress.org/plugins/pixelyoursite/): Basic functionalities are available with the free version.
You can see the [current pricing of the plugin here](https://www.pixelyoursite.com/).
## Comparison Table: Pixel Manager for WooCommerce vs PixelYourSite
| Benefits | PMW (Free) | PMW (Pro) | PYS (Free) | PYS (Pro) |
|----------------------------------------|------------|-----------|------------|-----------|
| Automatic Conversion Recovery | ❌ | ✔ | ❌ | ❌ |
| REST API | ✔ | ✔ | ❌ | ❌ |
| Payment Gateway Accuracy Diagnostics | ✔ | ✔ | ❌ | ❌ |
| Integration with Consent Management | ✔ | ✔ | ✔ | ✔ |
| **Order Duplication Prevention** | ✔ | ✔ | ❌ | ❌ |
| **Server-Side Proxy (Edge Network)** | ❌ | ✔ | ❌ | ❌ |
| **Unified S2S architecture across all platforms** | ✔ | ✔ | ❌ | ❌ |
| **Server-side UA detection for gateway webhooks** | ✔ | ✔ | ❌ | ❌ |
| **Per-platform purchase idempotency keys** | ✔ | ✔ | ❌ | ❌ |
| **No synthetic `_fbp` inflation** | ✔ | ✔ | ❌ | ✔ |
| Advanced GA4 Features | ✔ | ✔ | ✔ | ✔ |
| **Scroll Tracking** | ❌ | ✔ | ❌ | ✔ |
| **Automatic Phone and Link Tracking** | ❌ | ✔ | ❌ | ✔ |
| Event Tracking | ✔ | ✔ | ✔ | ✔ |
| Plugin Ratings (Free version) Pro-rated| 4.87/5 | - | 4.29/5 - |
## Wrapping Up
Both Pixel Manager for WooCommerce and PixelYourSite offer robust solutions for tracking and analytics in WooCommerce environments.
To recap:
- [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) excels in data accuracy and automated reporting, making it ideal for those prioritizing precise data collection. It's super easy to set up, and the support and documentation are outstanding. It also offers a unique [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview) that offloads conversion API calls to an edge network, reducing server load and improving tracking accuracy by routing events through your own first-party domain — a feature PixelYourSite doesn't have.
- On the other hand, [PixelYourSite](https://www.pixelyoursite.com/) helps you integrate and manage APIs and pixels on your WordPress site or WooCommerce-powered online store. It also lets you track traffic sources and UTMs.
## Frequently Asked Questions
### Does PixelYourSite support the Facebook Conversions API?
Yes. Both PixelYourSite Free and Pro send purchase and other events to Meta via the Conversions API. The implementation differs from Pixel Manager in three notable ways: it is built per-platform rather than sharing a single abstract S2S base class, the Free version mints a synthetic `_fbp` cookie value when a real one is missing, and it uses a single boolean meta key for purchase idempotency rather than per-platform keys. Details are in the [dedicated CAPI quality breakdown](https://sweetcode.com/blog/woocommerce-conversion-api-quality).
### Why does PixelYourSite show a higher Facebook Event Match Quality (EMQ) score than Pixel Manager?
Because PixelYourSite Free mints a synthetic `_fbp` value (`'fb.1.' . time() . '.' . rand(1000000000, 9999999999)`) and sends it to Meta whenever a real cookie is missing. Meta's EMQ score rewards the *presence* of an `_fbp` value but does not validate that it corresponds to a real browser session, so the dashboard goes up. The synthetic value cannot be matched to any real Facebook user, so it contributes zero attribution, audience-matching, or optimizer lift. Pixel Manager deliberately does not do this and only sends `_fbp` when the real Facebook pixel set the cookie. PixelYourSite Pro behaves the same way as Pixel Manager on this specific point.
### Which plugin handles Klarna, bank transfers, or other deferred-payment gateways correctly?
Pixel Manager. The Pixel Manager's S2S base class explicitly detects requests originating from gateway webhooks (Stripe, PayPal, Klarna, Mollie, Adyen, Square, `wp-cron`) and resolves the customer's User-Agent, IP address, and browser identifiers from the order's stored values rather than from the webhook request itself. Without this handling, deferred-payment orders end up with a `User-Agent` like "Stripe-Webhook" or "wp-cron", which destroys ad-platform match rates.
### Does Pixel Manager work with WooCommerce Subscriptions?
Yes. Initial subscription charges fire as `Subscribe` (or the platform-equivalent event), recurring renewals fire as `RecurringSubscriptionPayment`, and cancellations fire as `CancelSubscription`. Each event carries the right product context, value, and per-platform idempotency key. PixelYourSite supports WooCommerce Subscriptions in its Pro tier with a more limited set of events.
### Which plugin handles iframe checkouts, manual back end orders, and pay-for-order links correctly?
Pixel Manager handles all three out of the box. Iframe checkouts are detected so the browser pixel does not double-fire. Manual orders created in the WordPress back end and marked paid by staff still trigger the CAPI pipeline (since the customer's browser never reaches a thank-you page). Pay-for-order links hook into WooCommerce at priority 5 so the conversion is attributed to the actual payment moment. PixelYourSite does not handle these edge cases consistently across its supported platforms.
### Does Pixel Manager track GA4 refunds (full and partial)?
Yes. When an order or specific line items are refunded, Pixel Manager sends GA4 a properly-formed `refund` event with the correct `items` array. PixelYourSite does not currently send GA4 refund events.
### Which plugin offloads server-side tracking from the WooCommerce server?
Only Pixel Manager. The paid tiers integrate with the [Server-Side Proxy](https://sweetcode.com/docs/pmw/server-side-proxy/overview), a Cloudflare Worker that runs on a first-party subdomain of your shop (e.g. `ssp.yourshop.com`). The PHP server sends one outbound call to the proxy instead of six separate HTTPS calls (one per ad platform), and because events travel under your domain they are not blocked by browser privacy controls. PixelYourSite has no equivalent feature.
### Does PixelYourSite work on non-WooCommerce WordPress sites?
Yes, this is one of PixelYourSite's genuine advantages. PixelYourSite works on any WordPress site (blogs, membership sites, lead-gen sites, LMS plugins, BuddyPress, Easy Digital Downloads, etc.). Pixel Manager is WooCommerce-only by design. If your tracking needs are not centred on a WooCommerce shop, PixelYourSite is the more natural choice.
### Which plugin is better for non-technical users setting up click-based event tracking?
PixelYourSite. It includes a settings UI that lets non-developers attach tracking events to any clickable element via CSS selectors. Pixel Manager exposes a code-driven event-filter API for the same use case, which is more powerful (composable, testable, version-controllable) but less accessible to users who do not write code.
### Which plugin has better support for Google Ads, Microsoft Ads, and Bing?
Pixel Manager. It supports server-side conversion APIs for Google Ads, Microsoft Ads, TikTok, Pinterest, Snapchat, Reddit, and GA4 Measurement Protocol, all built on the same shared abstract S2S base class. PixelYourSite covers fewer ad platforms server-side and uses a per-platform implementation, so an edge case fixed for one platform does not automatically benefit the others.
### Can I replicate PixelYourSite's Advanced Marketing Events (FirstTimeBuyer, ReturningCustomer, FrequentShopper, VIPClient, BigWhale) in Pixel Manager?
Yes, all of them. Pixel Manager exposes a custom event API (`pmw.trackCustomFacebookEvent`) plus a `pmw:purchase` browser event, which together replicate every PixelYourSite Advanced Marketing Event with the exact thresholds you had configured, and additionally attach `transaction_count`, `aov`, and `ltv` as custom data for Meta audience rules. A copy-paste-ready snippet is available in [the documentation](https://sweetcode.com/docs/pmw/developers/tipps-and-tricks#replicate-pixelyoursites-advanced-marketing-events), and we wrote a [full migration walkthrough](https://sweetcode.com/blog/replicate-pixelyoursite-advanced-marketing-events) showing how our chatbot generates customized variants.
### Which plugin is better for stores under WooCommerce Subscriptions / membership models?
Pixel Manager. The subscription lifecycle (initial charge, recurring renewal, cancellation) maps to dedicated events with full product context and per-platform idempotency. PixelYourSite Pro supports the basics; Pixel Manager handles the full lifecycle across every supported platform.
Take your time to evaluate the features and benefits of both tools. Choose the one that aligns best with your ecommerce goals and start leveraging data to enhance your marketing strategies today!
You can see the reviews for the free versions of [Pixel Manager for WooCommerce here](https://wordpress.org/support/plugin/woocommerce-google-adwords-conversion-tracking-tag/reviews/) and [PixelYourSite here](https://wordpress.org/support/plugin/pixelyoursite/reviews/).
---
# Best Free WooCommerce Plugin for Tracking Sales: Free vs Pro
URL: https://sweetcode.com/blog/best-free-woocommerce-plugin-for-tracking-sales-free-vs-pro
Date: 2024-09-27
Tags: pixel manager, new feature

- The free version of Pixel Manager for WooCommerce is ideal for small shops with a limited advertising budget, offering basic tracking (Google Ads, Meta) without the complexities of Google Tag Manager.
- The Pro version is recommended for businesses spending more than $10/day on ads, featuring advanced tools like Automatic Conversion Recovery (ACR), Google Ads Enhanced Conversions, and support for more platforms, ensuring accurate tracking and data recovery.
- Upgrading to the Pro version enables better data accuracy, additional pixel integrations, and premium support, providing improved ROI and optimization for growing businesses.
## Management summary
When it comes to digital marketing (especially paid ads), it's crucial you know exactly which campaigns and ads convert into a sale and which don't. This allows you to allocate the budget correctly and grow your shop.
The free version of the Pixel Manager plugin is suitable for small WooCommerce shops with a small advertising budget (say $10/day). They'll be able to track the basics (i.e. Google Ads, META) and have the correct pixel tracking setup implemented.
This is far better than fiddling around with Google Tag Manager yourself which might be “free” but is far more complex in terms of setup. What's worse is that if you set it up incorrectly, you'll get inaccurate tracking data which means you'll be blindly allocating marketing budget and increase the risk of losing money.
See our article on ["Is Google Tag Manager Really Free?"](https://sweetcode.com/blog/best-gtm-alternative#is-google-tag-manager-free) for more information.
Any serious WooCommerce shop spending more than $10/day should consider the Pro version of the Pixel Manager plugin. Why?
The Pro version of the Pixel Manager for WooCommerce plugin also tracks all purchases that do not go smoothly. It does this by using its built-in ACR (Automatic Conversion Recovery) feature and Google Ads Enhanced Conversions and Adjustments. This gives you the **complete picture** of your digital marketing spend and return. Plus, you get access to an API to META, the option to set up tracking on more platforms like TikTok, and one-on-one support for your WooCommerce shop.
Read the full article to understand how to save money by allocating ad budget to the right campaigns and ads. You'll also learn how to track sales accurately and get actionable tips to grow your sales and profits.
The Pro version of the Pixel Manager plugin is an incredible bargain compared to your ad spend. It could very well be the best investment you make for your shop!
## Introduction
Pixel tracking is a technique savvy digital marketers use to monitor the behavior of website visitors and the performance of digital marketing campaigns.
Whenever a user visits a page, views an ad, or completes a purchase, the pixel is loaded and data about the user's interaction is sent back to the server. This data enables businesses to understand better how users interact with their content and help them make informed decisions about optimizing their site's performance and enhancing marketing campaigns..
While many digital marketers still use [Google Tag Manager](https://sweetcode.com/blog/best-gtm-alternative) (GTM) for pixel tracking, an increasing number are shifting to easier solutions to set up and provide accurate tracking data, like [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) (PMW).
Now, you might be unsure whether to choose the free version or the pro version of the plugin. In this article, we'll help you decide by highlighting the features and benefits of each option.
## Overview of Pixel Manager: Free Version
The free version of the Pixel Manager for WooCommerce plugin has over 40,000 active installations and a 5-star rating in the WordPress Plugin Directory. Google's Tag Implementation Team endorses it.
With the free version of the plugin, you can track WooCommerce store visitors and collect data for conversion optimization, paid ads, dynamic remarketing, and reporting. The plugin is user-friendly and easy to get started with.
You can use customizable filters for even more precise tracking and get standardized data output across platforms. The free version of the plugin is GDPR-aligned and comes with advanced data privacy features.
In addition to all this, its lightweight JavaScript library ensures your WooCommerce site maintains high performance and speed.
The free version of the plugin is perfect for digital marketers and WooCommerce site owners who need to implement the Google Ads Pixel, Google Analytics Pixel, HotJar Pixel, or Meta Ads Pixel on their site.
It lets you set up neat features like order duplication prevention, dynamic remarketing, Google Ads cart data tracking, and payment gateway accuracy reports to ensure you're collecting accurate data from your site visitors.
You can download the [free version of the Pixel Manager for WooCommerce](https://wordpress.org/plugins/woocommerce-google-adwords-conversion-tracking-tag/) plugin from the WordPress Plugin Directory or by searching for it from the WordPress back-end.
## Overview of Pixel Manager: Pro Version
The Pro version of the Pixel Manager for WooCommerce plugin includes all the free version's features and adds powerful, advanced tools that take your store's performance to the next level.
With the pro version, you get access to additional pixels including LinkedIn Ads Pixel, Microsoft Ads Pixel, Pinterest Ads Pixel, Reddit Ads Pixel, Twitter (X) Ads Pixel, and more. In addition to this, it also offers server-side tracking for many platforms.
You also get access to neat features like Google Ads Enhanced Conversions, Meta Conversion API, and Automatic Conversion Recovery (ACR) – more on this later. In addition to this, you get one-on-one support for your WooCommerce shop.
You can get the [Pro version of the Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) plugin here.
## Pixel Manager: Free vs Pro
Feature | Free Version | Pro Version
--- | --- | ---
Pixel Integrations | Google Ads Pixel, Google Analytics Pixel, HotJar Pixel, Meta Ads Pixel | All Free Version Pixels, LinkedIn Ads Pixel, Microsoft Ads Pixel, Pinterest Ads Pixel, Reddit Ads Pixel, Snapchat Ads Pixel, Taboola Ads Pixel, TikTok Ads Pixel, Twitter Ads Pixel
Google Consent Mode v2 | ✓ | ✓
Google Ads Conversion Value Tracking | ✓ | ✓
Google Ads Dynamic Remarketing | ✓ | ✓
Google Ads Cart Item Tracking | ✓ | ✓
Google Shopping New Customer Parameter | ✓ | ✓
GA4 Enhanced E-Commerce | ✓ | ✓
Meta Remarketing Events | ✓ | ✓
Basic Order Duplication Prevention | ✓ | ✓
Automatic Conversion Recovery | ✘ | ✓
Google Ads Enhanced Conversions | ✘ | ✓
Google Ads Conversion Adjustments | ✘ | ✓
Advanced Order Duplication Prevention | ✘ | ✓
Meta/Pinterest/Snapchat CAPI | ✘ | ✓
Scroll Tracking | ✘ | ✓
Automatic Phone and Link Click Tracking | ✘ | ✓
Let's take a closer look at the differences between the free version and the pro version of the plugin.
### Feature #1: More pixel integrations
The free version of the plugin lets you implement the Google Ads Pixel, Google Analytics Pixel, HotJar Pixel, or Meta Ads Pixel on your site. With the pro version of the plugin, you get access to an additional 9 pixels including:
LinkedIn Ads Pixel (Pro)
Microsoft Ads Pixel (Pro)
Outbrain Ads Pixel (Pro)
Pinterest Ads Pixel (Pro)
Reddit Ads Pixel (Pro)
Snapchat Ads Pixel (Pro)
Taboola Ads Pixel (Pro)
TikTok Ads Pixel (Pro)
Twitter Ads Pixel (Pro)
Having more pixel integrations available means you can expect better tracking accuracy across various customer touchpoints, improved ad targeting, and higher return on investment (ROI).
### Feature #2: Automatic Conversion Recovery
Another feature that's only available with the pro version of the plugin is Automatic Conversion Recovery. In a nutshell, ACR is a tool that's designed to detect and recover untracked purchase events on your WooCommerce site.
Many times, tracking pixels miss some purchase events because customers don't always reach the purchase confirmation page. This leads to incomplete (and inaccurate) data.
ACR solves this problem by identifying and recording missed conversions when customers revisit your WooCommerce store. As a result, you achieve more precise tracking and a clearer understanding of the effectiveness of your paid ad campaigns.
### Feature #3: Google Ads Enhanced Conversions and Conversion Adjustments
The pro version of the Pixel Manager for WooCommerce plugin offers support for Google Ads Enhanced Conversions and Conversion Adjustments.
For those unfamiliar, Google Ads Enhanced Conversions improves conversion tracking accuracy by making use of first-party data.
For example, when a user completes a conversion (like making a purchase), Google Ads Enhanced Conversions collects and matches data such as hashed email addresses or phone numbers that it sends to Google to match with Google accounts to confirm the conversion.
This process helps accurately attribute conversions to the correct ads. As a result, digital marketers and WooCommerce store owners can gain better insights from their paid ad campaigns, optimize their ads, and achieve a better ROI.
When we think of conversions, we tend to think a user's conversion path ends when they act on the conversion goal i.e. make a purchase or fill out a form. In reality, customers often return the items they bought, cancel their orders or reservations, or take action that increases their value to your business.
Google Ads Conversion Adjustments is a feature that lets advertisers adjust the value of a conversion after it's reported in Google Ads. It lets you retract conversions that should no longer be counted, restate the value of conversions in case of partial returns, or change the value of conversions based on customer lifetime value (LTV).
### Additional features
In addition to these key features, the pro version of the plugin also offers:
- **Advanced Order Duplication Prevention**: If customer orders are recorded more than once, it can mess up your data, leading to inaccurate reports. This feature ensures the same order isn't counted multiple times so your sales data is accurate and reliable.
- **Meta/Pinterest/Snapchat CAPI**: Direct data transfer to Meta/Pinterest/Snapchat improves the accuracy of your ad performance tracking and helps with retargeting campaigns. As a result, it can help you boost your return on ad spend.
- **Scroll Tracking**: Keeping an eye on how far users scroll on your online store can help you gauge their engagement with your content. If users are only scrolling a quarter of the way down your page, you might need to rethink your content strategy or change the placement of your CTA buttons.
- **Automatic phone and link click tracking**: Knowing which links and phone numbers users are clicking helps you understand what they're interested in. This enables you to monitor the effectiveness of your Contact Us pages and promotional links.
- **Excellent, fast response support**: Having access to reliable support ensures that any problems that may come up are resolved quickly and ensures you make the most of the plugin's features.
## Why you should upgrade to the pro version
If you're still on the fence about whether or not you should upgrade to the pro version, here are some reasons to go for it.
The bottom line is that upgrading to the pro version of the Pixel Manager for WooCommerce plugin is essential for any growing e-commerce store owner or digital marketer looking to maximize their data and paid ad performance.
### Reason #1: You're growing and need access to more pixels i.e. more data
As your business grows and expands, having access to more pixel integrations is essential for gathering accurate and comprehensive data on your site visitors and their behavior.
### Reason #2: You want accurate data for your ad performance
Accurate data is crucial for evaluating and optimizing your paid ad campaigns. The pro version of our pixel tracking plugin offers advanced features like Google Ads Enhanced Conversions and Google Ads Conversion Adjustments to ensure you're capturing the most precise information.
### Reason #3: You want to see how many people are calling your business directly
Let's say you run a business that relies on direct customer interactions such as a restaurant or hotel. You can use the pro version of the Pixel Manager for WooCommerce plugin to see how many people are calling your business directly via its automatic phone and link click tracking feature. This allows for better tracking and conversion analysis.
### Which plugin is right for you: free or pro?
All pricing plans come with a 14-day free trial and a 30-day money-back guarantee.
With the pro version of the plugin, you get:
- More pixel integrations
- Automatic Conversion Recovery
- Support for Google Ads Enhanced Conversions and Google Ads Conversion Adjustments
- Top-notch, priority support from the developers
It's worth a shot if your business is growing and you need accurate and comprehensive data on site visitors and how they interact with your site and your paid ads. The pro version of our pixel tracking plugin can help you capture more precise information and maximize paid ad performance.
## Conclusion
Pixel Manager for WooCommerce is arguably the best free WooCommerce plugin in the market for tracking sales. The free version of the plugin is suitable for anyone who wants to get started with pixel tracking and is primarily using the Google Ads Pixel and/or Meta Ads Pixel.
As your business grows and expands, you can upgrade to the pro version of the plugin to leverage additional pixel integrations as well as advanced features like Automatic Conversion Recovery, Meta Conversion API, scroll tracking, and automatic phone and link click tracking.
Ready to start using a WooCommerce plugin to track sales? Get the [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) plugin today!
---
# SweetCode Pixel Manager Pro Reviews Roundup: What Others Are Saying
URL: https://sweetcode.com/blog/pmw-roundup
Date: 2024-07-10
Tags: pixel manager, clippings

- Roundup of reviews from various sources
## Introduction
At SweetCode, we believe in transparency and the power of customer feedback. Making an informed decision about a product like our Pixel Manager Pro plugin is crucial, and that's why we've compiled reviews and testimonials from various sources. This blog post aims to provide you with an unbiased perspective on what users and experts have to say about our plugin.
## Overview
In today's digital world, understanding real-world experiences and opinions about products is key to making confident purchasing decisions. We've curated feedback from blogs, YouTube videos, podcasts, and direct customer testimonials to give you a comprehensive view of Pixel Manager Pro.
## Review Highlights
### Blog Reviews
Explore in-depth reviews and analyses from trusted bloggers who have thoroughly tested Pixel Manager Pro.
- [Pixel Manager for WooCommerce Review: Track Conversions & Traffic With Ease](https://wpmayor.com/pixel-manager-for-woocommerce-review/) by WP Mayor, 2024
- [Pixel Manager for WooCommerce Review](https://www.commercegurus.com/category/woocommerce/) by Commerce Gurus 2023
- [WooCommerce: How To Set Up Accurate Paid Advertising Conversion Tracking](https://www.businessbloomer.com/woocommerce-accurate-paid-advertising-tracking/) by Business Bloomer (2024)
- [Pixel Manager for WooCommerce: Easy Tracking for Your Store](https://wphive.com/reviews/pixel-manager-for-woocommerce/) by WP Hive (2024)
- [10 Best Facebook Pixel WordPress Plugins 2024](https://startupvortex.com/best-facebook-pixel-wordpress-plugins/) by Startup Vortex (2024)
- [WooCommerce Analytics & Conversion Tracking for Data-Driven Growth](https://www.pluginhive.com/woocommerce-analytics-conversion-tracking/#best_plugins) by Pluginhive (2024)
### YouTube Reviews
Watch video reviews and demonstrations where influencers showcase the features and benefits of Pixel Manager Pro.
- [Slash Your Ad Costs With Pixel Manager for Woocommerce](https://www.youtube.com/watch?v=A7Lb6dOBrgU) by WP Simple Hacks (2024)
- [Google Ads Conversion Tracking Plugin For WooCommerce | woopt WooCommerce Pixel Manager](https://www.youtube.com/watch?v=Wp8TlD030EE) by Sam Dey (2022)
- [Google Ads WooCommerce Conversion Tracking - Track Purchase Conversions For a WooCommerce Website](https://www.youtube.com/watch?v=LGS1DiBv5Qg) by Surfside PPC (2023)
### Podcast Mentions
Listen to podcast episodes where Pixel Manager Pro is discussed and recommended by industry experts and hosts.
-[ WordPress founder: How to Successfully Bootstrap a Product and Agency Simultaneously](https://www.youtube.com/watch?v=HL70Q_BNjD0) by Wildcloud (2023)
## Customer Testimonials
Here are excerpts from testimonials we've received directly from our users:
- "Very easy to set up and it just works. A lot better than most pixel plugins." - [sanderj5 on wp.org](https://wordpress.org/support/topic/great-pixel-manager/)
- "This plugin was recommended to us by Google's Tag Implementation Team. That should say enough." - [dpacker on wp.org](https://wordpress.org/support/topic/simple-easy-to-use-does-what-it-says-on-the-tin/)
## Conclusion
By compiling these reviews and testimonials, we aim to showcase the reliability and effectiveness of Pixel Manager Pro. Whether you're looking to enhance your website's performance or streamline your image management process, we hope these insights help you in your decision-making journey.
Ready to experience the benefits of Pixel Manager Pro? Visit [SweetCode Pixel Manager Pro](https://sweetcode.com/plugins/pmw/) to learn more about its features, pricing, and how it can optimize your website's image management. Join the community of satisfied users who have chosen SweetCode's Pixel Manager Pro for their digital needs.
---
# The cdn.polyfill.io Vulnerability: What You Need to Know
URL: https://sweetcode.com/blog/cdn-polyfill-io-vulnerability
Date: 2024-07-08
Tags: pixel manager, vulnerability

- The Pixel Manager contained the cdn.polyfill.io vulnerability
- It was fixed in version `1.43.4`, the same day it was discovered
- cdn.polyfill.io support was experimental and not enabled by default
## What happened?
On June 26, 2024, we were made aware of a vulnerability in the Pixel Manager on our [Discord channel](https://discord.com/invite/dc8ZyVP9fk) by the user `@bmtalks`.
We read and analyzed Sansec's article about the the cdn.polyfill.io supply chain attack: https://sansec.io/research/polyfill-supply-chain-attack. Based on that information we agreed that this is serious and we need to act fast.
We then analyzed if the Pixel Manager was affected by this vulnerability and how big the impact was.
The Pixel Manager indeed contained experimental support for cdn.polyfill.io that was not enabled by default. We still decided to fix this vulnerability as soon as possible.
Just a few hours later, on the same day, we released version `1.43.4` of the Pixel Manager with the vulnerability fixed.
Since we fixed this, various vulnerability tracking platforms have picked it up and started reporting the vulnerability for installations of the Pixel Manager below version `1.43.4`.
- Patchstack: [WordPress Pixel Manager for WooCommerce Plugin `<=` 1.43.3 is vulnerable to Backdoor](https://patchstack.com/database/vulnerability/woocommerce-google-adwords-conversion-tracking-tag/wordpress-pixel-manager-for-woocommerce-plugin-1-43-3-malicious-polyfill-io-embed-vulnerability)
- Wordfence: [Various Plugins `<=` Various Version - Use of Polyfill.io](https://www.wordfence.com/threat-intel/vulnerabilities/detail/various-plugins-various-version-use-of-polyfillio)
## What is cdn.polyfill.io?
cdn.polyfill.io was a service that provided [polyfills](https://en.wikipedia.org/wiki/Polyfill_(programming)) for web technologies. Polyfills allow you to use modern JavaScript features on older browsers that do not support them.
To increase tracking accuracy for the Pixel Manager we wanted to make sure that the Pixel Manager JavaScript codes runs on as many browsers as possible. That's why we added experimental support for cdn.polyfill.io.
Not long after we added experimental support for cdn.polyfill.io, we found better ways to increase browser support coverage in the Pixel Manager and never enabled cdn.polyfill.io by default.
But, we also never removed the experimental support for cdn.polyfill.io from the Pixel Manager, which we could have done earlier for sure.
## Who is affected?
Support for cdn.polyfill.io was always experimental and not enabled by default. We never documented how to enable it and we never recommended to enable it (apart of one user with which we tested it).
It is unlikely that many users enabled cdn.polyfill.io support in the Pixel Manager. If any at all it was probably only a handful of users.
Everyone else is and never has been affected by this vulnerability.
## How to update the Pixel Manager
If you are using the Pixel Manager version `1.43.3` or below, please update to version `1.43.4` or above to fix this vulnerability.
Simply follow the standard update procedure for WordPress plugins.
Pro users of the Pixel Manager need to have an active subscription to receive updates. If you have an active subscription, you can update the Pixel Manager in the WordPress admin area.
Users of the free version of the Pixel Manager can update the plugin in the WordPress admin area as well.
---
# Google Ads Custom Variables
URL: https://sweetcode.com/blog/google-ads-custom-variables
Date: 2024-07-07
Tags: pixel manager, development update

- Added support for Google Ads Custom Variables
## New feature
Google Ads allows you to track [Custom Variables](https://support.google.com/google-ads/answer/9964350) with each conversion.
With version `1.43.5` of **the Pro version of the Pixel Manager** we added support for Custom Variables for Google Ads for purchase conversion events.
(Currently only available for subscribers of the beta version `1.43.5-beta.2` and will be available for all users once version `1.43.5` is released.)
## What are Custom Variables?
Let's say you want to see conversion numbers split by the color of the product. You can add a custom variable `color` to the purchase conversion event.
Or, you want to see conversion numbers split by the product name. You can add a custom variable `product_name` to the purchase conversion event.
Or, you want to see conversion numbers split by the product category. You can add a custom variable `category` to the purchase conversion event.
This helps you answer questions like:
- Which color converts the best?
- Which product category converts the best?
- Which product name converts the best?
## How to add Custom Variables to the purchase conversion event
Because we want to give you full flexibility, we added a filter to the Pixel Manager.
With the following filter you can add Custom Variables to the purchase conversion event:
```php title="/wp-content/themes/child-theme/functions.php"
add_filter('pmw_google_ads_order_custom_variables', function ($custom_variables, $order) {
$custom_variables['example_variable'] = 'example_string';
$custom_variables['color'] = 'example_blue';
$custom_variables['product_name'] = 'example_name';
return $custom_variables;
}, 10, 2);
```
Or head over to the setup guide for [Google Ads Custom Variables](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#custom-variables) to learn more.
## Examples
### Track Google Automated Discounts
If you're using [Google Automated Discounts](https://support.google.com/merchants/answer/11542980), and use our [Google Ads integration for Google Automated Discounts](https://sweetcode.com/plugins/gadwc/), you can track which conversions came from Google Automated Discounts.
:::info
The following example is still experimental and might change in the future without notice.
:::
```php title="/wp-content/themes/child-theme/functions.php"
/**
* Adds a custom variable to Google Ads order data based on
* Google Automated Discounts session status.
*
* This filter checks if any of the products in the order were
* part of a Google Ads Automated Discount session.
*
* If so, it sets a custom variable 'gad' to 'yes'.
* Otherwise, 'gad' remains 'no'.
*
* This can be useful for tracking and analytics purposes
* in Google Ads campaigns.
*
* @param array $custom_variables Existing array of custom variables for the order.
* @param WC_Order $order The WooCommerce order object.
* @return array Modified array of custom variables with 'gad' key added or updated.
*/
add_filter('pmw_google_ads_order_custom_variables', function ( $custom_variables, $order ) {
$custom_variables['gad'] = 'no';
foreach ($order->get_items() as $item_id => $item) {
$product = $item->get_product();
$product_id = $product->get_id();
if (function_exists('sgadwc_is_product_in_discount_session')) {
if (sgadwc_is_product_in_discount_session($product_id)) {
$custom_variables['gad'] = 'yes';
break;
}
// do something
}
}
return $custom_variables;
}, 10, 2);
```
---
# The Ultimate Guide to Integrating Spotlight Instagram Feeds with WooCommerce
URL: https://sweetcode.com/blog/integrating-spotlight-instagram-feeds-with-woocommerce
Date: 2024-05-30
Tags: guest post

- Guide to Integrating Spotlight Instagram Feeds with WooCommerce
- How to create shoppable feeds with Spotlight
Modern businesses turn to social media marketing more than ever to promote products and get more eyes on their WooCommerce store.
You're probably running one of them – maybe you're already posting images of your products on Instagram and encouraging customers to tag you as they show off your items in action.
Adding Instagram feeds to your WooCommerce store is a great way to highlight your products or its testimonials. Shoppable Instagram feeds are an even better way to engage customers and streamline the process of purchasing products.
Want to try it for yourself? This guide will introduce you to Instagram feeds and teach you how to add them to your WooCommerce store. Every question you have about Instagram feeds will be answered.
## What are shoppable WooCommerce Instagram feeds?
An displays your posts in a customizable gallery or carousel on your website, and there are several different types. These include .
When clicked, rather than opening your Instagram post page, shoppable feeds direct users to your products – including WooCommerce products. With this, users can buy your products in just a few clicks.
## Why you should use Instagram feeds on your WooCommerce store
Social media marketing and its potential for heightened engagement is an entire topic of its own. If you're not already promoting your products on Instagram, you probably should be.
And bringing those Instagram posts back to your website is a great way to get potential customers' attention. A beautiful gallery is always a great addition to any website – all the better if it gets more eyes on your products.
Luckily, creating is easy with Spotlight. Embedding Instagram galleries and connecting them to WooCommerce products is simple with a plugin.
Curious how you can use Instagram feeds on your WooCommerce site? Here's a few fun ideas:
- Promote your products with one-click, seamless shoppable feeds. Show off your products on Instagram, embed the feed on your website, and let users click to shop.
- Create a related products feed and embed it on WooCommerce pages for cross-selling potential.
- Get free by showing off user-generated content as product testimonials.
- Promote hashtag campaigns for particular products or lines.
- Spotlight influencers who are using your products.
All these are possible with Spotlight, but we're going to focus on the first one: promoting your products through shoppable feeds.
## How to create shoppable feeds with Spotlight
Are you ready to start creating Instagram feeds of your own? First up: You'll need to install and activate . To create shoppable feeds, you'll need the PRO version or higher. You'll also be able to embed feeds directly on WooCommerce product pages.
Go ahead and install Spotlight, then activate your license key on Instagram Feeds > License. With that, you're ready to create your first shoppable feed!
### Step 1. Link your Instagram account
Before you jump into creating a feed, a good first step is to link your Instagram account. You can connect as many as you want, so don't hold back.
You can find the right page on **Instagram Feeds > Settings** in your WordPress sidebar. You'll land on the **Accounts** tab.

You're probably using Instagram for Business for your WooCommerce website, so select **Business account** and follow the steps to connect to Spotlight.
If you want to get right into it, you'll have a chance to connect your account when you're setting up a feed. Either way, you're ready to get started!
### Step 2. Set up your first shoppable feed
Head to **Instagram Feeds > Feeds** from the sidebar and look for the big blue **Create a new feed button**.
This will open up a new menu for creating your Instagram feed. Select **Shoppable feed** from the list and click the blue **Next step** button.

Now you get to pick a template. You can always swap this out later, so no worries if you don't like how it looks on your website. You'll also be able to tweak the **feed layout** and design.
For shoppable feeds, you might like the **Gallery**, **Carousel**, or **Zoom** layouts – let's go with that one. Click **Next step** when you're ready.

Now just click **Connect & customize**. You'll be taken to the feed editor.
### Step 3. Choose Instagram posts for your shoppable feed
On the next page, you'll land on the **Connect** tab. If you haven't connected your Instagram account yet, you'll have a chance to do so now. Otherwise, you can choose which accounts and hashtags to display posts from.
If you want to curate a feed of your own content, click the account(s) below **Show posts from these accounts**. If you want to show posts from other users that have tagged you or used a certain hashtag, click those instead. You can mix and match in one feed.

You'll also want to check out the **Filter** and **Moderate** tabs at the top. You probably don't want your entire Instagram account or everyone who ever tags you in this one feed, so use these pages to curate the selection.
On the **Filter** page, you can show or exclude posts using certain phrases or hashtags.

And on the **Moderate** tab, you can choose to hide selected posts or only show selected posts from your feed. This is useful for curating your own posts, and also for manually adding new tagged posts from other Instagram users or removing any unwanted posts that slip through.

### Step 4. Customize your shoppable feed
If the premade layouts aren't quite right, Spotlight gives you full reign over Instagram feed design. You can find plenty of customization settings in the **Design** tab.

You might want to:
- Change the number of displayed posts or how they're arranged (**Layout**)
- Adjust individual height, spacing, text size, or hover options (**Appearance Settings**)
- Randomize post order or open posts in a lightbox (**Feed Options**)
- Add your Instagram header and avatar (**Feed Header**)
- Let users load more images (**Load more button**)
You can even add your own CSS styling. The sky's the limit, so have fun customizing.
### Step 5. Tag and promote WooCommerce products
Now you're ready to connect your WooCommerce products to your Instagram posts. Whenever these Instagram images are clicked in the feed, users will be taken directly to your product pages.
You have two options: First, you can manually link products in every feed you create. Open the **Shop** tab and click the plus sign on any of your posts.

Now click the **Link source** drop-down menu and select **Product**. Search for and select the WooCommerce product you want to link to. You can also change click behavior and other settings for the individual post here.

Now when any user clicks on this post in your Instagram, they'll be taken directly to your WooCommerce store page.
Rather than filling this in for every single feed, you can instead automate the process. Go to **Instagram Feeds > Promotions**.
You'll land on the **Automate** tab. Here you can have any posts in your feeds that use a particular hashtag link to your product pages.

Or you can go to the **Global Promotions** tab and set up a universal product link just like you did within your Instagram feed. Now whenever this post is used in any feed, it will always link to the same WooCommerce product page.

### Step 6. Embed the shoppable feed on your website and product pages
Now your shoppable feed is all set up and ready for display. You have a few options here.
First of all, if you're using the block editor in WordPress, you can easily add the Instagram Feed block. Just type **/Spotlight** when editing any post or page, click **Spotlight Instagram Feed**, and pick your feed from the list.

You can also use a shortcode. You'll find the shortcode for your feed on the **Embed** tab when editing your feed.

Finally, if you're using an older theme, you can embed a widget.
There are plenty of creative ways to use shortcodes and blocks to embed Instagram feeds on your site, including pages directly.
With that, your shoppable Instagram feed is all done and displayed on your website.

Don't forget to check out **Instagram Feeds > Analytics** to see how many clicks your new feed is getting.
## Increase engagement with Instagram feeds for WooCommerce
Adding shoppable Instagram feeds to WooCommerce is a surefire way to get customers' attention. There are plenty of creative ways to beautifully display your products, attracting interest and clicks.
If you're curious to try it on your own website, give a try. One simple WordPress plugin is all you need to design intricate Instagram feeds and easily embed them anywhere on your website. It's elegant, codeless, and the perfect fit for anyone who wants to integrate Instagram feeds and WooCommerce.
---
# Snapchat CAPI published
URL: https://sweetcode.com/blog/snapchat-capi-published
Date: 2024-05-23
Tags: pixel manager, development update

- We published Snapchat's Conversions API (CAPI) integration in the Pixel Manager
## What happened?
We published Snapchat's Conversions API (CAPI) integration in the Pixel Manager with version `1.43.0`.
This integration allows you to send server-2-server events to Snapchat for better ad optimization.
## How to use it?
You can find the Snapchat CAPI integration in the Pixel Manager under > Advanced > Snapchat. You only need to add the Snapchat CAPI token and the Pixel Manager will start server-2-server events to Snapchat.
Here's how to set it up: [Snapchat CAPI integration](https://sweetcode.com/docs/pmw/plugin-configuration/snapchat#conversions-api)
## Snapchat's Conversions API presentation
---
# GA4 Measurement Protocol purchase event processing bug
URL: https://sweetcode.com/blog/ga4-mp-purchase-event-processing-bug
Date: 2024-05-21
Tags: pixel manager, development update, bug report

- I was wrong **and** I was right about the bug
- Update to the `session_id` [bug post](https://sweetcode.com/blog/ga4-mp-session-id-purchase-event-bug)
## What happened?
We started getting reports from our users that GA4 channel attribution suddenly started to break. All purchase events processed through the GA4 Measurement Protocol were attributed to 'unassigned'.
We already had bug reports few weeks ago about a [similar issue](https://sweetcode.com/blog/ga4-mp-session-id-purchase-event-bug). GA4 stopped showing purchase events in the reports. That was even worse.
When I investigated that issue and found that purchases processed through the Measurement Protocol and where the `session_id` was missing were not affected. The issue was only with purchase events where the `session_id` was set. So in a bit of a hurry, I removed the `session_id` from the purchase events and published a new version of the Pixel Manager.
Unfortunately I had forgotten what the `session_id` was for before removing it. It's used to stitch together user sessions across devices and platforms. So removing the `session_id` from the purchase events helped bring back the purchase events in the reports, but it broke the channel attribution.
To fix the channel attribution **and** bring back the purchase events in the reports, I needed to be more careful with my further investigation. I took my time to investigate the issue thoroughly to understand what was going on and find a proper fix for our users.
If it was just me, I would have been much faster to fix the issue. But, GA4's internal processing made this difficult to debug fast.
1. The GA4 Measurement Protocol validation endpoint never returned any errors. It accepted all the events we sent and responded with empty error messages.
2. GA4 takes 24 hours to process purchase events. So I had to wait at leas a day after each change to see if it had any effect.
Essentially this felt like poking in the dark.
Fortunately, one of our Pixel Manager users found another, similar support request of users who were not using the Pixel Manager, with clues that helped me to understand what was going on.
## What did we do?
For the first two weeks it was really just poking in the dark. I removed properties from the purchase events, changed them, added them back, and so on, with no effect.
I asked around in a Slack group for Google Analytics experts, but none of them had a clue what was going on.
All of that changed when one of our customers found the support request from someone else on another forum and sent the link to us. It was about a similar issue, but they were not using the Pixel Manager: [All orders and revenue reporting as Direct and Unassigned from 21st March](https://support.google.com/analytics/thread/268775694/all-orders-and-revenue-reporting-as-direct-and-unassigned-from-21st-march?hl=en)
I investigated further and found other, similar reports in the Google Analytics expert group.
Now I was onto something.
## What did we find?
In an early stage of the investigation I wound that the issue could be related to the new **user-provided data collection** feature in GA4.
Further investigation showed that it is possible that that feature might play a role to trigger the issue, but for solving the issue another setting had to be changed.
We had to change the **Reporting Identity** setting from **Observed** to **Device-based**.

Once we made that change, and waited for 24 hours, the purchase events started to show up in the reports again, and the channel attribution was fixed. Not only that, but also old purchase events that were not showing up in the reports before started to show up.
## Hey Google!
There is no easy way to report bugs to Google. Sure, I tried their support. But it was just another proof that their first level support doesn't read the request. I got a very generic response about something completely different.
I tried contacting them through their Discord Channel as well. In my first request people were fast to answer, but also, didn't read the question. When I tried to explain the issue in more detail, I got no response. My guess is because it is not a generic issue, but a new bug, and they didn't know how to handle it.
The second time I had sent a request to their Discord Channel, I got no response at all.
This is frustrating.
I understand that Google needs to prioritize their resources. But, they should have a better way to report bugs when they are reported by a company like us that runs their products on more than 50'000 installs.
I do have much better experiences with product teams at Google for other products. But, for GA4, their support is adding more frustration than help.
After all, it wasn't a bug in the Pixel Manager. It was a bug in GA4. We lost a lot of time and nerves because of that. Some of our customers got frustrated too. This could have been avoided, maybe even prevented to become widespread issue, if Google had a better way to report bugs to them.
Google should have a better way to report bugs to them. And, they should have a better way to communicate with their users when a bug is confirmed.
## Conclusion
If you are experiencing similar issues with GA4 purchase events processed through the Measurement Protocol, try the following:
1. Update the Pixel Manager to the latest version
2. Change the **Reporting Identity** setting from **Observed** to **Device-based**
You always have to wait at least 24 hours to see if the changes had any effect.
---
# GA4 Measurement Protocol session_id purchase event bug
URL: https://sweetcode.com/blog/ga4-mp-session-id-purchase-event-bug
Date: 2024-05-01
Tags: pixel manager, development update, bug report

:::danger[Update]
We have identified the root cause. Please read our new post [GA4 Measurement Protocol purchase event processing bug](https://sweetcode.com/blog/ga4-mp-purchase-event-processing-bug) for more information.
:::
- Certain purchase events not processed through GA4 Measurement Protocol
- We identified the root cause and have a fix in place
## What happened?
Starting from April 28 we started getting reports from Pixel Manager users that purchase events were not being processed anymore.
We quickly identified that the issue only happened to users of the Pro version of the Pixel Manager who had the Measurement Protocol enabled.
However, the cause was not immediately clear.
We had not changed the Measurement Protocol implementation in the last few releases, so we were puzzled by the sudden issue.
Also, our logs showed that the purchase events were being sent to GA4, GA4 accepted the network requests without errors, but purchase events were not showing up in the reports.
## What did we do?
We immediately started investigating the issue, added a lot more logging to the Measurement Protocol code, and started comparing the network requests sent by the Pixel Manager to order data.
Also we informed our users who reached out to us, that in the meantime they could simply disable the Measurement Protocol in the Pixel Manager settings to get their purchase events processed again through the browser pixel (which was not affected by this issue).
## What did we find?
After further investigation, we found that GA4 stopped processing purchase events from April 21, 2024, if the `session_id` parameter was included in the Measurement Protocol request. The `session_id` parameter is optional and we have been including it in the Measurement Protocol requests for a long time to help GA4 display purchase events in the real-time reports. We tried to help our users with this because regular purchase events sometimes take 24 hours to show up in GA4 reports. This is a processing delay that happens entirely on the GA4 side and is not related to the Pixel Manager.
Adding the `session_id` to show events in the real-time reports is a documented feature of the Measurement Protocol ([show user activity in real-time reports](https://developers.google.com/analytics/devguides/collection/protocol/ga4/sending-events?client_type=gtag#recommended_parameters_for_reports)).
## What did we do to fix it?
:::danger[Update]
We have identified the root cause. Please read our new post [GA4 Measurement Protocol purchase event processing bug](https://sweetcode.com/blog/ga4-mp-purchase-event-processing-bug) for more information.
:::
We removed the `session_id` parameter from the Measurement Protocol requests in the Pixel Manager and confirmed that purchase events are now being processed correctly by GA4.
This change has been released with the version `1.42.6` of the Pixel Manager.
---
# Facebook Microdata for Catalog Deprecation Notice
URL: https://sweetcode.com/blog/facebook-microdata-for-catalog-deprecation-notice
Date: 2024-04-27
Tags: cmp

- We dropped support for Facebook Microdata for Catalog output in the Pixel Manager.
## What is changing?
Starting with version `1.42.6` of the Pixel Manager, we will no longer provide support for Facebook Microdata for Catalog output.
## What is Facebook Microdata for Catalog?
[Facebook Microdata for Catalog](https://developers.facebook.com/docs/marketing-api/catalog/guides/microdata-tags/) is a way to provide Facebook with structured data about your products. Facebook scans your website for this structured data and uses it to create a product catalog that you can use in your Facebook ads.
## Why are we dropping support for Facebook Microdata for Catalog?
Facebook never provided a proper way to handle variations of variable products in their microdata specification. This made it impossible for us to provide a reliable integration that works for all users of this feature.
---
# A 2024 Ranking of Top Cookie Banner (Consent Management Platform) Solutions
URL: https://sweetcode.com/blog/cmp-ranking
Date: 2024-04-12
Tags: cmp

- I ranked the top Cookie Banners (Consent Management Platforms or CMPs) based on my own ranking criteria.
- The top CMPs are Cookiebot, Cookie Script and OneTrust.
- Read the ranking of all analyzed CMPs and the criteria in this article.
Jump to the ranking by following this link: [CMP Ranking](#cmp-ranking)
## Who is this blog post written for?
- Website owners who want to choose the right CMP for their website.
- Developers who want to integrate a CMP into a customers website.
- CMP developers who want to improve their CMP.
- Readers who are curious how scoring and ranking a CMP could look like.
## Why I ranked CMPs
Simply said: Because I wanted to find out which CMPs are easiest to implement and maintain with a tracking code manager like our [Pixel Manager](https://sweetcode.com/plugins/pmw/).
It's been several years since I started adding support for various Consent Management Platforms (CMPs) in the Pixel Manager natively ([supported CMPs](https://sweetcode.com/docs/pmw/consent-management/platforms)). The logic is simple. The Pixel Manager is not a CMP, it is a tracking code manager. That's what the Pixel Manager is really good at. Today it is a requirement in many regions to manage visitor consent in a legally compliant way. That's what CMPs are for.
But, the Pixel Manager is not a CMP. Developing and maintaining a CMP in a compliant way is a huge task by itself. It requires a different set of skills and resources. That's why I decided not to develop a CMP, but to support the best and most popular CMPs on the market.
Over the years I've accumulated a lot of experience adding support for several CMPs into the Pixel Manager. I've seen the good, the bad and the ugly. I've seen CMPs that are easy to integrate and work well, and I've seen CMPs that are a nightmare to integrate and don't work well.
At minimum, I will provide a list of the criteria I used to rank the CMPs, so you can make your own ranking and informed decision what the best CMP is for your use case.
I hope that this ranking will help you choose the right CMP for your website.
## What this article is NOT about
- This article is not about the legal requirements of a CMP. I am not a lawyer and I don't give legal advice. I am a tracking code manager developer and I give technical advice.
- This article is not about a judgement if certain consent categories make sense or not. There are some categories that have become a quasi standard, like "statistics", "marketing", "preferences" and "necessary". These might have their roots in the interpretation of the [GDPR cookies policy](https://www.edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_en.pdf). If they make sense or not is not a question this article answers. The article only focuses how easy it is to implement and maintain a CMP with these categories.
## Ranking criteria
### Category based consent
There are two main types of consent. Category based consent and vendor based consent. What do I mean by that?
- **Category based consent:** The website uses multiple tracking pixels. Each tracking pixel, such as Google Analytics of Facebook Ads, is assigned to a category. For Google Analytics that would be "statistics" and for Facebook Ads that would be "marketing". The visitor can then choose to allow or disallow each category. If the visitor allows the "statistics" category, the Google Analytics pixel, including all other statistics pixels, are loaded. If the visitor disallows the "marketing" category, the Facebook Ads pixel, including all other marketing pixels, are not loaded. This is category based consent.
- **Vendor based consent:** The website uses multiple tracking pixels. Each tracking pixel is from a vendor. The visitor can then choose to allow or disallow each vendor. If the visitor allows Google Analytics, only the Google Analytics pixel is loaded. If the visitor disallows Facebook Ads, only the Facebook Ads pixel is not loaded. This is vendor, or pixel based consent.
Category based consent is the most common type of consent. It is the most user-friendly type of consent. And it is the most easy one to implement with a tracking code manager like the Pixel Manager or the Google Tag Manager. That's why I prefer category based consent.
Vendor based consent is very difficult to implement with a tracking code manager. It is not necessarily the first time setup that's difficult, but the maintenance and the changes are. You see, website managers often add and remove tracking pixels. With vendor based consent you have to update the CMP and the tracking code manager every time, and test if everything works correctly. This is a lot of work and a lot of room for errors.
There is the question if vendor based consent might be required to be compliant with the GDPR. I personally don't think so (but don't take this as legal advice). Here are a few facts that help you make your own decision:
- The GDPR requires that the visitor gives informed consent: [GDPR on consent](https://www.edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_en.pdf)
The GDPR policy states that the visitor must be informed what data is collected, trough which tracking pixel and for what purpose. But, it doesn't state that there is a requirement to be able to give consent for each vendor separately. So categorizing the tracking pixels, letting the visitor know which vendor belongs to which category and letting the visitor choose which category to allow or disallow is compliant with the GDPR.
- There are many very popular and certified CMPs that only support category based consent. This means that the CMPs with category based consent are compliant with the GDPR, such as or [OneTrust](https://www.onetrust.com/).
- List of Google certified CMPs: [Source](https://support.google.com/admob/answer/13554116)
- List of IAB certified CMPs: [Source](https://iabeurope.eu/cmp-list/)
**While it is not wrong to use vendor based consent, I think that category based consent is the much better choice. It is more user-friendly, easier to implement and maintain and it is compliant with the GDPR.**
### Standardized categories
When CMPs standardize the categories, it is much easier to implement the tracking pixels and the consent logic in a tracking code manager. This is because the tracking code manager can be pre-configured with the standardized categories. This is a huge time saver and reduces the risk of errors.
Having implemented more than 10 CMPs in the Pixel Manager (and analyzed next to 20), I can tell you that not all CMPs have standardized the categories. This can be a pain point.
Most CMPs now use 4 different types of categories:
- **Statistics**: Tracking pixels that set cookies for statistics and analytics, such as Google Analytics.
- **Marketing**: Tracking pixels that set cookies for marketing purposes, such as Facebook Ads.
- **Preferences**: Website features that set cookies to remember the visitor's choices, such as the language.
- **Necessary**: Website features that set necessary cookies for the website to work properly, such as the login state.
Some CMPs use different names for these categories. That's not a big deal. That's easy to map.
But, some CMPs don't support all of these categories. They may not support the "preferences" category.
Other CMPs offer more categories that feel arbitrary and unnecessary.
Such deviations make it harder to implement a standardized consent logic in a tracking code manager.
**I like CMPs that use the four standardized categories `statistics`, `marketing`, `preferences`, and `necessary`.**
Google is usually leading the way with the standardized categories. They now added more categories with the Google Consent Mode v2, which give a bit more granular control. It would be great if CMPs would either support the 4 standardized categories and/or the [Google Consent Mode v2 categories](https://developers.google.com/tag-platform/security/concepts/consent-mode).
### Script auto blocking
Some CMPs offer the option to block tracking scripts before the visitor has given consent. This is a very important feature and I think every CMP should support it. If the tracking scripts are not blocked before the visitor has given consent, the tracking scripts will run before the visitor has given consent. That would be a violation in some regions like for visitors from the European Union (GDPR).
There are several components of this feature that I want to discuss here:
#### Who blocks
- **Why not just use the Pixel Manager for that?** The Pixel Manager can only block tracking scripts that are added through the Pixel Manager. It can't block tracking scripts that are added directly to the website. That's why it is important that the CMP has a way to block tracking scripts that are added directly to the website.
- **Why not just use the CMP auto-blocker for all tracking scripts?** The CMP auto-blocker can only block or unblock the tracking code manager itself (the Pixel Manager in our case), but it can't block or unblock the tracking scripts separately that are added through the tracking code manager.
**So a combination of both, the CMP auto-blocker and the tracking code manager's blocking mechanism is required for the best result.**
#### How to block
There are several ways how the tracking scripts are blocked by the CMP:
- **HTML script tag adjustment:** The CMP changes the HTML output and changes the `
```
- **Script tag attribute based:** Add a script tag attribute to the tracking code manager script that the CMP recognizes and excludes from being blocked.
A script tag attribute based exclusion looks like this:
```html
```
or this:
```html
```
- **WordPress filter:** Add a pattern to a WordPress filter, offered by the CMP, that excludes the tracking code manager script from being blocked.
A good filter based exclusion filter offers a way to add any type of pattern that appears in the script tag or within the script.
A filter based exclusion looks like this:
```php
add_filter('cmp_exclude_script', function($patterns) {
$patterns[] = 'example.com/app.js';
$patterns[] = 'pmwDataLayer';
return $pattern_array;
});
```
From experience I can say, the most effective and efficient ways are script tag based attributes and WordPress filters. With those, the tracking code manager can set the exclusions itself programmatically. Because it doesn't require any manual intervention by the website owner, the error rate is much lower.
**I prefer CMPs that offer the script tag based attribute and WordPress filter based exclusions.**
### Google Consent Mode script support
The Google Consent Mode has become an integral part of the Google services to track visitors in a compliant way. It allows to track visitors using cookies and when cookie consent is removed it falls back to a cookie-less tracking method. It therefore depends on the consent of the visitor given through a CMP.
While a Google Consent Mode script is not a technical requirement to allow compatibility with a tracking code manager, it should be an integral part of any modern CMP. If a website owner doesn't want to to integrate the Google Consent Mode trough a tracking code manager, he should at least be able to integrate it through the CMP.
**Since the Google Consent Mode can be implemented through the Pixel Manager or the Google Tag Manager, I have not given this criteria a high weight. But, it is a good to have option.**
### Filter to disable Google Consent Mode script
More importantly to make the CMPs Google Consent Mode work well with a tracking code manager like the Pixel Manager, the CMP should offer a way to disable the Google Consent Mode script. This is important because the Pixel Manager can handle the Google Consent Mode script itself. And duplicating that script would cause issues.
Some CMPs offer ways to disable the Google Consent Mode script:
- **CMP Settings:** Settings in the CMP that allow you to disable the Google Consent Mode script.
- **WordPress Filter:** Add a filter condition that disables the Google Consent Mode script in the CMP.
A good filter based exclusion filter offers a way to add any type of pattern that appears in the script tag or within the script.
A filter based exclusion looks like this:
```php
add_filter('cmp_disable_google_consent_mode', '__return_true');
```
**I prefer CMPs that offer a WordPress filter to disable the Google Consent Mode script. This reduces the risk of errors and makes the integration more reliable.**
Unfortunately I haven't come across a CMP that offers a filter to disable the Google Consent Mode script. So we must rely on the website owner to disable the Google Consent Mode script manually. In some cases I have found workarounds, but a native solution would be much better.
### Google Consent Mode consent updates
Even more important is that the CMP offers a way to update the Google Consent Mode consent. The Pixel Manager can do that itself, but it makes assumptions about the mapping of the categories. Since Google's Consent Mode offers more granular categories, it is best if the CMP can update the consent itself. The Pixel Manager will process the updated consent and adjust the tracking accordingly.
**If a CMP offers Google Consent Mode updates through the `gtag` command, it ensures the highest level of compatibility with the Google Consent Mode.**
### Geo location restrictions
Not every region has the same requirements for consent. The European Union has the GDPR, which requires consent for tracking pixels. The United States has the CCPA, which requires an opt-out for tracking pixels. Other regions don't have any requirements at all.
As a website owner, when using tracking pixels, you want to measure as much as possible and at the same time be compliant with the law. This means that you want to show the CMP only to visitors from regions that require consent and possibly have even different settings for each of those region.
To be able to do that, the CMP should offer a way to restrict the CMP to certain regions using geo location detection.
It is the only way to strike a good balance between measuring and compliance.
**CMPs that offer geo location restrictions should be preferred.**
### Good documentation
Good documentation is key to a successful integration of a CMP (any software really), which is why I have given this criteria a high weight.
Good documentation should include:
- **Installation guide:** A step by step guide how to install the CMP on your website.
- **Up to date:** The documentation should be up to date with the latest version of the CMP.
- **Easy to read:** The documentation should be easy to read and understand.
- **Comprehensive:** The documentation should cover all aspects of the CMP.
- **Searchable:** The documentation should be easy to search.
- **Examples:** The documentation should include examples for common use cases.
I have seen so many documentations. So I know that it is possible to write documentation that is at the same time comprehensive, easy to read and easy to search. Any software developer should make the documentation a priority. It is one of the biggest selling points of good software, at least for me. Good documentation also shows that the developers care about the software's quality and the user experience. So I am much more forgiving if the software has has an issue here or there, as long as the documentation is good.
**I clearly prefer CMPs that offer good documentation.**
### Easy to hook JavaScript events
Setting the correct initial consent is only the first step that a CMP should do. When using a CMP in combination with a tracking code manager, the CMP should also be able to signal consent changes without having to reload the page. Reloading the page would be a bad user experience. And since it is possible to signal consent changes using JavaScript events, this is the preferred way.
The Pixel Manager for example is able to listen to such JavaScript events and load or adjust tracking scripts based on the consent given.
Unfortunately not all CMPs offer this convenient way to signal consent changes. Some CMPs don't emit JavaScripts events at all and require a page reload to signal consent changes. Other CMPs emit JavaScript events, but don't signal the consent changes of the categories. Missing documentation made it really hard finding those JavaScript events. At the end, only a few of the analyzed CMPs emit JavaScript events with useful information and are well documented.
**Having a CMP that emits JavaScript events with useful information and is well documented is a huge plus.**
### Easy to read consent cookie
Ironically, all CMPs must set a cookie to remember the visitor's consent. This cookie is required to remember the visitor's consent and to load or block the tracking scripts accordingly.
The consent cookie should be easy to read when a third party tool like a tracking code manager wants to read it. This means that the consent cookie should be set in a way that it can be read by JavaScript.
The range of how well this is implemented is huge. Here are a few problems that I have encountered:
- **Cookie names change over time:** There is one CMP that has changed the cookie names several times over the past years. This is very difficult to track and maintain.
- **Cookie value names not standardized:** There are CMPs that allow the website owner to choose the name of the cookies. Why? There is no benefit in that, and it makes it impossible to read the cookie value in a standardized way.
- **Cookie values are formatted in a way that is hard to decode:** There are CMPs that format the cookie values in a way that is hard to decode. Using a JavaScript object with `JSON.stringify()` and `JSON.parse()` is an excellent way to store and read the consent cookie values. Why not use that?
- **Cookie values are different than the JavaScript event values:** Yeah. One CMP uses different category names when storing the consent in the cookie than when emitting the JavaScript events. This is very confusing and makes it hard to implement the consent logic in a tracking code manager.
- **Cookie names change if the visitor changes the website language:** One CMP sets a different cookie when a visitor changes the website language. Why? The consent is the same.
- **Different cookie logic for different versions of the same CMP:** One CMP offers a free and a paid version. And the cookie logic is different for each version. This only makes it harder to implement. And I guess they get regular support tickets from users who switch from the free to the paid version (or vice versa) and wonder why the consent is not remembered.
- **One cookie for each category:** Various CMPs set separate cookies for each category. This is not necessary. One cookie containing the consent information for each category is easy to implement and avoids a mess in the cookie storage.
CMP cookies should:
- Use consistent cookie names over time
- Use standardized cookie names
- Use JSON stringified JavaScript objects as cookie values
- Use the same category names in the cookie as in the JavaScript events
- Use the same cookie name for all website languages
- Use the same cookie logic for all versions of the CMP
- Use one cookie for all categories
**CMPs that follow all or most of these rules get a higher score (and more respect) from me.**
### Google Tag Manager template available
The Google Tag Manager offers a way to add custom templates for CMPs. It's like a small app that offers a standardized interface to integrate the CMP into the Google Tag Manager. It is a very convenient, user-friendly and reliable way to integrate a CMP into the Google Tag Manager.
While the Pixel Manager doesn't depend on Google Tag Manager templates, it is a good indicator that the CMP is well maintained and up to date.
And I write this ranking not only for users of the Pixel Manager, but for all website owners and developers. So I think it is a good indicator for you too.
Creating and adding such templates to the Google Tag Manager template gallery is quite easy. So it should be a priority of any good CMP to offer such a template.
**While not a requirement for our Pixel Manager, offering a GTM template it is a good indicator for a well maintained CMP.**
### Google certified CMP
Google offers a certification for CMPs. This certification is a good indicator that the CMP is compliant with not only Google requirements but more importantly with the GDPR and IAB Transparency and Consent Framework (TCF).
The list of Google certified CMPs can be found [here](https://support.google.com/admob/answer/13554116).
**Don't just take my word for it. This is a great third party quality indicator.**
### IAB certified CMP
The IAB also offers a certification for CMPs. This certification is a good indicator that the CMP has passed IABs compliance checks required by its CMP Compliance Programme.
The list of IAB certified CMPs can be found [here](https://iabeurope.eu/cmp-list/).
**This is another great third party quality indicator.**
## CMP Ranking
[Click here to see the full ranking](https://docs.google.com/spreadsheets/d/e/2PACX-1vQDqbAQ6BlomJp7SEg-cfrpE8_apb2CexstNZbsai4g9SJFRIknOlDdQemZzd4lRUzyH-JQ8vVNDCLa/pubhtml?gid=0&single=true&widget=true&headers=false)
## The ideal CMP
The ideal CMP meets all the criteria I have listed above. It offers:
- Category based consent
- Standardized categories
- Script auto blocking
- Offers a programmatic way to disable auto blocking for the tracking code manager
- Google Consent Mode script support
- Offers a filter to disable Google Consent Mode script
- Google Consent Mode consent updates
- Geo location restrictions
- Good documentation
- Easy to hook JavaScript events
- Easy to read consent cookie
- Google Tag Manager template
- Google certified
- IAB certified
## Conclusion
The top three CMPs are:
1. Cookiebot
2. Cookie Script
3. OneTrust
## After thoughts
I've been surprised how few installs high scoring CMPs, like [OneTrust](https://wordpress.org/plugins/cookiepro/), and how many installs low scoring CMPs, like [Cookie Compliance](https://wordpress.org/plugins/cookie-notice/) (by hu-manity.co) with over 1,000,000 installs, got on [wordpress.org](https://wordpress.org/plugins/).
The active install count on [wordpress.org](https://wordpress.org/plugins/) is not a good indicator for the quality of a CMP. The scoring that I developed helped me a lot to see the differences between the CMPs in a much more objective way.
I was also startled to see that many of the CMP providers seem not to care at all about the technical implementation of their CMP. It seems to me most of them are too much focused on marketing and sales. In some cases it also seems they don't have a clear understanding of what a CMP should do. This is very concerning, because a CMP is a very important part of a website. A bad CMP and implementation may open you're website up to legal risks and fines.
Luckily there is a handful that solves this really well. I hope that this ranking will help you to choose the right CMP for your website.
---
# Borlabs and Real Cookie Banner direct support deprecation notice
URL: https://sweetcode.com/blog/borlabs-and-rcb-direct-support-deprecated
Date: 2024-04-06
Tags: pixel manager, development update

- We dropped direct support for the Borlabs Cookie and Real Cookie Banner CMPs in the Pixel Manager.
- Direct support was deprecated starting with version `1.41.1` and has since been fully removed.
- Neither CMP is supported today, and we do not recommend either of them. If you use one of them, switch to a standards based CMP from our [supported platforms](https://sweetcode.com/docs/pmw/consent-management/platforms) list.
- If Borlabs or RCB implemented any of three widely adopted consent standards, integration would work out of the box - no custom code required.
:::info[Updated - March 1, 2026]
This article was originally published on April 6, 2024. Since then, direct support for Borlabs Cookie and Real Cookie Banner has been fully removed from the Pixel Manager. The article has been updated to reflect the current state, to explain the standards-based paths that remain available, and to share our perspective on proprietary approaches in the CMP space.
:::
## What changed?
Starting with version `1.41.1` of the Pixel Manager, we deprecated direct support for Borlabs Cookie and Real Cookie Banner. As of April 6, 2025, all remaining direct support for these CMPs has been fully removed from the Pixel Manager.
## What do we mean by "direct support"?
Direct support meant that the Pixel Manager contained specific integrations for these CMPs - detecting their consent signals automatically, mapping them to tracking categories, and managing pixel activation accordingly. These CMPs are no longer listed in the Pixel Manager's interface, and no updates or fixes are provided for them.
To be clear: **the Pixel Manager directly supports a wide range of CMPs**. You can find the full list on our [supported consent management platforms](https://sweetcode.com/docs/pmw/consent-management/platforms) page. These CMPs follow established standards, which makes integration straightforward and reliable. They are much better choices for site owners who want a consent solution that works with a wide range of plugins and tools without locking them into proprietary, non-standardized systems.
Additionally, the Pixel Manager supports **three widely adopted, standards-based consent mechanisms** that any CMP - including Borlabs and Real Cookie Banner - can implement to achieve seamless, zero-configuration integration. More on this below.
## Why did we drop direct support?
Two main reasons:
- **Pixel based consent instead of category based consent:** Borlabs Cookie and Real Cookie Banner let visitors choose not only which categories of cookies to accept, but also which specific tracking pixels to allow. This level of granularity made it technically challenging to integrate with the Pixel Manager. Maintaining pixel-level consent mappings for each CMP was a significant and ongoing burden.
- **Lack of standardization:** At the time we made this decision, neither Borlabs Cookie nor Real Cookie Banner standardized the way they communicate consent decisions. Instead of implementing any of the widely adopted consent standards (Google Consent Mode, WP Consent API), they relied on proprietary interfaces. This made it extremely difficult to provide a **reliable** integration that worked for all users of those CMPs. It is possible that they have since added support for one or more of these standards. We have not verified this and will not be testing it on our end. If you want to find out whether your CMP now supports these standards, please contact the developers of Borlabs or Real Cookie Banner directly.
## Three standards that would make it work
This is a conscious product decision, not a technical limitation. The Pixel Manager fully supports standardized, future-proof consent communication mechanisms. If Borlabs or Real Cookie Banner implemented **any one** of the following three standards, their users would have zero-configuration, out-of-the-box integration with the Pixel Manager - no custom code required.
### 1. WP Consent API
The [WP Consent API](https://wordpress.org/plugins/wp-consent-api/) is a WordPress community standard that provides a common interface for CMPs to communicate consent decisions to plugins. The Pixel Manager supports it natively. Any CMP that implements the WP Consent API works with the Pixel Manager out of the box.
### 2. Google Consent Mode (gtag consent updates)
The [Google Consent Mode](https://support.google.com/analytics/answer/9976101) is the industry standard for communicating consent decisions to tracking tools. It is **required** for [Google CMP certification](https://support.google.com/admob/answer/13554116). The Pixel Manager listens to Google Consent Mode updates automatically and blocks or unblocks tracking scripts accordingly.
The vast majority of certified CMPs already implement this standard. It is the most widely adopted consent communication mechanism in the industry.
### 3. Pixel Manager Consent API
The Pixel Manager provides its own [Consent API](https://sweetcode.com/docs/pmw/consent-management/api) - a simple, well-documented interface using category-based calls like `acceptAll()` and `updateSelectively()`. Any CMP developer can integrate with it in minutes. This API exists specifically so that any CMP, including custom-built consent banners, can communicate with the Pixel Manager.
### The door is open
We do not allocate development resources to maintaining integrations that depend on unnecessarily complex or proprietary approaches when widely adopted standards already exist. But the door is wide open: if the developers of Borlabs or Real Cookie Banner choose to implement any of these three standards, their users will have seamless integration with the Pixel Manager immediately. No action required on our side - it would just work.
## Is pixel based consent required for GDPR compliance?
This is a topic where even well-informed privacy experts hold different views. We will share the facts and let you draw your own conclusions.
- **The GDPR does not require pixel based consent:** The [GDPR regulation](https://www.edpb.europa.eu/sites/default/files/files/file1/edpb_guidelines_202005_consent_en.pdf) requires that you inform your website visitors about the cookies you use and obtain their consent before setting any cookies (except for necessary cookies).
However, the regulation does not specify that consent must be obtained for each individual tracking pixel separately.
Category based consent is sufficient to comply with the GDPR.
- **The vast majority of certified CMPs use category based consent:** [Google](https://support.google.com/admob/answer/13554116) and the [IAB](https://iabeurope.eu/cmp-list/) have developed certifications for GDPR compliant Consent Management Platforms. Most certified CMPs use category based consent, and they are considered fully compliant with the GDPR.
- List of Google certified CMPs: [Source](https://support.google.com/admob/answer/13554116)
- List of IAB certified CMPs: [Source](https://iabeurope.eu/cmp-list/)
For example, and [OneTrust](https://www.onetrust.com/) are two of the most popular CMPs in the world. They both use category based consent, they are certified by Google and the IAB, and they are considered fully compliant with the GDPR.
To answer the question directly: Pixel based consent is not wrong, but it is not required for GDPR compliance. **No single CMP vendor has a monopoly on legal compliance.** Compliance is determined by adherence to the regulation, not by which specific product you use.
## A note on proprietary approaches in the CMP space
*The following reflects our editorial perspective, based on our experience working with dozens of CMPs over several years.*
There is a pattern in the CMP space that is worth examining.
Some CMP vendors have chosen to build proprietary, non-standard consent interfaces instead of implementing widely adopted standards like Google Consent Mode or the WP Consent API. This creates a situation where every plugin developer who wants to support these CMPs must write and maintain custom integration code specifically for them - code that is fragile, hard to test across configurations, and expensive to maintain.
From an engineering perspective, this is unnecessary complexity. The standards exist. They are well-documented. They are supported by the largest players in the industry. Implementing them is straightforward.
The question is: why would a CMP vendor choose not to implement these standards?
The effect - whether intentional or not - is vendor lock-in. Once a site owner has invested significant time configuring a complex, proprietary consent setup, the cost of switching to a different CMP becomes high. Not because the alternative is worse, but because the migration requires undoing all the custom work. This complexity benefits the CMP vendor by increasing switching costs. It does not benefit the site owner.
We have also observed that some vendors in this space use fear-based messaging, suggesting to their customers that their specific CMP is the only legally compliant option and that using anything else puts them at legal risk. This is not accurate. As outlined above, the vast majority of Google-certified and IAB-certified CMPs use category based consent and are considered fully GDPR compliant. Legal compliance is not exclusive to any single vendor - it is a matter of correctly implementing the requirements of the regulation.
We recognize that every business makes its own product decisions. But we believe that prioritizing open standards over proprietary lock-in better serves the WordPress ecosystem and its users. This is why the Pixel Manager supports three distinct, standards-based consent mechanisms and why we encourage all CMP vendors to implement at least one of them.
Our position is clear: we will not allocate engineering resources to maintaining integrations that depend on unnecessarily proprietary systems when open, widely adopted standards already exist. Clean architecture and shared consent standards provide long-term stability for everyone.
## What should you do?
If you are currently using Borlabs Cookie or Real Cookie Banner, you have two clear paths forward:
- **Switch to a standards-compliant CMP:** We recommend using a CMP that is certified by [Google](https://support.google.com/admob/answer/13554116) or the [IAB](https://iabeurope.eu/cmp-list/), such as , [CookiePro by OneTrust](https://www.onetrust.com/), or [Complianz](https://www.complianz.io/). These CMPs implement Google Consent Mode and/or the WP Consent API and work with the Pixel Manager out of the box - zero custom code, zero configuration.
- **Ask the developers of Borlabs or Real Cookie Banner to implement a standard:** If you prefer to stay with your current CMP, we encourage you to reach out to their developers and ask them to implement at least one of the three supported standards: [Google Consent Mode](https://support.google.com/analytics/answer/9976101), the [WP Consent API](https://wordpress.org/plugins/wp-consent-api/), or the [Pixel Manager Consent API](https://sweetcode.com/docs/pmw/consent-management/api). If they implement any one of these, integration with the Pixel Manager becomes automatic. We are happy to assist any CMP developer who wants to integrate with these standards.
---
# Best Google Tag Manager Alternative for WooCommerce conversion tracking
URL: https://sweetcode.com/blog/best-gtm-alternative
Date: 2024-04-05
Tags: pixel manager, google tag manager, gtm

- Using the Google Tag Manger is not "free"
- Expert driven vs. community driven tracking optimization
- Tag management is a measurement strategy, not plumbing, and someone has to own the data layer
- If you're using the Google Tag Manager to track data on your WooCommerce site, you're losing money
Google Tag Manager is one of the most popular tracking tools available to marketers. It offers a wide range of features to track data on websites and online stores.
However, if you aren't particularly tech-savvy, setting up Google Tag Manager on your online store can be challenging.
In this article, we'll take a closer look at why Google Tag Manager isn't the best solution for data tracking and why you should consider using an alternative like Pixel Manager for WooCommerce.
## What is Google Tag Manager (GTM)?
[Google Tag Manager](https://tagmanager.google.com/) is an advanced marketing tool that lets you track different metrics on your WooCommerce site.

You can use any type of tag or tracking pixel across your site to get access to detailed data about your target audience or know exactly how well your landing pages are performing.
This includes how many users click on a link or download a PDF file. You can set up Google Tag Manager in a way that lets you track button clicks, scroll depth, and any custom events you want to track.
## Is Google Tag Manager “free”?
Here are some of the most common misconceptions people have about the Google Tag Manager:
**Misconception #1:** The Google Tag Manager is free to use.
**Reality:** While the Google Tag Manager doesn't have a price tag, it still costs you plenty of time and resources to set it up properly. This means you have to sacrifice a lot of precious time which could otherwise be used to grow your business.
Moreover, if it isn't set up correctly, it will give you inaccurate conversion data. Deteriorated tracking data will give you the false impression that tracking is working fine, but in reality, it's not tracking optimally. Every tracking inaccuracy will lead to opportunities lost. You won't allocate your advertising budget effectively, and you won't be able to optimize your campaigns efficiently. This leads to higher advertising costs and lost income, every day, every week, every month, every year.
And if you don't wan't to spend your time on setting up Google Tag Manager yourself, you have to hire an expert. The cost of hiring an excellent Google Tag Manager expert can be quite high.
**Misconception 2:** The Google Tag Manager offers more features and is more flexible than its alternatives.
**Reality:** This is true for marketers who have decent knowledge of how tag managers work. However, if you're not very tech-savvy or this is your first time using the Google Tag Manager, there's a pretty good chance you won't be able to use most of the tool's advanced features right off the bat.
And if you hire a Google Tag Manager expert you have to be lucky to find one who really knows how to squeeze the most out of the tool.
**Misconception 3:** The Google Tag Manager is quick and easy to set up.
**Reality:** You have to go through extensive training and learn how to use the Google Tag Manager platform before you can use it to start tracking accurate data. Or, you hire an expert to do it for you.
## Why businesses should use an alternative to Google Tag Manager
Let's take a closer look at some of the major reasons why businesses might want to use an alternative to Google Tag Manager:
- **Not really free.** The Google Tag Manager is not free to use. It will cost your business a lot of time and resources to learn how to use the tool for tracking accurate data on your WooCommerce site. On top of that, inaccurate data tracking can lead to lost sales opportunities and higher advertising costs.
- **Difficult to set up.** If you're thinking about committing to the Google Tag Manager, be prepared to go through an extensive initial setup process that requires you to follow online tutorials and documentation before you can get the tool to start working the way you want.
- **Takes a lot of time to get it right.** While it's difficult to first set up the Google Tag Manager on your site, that's not the major roadblock you'll have to deal with. Getting the Google Tag Manager to work perfectly on your website takes a lot of time and testing. You'll never be 100% sure that you're tracking all the data accurately.
## Can't set up the Google Tag Manager?
Most people have a hard time setting up the Google Tag Manager for their WooCommerce site. This is because it requires a decent knowledge of coding and tech-savviness.
Even with Google Tag Manager plugins that support WooCommerce you still have to set up all the tags, triggers and templates manually. This can be a daunting task for someone who isn't tech-savvy. And manual setup often leads to mistakes that can lead to inaccurate data tracking.
The good news is that there are Google Tag Manager alternatives available, like Pixel Manager for WooCommerce, that are much easier and quicker to set up for accurate data tracking on your WooCommerce site.
## Best Google Tag Manager alternative: Pixel Manager for WooCommerce
The [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) offers an intuitive, all-in-one solution for setting up accurate data tracking on your online store.

You can set up professional-level data tracking on your WooCommerce site without having to worry about getting inaccurate data or running into performance issues. The best part is that it fully supports the most popular pixels including GoogleAds, Meta, TikTok, Reddit, LinkedIn, and Snapchat.
While Pixel Manager for WooCommerce's ease of use is one of the major reasons why it's a better alternative to Google Tag Manager, you also get better site performance and GDPR ready data tracking on your online store.
## Google Tag Manager vs Pixel Manager for WooCommerce: Comparing features
Here, we'll compare Google Tag Manager vs Pixel Manager for WooCommerce to see how they stack up against each other. This can help you decide on the right tag-tracking tool for your WooCommerce site.
### Cost
While Google Tag Manager is technically “free” to use, it's going to cost your business a lot more time and opportunity.
On the other hand, Pixel Manager for WooCommerce offers a free-to-use plugin as well as a premium version of the plugin. With the free version, you get access to the core functionality of the plugin so you can get started with accurate data tracking on your online store without spending a penny.
Once you're more familiar with the tool and want access to premium features like more tracking pixels, scroll tracking, automatic conversion recovery, and phone and link click tracking, you can upgrade to the premium version of the plugin.
### Flexibility
Google Tag Manager offers extensive features for setting up any type of tag, pixel, or script on your WooCommerce site.
You can also create custom triggers and variables to track custom event data on your online store. In addition to this, it lets you create custom tags to fire custom scripts across your WooCommerce site.
In simple words, Google Tag Manager offers the ultimate level of control over the pixels and tags of your WooCommerce site.
With Pixel Manager for WooCommerce, you can add most of the popular pixels and tags on your WooCommerce site within a few clicks. But it doesn't allow to add any type of pixel you want, only the ones supported. The advanced tool is designed to seamlessly integrate with WooCommerce and the tracking pixels. Additionally, all variables and triggers are pre-configured and optimized from the get-go so you can focus on other important business tasks.
Both tools offer decent flexibility when it comes to setting up tracking pixels, tags, and scripts on your WooCommerce site. With Google Tag Manager, you have all the control you need to set up pixels and tags the way you want, assuming you are proficiently tech-savvy.
Pixel Manager for WooCommerce also lets you track most of the popular pixels without having to go through the hassle of manually adding them to your site's code.
### Ease of use
Google Tag Manager is not very easy to set up on any WooCommerce site and requires decent amount of technical knowledge to seamlessly use the tool for accurate data tracking. If you're learning to use Google Tag Manager through online tutorials and guides, it can be frustrating to get things set up.
Pixel Manager for WooCommerce is the complete opposite of Google Tag Manager when it comes to ease of use. It is designed to be intuitive out of the box and requires little to no coding knowledge for setting up accurate data tracking pixels on your online store.
### Tracking accuracy
Because the Google Tag Manager requires a lot more manual setup it is more error-prone, especially if you're still learning to use the tool. Adding tags or tracking pixels to the code of your site can lead to mistakes that ultimately break the tracking process.
The Pixel Manager for WooCommerce offers advanced features like automatic conversion recovery to ensure data integrity and help increase the accuracy of data tracking across your online store.
### Support
One of the major drawbacks of using Google Tag Manager is that it lacks developer support since it is open source. This means you need to rely on forums and hope someone can help you fix your issue.
With a professional tool like Pixel Manager for WooCommerce, you get top-notch support from the developers of the plugin. It's a fool-proof way to ensure your site will always be online and tracking data accurately.
### Crowd-Sourced Guidance vs. Crowd-Sourced Functionality
Both, the Google Tag Manager and the Pixel Manager for WooCommerce are community-driven. However, their communities focus on different aspects, which is a key distinction between the two tools, and a major advantage of the Pixel Manager for WooCommerce.
Google Tag Manager's community mainly offers advice on using the tool, which is helpful for mastering it. However, it doesn't prevent manual errors in setup.
On the other hand, the Pixel Manager for WooCommerce focuses on functionality, based on user feedback. Users actively report issues or request new features. Once these issues are fixed or new features are added, **all users benefit, not just the one who reported it**. This means every Pixel Manager user quickly benefits from the community's feedback instantly, which is a major plus.
## Who owns the data layer? Faster tag setup is not better tag setup
The biggest hidden cost of Google Tag Manager isn't the initial setup. It's everything that happens afterwards. GTM is a powerful tool, but it's like a scalpel: fine in the hands of a surgeon, dangerous in everyone else's. And once it's installed, somebody has to keep using that scalpel, every time WooCommerce, a pixel vendor, a consent rule, or a browser changes.
A recent [PPC Land article on Google moving GTM inside Google Ads Data Manager](https://ppc.land/google-tag-manager-moves-inside-google-ads-data-manager-what-changes/) captures the trap perfectly. Mohamed Gamal, founder of Gambra Digital, describes a scenario most agencies and store owners will recognise instantly:
> Accounts where GTM "was set up once by an agency and never touched again," where "the trap is teams treating tag management as plumbing instead of measurement strategy." Easier access to tags, in that framing, means more bad tags fired faster unless someone owns the data layer. **Faster implementation does not automatically improve implementation quality.**
This is exactly the gap the Pixel Manager is built to close.
### GTM is a tool. It doesn't own your data layer.
Google Tag Manager is, by design, a generic container. It doesn't know what a WooCommerce product is, what a variation is, what a refund is, what a subscription renewal is, or how your checkout actually fires. It just executes the tags you (or your agency) configure. The data layer (the part that actually decides whether your tracking is correct) is your responsibility.
That means every GTM setup is essentially a custom build. And every custom build needs ongoing maintenance:
- WooCommerce updates change hooks and template structures
- Ad platforms change parameters, consent requirements, and recommended event schemas
- Browsers change cookie behaviour (Safari ITP, GCLID stripping, etc.)
- Consent Mode v2, enhanced conversions, and first-party data requirements keep evolving
If no one is actively watching that, the container quietly rots. Tags keep firing, dashboards keep showing numbers, but the numbers are wrong, and you make budget decisions on top of wrong numbers.
### The Pixel Manager owns the data layer for you
The Pixel Manager takes the opposite approach: **we own the data layer**. The plugin knows WooCommerce, knows the supported pixels, and knows how the two should talk to each other, out of the box and on every release.
That changes the economics in two ways:
1. **Maintenance is crowd-sourced and centralised.** When one user reports an issue, or a pixel vendor changes its schema, we fix it once in the plugin. Every store on the next version inherits the fix automatically. With GTM, every container has to be re-checked and re-fixed individually, usually by someone you're paying by the hour.
2. **Quality stays high by default.** You're not relying on whoever happened to build the container two years ago having anticipated Consent Mode v2, enhanced conversions, server-side deduplication, or Safari's GCLID handling. The plugin keeps up with those shifts as part of its normal release cycle.
### The real cost comparison
GTM's license fee is zero. The opportunity cost almost never is:
- **DIY path:** the time you spend learning, configuring, debugging, and re-validating GTM is time not spent on the business, plus the cost of every untracked or mis-tracked conversion in the meantime.
- **Freelancer path:** even a modestly priced specialist will, over a year, cost more than a Pixel Manager license, and they still won't be watching your container daily.
- **Agency path:** the bill keeps going up, and the opportunity cost of a misconfiguration (lost conversion data, wasted ad spend, broken consent compliance) can dwarf the agency invoice itself.
The Pixel Manager doesn't replace strategic thinking about measurement. But it does take the "plumbing" off your plate, so the strategic thinking actually has a clean data layer to sit on. That's the part GTM, by design, will never do for you.
## Conclusion
Data tracking on your WooCommerce site is important for tracking metrics like conversions and landing page visits to enhance marketing campaigns for your business.
Instead of opting for the Google Tag Manager simply because it's “free”, most marketers would be better off with a user-friendly conversion tracking solution such as Pixel Manager for WooCommerce.
The plugin is very easy to first set up and doesn't require you to spend a huge amount of time learning how to use it for accurate data tracking.
As a rule of thumb: If you spend more than $100 on advertising per month, it is likely that you will save money by buying a Pixel Manager for WooCommerce license instead of using the Google Tag Manager.
Ready to start tracking WooCommerce conversions? Get [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) today!
---
# CommerceGurus Popups WooCommerce Plugin: In-Depth Review
URL: https://sweetcode.com/blog/commercegurus-popups-plugin-review
Date: 2024-02-20
Tags: review

If your online store sees a lot of site traffic but doesn't have enough sales, it means people are leaving your site without considering spending money.
One way to keep potential buyers on your online store is by using a popups plugin, like CommerceGurus Popups, to display incentivized offers, show selected products, and encourage site visitors to buy from you.
I installed the CommerceGurus Popups plugin and tested it and, in the following article, I'm going to share my experience with you. We'll start by taking a closer look at the features on offer, how it works, and the benefits it offers online sellers.
## CommerceGurus Popups: Overview
The [CommerceGurus Popups](https://www.commercegurus.com/product/commercegurus-popups/) plugin offers an all-in-one solution for converting site traffic into successful sales on your WooCommerce site using smart popups.

The plugin lets you create targeted popups for your WooCommerce store without having to touch a single line of code. You can create all sorts of popups and strategically target them to appear at the perfect time. This can help you capture sales and win back lost sales without having to send follow-up emails.
Done right, it can help you reduce the cart abandonment rate on your online store. Thanks to its targeted popup trigger features, you can display popups with discounts to encourage site visitors to complete their purchases instead of bouncing off your online store.
You can also use targeted popup displays to boost conversions by encouraging first-time site visitors to sign up for your mailing list. You can offer them a special “First-time purchase” discount to earn a new customer.
The CommerceGurus Popups plugin is designed to let you have multiple popups active at a time. This means you can set up different popups for different scenarios including:
- When the page loads
- When a visitor is about to leave the store
- When a visitor scrolls or swipes down the page
- When a visitor clicks a link
- When a visitor is hesitating to click on a call to action button
## CommerceGurus Popups: Key features
I've explored the different features of the CommerceGurus Popups plugin. In this section, I'm going to discuss my user experience, impressions, and observations.
### Win back lost sales
If you're like most business owners, you might struggle with reducing cart abandonment at some point.
Once site visitors decide to leave your online store, convincing them to complete the purchase can take time. However, if you stop them before they're about to bounce off your site, you can convince them to complete their purchase.
I wanted to create a popup to show users if they decided to leave my online store. More specifically, I wanted the popup to show users a discount code along with a 20% off offer.

To do this, I simply browsed through the patterns that come with the Popups plugin and modified it by replacing the heading, text, and photo with my own. The plugin comes with 5 patterns that you can access by clicking the Add block icon in Gutenberg then Patterns → CommerceGurus Popups.

Next, I scrolled down to the Popup Settings section which was pretty intuitive. Since I wanted to show the trigger when a user was about to leave the site, I selected the Exit Intent trigger. I especially like how each option has a description. This takes a lot of the guesswork out of configuring popups.

Here's what my popup looked like on the front-end:

Let's talk about business benefits.
A well-designed popup (like the one I created here) provides a last opportunity to captivate the attention of site visitors and encourage them to complete their purchase. As a result, you can potentially increase sales without needing to rely on follow-up emails or retargeting ads to win back lost sales on your online store.
For those wondering, the popup looks equally good across both desktop and mobile platforms. Here's a quick preview:

The popup strikes the perfect balance between being engaging and obtrusive. It has a visible close icon in the top corner so users can exit out easily if they want. You can also choose to disable the popups from appearing on small screens from the Triggers settings section if you want.
### Show selected products
As a store owner, you might want to create conversational popups to encourage shoppers to buy more from you. CommereceGurus Popups also lets you show selected products to your site visitors based on their actions on your online store.
Same as before, I used an existing pattern to create a popup on my online store. The call to action button was surprisingly easy to configure.

It's basically a Gutenberg Button block which means you'll have an easy time adding your destination URL and designing the button if you're familiar with Gutenberg (and even if you're not!).

For this popup, I went with the On Scroll trigger and tweaked the Display Rules to show the popup if customers were on specific product pages.

Here's what it looks like on the front-end:

Now you might be wondering: what's the experience like for users?
If a customer is on either of the product pages I specified and starts scrolling, they'll see the popup.
I think this feature is particularly useful for increasing product visibility and encouraging customers to check out products they might otherwise have missed.
### Convert new site visitors to customers
Whenever a new site visitor lands on your online store, it's an opportunity to make a sale or encourage them to visit back once they're ready to buy. One way to do this is by offering a discount.
I found this quite easy to implement with the Popups plugin. Without having to refer to the documentation, I was able to intuitively figure out that what I want is for the popup to appear for first-time visitors which means tweaking the Display Rules settings as follows:

I decided I wanted to show a “20% off your first order” popup to new site visitors and click a button to avail the discount. Fortunately, the Popups plugin has a built-in feature that automatically creates a shortcode for a discount button!
I simply entered the discount offer details and it generated a shortcode I could add to my form. The best part? I was able to do all of this without (a) installing a separate plugin and (b) leaving the page I was working on.

### Enhance customer loyalty
Savvy marketers will agree that it's important to welcome back loyal customers with personalized messaging to encourage them to shop again.
For instance, for repeat customers or returning shoppers, you can display a popup acknowledging you appreciate their return visit. This is a simple and effective way to delight existing customers.

With CommerceGurus Popups, I was able to configure Display Rules to show popups to returning customers in one simple step.

### Offer upsells easily
Upsells are essentially a way to encourage your customers to spend more based on the products already added to their cart. For instance, if a customer has a pair of sneakers added to their shopping cart, you can upsell them a more premium pair so they spend more.
This is a great way to boost the customer experience and increase the average order value on your WooCommerce site.
As you might have already guessed, the CommerceGurus Popups plugin is perfect for this. You can really get creative with how you want to offer upsells. I was able to mix and match triggers and display rules to create a truly unique experience for customers.

Another pro tip I picked up from the Popups landing page was to create a mystery gift product that you offer to customers who spend a certain amount on your online store.

I did this in a few clicks by setting the Display Rules to show the popup if the customer's cart total was $60 or more.
### Make new product launches more interactive
Sending a notification to everyone in your email list is a must when launching new products on your online store. While this is the best way to alert customers and encourage them to visit your site, you also need an effective way to notify customers or site visitors who are currently browsing your online store.

The CommerceGurus Popups plugin lets you create promotional messages using pop-ups and display them to your site visitors as soon as they land on your shop's home page. It's a great way to keep your customers informed while encouraging them to purchase the newly released product.
## CommerceGurus Popups: Pricing
You can get started with CommerceGurus Popups plugin for $149 per year which also includes one year of updates and dedicated support.

You don't have to worry about spending extra on getting more functionality, all features offered are accessible for you to use after purchasing the plugin.
## Conclusion
Reducing the cart abandonment rate of your online store while encouraging your customers to spend more is a great way to generate more revenue and increase profits for your business.
My personal experience with the CommerceGurus Popups plugin has been remarkably positive. It stands out as a user-friendly, feature-rich popups solution for WooCommerce stores, catering to both non-coders and seasoned users alike.
What I liked most was its intuitive design and explanation of features on screen. It makes it incredibly easy to create diverse popups effortlessly and without navigating away from the page.
So, whether you want to send personalized messages to repeat customers, offer discounts to first-time customers, or recover abandoned carts, CommerceGurus Popups has got you covered and is definitely worth trying out.
Ready to start increasing conversions on your online store? Get [CommerceGurus Popups](https://www.commercegurus.com/product/commercegurus-popups/) today!
---
# Release: The Pixel Manager now supports Taboola
URL: https://sweetcode.com/blog/taboola-release
Date: 2024-02-03
Tags: pixel manager, feature release, taboola

The Pixel Manager now supports [Taboola](https://www.taboola.com/). Activate the Taboola pixel on your site and start tracking your Taboola campaigns.
## About this release
You asked for it, and we delivered. From version `1.38.0` onwards the Pixel Manager supports the Taboola pixel. Activate the Taboola pixel on your site and start tracking your Taboola campaigns. It's that simple.
## Pro Feature
The Taboola pixel is available for all users with a [Pro subscription](https://sweetcode.com/plugins/pmw#pricing-section).
## How to activate the Taboola pixel
Please follow the instructions in the [Pixel Manager documentation](https://sweetcode.com/docs/pmw/plugin-configuration/taboola).
---
# Discount Banner for the Google Automated Discounts Plugin
URL: https://sweetcode.com/blog/gad-discount-banner
Date: 2024-01-29
Tags: pixel manager, gad, new feature

The Google Automated Discounts plugin now supports a new feature that allows you to display a discount banner on your store. This banner will be displayed on the product page with an active Automated Discounts price and will show a counter with the time left until the discount expires, along some additional information about the discount.
## Why
**Short answer**: To increase your conversion rate.
**Long answer**: The Google Automated Discounts program allows to offer automated and time-limited discounts to a subset of customers. The discounts are only offered through Google Shopping ads and activate once the customer clicks on the ad.
Although the product page will show the discounted price, the customer will not be able to see the discount details, such as the discount amount or the time left until the discount expires.
That leads to a couple of issues:
- In some cases customers won't realize that the product is on a time-limited discount only offered to them and might not make the purchase (or might not make the purchase in time).
- In other cases the customers might be frustrated as they might think no discount is applied to the product, as the product page will show the discounted price, but no discount details.
To solve this issue, the Google Automated Discounts plugin now supports a new feature that allows you to display a discount banner on your store. This banner will be displayed on the product page with an active Automated Discounts price and will show a counter with the time left until the discount expires, along some additional information about the discount.
The banner works equally well with simple and variable products.

## How to enable the discount banner
The discount banner is disabled by default. To enable it, go to the plugin settings page, check the "Discount Banner" checkbox and save the settings.
## How to customize the discount banner
The discount banner can be fully customized by copying the default template and modifying it. The template can be found in the plugin folder under `templates/discount-banner-flipper.php`.
A full description of how to customize the template can be found in the [plugin documentation](https://sweetcode.com/docs/gadwc/configuration/#discount-banner-template).
---
# Variations Discount Inheritance
URL: https://sweetcode.com/blog/variations-discount-inheritance
Date: 2024-01-29
Tags: gad, new feature

The Variations Discount Inheritance feature copies the discount received from Google to all variations of the same product.
## Problem
When a product has multiple variations, the discount received from Google is only applied to the specifi variation that was clicked on. This means that the discount is not applied to the other variations of the same product.
Imagine that you're selling a shoe in different colors and sizes. When a user clicks on an Automated Discount ad for a blue shoe in size 10, the discount is only applied to the blue shoe in size 10.
However, the user might want to buy the same shoe in a different size or color.
If the discount is not applied to the other variations, the user might become frustrated and not buy the shoe at all.
## Solution
We implemented the new Variations Discount Inheritance feature to solve this problem.
When a user clicks on an Automated Discount ad for a blue shoe in size 10, the discount is applied to all variations of the same product.
This means that the user can buy the same shoe in a different size or color and still get the discount.
## Settings
The Variations Discount Inheritance feature is disabled by default. The reason is that there are some cases where you might not want to apply the discount to all variations of the same product. Examples would be variable products with large price differences or profit margins between variations.
You can choose to copy the discounted price to all variations of the same product or to copy the discount percentage to all variations of the same product.
---
# Lifetime Value Calculation
URL: https://sweetcode.com/blog/lifetime-value-calculation
Date: 2024-01-07
Tags: pixel manager, development update

There were some drawbacks in the previous implementation of the lifetime value calculation in the Pixel Manager. We have now fixed them and added some new features.
## Problems with the previous implementation
- For shops with large numbers of orders for the same customer, there was the risk that the calculation was incorrect.
- The calculation took place while saving a new order. For shop customers with a large number of orders, this could have caused long load times, and in certain cases even a timeout error.
- The calculation didn't take into account refunds.
## New features
- The lifetime value calculation of old orders is now done in the background, so it doesn't affect the loading time of the order page.
- The calculation is done for all orders of a customer, not just the last 1000.
- Auto detection of refunds and canceled orders. The lifetime value is now calculated correctly, even if the customer has refunds or canceled orders.
- Auto detection if the calculation logic for the lifetime value has changed. If the logic has changed, the lifetime value is recalculated for all customers (during night time).
- Button to manually recalculate the lifetime value for all customers. This is useful if you change the order value logic in the Pixel Manager settings or change the order value filter. The auto detection should pick it up with the next order that is saved. But, if you use a custom order value logic, depending on how the logic works, it might be necessary to manually recalculate the lifetime value for all customers.
## Important to know
The lifetime value calculation is now done in the background using the Action Scheduler. But, there are things that you should be aware of.
### Recalculation of a single customer
When a order is refunded or cancelled, only this order and all newer orders for the same customer will be recalculated. This doesn't happen instantly, but should take only a few minutes.
### Recalculation of all customers
A recalculation of the lifetime value for all customers is more complex.
- It will go through all orders of the shop.
- The Action Scheduler that's running the calculation does its best to limit the load on the server. However, some hosting providers might still flag this. Since the recalculation of all customers should happen very rarely, this shouldn't be a problem.
- The recalculation is scheduled to run at night when the server is under light load.
- The recalculation of all customers should happen very rarely. It will happen the first time you update the Pixel Manager to the new version. And, it will happen if the Pixel Manager detects a change in the logic for the lifetime value calculation.
### Action Scheduler
While the Action Scheduler is doing a real good job at limiting the load on the server and running the tasks in the background, it's not perfect.
We have seen cases where simple tasks run into a timeout error. Those cases are rare, but are likely to happen when a recalculation of all customers is triggered (on shops with thousands of orders). The Pixel Manager will automatically handle those cases and retry the task. You probably will see the timeout errors in the error log of your server.
From a technical point of view we are not sure yet if this is a problem with the Action Scheduler, with the server or with WordPress. Once we have more clues, we will report it to the respective developers.
## Conclusion
The lifetime value calculation is now more reliable and more accurate than before.
---
# Transparency and Consent Framework v2 for Google
URL: https://sweetcode.com/blog/transparency-and-consent-framework-v2-for-google
Date: 2024-01-03
Tags: pixel manager, update, TCF, google

The Pixel Manager now includes support for the IAB Europe's Transparency and Consent Framework v2 (TCF v2) for Google.
This means that you can now configure your Google tags to respect the user's consent preferences for the purposes of GDPR and ePrivacy compliance.
## What is the Transparency and Consent Framework v2?
The Transparency and Consent Framework v2 (TCF v2) is the latest version of the IAB Europe's Transparency and Consent Framework. It is a technical specification for the digital advertising ecosystem that enables website owners and publishers to communicate clearly with users about how their data is used and to request consent to use that data in a way that complies with the EU's General Data Protection Regulation (GDPR) and ePrivacy Directive (ePR).
:::info
The Transparency and Consent Framework v2 implementation for Google is available in the [Pro version of the Pixel Manager](https://sweetcode.com/plugins/pmw#pricing-section) from version `1.35.0` onwards.
:::
## Who is the Transparency and Consent Framework v2 for?
The TCF v2 is for website owners who also act as ad publishers. This means if you have a website that displays ads from Google Ads, Google Ad Manager, or Google AdSense, then you are a publisher and the TCF v2 is for you.
## How to activate the TCF v2 in the Pixel Manager?
In the Pixel Manager advanced settings for Consent Management, you can now select the TCF v2 option for Google. This will enable the TCF v2 implementation for Google tags in your Pixel Manager.
---
# Google Consent Mode v2
URL: https://sweetcode.com/blog/google-consent-mode-v2
Date: 2024-01-02
Tags: pixel manager, update, google

Google announced a new version of their Consent Mode in November 2023. The technical details have been published in December 2023. By mid of December 2023, we have updated the Google's Consent Mode to version 2 in the Pixel Manager.
The new Google Consent Mode v2 is required for personalized advertising from March 2024.
:::info
The Google Consent Mode v2 is available in the [Pro version of the Pixel Manager](https://sweetcode.com/plugins/pmw#pricing-section) from version `1.35.0` onwards.
:::
Watch the following video to learn everything you need to know about the Google Consent Mode and the version 2 in particular.
[YouTube video](https://www.youtube.com/watch?v=IcNS8ATkGo0)
And here's the official documentation from Google: [About consent mode](https://support.google.com/google-ads/answer/10000067)
---
# Meta (Facebook) Event Manager Warning: IPv6 is preferable over IPv4 for IPv6-enabled users
URL: https://sweetcode.com/blog/ipv6-is-preferable-over-ipv4-for-ipv6-enabled-users
Date: 2024-01-01
Tags: pixel manager, facebook, meta

Some Facebook marketers have seen the following warning message in their Facebook Event Manager:
> Change IPv4 addresses for AddToCart events to IPv6. IPv6 is preferable over IPv4 for IPv6-enabled users. IPv6 is currently the industry-accepted standard and offers durability for your integration.
The short message makes it sound simple, but what does it mean? And how do you do it? How simple is it? And how did we implement it in the Pixel Manager?
This is what we'll cover in this article.
:::info
This solution is available in the [Pro version of the Pixel Manager](https://sweetcode.com/plugins/pmw#pricing-section) from version `1.35.1` onwards.
:::
:::tip[Update — Pixel Manager v1.58.4 (2025)]
Starting with version 1.58.4, we've changed our approach to IPv6 detection. Instead of using IPv6-only endpoints (which cause `ERR_NAME_NOT_RESOLVED` console errors for IPv4-only users), we now use **dual-stack endpoints exclusively** and rely on the browser's [happy eyeballs algorithm (RFC 8305)](https://datatracker.ietf.org/doc/html/rfc8305) to naturally return the IPv6 address when the browser prefers it. This eliminates all console errors while still correctly detecting IPv6 for dual-stack users. See the [updated implementation section](#updated-approach-dual-stack-with-happy-eyeballs-v1584) below for details.
:::
## An example of the warning message
Here's what the warning message looks like in the Facebook Event Manager:

And here's what Facebook suggests on how to fix it:

Looks simple, right?
Let me tell you, there is so much to unpack here. And Facebook doesn't help with their documentation. Let alone the fact that the "fix" is only for a small subset of the events you can send to Facebook and that it probably won't do much to improve your results.
## What is IPv6?
[IPv6](https://en.wikipedia.org/wiki/IPv6) is the latest version of the Internet Protocol (IP), the communications protocol that provides an identification and location system for computers on networks and routes traffic across the Internet. IPv6 was developed by the Internet Engineering Task Force (IETF) to deal with the long-anticipated problem of IPv4 address exhaustion. IPv4 address range is 32-bit, which allows for 4.3 billion unique IP addresses. The IPv6 system uses 128-bit addresses, which allows for approximately 3.4×10^38 addresses. This is a huge number and should be enough for the foreseeable future.
Here's an example of an IPv4 address:
`192.168.1.1`
Here's an example of an IPv6 address:
`2001:0db8:85a3:0000:0000:8a2e:0370:7334`
## Facebook Warning: Report the IPv6 address of the user instead of the IPv4 address
Here's where it gets tricky. IPv6 has been around for a while but is not widely adopted. Most users still use IPv4. (And there is nothing you can do about it. It is the users's ISP that decides which protocol is available.)
Today, most users have either an IPv4 address or an IPv6 address. Due to some smart engineering, some ISPs offer IPv4 and IPv6 addresses for the same clients. This is called [dual-stack](https://en.wikipedia.org/wiki/IPv6#Dual-stack_IP_implementation).
In a dual-stack configuration, it is the user's browser that decides which address to use. It depends on the entire network path between the user and the server. If the entire path supports IPv6, the browser will likely use IPv6 (but not necessarily).
While Facebook didn't make it very clear when to report the IPv6, it is clear to me that Facebook only tries to address those events for users that have both an IPv4 and an IPv6 address, which is only possible in a dual-stack configuration. For all other IPv4 users, there is no IPv6 address to report. For the remaining IPv6 users, the IPv6 address is already reported.
## Why does Facebook want the IPv6 address?
Facebook doesn't say why they want the IPv6 address. But I can think only of one reason: to improve the matching accuracy between the visitor and the Facebook user.
Since IPv6 is more unique and identifies a single device, not just a network, it is more accurate than the IPv4 address. So it makes it a much better identifier for the user. (User devices usually are behind a NAT router, meaning that multiple devices share the same IPv4 address. IPv6 usually gets a unique address for each device.)
## How to get the IPv6 address from a dual-stack user?
Many Facebook CAPI implementations use server-side logic to send events to Facebook. Naturally, the server knows the IPv4 address of the client that's connected to the server. So, one would think that it is easy for the server to request the IPv6 address from the client. But this is not the case. The server has no control over how the client connects to the server, and there is no technical way for the server to request the IPv6 address from the client if they are already connected through IPv4.
Fortunately, there is another way to get the IPv6 address of the client. The server can add a script to the website viewed by the browser (the client) which is then run in the browser to determine the IPv6 address of the client and sends it to the server. The server can then send the IPv6 address to Facebook.
But, again, this is not as easy as it sounds. There is no function in modern browsers that simply returns the IPv6 address of the client.
The only way is to request the IP information from one of many, free-to-use, IP information services. These services return the IP address of the client that requested the information.
But it's getting more complicated. Some of those services just return the current IP address of the client, and in the dual-stack configuration it could still be the IPv4 address. Remember, the browser decides which address to use. So, even if the client has an IPv6 address, the browser could still use the IPv4 address to connect to the IP information server.
Luckily, some IP information services have a solution for this. They offer servers that are only accessible via IPv6. Connection requests through IPv4 get refused. So, if the client can connect to such a server, it must have an IPv6 address. If the IP information server returns the IPv6 address, it is the IPv6 address of the client.
## Which service to use to get the IPv6 address?
There are many IP information services. However, only a few offer IPv6-only servers that reliably return the IPv6 address of the client (if an IPv6 address is available on the client side).
Many of those services are paid services. But there are a few free services. And because our detection script will run on browsers of our users we can't use a paid service. We couldn't use any form of authentication. Plus we would not be able to pay for the traffic. So we need to use a free service. This shortens the list of services to just a few.
But it's getting even more complicated. Not all of those IP information services allow to be accessed from browsers as those servers are protected by [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS). So the list of services is even shorter.
But things are getting even more complicated. Some of those IP information services get blacklisted regularly because they often are used by malware authors, even though the IP information services are not malicious themselves. Here's an interesting story about one of those IP information services called icanhazip.com: [A new future for icanhazip](https://major.io/p/a-new-future-for-icanhazip/). So, we need to ensure that if a browser denies access to the IP information service, we can fall back to another service.
After a lot of research, here's a very short list of IP information services to retrieve the IPv6 address that we use in the Pixel Manager:
- https://ipv6.icanhazip.com
- https://api6.ipify.org
There may be more such services around. But those two are certainly the most reliable and fastest ones. They can handle billions of requests per day. And they are free to use.
Please let us know if you know of a service that needs to be added to this list. The more we have, the more reliable our detection script will be.
## How to implement the IPv6 detection script?
Nothing comes for free. Even this part is more complex than I hoped it would be.
Because we want the IPv6 check to be as fast as possible and not block any other scripts from executing, we don't check each service one after the other. Instead, we use the relatively new `Promise.any()` function to check all services simultaneously and return as soon as we have the first valid result. Since `Promise.any()` is [not supported by all browsers yet](https://caniuse.com/?search=promise.any), it usually would be too risky to rely on it. Luckily in the Pixel Manager, we can rely on it because the Pixel Manager's library is compiled with [Babel](https://babeljs.io/), which allows us to automatically use polyfills for functions not supported by all browsers yet.
Unfortunately, this solution will not work for Google Tag Manager implementations since the GTM doesn't allow the use of functions like `Promise.any()` or compiled libraries directly. One could prepare such a library, host it on a server, and then load it in the GTM. This would add more complexity and dependency to the implementation. Especially making this a reliable solution for all browsers would be a challenge. Sure, you could just implement requests to `https://ipv6.icanhazip.com`, for instance. But that would also be less reliable than our approach, which currently uses two services for this task.
## Updated Approach: Dual-Stack with Happy Eyeballs (v1.58.4)
After running the IPv6-only endpoint approach in production for over a year, we identified a significant drawback: **IPv6-only endpoints cause `ERR_NAME_NOT_RESOLVED` console errors** for users whose networks don't support IPv6. These errors are logged by the browser's network stack *before* any JavaScript error handler runs — there is no way to catch or suppress them. This creates unnecessary noise in the developer console and can alarm site owners.
### What changed?
Starting with version 1.58.4, we removed all IPv6-only endpoint calls from the automatic IP detection flow. Instead, we exclusively use **dual-stack endpoints** — services that accept both IPv4 and IPv6 connections.
Modern browsers implement the [happy eyeballs algorithm (RFC 8305)](https://datatracker.ietf.org/doc/html/rfc8305), which gives IPv6 a ~250ms head start when connecting to dual-stack hosts. If the browser's network path supports IPv6 end-to-end, the dual-stack endpoint will naturally return the IPv6 address. If not, it returns IPv4 — which is actually the *correct* result for CAPI event matching.
### Why this is actually more accurate
Here's the key insight: when a dual-stack endpoint returns an IPv4 address, it means the browser **prefers IPv4 for external connections**. Since Facebook's own pixel (`connect.facebook.net`) is also a dual-stack endpoint, the browser uses the same protocol preference for both. This means the IP address we detect matches the IP address Facebook sees from the browser-side pixel — which is exactly what CAPI needs for accurate event deduplication and user matching.
The old approach of *forcing* an IPv6 lookup could actually return an address that Facebook's browser pixel never sees, potentially reducing matching accuracy rather than improving it.
### Additional improvement: racing all services
We also improved reliability by racing **all configured IP services concurrently** using `Promise.any()`, instead of only the first three. The first service to respond with a valid IP wins. This makes detection faster and more resilient against individual service outages — with zero console errors.
### Summary of changes
| | Before (v1.35.1–v1.58.3) | After (v1.58.4+) |
|---|---|---|
| **IPv6-only endpoints** | Called `api6.ipify.org`, `ipv6.icanhazip.com` | Not called automatically |
| **Console errors** | `ERR_NAME_NOT_RESOLVED` for IPv4-only users | Zero console errors |
| **IPv6 detection** | Forced via IPv6-only endpoints | Natural via happy eyeballs on dual-stack |
| **Service racing** | First 3 services only | All services concurrently |
| **Accuracy** | Could return IPv6 the pixel doesn't use | Always matches browser's actual protocol preference |
## Conclusion
Even after having researched all of this and having implemented it in the Pixel Manager, I still don't know if it is worth the effort. I learned a lot about IPv6 and how to detect it in the browser. But does it really help Facebook marketers to comply with Facebook's request to report the IPv6 where available?
Here are some of my thoughts:
- I'm unsure if Facebook will remove the warning message after implementing this. After all, it could be a bug on their side, which would be nothing new. Or they might have a different "opinion" for which browsers an IPv6 can be reported. In that case, our approach to detecting dual-stack configurations and reporting the IPv6 would not remove the warning. Again, Facebook is very vague on what they want and how to achieve it.
- I'm unsure if reporting the IPv6 address (for IPv4 connections) will significantly improve the matching accuracy between the visitor and the Facebook user. It probably will improve it, but just a tiny bit.
- Even if it improves the matching accuracy, I don't believe it will significantly impact campaign performance.
- **Update (v1.58.4):** After over a year of running the IPv6-only endpoint approach, we've concluded that forcing IPv6 detection is counterproductive. The dual-stack approach with happy eyeballs is not only error-free but also more accurate — it reports the IP the browser actually uses for Facebook connections. Interestingly, [Facebook's own WooCommerce plugin](https://woocommerce.com/products/facebook/) does zero browser-side IP detection; it relies purely on server-side `$_SERVER['REMOTE_ADDR']`. This reinforces our conclusion that the practical impact of forced IPv6 reporting is minimal.
One thing is for sure. Users of our Pixel Manager can now comply with Facebook's request to report the IPv6 address where available. It is a very robust solution that works in all browsers. The methods we implemented into the Pixel Manager will be available for future use cases where we must detect and process a browser's IP address.
---
# Why Agencies Should Consider Pixel Manager for WooCommerce
URL: https://sweetcode.com/blog/why-agencies-should-consider-the-pixel-manager
Date: 2023-12-07
Tags: pixel manager, agencies

As an agency, you're always striving to deliver high-performing, feature-rich websites to clients. Successful online stores track traffic and conversions to boost marketing performance, generate qualified leads, and maximize sales.
So, how do you deliver this essential functionality to clients at scale?
[Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) is a turnkey solution that enables marketers and shop owners to track WooCommerce customer data by implementing pixels. Out of the box, it lets you implement pixels from many different providers including Google Analytics, Google Ads Pixel, Meta Pixel, Microsoft, Pinterest, Reddit, Snapchat, Tiktok, and X (Twitter).
In this article, we'll explore some compelling reasons why agencies should consider Pixel Manager for WooCommerce.
## 9 Reasons Why Agencies Should Consider Pixel Manager for WooCommerce
Let's take a look at the main reasons why agencies should consider Pixel Manager for WooCommerce to unlock the potential for growth.
### #1: Ease of use
Pixel Manager for WooCommerce is an easy-to-use pixel tracking plugin for online stores. It features an intuitive user interface that lets you set up pixels and start tracking right away.

All you have to do is enter the IDs for your properties and click the _Save Changes_ button. Once you've done that, the Pixel Manager for WooCommerce plugin will begin tracking the pixels for you.

Agencies are always looking for ways to deliver more value to their clients. Pixel Manager for WooCommerce makes it easy to set up pixel tracking in a few simple steps. You can add codes for as many pixels as your client needs to track quickly and easily.
### #2: White-labelable platform
White-labelable plugins allow agencies to forego development and focus on what they do best. Pixel Manager for WooCommerce is a white-labelable platform which means that you can rebrand it as your own.

By enabling _White Label Mode_, you can hide confidential information about your agency's account and licensing. This way, clients won't see your account details in their site's back-end. In addition to this, clients won't see the pricing page, add-on prices, and contact us page links in the back-end. This results in a seamless user experience.
With a white-labelable plugin, agencies can increase the perceived value they offer clients by presenting them with professional pixel tracking functionality that looks like a proprietary platform.
### #3: Plans for multiple licenses
Pixel Manager for WooCommerce pricing is designed with agencies in mind. There are multiple pricing plans on offering including:

- **Business** - suitable for 5 active websites
- **Agency** - suitable for 10 active websites
- **Agency Plus** - suitable for 25 active websites
In addition to this, you can reach out to the team to purchase a bulk license for 50 or 100 active websites.
Agencies that work with dozens of clients can buy licenses in bulk which is more cost-effective than purchasing multiple single site licenses.
### #4: Great support
Pixel Manager for WooCommerce comes with top-notch support from the developers. All support queries are answered within 24 hours on business days and the average support first response time is an impressive 2 hours.

In addition to this, the free version of the plugin – which has over 40,000 active installations – has an average rating of 4.9 out of 5 stars in the WordPress Plugin Directory which speaks to the plugin's rich feature set, ease of use, and support.

The free version of the plugin lets agencies test out the core features of the plugin like conversion tracking, dynamic remarketing, and cart item tracking for Google Ads, event processing on lazy loaded products, link attribution for Google Analytics, and payment gateway accuracy reports.
The premium version of the plugin offers all of these core features in addition to premium features like automatic conversion recovery, order duplication prevention, conversion adjustments, Google consent mode, scroll tracking, as well as premium pixels including Microsoft Advertising Pixel, Pinterest Ads Pixel, Reddit Ads Pixel, Snapchat Ads Pixel, Tiktok Ads Pixel, Tiktok Events API, and Twitter (X) Ads Pixel with purchase and all remarketing events.
When it comes to offering advanced features – like pixel tracking – to clients, agencies prefer to go with a solution that comes with excellent support. Pixel Manager for WooCommerce has a reliable team of developers working behind the scenes to resolve issues and queries in a timely manner.
### #5: Easy to tweak with code
If you need to add custom code to the Pixel Manager for WooCommerce plugin, you can do so using [filters](https://sweetcode.com/docs/pmw/developers/php-filters) and [shortcodes](https://sweetcode.com/docs/pmw/developers/shortcodes).
These options let you tweak the plugin programmatically. As a result, it gives you more granular control over the plugin's output. The best part is that you can find filters and shortcodes to use in the plugin's extensive [Documentation](https://sweetcode.com/docs/pmw/developers/php-filters).
Agencies that want to stand out from their competitors can set up Pixel Manager for WooCommerce for their clients that gets them the exact outputs they require. For instance, this might mean setting the plugin up to:
- Add more selectors for specific events such as add-to-cart events or begin-checkout events.
- Disable subscription renewal tracking for all tracking pixels.
- Fire all pixels with a single shortcode.
### #6: Lots of use cases
Another major reason agencies should go with the Pixel Manager for WooCommerce plugin is that it has lots of use cases.
Many of the different ways you can use the pixel tracking plugin are covered in the plugin's extensive documentation and on the blog. You can expect to find lots of in-depth, step-by-step tutorials that explain how you can get the most out of the plugin.
This makes it easy for just about anyone to get started with the plugin and use it in a variety of different ways to elevate marketing efforts. It also eliminates the need to use third-party plugins or tools to achieve the desired functionality.
### #7: Performance optimized
Pixel Manager for WooCommerce is performance-optimized out of the box. The plugin has a small library and pre-compiled, pre-compressed code.
Agencies and teams can rest assured they're using an optimized pixel tracking plugin on their client's sites that won't negatively affect performance.
### #8: High precision
Unlike other pixel tracking plugins for WooCommerce sites, Pixel Manager for WooCommerce offers high precision pixel tracking which means the output you get is highly accurate. This helps you get an accurate assessment of how well your ads and other marketing efforts are performing at any point in time.
Agencies that work with online store owners need to ensure their clients get accurate data from their pixel tracking tool so they can make informed business decisions and grow their bottom line.
### #9: Turnkey solution
Pixel Manager for WooCommerce is a turnkey solution for pixel tracking. It's a simple, plug-and-play tool that lets you get up and running in no time. All you have to do is enter the IDs for the different platforms you'd like to enable pixel tracking for and it takes care of everything else for you.
The Pixel Manager for WooCommerce plugin offers a wide range of features out of the box including:
- **Cookie consent management.** Better manage site visitor's consent on ecommerce stores. Also lets you block and unblock tracking scripts fully or partially and enable Google Consent Mode for cookie-less tracking.
- **Automatic conversion recovery.** ACR features determine whether purchases have been tracked successfully and recover the conversion when a customer returns to your store.
- **Compatible with the new Cart and Checkout blocks.** Pixel Manager for WooCommerce is compatible with the new Cart and Checkout blocks which offer conversion-optimized features and a simplified shopping experience.
- **HPOS compatibility.** Compatible with WooCommerce's new High-Performance Order Storage feature.
- **Automatic data tracking and integration.** Lets you connect to your Google Analytics 4 data to enhance tracking and improve marketing campaigns.
- **Payment gateway accuracy report.** Not all payment gateways redirect customers properly to the purchase confirmation page where pixels are tracked. Pixel Manager for WooCommerce, however, lets you see how payment gateways affect conversions.
In addition to this, you get access to plenty of features that aren't available with other pixel tracking plugins for WooCommerce.
Agencies can use the Pixel Manager for WooCommerce plugin to track conversions across multiple sources for their client's online stores. Since the plugin offers all the pixel tracking features store owners and marketers might need, you can effectively reduce plugin bloat on client sites and eliminate the need to use additional tools or apps.
## Conclusion
With Pixel Manager for WooCommerce, you can deliver more value to clients in a cost-effective and scalable way. This helps you diversify your services, gain a competitive advantage in the industry, and upscale your existing business without making drastic changes to the infrastructure.
To recap, here's why agencies should consider using Pixel Manager for WooCommerce:
- It's incredibly easy to set up and get started with.
- It's white-labelable which allows you to deliver a seamless user experience to clients.
- It offers plans for multiple licenses making it a cost-effective option.
- It comes with top-notch support from the developers.
- You can tweak the plugin's functionality with code to get the exact output you need.
- It covers a variety of different use cases.
- It's performance-optimized from the get-go.
- It offers high precision pixel tracking that gets you accurate data each time.
- It's a turnkey solution so you don't need to use any additional plugins, tools, or apps.
Ready to start offering high-precision traffic and conversion tracking to clients in a scalable way? Get [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw/) today!
---
# Don't sign the NDA! (yes, do it, but only after you make sure the conditions are fair)
URL: https://sweetcode.com/blog/dont-sign-the-nda
Date: 2023-11-17
Tags: pixel manager, business

The other day, I started preparing to partner with a larger company active in the WordPress space. Great, I thought. We are a small shop, and we are looking for ways to grow. This could be a great opportunity. I was excited.
Communication was slow at the beginning because large companies sometimes have a lot of bureaucracy. That's fine, I thought. I have time, and I'm not in a hurry.
So, the day came when they sent me an NDA to sign. NDA ([non-disclosure agreement](https://en.wikipedia.org/wiki/Non-disclosure_agreement)) is a contract used to protect confidential information. It's a standard practice in the business world. I've signed a few of them in the past.
But this time, I decided to give it to my new Director of Business Development, [Mark Koemans](https://www.linkedin.com/in/mark-koemans-55259a20/). Since I now had someone to bounce ideas off of, it would be a good idea and exercise to get his opinion. So, I gave him the NDA and asked him to review it.
> **"A person who doesn't learn from his mistakes is a fool. A person who learns from his mistakes is smart. A person who learns from other people's mistakes is a genius."**
>
> That quote from an unknown source is what my father tried to teach me.
After reading the NDA, Mark told me a story from someone he knew who ran into an issue with a similar NDA. The essence of the story was that larger companies often have a lot of legal resources, and they can use that to their advantage.
So, what were the essential points in the NDA that Mark pointed out?
1. The company for which I was about to sign the NDA is a large company in a foreign country.
2. The court of law specified in the NDA was in that foreign country.
3. The NDA was written in English, but it was not specified which language would be used in the court of law.
## Hope for the best, prepare for the worst
**We all hope for the best but should also prepare for the worst.**
The worst would mean that I would have to go to court in a foreign country, where I don't speak the language and where I would have to pay for a lawyer. Also, in a dispute, even if I am right, a large company can use its legal resources to drag the case for a long time, which would cost me a lot of money and possibly drain my resources to the point where I would have to give up.
So, Mark brought up a good point. We propose to change the NDA to be more fair and use the [WIPO (World Intellectual Property Organization) Arbitration and Mediation Center](https://www.wipo.int/amc/en/center/index.html) as the arbitrator in case of a dispute. [WIPO](https://www.wipo.int/) is a neutral organization that can be used to resolve disputes between parties from different countries.
Not only are they neutral and have experience in resolving disputes, but there are several advantages to using WIPO:
- They have fixed fees for resolving disputes. This means that the cost of resolving a dispute is known.
- The language of the proceedings can be set to English.
- The length can be set to a specified number of days. If the two parties don't solve the dispute within a limited number of days, WIPO will decide.
- The law that will be used to resolve the dispute can be set to the law of the country of the issuer of the NDA.
- The location of the proceedings can be set to be online. This means that I don't have to travel to a foreign country.
The WIPO Arbitration and Mediation Center even has a free tool that can be used to create a custom NDA. It's called the [WIPO Clause Generator](https://amc.wipo.int/clause-generator/). It's a great tool that can be used to create a custom NDA that is fair to both parties.
So, we asked the company to change the NDA to use WIPO as the arbitrator in case of a dispute.
- Law: Their country's law
- Language: English
- Days to resolve the dispute: 30
- Location: Online
These are fair conditions, especially since I kept their country's law as the law that would be used to resolve the dispute.
Unfortunately, they refused to change the NDA. So I decided not to sign it, possibly losing a great opportunity.
## Reasons they didn't want to change the NDA
I can only speculate about it. Probably many other partners signed the NDA without asking for changes. So they didn't want to make an exception for me. My change would make things more complicated for them. And for a large company, that's not usually worth it. I understand that (to some extent).
However, changing the NDA would also be in their best interest. They work a lot with companies across the world. Having a modern NDA that is fair to both parties would benefit them.
## Conclusion
I never was in dispute after singing such an NDA. But when the moment comes, and the dispute happens, it's too late to change the NDA. So it's good to have a worst-case scenario laid out that is acceptable to both parties.
All small companies trying to do business with larger companies should know this. WIPO can be used to resolve disputes that happen after signing the NDA.
---
# Podcast: Unveiling the Synergy Between Pixel Manager and Our Digital Marketing & Advertising Agency
URL: https://sweetcode.com/blog/wildcloud-podcast
Date: 2023-11-06
Tags: pixel manager, wildcloud, podcast

Hi there,
I recently enjoyed being a guest on the wildcloud Podcast, hosted by the brilliant co-founders Roger Rosweide and Wijnand van Leeuwen. This podcast delves into the exciting intersection of Pixel Manager and our dynamic digital marketing and advertising agency.
In this 1 hour podcast, we go into:
- Discovering the Magic of wildcloud: We start by unraveling the essence of wildcloud and its potential to automatically sell prebuilt, managed websites that can be continually enhanced.
- **My Journey to Becoming a Digital Marketing and Advertising Expert: I shared my journey and the insights that shaped me into a digital marketing and advertising aficionado.**
- Synergy of growing two businesses simultaneously
On one side, making the best plugin, and on the other, growing the agency.
- Pixel Manager: A Peek "Under the Hood": I shed light on the advantages of Pixel Manager over competitor plugins and how it plays a pivotal role in optimizing e-commerce
- Tracking and Optimizing Lead Generation: We explore the power of Google Tag Manager in tracking and optimizing lead generation, a crucial aspect of any digital marketing strategy.
- Fundamental methodology: 'We look at the data and improve.'
- Lessons learned: 'Success is proportional to time invested.'
- Outlook
- A small selection of excellent tools Aleks uses daily
- [Screen Studio](https://screen.studio/) (easy screen recordings)
- [Cody AI](https://meetcody.ai/) (AI-powered virtual employee)
- [Docusaurus](https://docusaurus.io/) (a.o. publish documentation)
Markdown editor for a.o. Blogposts
There you have it, hope you enjoy it.
If you become interested in our Agency, get a free first consult [here](https://wolfundbaer.ch/contact).
## Snippets from the episode
## More on wildcloud
[wildcloud](https://wildcloud.com/) is a leading WordPress Software as a Service (SaaS) provider that's quickly gaining momentum globally. It's presented by founders Wijnand van Leeuwen and Roger Rosweide.
In 2023, wildcloud earned a nomination for the Innovation Award from WooSesh. The platform empowers WordPress entrepreneurs to generate consistent income by providing the tools to establish their own counterparts to Shopify, Wix, or Webflow, all through the versatility of WordPress.
wildcloud offers a seamless way to market and distribute managed, pre-designed websites which can be updated and enhanced centrally as needed.
## More on SweetCode
[SweetCode](https://sweetcode.com/) is creator of innovative tools such as the Pixel Manager for WooCommerce and Google Automated Discounts, received a nomination for the best WooCommerce plugin of 2023 by WooSesh. Our Pixel Manager stands out as the simplest solution for monitoring your WooCommerce store's traffic and sales conversions. Developed and refined by our expert performance marketers, it's renowned for its precision, minimal system footprint, and user-friendly yet adaptable configuration.
As a newcomer, you can trust in the reliability and exactness of your tracking results.
## More on Wolf+Bär Agency
The [Wolf+Bär Agency](https://wolfundbaer.ch/) is a performance marketing agency, being lauded as specialists in digital marketing and advertising. We are recognized for our commitment to keeping abreast with the most current industry tools and practices. They consistently prioritize our customers company's interests from both a revenue enhancement and cost-effectiveness perspective.
## Listen to the full episode
[](https://podcasts.apple.com/us/podcast/the-wildcloud-podcast/id1712301346)
[](https://open.spotify.com/show/66Ni1P4uHIq272Qlpa6W2C)
---
# Do you love the Pixel Manager? Then help us with our WooSesh Seshies Nomination 2023!
URL: https://sweetcode.com/blog/woosesh-nomination-2023
Date: 2023-09-14
Tags: pixel manager, woosesh

## The Seshies Award 2023
This year, for the first time, [WooSesh](https://woosesh.com/), the largest WooCommerce virtual conference, is going to have a Seshies Award Ceremony. The Seshies are a new award that will be given to the best WooCommerce extensions, stores, developers, advocates and agencies. The Seshies are a great way to recognize the best of the best in the WooCommerce ecosystem.
If you want to help to get the [Pixel Manager](https://sweetcode.com/plugins/pmw/) nominated for the Seshies Award 2023, then please nominate us here: [https://woosesh.com/seshies](https://woosesh.com/seshies) or go directly to the nomination form here: [Nomination Form](https://docs.google.com/forms/d/e/1FAIpQLSfobtJGqOszioOSTM4IMkdDbiIi44OhTZgFg1PXidnwWksEsQ/viewform)
We'd love to get nominated for the following categories:
- Innovation Award
- Extension of the Year
## Two rounds of voting
In the first round, we need to get nominated. The nomination period is open until one week before the WooSesh conference, around **October 3rd, 2023**. After that, the top 3 nominees in each category will be selected and the second round of voting will begin. The second round of voting will be open until the second day of WooSesh, **October 11, 2023**. The winners will be announced at the Seshies Award Ceremony on **October 12th, 2023**.
## How to nominate the Pixel Manager
To nominate the Pixel Manager, please fill out the nomination form here: [Nomination Form](https://docs.google.com/forms/d/e/1FAIpQLSfobtJGqOszioOSTM4IMkdDbiIi44OhTZgFg1PXidnwWksEsQ/viewform)
1. The first question is about the Innovation Award.
For the URL please use: https://sweetcode.com/plugins/pmw/
As for reason, you can copy the following text, or write your own:
_The Pixel Manager for WooCommerce offers two unique and very valuable features that no other tracking code manager has: The Tracking Accuracy Report and the Automatic Conversion Recovery Report. The former identifies potential tracking inaccuracies, which in severe cases, can indicate that over 50% of the ad budget is wasted, leading to missed revenue opportunities. The latter helps to partially mitigate the impact of lost conversions automatically._
2. Skip **Next** and go to the **Extension of the Year** category.
For the URL please use: https://sweetcode.com/plugins/pmw/
For the reason you can copy the following text, or write your own:
_The Pixel Manager is best of its class for several reasons:_
- Innovation: Our exclusive features like the Tracking Accuracy Report and Automatic Conversion Recovery embody our commitment to continuous improvement and optimization.
- Comprehensiveness: With advanced functionalities such as Google Ads Conversion Adjustments and Tracking Script Lazy Loading, the PMW surpasses other tracking code managers in feature richness while maintaining optimal website load times and tracking accuracy.
- User Approval: Boasting the highest rating among tracking code managers (4.9 from 294 reviews), PMW is well-received by users.
- Responsive Support: We guarantee quality support within one business day for both free and pro version users.
- Extensive Documentation: Our robust and well-appreciated documentation facilitates users in making the most out of the PMW.
- Ease of Use: Easy to set up, the PMW offers numerous customization options to perfectly suit every shop's needs.
- Technical Superiority: PMW stands out technically, utilizing the REST API for server interaction, with Ajax as a fallback option, showcasing its technical advantage over competitors predominantly relying on Ajax.
## How to upvote the Pixel Manager
As soon as the second round of voting starts, you will be asked to vote for the Pixel Manager.
---
# Development Update July 2023 (#11)
URL: https://sweetcode.com/blog/development-update-11
Date: 2023-07-01
Tags: pixel manager, development update, newsletter

## TLDR
- Added the Reddit pixel
- Added the Pinterest API for Conversions
- Added support for Termly CMP
## Reddit Pixel 🎯
The Pixel Manager for WooCommerce is all about making your e-commerce experience easier, more efficient, and ultimately more profitable. Today, we're taking another leap forward.
We are thrilled to announce the integration of the Reddit pixel for [Reddit Ads](https://ads.reddit.com/) into Pixel Manager! This tracking pixel empowers you to harness the power of Reddit's wide and engaged audience base through Reddit ads.
What does this mean for you? 🤔
More Data, Smarter Decisions: With the Reddit pixel, you can track user activity on your website post-Reddit ad click. Gain insights on customer actions like page visits, items added to cart, purchases made, and more.
- Enhanced Ad Performance: Optimize your Reddit ad campaigns based on real-time analytics to maximize reach and boost conversions.
- Better Retargeting: Build highly targeted custom audiences based on user behaviors and increase the chances of turning browsers into buyers.
Update now and start your journey towards higher visibility, increased sales, and ultimate success.
Try the new [Reddit pixel feature](https://sweetcode.com/docs/pmw/plugin-configuration/reddit) today and take your WooCommerce store to the next level! Happy Selling! 🚀
:::info[Pro Feature]
[The Reddit pixel](https://sweetcode.com/plugins/pmw#pricing-section) is a Pro feature, available with a [Pro license](https://sweetcode.com/plugins/pmw#pricing-section).
:::
## Pinterest API for Conversions
Pixel Manager for WooCommerce now integrates with Pinterest API for Conversions. This feature, unique to Pixel Manager, enhances your ability to track visitor interactions and understand your customer journey more accurately.
The Pinterest API integration not only improves conversion tracking but also identifies user engagement patterns. This information can be used to optimize your marketing strategies, leading to higher engagement and conversion rates.
Moreover, the enriched visitor tracking paves the way for effective retargeting. It enables you to cater to your audience's behavior and preferences more accurately.
Try the new feature to enhance the way you track visitors, engage your audience, and drive conversions. Thank you for choosing Pixel Manager, and we look forward to sharing more advancements in the future.
:::info[Pro Feature]
[The Reddit pixel](https://sweetcode.com/docs/pmw/plugin-configuration/reddit) is a Pro feature, available with a [Pro license](https://sweetcode.com/plugins/pmw#pricing-section).
:::
## Termly CMP
Exciting news! The Pixel Manager now supports [Termly CMP](https://termly.io/), available in both free and pro versions. No manual setup required - it works out of the box!
✨ Key Features ✨
- Seamless Integration: Effortlessly sync your pixels with the Termly Consent Management Platform.
- Free & Pro: Enjoy this powerful feature regardless of your version.
- Instant Setup: Say goodbye to manual configurations. Pixel Manager is ready to go!
🚀 Simplify your pixel management while meeting regulatory standards with ease! 🚀
👉 [Get started now!](https://sweetcode.com/plugins/pmw#pricing-section) 👈
## Other notable changes
- The Pixel Manager automatically tracks clicks on mailto: and tel: links and sends them to GA4 as events. No manual setup required.
- It also tracks page load time and sends it to GA4.
- Now shop manager also can see GA4 order attribution data.
- Various performance improvements have been implemented such as optimized composer autoload files for even faster loading to squeeze out the last possible milliseconds of load time (it already was fast, but now it's even faster).
- Since the last development update in January 2023 we implemented
- 9 new features
- 84 tweaks
- 10 fixes
---
# Launch of the Google Automated Discounts Plugin
URL: https://sweetcode.com/blog/google-automated-discounts-plugin
Date: 2023-04-10
Tags: plugins, google, automated discounts

## TLDR
- We launched the [Google Automated Discounts plugin for WooCommerce](https://sweetcode.com/plugins/gadwc/)
- It allows you to automatically apply discounts to your Google Shopping campaigns
- It's available on [sweetcode.com](https://sweetcode.com/plugins/gadwc/) and the [WooCommerce marketplace](https://woocommerce.com/products/google-automated-discounts-pro-for-woocommerce/)
## Introduction
We're excited to announce the launch of the [Google Automated Discounts plugin](https://sweetcode.com/plugins/gadwc/). It's a plugin that allows you to process Google's Automated Discounts in your WooCommerce store.
Google launched the [Automated Discounts](https://support.google.com/merchants/answer/11542980) beta in 2021. But due to its high bar of requirements, it was only available to a select few merchants. In 2022, Google opened up the beta to more merchants. But it still required a lot of manual work to set up.
By developing the Google Automated Discounts plugin, we've made it easier for WooCommerce merchants to set up Automated Discounts on their stores.
## What is Google Automated Discounts?
[Google Automated Discounts](https://support.google.com/merchants/answer/11542980) is a new feature that allows you to automatically apply discounts to your Google Shopping campaigns. It's a great way to increase your sales and revenue.
For each Google Shopping search Google will automatically determine if a discount should be applied and how high the discount should be to maximize your revenue and profit. Only for searches where a discount is applicable, Google will show a discount in the Google Shopping results.
## Bar of requirements is still high
While the Google Automated Discounts plugin makes it easier to set up Automated Discounts, the bar of requirements is still high. Here's a list of requirements:
- A Google Merchant Center account
- A Google Ads account
- Track [conversions with cart data](https://support.google.com/google-ads/answer/9028254)
- Set cost of goods sold (COGS) for each product
- Set auto pricing minimum price for each product that you want to opt in for Automated Discounts
- Process the Automated Discounts within the WooCommerce store correctly (this is where our plugin comes in)
Determining and setting the cost of goods sold (COGS) for each product is also not easy. You need to know the cost of each product, including shipping, taxes, and other fees.
And setting the auto pricing minimum price is best done with a long term strategy in mind. If done correctly, it can not only increase your sales and revenue, but also your profit.
Even with using our plugin to take care of the WooCommerce part of the implementation, taking care of all these requirements is a lot of work. Successfully setting up Automated Discounts can easily take several months. That's where our implementation service comes in.
## SweetCode Implementation Service
While some steps are relatively simple, others — such as determining and setting the Cost of Goods Sold and Auto Pricing Min Price for each product — demand meticulous preparation. Businesses vary in their compatibility with the Automated Discounts program, and each one calls for a tailored approach to ensure accurate calculations.
To truly unlock the potential of Automated Discounts, a well-crafted and customized strategy is essential for seamless implementation, execution, and performance optimization.
Should you find any of these steps challenging, SweetCode is here to help. Our team of skilled developers and business economists will guide you throughout the setup process, actively implementing the necessary steps and fine-tuning the program for optimal results. To receive a personalized quote, simply contact us via our [support form](https://sweetcode.com/support/), and we'll be eager to help you implementing the Google Automated Discounts program.
## Where to get the plugin
You can get the plugin on [sweetcode.com](https://sweetcode.com/plugins/gadwc/) and the [WooCommerce marketplace](https://woocommerce.com/products/google-automated-discounts-pro-for-woocommerce/).
Existing customers with an active license can get the plugin with a discount [1]. Please reach out to us through our [support form](https://sweetcode.com/support/) using an email address one of our plugins is licensed to. We'll send you a coupon code.
[1] For now, as we don't have a way to verify if customers of the WooCommerce distribution have an active license, the discount is only available to customers who purchased the plugin through sweetcode.com.
## How well does the plugin work?
We've been testing the plugin for several months. The plugin itself works exceptionally well. It's been thoroughly tested under various conditions and scenarios.
Most issues are to be expected with too aggressive caching layers. But, usually this can be resolved by setting appropriate caching rules and clearing the server side cache.
## How well do Automated Discounts work?
We've also been testing Automated Discounts for several months.
While results can vary, we've seen an average increase of 15% in orders, 7% in revenue and 4% in profit.
These results are likely to be improved as many of the factors still can be optimized and fine tuned over time. Also, we are testing additional features in the plugin that may help with improving the conversion rate for Automated Discounts specifically.
## Conclusion
If you think your shop is a good fit for Automated Discounts, we recommend you to give it a try. Especially shops that have a lot of products, a lot of Google Shopping traffic are situated in a price competition market can benefit from Automated Discounts.
---
# News January 2023 (#10)
URL: https://sweetcode.com/blog/newsletter-10
Date: 2023-01-05
Tags: pixel manager, development update, newsletter

## TLDR
- Subsription Multipler
- Lazy Load the Pixel Manager
- TikTok Events API
## News January 2023
We skipped the newsletter in December. We didn't want to release any major features in the Pixel Manager during the high season (only minor tweaks and bug fixes).
But we've been working on some new features and improvements for the Pixel Manager in the background and released them just a few days ago.
In this newsletter, we'll cover several tweaks and significant improvements released since the last newsletter.
## Subscription Value Multiplier
The subscription value multiplier helps to track the conversion value of subscription products more accurately.
The conversion pixels typically only transmit the product value of an order when it is placed by a customer in person. That means that the conversion pixels fire in the browser when the customers reach the purchase confirmation page.
However, for subscription renewals, that doesn't work. They are processed automatically in the background without interaction from the customer. That means that the conversion pixels don't fire as usual.
And a subscription customer's lifetime value (CLV) is much higher than the initial order value. So, we need to track the CLV of subscription customers more accurately.
Imagine that, on average, a subscription to a 10$ product lasts for 12 months. That means that the CLV of a subscription customer is 120$ (10$ x 12 months). So we want to train the bidding algorithms to bid higher for subscription customers. And to do that, we need to adjust the conversion value of the subscriptions on the first purchase.
The Pixel Manager now offers a subscription value multiplier setting that allows you to adjust the initial conversion value of subscription products. Taking the example above, you can set the subscription value multiplier to 12. That means that the initial conversion value of a subscription product will be transmitted with 120$.
Here's [how to set up the subscription value multiplier](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#subscription-value-multiplier).
## Lazy Load the Pixel Manager
We've encountered JavaScript optimization plugins that allow scripts to be lazy-loaded and, in some cases, improve page speed scores dramatically. The scripts get only loaded after user interaction. As a website owner, you get the best out of both worlds: Fast loading pages and the ability to track visits very accurately.
But, not all users of the Pixel Manager use such JavaScript optimization plugins. So we've added a lazy load option to the Pixel Manager. It will only lazy load the Pixel Manager tracking scripts. That alone will improve page speed scores significantly.
Here's an example.

Learn how to enable lazy loading in the [Pixel Manager documentation](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#lazy-load-the-pixel-manager).
## TikTok Events API
Like the Meta Conversion API (Facebook CAPI), TikTok also offers a server-to-server API to track conversions. It is called the TikTok Events API. In essence, it works the same way as the Meta Conversion API. All higher-order events are sent by the browser pixel **and** the server-to-server API to TikTok. TikTok then deduplicates the events and uses the data for campaign optimization.
We've implemented the TikTok Events API in the Pixel Manager. You can now [enable it in the Pixel Manager settings](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok#tiktok-events-api).
## Automatic Tracking of Phone Number Click in Google Analytics
We've added a new feature to the Pixel Manager that automatically tracks phone number clicks in Google Analytics. You don't need to add any custom code to your website to track phone number clicks.
## IP Bot Filter
We've added a new filter that automatically filters out bot traffic from the server-to-server requests. That reduces the number of server-to-server requests and thus reduces server load.
Almost all (if not all) advertising and analytics platforms have an army of bots that crawl the web and collect data. They also use those bots to verify if everything is ok on the websites of the advertisers who use their services. That means they also visit the websites that use the Pixel Manager.
Server resources are expensive. And if such bots trigger server-to-server tracking events, they only waste server resources. So, we've added a new filter that automatically filters out bot traffic (from known bots) from the server-to-server requests. That reduces the number of server-to-server requests and thus reduces server load.
The Pixel Manager also offers a filter that allows to add more custom IP addresses and IP ranges to the bot filter. That way, you can also filter out bot traffic from bots that we have not added to the standard pool of IP exclusions. Here's how to [add custom IP addresses and IP ranges to the bot filter](https://sweetcode.com/docs/pmw/developers/php-filters#ip-exclusion).
You might ask yourself why we don't filter the bot traffic from the browser pixel. That's because the bots often verify if everything is in order with the tracking implementation on the website. For that, they need a working browser pixel. So, we can't block them from the browser pixel.
## TikTok Advanced Matching
TikTok offers a feature called Advanced Matching. It allows you to pass additional data to TikTok. When this is enabled, additional identifiers are passed to TikTok. That allows TikTok to increase the match rate of users across devices and browsers. The enriched data can then be used for better campaign optimization.
Here's how to [enable TikTok Advanced Matching](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok#advanced-matching).
## Subtracting Order Fees
We've added a new feature to the Pixel Manager that automatically subtracts order fees (where available) from the order value.
When you've set the Pixel Manager to transmit the net value of a transaction (order subtotal is the default setting), then the Pixel Manager, up until now, sent the order value excluding the VAT and shipping.
With the newest version, when using the subtotal setting, the Pixel Manager removes order fees (such as PayPal or Stripe fees) from the order value. That way, the net value of the order is transmitted more accurately. This is done on best effort basis. Not all payment gateway save the order fees on the orders. So, if the order fees are unavailable, the Pixel Manager will transmit the order value as before.
If you are using a payment gateway for which the Pixel Manager isn't able to determine the order fees, you can reach out to us. We can look into it, and if we find a way to determine the order fees, we'll add it to the Pixel Manager.
## Gutenberg Compatibility
Gutenberg blocks are the future, not only for WordPress but also for WooCommerce. Since we added Gutenberg support for the Pixel Manager, WooCommerce added many more blocks, improved and changed existing blocks. That means many of the blocks were no longer compatible with the Pixel Manager.
We fixed that for the significant part. But there is still work left to do. Also, WooCommerce Gutenberg blocks are still not stable. And a lot can change before shops adopt Gutenberg blocks on a large scale. We will keep an eye on the development and will keep improving Gutenberg compatibility.
---
# Here's The Best Plugin Alternative to Facebook for WooCommerce
URL: https://sweetcode.com/blog/facebook-for-woocommerce-alternative
Date: 2022-12-07
Tags: woocommerce, facebook
{`Here's The Best Plugin Alternative to Facebook for WooCommerce`}

## TLDR
- Facebook for WooCommerce is a popular WordPress plugin used by WooCommerce store owners who run Meta Ads. The plugin promises to track conversion events that happen after customers land on your eCommerce website through a Facebook Ad.
- The reality is that [Facebook for WooCommerce](https://woocommerce.com/products/facebook/) is buggy and can cause significant issues, which is why we don't recommend it even though it's free.
- [Pixel Manager for WooCommerce](/) is more accurate, offers more features, and respects data privacy. In this article, we discuss why this plugin is the best eCommerce solution for tracking conversion events coming from Facebook page ads.
Do you want to connect your WooCommerce store to Facebook and want an alternative to the Facebook for WooCommerce plugin?

[Facebook for WooCommerce](https://woocommerce.com/products/facebook/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce%20alternative) is a free [WooCommerce](https://woocommerce.com/) plugin that enables you to install the Facebook pixel to your eCommerce store so you can track the performance of your ads and set up dynamic retargeting. You can also sync your WooCommerce catalog to Facebook.
On the surface, this probably sounds like the exact solution you need. However, when you take a closer look, you'll notice that the plugin only has a [2-star rating across more than 60+ reviews](https://woocommerce.com/products/facebook/#reviews), and causes a lot of problems for WooCommerce store owners. That's why it's worth considering an alternative plugin that will do a better job than Facebook for WooCommerce!
In this article, we'll spend some time taking you through the best Facebook for WooCommerce alternative, [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative), and show you how to set it up, step by step, in our tutorial.
## Why do you need a Facebook for WooCommerce alternative?
Facebook for WooCommerce sounds like an enticing solution on paper, as it's free and promises to be easy to use - which means that WooCommerce store owners, especially small businesses who need to control their expenses, may be tempted to use this plugin to track conversions coming from their Facebook Ads. Unfortunately, Facebook for WooCommerce comes with a number of well-known issues.
Users have reported that the shop sync doesn't work correctly, and in some cases, the plugin has caused their WordPress website to crash. In many instances, it creates bugs, such as the Woo Cart not working.
Facebook for WooCommerce has compatibility issues with many popular themes and plugins, which can cause errors such as the [White Screen of Death](https://wordpress.org/support/article/common-wordpress-errors/#the-white-screen-of-death).
Furthermore, Facebook for WooCommerce ignores site visitors' cookie preferences, which means you risk breaching privacy laws by using the plugin.
If you are currently running Facebook Ads or considering it, you should definitely find an alternative to Facebook for WooCommerce. The features on offer are very important for your business, but it's worth finding a solution that offers the same functionality without bugs or privacy issues.
The most important feature you'll need is the ability to add the [Meta pixel](https://developers.facebook.com/docs/meta-pixel/) to your WooCommerce store so you can track conversions (i.e., the actions that visitors take on your eCommerce site after they click through from your Facebook Ads).
With this conversion data at hand, you can quickly and efficiently determine which ads are working or not and how to optimize them. You'll also find out what the typical customer journey is like for a customer that lands on your WordPress website through Facebook. If it's not in line with what you want, then you can make changes to your site to increase your conversion rates.
## Introducing Pixel Manager for WooCommerce, the best pixel-tracking plugin
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative) is the best alternative to Facebook for WooCommerce. If you're looking for a powerful solution for conversion tracking, you'll quickly discover that Pixel Manager for WooCommerce is more accurate than any other plugin on the market.

That's because Pixel Manager's compiled code ensures that it can run on most old and new browsers flawlessly, which maximizes tracking accuracy. All you need to do to get started is retrieve the Meta pixel and add it to the field in the plugin's backend (which we'll show you how to do in the next section).
Pixel Manager for WooCommerce uses the Meta pixel to track all major events that occur after visitors land on your site through Facebook, including:
- Adding payment info such as payment options selected and currencies used
- Adding items to the shopping cart
- Adding items to their wishlist
- Initiating checkout
- Purchasing
- Searching
- Viewing content on the site
The plugin will send all of this data to Facebook Ads Manager, so you can see your conversion reports there.
If a customer lands on your website through one of your Facebook Ads and makes a purchase, the plugin will use Order Total Logic to determine the Order Subtotal (the total minus the shipping costs, taxes, and discounts added) or the Order Total (what the customer has paid, including shipping costs and taxes). This information is sent to the pixel.
Pixel Manager for WooCommerce allows for a much more granular setup and output compared to Facebook for WooCommerce, which means you can track various types of order total calculations.
For even more accurate and complete data, you can set up [Facebook's CAPI](https://developers.facebook.com/videos/2020/conversion-api-capi-overview/) with Pixel Manager for WooCommerce. This way, you can record server-to-server events as well as browser events.
Pixel Manager for WooCommerce uses the REST API to communicate with the server (for CAPI), using much fewer server resources. The plugin uses CAPI to track the same events as it does with the browser pixel, but you can also track subscription renewal events.
Unlike Facebook for WooCommerce, which ignores users' cookie consent choices, Pixel Manager for WooCommerce detects user cookie consent and will act accordingly. You can configure the plugin for Implicit Consent Mode (which tracks everything until consent is denied) or Explicit Consent Mode (which doesn't track anything unless consent is given). Pixel Manager for WooCommerce is compatible with [many Consent Management Platforms](https://sweetcode.com/docs/pmw/consent-management/platforms/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative), so you can stay on the right side of data privacy laws at all times.
Because Pixel Manager for WooCommerce is a pixel-tracking plugin, you'll need a dedicated feed plugin, like [Product Catalog Sync for Facebook](https://www.webtoffee.com/product/product-catalog-sync-for-facebook/), to upload your WooCommerce product catalog to Facebook.
Once you've uploaded your WooCommerce product catalog to Facebook, you can then use Pixel Manager for WooCommerce to set up dynamic remarketing. You can show personalized Ads to customers that have visited your store but haven't made a purchase to gently remind them about the products they've looked at. For example, if a customer lands on your store through a Facebook Ad and views a specific t-shirt, you can show him that t-shirt as a new Facebook Ad later.
Do you use other social media and search engine ad platforms in addition to Facebook? Pixel Manager for WooCommerce is an all-in-one solution for conversion tracking as it also integrates with [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative), [Twitter Ads](https://ads.twitter.com/), [Snapchat Ads](https://ads.snapchat.com/), and [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative), so you don't need to purchase multiple plugins just to track your ad campaigns.
You can also set it up for [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative), and [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative) for even more insight.
## How to set up and use Pixel Manager for WooCommerce
Now that you're all caught up on what Pixel Manager for WooCommerce is and what it has to offer, we'll show you exactly how to use it.
### Purchase Your Plan
Start by picking and [purchasing your pro plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative#pricing-section). All plans offer the same premium features, and the only difference between them is how many sites you'll need to install Pixel Manager for WooCommerce on. The starter package is perfect if you only own and operate one eCommerce website.
Next, upload the plugin to your plugins directory (/wp-content/plugins/) and activate it through the Plugins menu in WordPress.

### Retrieve the Meta Pixel
Next, you need to retrieve your Meta pixel. Go to Facebook Events Manager and click the Plus sign to connect data sources. Select Web > Meta Pixel and click Connect. Add your pixel name and your website URL, and then click Continue.

Now, simply add your Meta pixel in the backend. Select WooCommerce > Pixel Manager and then Facebook (Meta). Enter the pixel ID and click Save Changes.

### Setting up CAPI
Next, you need to set up the CAPI. You need a few things to set up the Conversions API:
- Your Pixel ID (which you've already obtained using the steps above),
- A Facebook Business Manager account (if you don't already have one, you can [find out how to create one in this guide](https://www.facebook.com/business/help/1710077379203657)),
- An access token, which is the parameter in each API call.
There are generally two ways to get an access token, namely through your own app or through Events Manager. Events Manager is the recommended way of getting your access token. Just choose the Meta Pixel you want to implement, select the settings tab and click the Generate Access Token link under Set Up in the Conversions API section.

Follow the instructions pop-up to complete the steps. Just note that the Generate Access token link is only visible if you have developer privileges; it's hidden from other users.
Once you have your token, click on Manage Integrations (in the Overview tab) and click the Manage button on the pop-up screen. This will create a Conversions API system user for you.

If you already have your own app and your own [system user](https://developers.facebook.com/docs/marketing-api/system-users/create-retrieve-update), you can generate your token inside Business Manager by going to Business Settings and assigning a pixel to your system user or creating a new system user. Select the assigned system user and click Generate Token.
Now go back to your WordPress site. Paste the access token into the advanced section for Meta (Facebook) within the plugin. Once it's saved in the configuration, CAPI will be active.

### Enable Dynamic Remarketing
For the final step, you may want to enable dynamic remarketing for Facebook Ads. For this, you'll need to use a feed plugin to upload your product catalog to Facebook. We recommend uploading your products with the Post ID as the identifier, as this is less likely to cause issues.
Go to the Dynamic Remarketing tab of your plugin. Enable dynamic remarketing audience collection by clicking the checkbox at the top.

Then, choose Post ID as the product identifier (if this is how you've uploaded your products as per our recommendation above), and check Enable variations output (unless you only want to upload the parent product of your variable products). Next, you can choose your business vertical, e.g., retail.
## Get started with the best Facebook for WooCommerce alternative
If you want to add the Meta pixel to your online store and start tracking conversions from your Facebook Ads, Facebook for WooCommerce is not the best plugin for it. Maybe you've already installed it and found that Facebook for WooCommerce is not working or is not compatible with your theme.
Facebook for WooCommerce has been known to cause bugs and sometimes doesn't sync correctly to your site. The WordPress plugin also ignores cookie preferences, which may lead to data privacy issues.
There is an alternative to Facebook for WooCommerce that does everything Facebook For WooCommerce promises to do and more.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative) is the best alternative on the market for any online business with a WooCommerce store. It's incredibly accurate, easy to set up, and can track all the major events that can happen in your store. You can also set up CAPI to track server-to-server events and dynamic remarketing for Facebook Ads.
There are no data privacy concerns, and it comes with full support (even on the lowest tier plan) to help you get started.
[Choose your plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-for-woocommerce-alternative#pricing-section) and get started today so you can enjoy richer, more accurate insights into your Facebook Ads.
---
# The Complete Guide to GDPR Compliance in WooCommerce
URL: https://sweetcode.com/blog/woocommerce-gdpr
Date: 2022-12-07
Tags: woocommerce, gdpr
{`The Complete Guide to GDPR Compliance in WooCommerce`}

## TLDR
- If you process data from EU site visitors and customers, then your WooCommerce store needs to be GDPR-compliant.
- In this article we discuss the major steps you need to follow in order to be compliant with GDPR legislation, although you should still consult with your lawyer as regulations may vary from country to country.
- WooCommerce is not GDPR-compliant by default, but it does have important settings that will help. For example, you can export and erase data as per customer requests.
- As a WooCommerce store owner, you'll want to track your customer behavior to gain insights about how to optimize your store. We'll show you how to do this with [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr).
Do you run a website and want to know how to make your WooCommerce store GDPR-compliant?
If you process data from EU site visitors, then you need to be on top of GDPR legislation. Your WooCommerce store won't be compliant out of the box, although it's entirely possible to make your site GDPR-compliant.
In this post, we will explore how you can follow GDPR regulations as a WooCommerce store owner, while still collecting valuable data from customers legally. We'll discuss everything: from what settings you need to change in default WooCommerce, to which plugins you need to ensure you're fully compliant.
## What is GDPR?
The [General Data Protection Regulation (GDPR)](https://gdprprivacypolicy.org/) is a data protection law that was introduced by the European Union in April 2016 and first came into effect on May 25, 2018. This set of regulations applies to all companies and providers that collect and process data from individuals residing in the EU, regardless of where the company is based.
The goal of GDPR is to give website visitors control over which personal data they want to share and impose strict rules on how companies can handle and process this information.
You've probably come across GDPR alerts on most (if not all) new websites you've visited. In some cases, they take the shape of popups or overlays that obstruct the content. Other times, these notifications are shown as footer bars.
GDPR requires you to tell your website visitors exactly what information you will be collecting (geographical data, IP address, user registration info, etc.) and why. This information is collected via [Preference Cookies, Statistics Cookies, and Marketing Cookies](https://gdpr.eu/cookies/), and site visitors can now give consent or deny consent to have this information collected. These options are usually represented with two buttons; one to accept these cookies and one to reject them.
There are a few other considerations you need to consider to follow GDPR. For example, EU residents also have the right to demand a copy of all data you have about them, ask you to correct any errors in that data, and demand you remove all personal information you have about them from your databases. As a website owner, you are also required to notify customers if their data is compromised in any way.

## Why is GDPR important for WooCommerce sites?
As a WooCommerce website owner, collecting customer data is likely a core part of your business. There are many advantages to learning more (and storing information) about your visitors. For instance:
- When customers purchase from your store, you store details about the customer, such as their name, email, and physical address,.
- You're likely e already using some way of tracking how your customers are landing on your site and what actions they take once there. A common way to do this is to add a tracking pixel that connects your site to your Google Analytics account and any similar platforms you use (we'll go through this in more detail soon).
- The data you collect through cookies can also let you learn more about your customers and give you ideas on how to optimize your site to increase conversions.
This data lets you learn more about your customers and how you can optimize your site to increase conversions, but you need to respect the law as you risk getting fined otherwise. Therefore, as a WooCommerce store owner, you need to know how to stay GDPR-compliant and only collect data from customers who consent.
So, with all this in mind, let's now look at how you can make your WooCommerce store GDPR-compliant.
## Setting up a Consent Management Platform on your site
A Consent Management Platform (or CMP) is a system you can use to ensure you're following GDPR law for handling your cookies. If you're using WooCommerce, your CMP of choice will likely be a plugin. Using a plugin can actually simplify your WooCommerce GDPR compliance considerably because you will be able to:
- Easily display a cookie banner with all relevant information about the essential and non-essential cookies you track and ask your users for consent to follow their behavior.
- Monitor certain cookies when consent is given and block other cookies when approval is denied.
- Store your users' consent information, which tells you how many users agreed to have their behavior tracked.
There are many excellent CMP plugins you can use to ensure your WooCommerce follows regulations. Some examples include , [Cookie Script](https://cookie-script.com/), [CookiePro by OneTrust](https://www.onetrust.com/products/cookie-consent/), and [Complianz](https://www.complianz.io/). All of them communicate consent through established standards, which is what makes them work reliably with tracking plugins. The Pixel Manager's [supported consent management platforms](https://sweetcode.com/docs/pmw/consent-management/platforms) page lists the ones we have tested, and names the two we do not recommend.
## Using a GDPR-compliant pixel tracker
Adding a pixel tracker to your website integrates your WooCommerce store with any analytics platform or ad platforms you might be using, such as [Google Analytics](https://analytics.google.com/analytics/web/) or [Google Ads](https://ads.google.com/). The pixel actually records all events that happen in your browser, so what this does is give you more specific information about where your users are coming from and what actions they take once they visit your site.
To be GDPR-compliant, you can only track events for consenting visitors (i.e., customers who allow you to track non-essential cookies). Some pixel-tracking solutions ignore cookie consent, so using these plugins is technically illegal from a GDPR standpoint.
If you want a pixel tracker tool that works within this legislation, you should try [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr). This plugin is not only the most accurate pixel tracker available for WooCommerce, but it's also fully compliant with GDPR guidelines and other privacy laws.

Pixel Manager for WooCommerce and integrate with all the major analytics and ads platforms, including [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr), [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr), [Meta (Facebook)](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr), [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr), [Twitter Ads](https://ads.twitter.com/), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr), [Snapchat Ads](https://ads.snapchat.com/), and [TikTok Ads](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr). This is very important because you will stay GDPR-compliant no matter what platform you use.
The plugin also has several built-in [consent management features](https://sweetcode.com/docs/pmw/consent-management/overview/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr). For example, you can set the plugin to use Implicit Consent Mode (tracking everything until consent is denied) or Explicit Consent Mode (not tracking anything until consent is given).
If visitors deny consent, no cookies are stored. Instead:
- If Google Consent Mode is enabled, Google tags will send pings that communicate minimal information about the user's activity (more on this below)
- Only the browser tags managed by the Pixel Manager will send data.
- Server-to-server tags will only send anonymized purchase data.
Pixel Manager for WooCommerce also integrates with [Google Consent Mode](https://sweetcode.com/docs/pmw/consent-management/google/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr). If Google Consent Mode is enabled, Google tags can send pings that communicate minimal information about the user's activity even when they reject cookies. The data will be less accurate than normal, although it's better than no tracking at all.
Google markets this as a GDPR-compliant way of tracking visitors without cookies, although the data is less accurate than normal. However, every store owner should assess this for themselves as regulations vary from country to country.
The Pixel Manager for WooCommerce plugin doesn't include a cookie banner, but [it integrates with all the major Cookie Management Platforms](https://sweetcode.com/docs/pmw/consent-management/platforms/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr). If you're a more advanced WordPress user, you'll also be happy to know Pixel Manager comes with a [Cookie Consent API](https://sweetcode.com/docs/pmw/consent-management/api/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr) you can use to implement your own custom-made cookie banner.
## Setting up a privacy policy page
If you want to follow GDPR legislation, you will need to add a Privacy Policy page to your WooCommerce store owner. This page should include information on the following:
- What data your store collects, and why
- What it does with the data
- Who you share this data with (e.g. payment methods)
- How customers can access their data
- How long you keep customer data for
Since the WordPress 4.9.6 update, you can assign any page on your site to be your Privacy Policy page, or you can create a new page from scratch. To set up your Privacy Policy page, you just need to go to _WP Admin → Settings → Privacy_ and choose the option you prefer. Here are a few good considerations for a [compliant Privacy Policy page](https://woocommerce.com/posts/getting-ready-for-gdpr-put-someone-in-charge-and-update-your-privacy-policy/):
- Make sure the text is well-written and easy to understand.
- Include all plugins and integrations that are going to be storing user data and specify whether they send information outside the EU.
- Explain why you're collecting data by detailing, for example, whether you do it to ship a product, send email updates on an order status, etc.
- Explain how users can get a copy of their data or request its deletion.
The last point is quite important, so let's go through a few data deletion considerations in a little more detail.
## Granting customers access to their personal data
One of the requirements of GDPR is [Right of Access requests](https://woocommerce.com/posts/right-of-access-requests/), and one easy way of enabling this is to include a contact form on your store. You can set up a contact form on your site using a plugin like [Contact Form 7](https://wordpress.org/plugins/contact-form-7/) or [Gravity Forms](https://www.gravityforms.com/).
The newer versions of WordPress have an [Export Personal Data](https://wordpress.org/support/article/tools-export-personal-data-screen/) tool which might come in handy because it also lets you export data for customers who request access. However, any plugins or systems you use to collect the information will need to be compatible with this tool. It's fine if you use any plugins that store data elsewhere as long as you can export data from the plugin when required.
When customers request to access their data, you should always:
- Send them a confirmation request using the Export Personal Data tool to verify their identity.
- Share a link to their report, or download the file yourself and send it to them directly.

## Erasing customers' personal data when requested
Before we delve into this section, note that the [Right to be Forgotten](https://gdpr.eu/right-to-be-forgotten/) doesn't always apply under GDPR regulations. For example, if you are required to keep customer data to comply with legal obligations such as declaring tax, then you are not obliged to erase a customer's data because agencies might request it.
WordPress has an Erase Personal Data tool that you can use for your [Right to Erasure requests](https://woocommerce.com/posts/getting-ready-for-gdpr-right-to-erasure-requests/). You can access it by going to _Tools → Erase Personal Data_. This tool is compatible with any of the in-built WordPress and WooCommerce methods for collecting data, including their official extensions.
When a user asks to have their data erased (again, you will ideally need a contact form for this), all you need to do is go to the tool and send a confirmation request to the user. Once they confirm, click the '_Erase Personal Data_' button.
You can also go to _WooCommerce → Settings → Accounts and Privacy_ to have complete control over:
- How long inactive accounts are preserved.
- How long pending, failed, or canceled orders are preserved.
- How long completed orders are preserved.
## Inform customers of security breaches
The last important consideration for complying with GDPR is its clause on [Security Breaches](https://woocommerce.com/posts/getting-ready-for-gdpr-security-breaches/). According to the legislation, you have a duty to ensure your WooCommerce site remains as secure as possible. So, for your WooCommerce store to be truly compliant, you should always have a security plugin like [Jetpack](https://jetpack.com/features/security/) installed on your WordPress site.
If you do have a breach, you are bound by law to inform all customers whose data you're storing about it within 72 hours. An excellent way to do this is by using a tool that can send mass emails, like [Mailchimp](https://mailchimp.com/) or [MailPoet](https://www.mailpoet.com/).
## Set up your GDPR-compliant WooCommerce store today
If your WooCommerce store collects data about EU customers in any way, having a GDPR-friendly site is not just advisable - it's mandatory.
Dealing with GDPR regulations can feel a little daunting at first, but It is possible to follow a few simple steps to create a compliant WooCommerce site. Default settings in WordPress make this easier, and there are plenty of plugins that help as well.
As a WooCommerce store owner, you should still care about your customer behavior, so you can understand what products they purchase and why - and make predictions for what to offer next! The good news is that you can still track conversions in a legal way.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr) is the best solution if you want to have accurate and GDPR-compliant conversion tracking. The plugin integrates with major analytics and ad platforms so you can track conversions legally no matter where your customers are coming from. Pixel Manager for WooCommerce also has in-built consent management features and integrates with major CMPs as well.
If you want to keep your WooCommerce store GDPR-compliant while still tracking your customer behavior, [try out Pixel Manager for WooCommerce today](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-gdpr#pricing-section).
---
# What is Facebook's Conversion API (CAPI), and how do I use it on my site?
URL: https://sweetcode.com/blog/facebook-capi
Date: 2022-12-06
Tags: woocommerce, facebook, capi, server-to-server, tracking, conversions
{`What is Facebook's Conversion API (CAPI), and how do I use it on my site?`}

## TLDR
- If you run Facebook Ads, then you'll want to track conversions when customers land on your WooCommerce store from an ad.
- Many WooCommerce stores use the Meta pixel in their browser, but it's recommended that you also use Facebook's Conversion API (CAPI), which enables server-to-server tracking on your site. This gives you more accurate data to work with and lets you track offline events too.
- In this article, you'll find out how to integrate Facebook CAPI using [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-capi).

Alt= Facebook displayed on a cellphone
Facebook is one of the most popular social media platforms in the world. It's used by [more than 2.32 billion people](https://www.statista.com/statistics/264810/number-of-monthly-active-facebook-users-worldwide/#:~:text=With%20roughly%202.93%20billion%20monthly,used%20online%20social%20network%20worldwide.) every single month. This makes a great place to reach new customers for your eCommerce store, which is why so many businesses, including WooCommerce stores, use Facebook Ads to direct potential customers to their websites.
Most companies do this by using browser pixels that track conversions that come from Facebook Ads. By using browser pixels, you can collect important data about your site visitors and the way they behave. While this is a great way of collecting data about site visitor behavior, businesses also need to account for data gaps. For example, if a redirect goes wrong and a customer doesn't reach the purchase confirmation page, the browser pixel won't send any data.
Meta has come up with a solution to this issue by developing the Facebook Conversion API. [Facebook's conversion API](https://developers.facebook.com/docs/marketing-api/conversions-api/) or CAPI allows for robust data attribution and conversion reporting and can usually track events even in instances when the browser pixel isn't able to.
In this article, we explain exactly what Facebook's CAPI is, why it's important, and how you can use it on your WooCommerce site.
## What is Facebook's Conversion API?
Facebook's Conversion API, previously known as the Facebook Server-Side API, is used for server-to-server tracking. It connects your website data (which is housed on your server) to Facebook Ads Manager (which is housed on Facebook's server).
[Server events](https://developers.facebook.com/docs/marketing-api/conversions-api/parameters/server-event) are linked to a Meta Pixel ID and processed like browser pixel events. This means you can see the performance of your Facebook Ad campaigns and how users behave on your website once they land there through your ads. Conversion API gives businesses a full picture of the customer journey, including off-site purchase events, whether they continued their free trial and then converted, etc.
Because CAPI isn't affected by factors that can cause data gaps, like browser crashes, you don't need to worry about important data getting lost, which makes CAPI an extremely efficient and accurate tracking tool.
This is how the tracking process works in essence:
1. The customer enters your website from a Facebook Ad. Your website will be equipped with Facebook Pixel to document user data.
2. The server will save user data in the same way it will save Google Analytics Client ID and other parameters.
3. When the user triggers one of the conversion events, the server will make a request that contains information about the event and the relevant user data to the Facebook server.
## Why you should use Facebook CAPI on your WooCommerce store
So, why do you need to implement the Facebook Conversion API on your Meta Ad campaigns, especially if you already use the browser pixel? Let's look at the main benefits:
### Events are far less likely to get lost using Facebook CAPI
If you use Facebook CAPI alongside the Facebook browser pixel, your data will be more reliable because you are collecting data through both methods. CAPI tracks many of the same events as the browser pixel, but these events are recorded server-to-server. This is very handy if there are issues that prevent the Facebook browser pixel from working reliably, e.g. if the browser crashes. Facebook CAPI will close the gap and ensure that your data is accurately and consistently recorded.
### Have a plan in place for future cookie restrictions
While third-party cookies are not going to be phased out overnight, it's important to prepare for any restrictions that may happen in the future. By setting up Facebook CAPI now, you can reap the benefits now, and have a backup plan in place.
### Facebook CAPI will capture events that aren't recorded on your site
Not all server-side events happen on your website. Depending on the method you use to integrate CAPI into your WooCommerce store, the conversions API allows you to track events that the Facebook Pixel simply can't, including offline events like subscription renewals.
We should add that none of this means that browser-based pixel tracking is outdated. In fact, [it's actually recommended that you use Facebook CAPI alongside pixel tracking](https://developers.facebook.com/docs/marketing-api/conversions-api/set-up-conversions-api-as-a-platform). The Facebook Pixel tracks information that the CAPI can't, including demographic data.
When you combine both tracking methods, you get the full picture of the complete customer journey. Tracking will become more reliable because the CAPI and the Facebook Pixel will track several of the same events (such as Add Payment Info, Add to Cart, Page View, and Purchase). By having mirrored tracking of these events, you'll have more accurate data to work with.
## How do I set up Facebook CAPI on WooCommerce?
The best way to integrate Facebook CAPI with your WooCommerce store is to use a plugin, which will seamlessly connect your WooCommerce store with Facebook Ads Manager and which will be pre-configured to track important conversion events in your store. The best plugin for the job is [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-capi).

Pixel Manager for WooCommerce is not only the most accurate pixel tracking plugin available but one of the easiest to set up and use. You can connect your WooCommerce data to your Conversion Reports on various supported platforms, in addition to Meta Ads.
The pro version of the plugin lets you set up tracking for the Facebook CAPI, with a quick and easy process. Using CAPI, the plugin will track all of the same events as the Facebook browser pixel. It will also track subscription renewals as offline events.
If data privacy is of concern to you, you will be reassured knowing that Pixel Manager for WooCommerce makes it possible for you to get the most out of your data through CAPI while staying compliant with privacy laws. The plugin won't send a CAPI hit if a visitor is blocking the Meta pixel, but you can choose to Process Anonymous hits as an alternative. That way, you can still gain valuable insights through anonymized data.
## How to integrate Facebook CAPI with Pixel Manager for WooCommerce
Integrating with Facebook CAPI is very simple with Pixel Manager for WooCommerce. However, in order to use it, you will need the following:
- Meta Business Manager
- A Facebook Pixel with your website, correlated with the Business Manager
- An access token
We'll show you how to create your pixel in the guide below.
1. You will need the Pixel Manager for WooCommerce plugin, so [choose the plan that works best for your needs](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-capi#pricing-section). All pro plans will let you set up CAPI - it's just a matter of how many sites you need the plugin for.
Once you've downloaded the plugin, install it by uploading it to the WP plugins directory and activating it in the Plugins menu in the WordPress backend.

2. Create your Meta pixel by going to [Facebook Events Manager](https://facebook.com/events_manager2). Click the green + sign to connect data sources. Select _Web > Meta Pixel > Connect_. Add your pixel name and your website URL. Click Continue.
Before exiting, click on Settings and make sure that automatic event tracking is disabled. Having this enabled may mean that some events will get duplicated, which impacts data accuracy.


3. Go to your website's admin panel. Select _WooCommerce > Pixel Manager_ and choose Facebook (Meta). Enter the pixel ID you generated in the previous step. Save your changes.

4. Now, we can enable CAPI. You've already received your pixel ID and have a Business Manager account. All you still need to get started is your access token. There are a few ways of generating this token, but Facebook recommends using Events Manager.
Choose the Meta Pixel you'd like to implement, click on _Settings > Conversions API > Set Up_ and then Generate Access Token. Then, simply follow the steps in the pop-up to complete the setup process.
5. Next, go to _Overview > Manage Integrations > Manage_. Click the Manage button to create a Conversions API system user.

6. Head back to WordPress and paste the access token into the advanced section for Meta (Facebook). Hit Save, and your CAPI will become active immediately, using both the pixel and the CAPI.
**Pro Tip**: Using the Meta (Facebook) Conversion API (CAPI) will increase the load on your server. You may need to upgrade your server capacity if it reaches its limits.
## Set up Facebook CAPI in your WooCommerce store today
If you run Facebook Ads to generate leads to your WooCommerce store, then you will need to track how customers behave on your website once they land there. Many WooCommerce store owners get by with the Meta browser pixel, but for even more accurate and reliable data, you should use both the conversations API and browser pixel tracking.
This way, you'll be recording events twice - through the browser and through the server - which makes it much harder for events to get lost, so you'll have much more reliable conversion data to work with. You can also use CAPI to record offline events, like subscription renewals, which won't be recorded in the browser.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-capi) is the best tracking plugin for WooCommerce, as it offers an easy and accurate solution for Facebook CAPI tracking. All plans come with a 14-day money-back guarantee. [Pick your plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-capi#pricing-section) and get started today!
---
# How to Add The TikTok Pixel To Your WooCommerce Store
URL: https://sweetcode.com/blog/tiktok-pixel-woocommerce
Date: 2022-12-06
{`How to Add The TikTok Pixel To Your WooCommerce Store`}

## TLDR
- As of May 2022, WooCommerce businesses can connect their online store to TikTok. This allows them to sync their product catalog with TikTok and run ads on the platform. It's also possible to add the TikTok pixel to your website, which lets you track conversions from customers who land in your eCommerce shop from a TikTok Ad.
- TikTok released an official plugin in tandem with its WooCommerce integration, called [TikTok for WooCommerce](https://woocommerce.com/products/tiktok-for-woocommerce/), which does all of these things. It's fine for uploading your product catalog to TikTok, but it's very limited when it comes to pixel tracking.
- A better alternative would be [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce), which lets you add the TikTok pixel to your site as well as pixels from a multitude of other platforms. The plugin is pre-configured to track important events that happen in your store and can be set up for dynamic remarketing on TikTok Ads.

Do you want to know whether your [TikTok](http://tiktok.com) ads are resulting in conversions? You need to add the TikTok pixel to your [WooCommerce](http://woocommerce.com) store!
Most of us associate TikTok with silly dances and fun videos, but it's become a powerful and engaging marketing tool. Thanks to a new integration, WooCommerce store owners can finally run ads on TikTok, but spending money on ads is a risk if you have no way of analyzing how people behave after landing on your site through a TikTok Ad.
Are they actually converting to paying customers or bouncing right away? If they don't purchase anything or engage with your content, chances are your targeting is off, or your advert isn't resonating with your audience the way it should.
Adding the TikTok pixel to your [WordPress](https://wordpress.org/) website will help solve the issue and help you get the insights you need to optimize your ad spending. In this article, we'll show you how to add it to your WooCommerce site using the [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce) plugin.
## Why should you add the TikTok pixel to your WooCommerce site?
On May 25, 2022, [TikTok announced that it would finally integrate with WooCommerce](https://www.tiktok.com/business/en-US/blog/grow-your-business-with-the-new-woocommerce-tiktok-integration), enabling merchants to sync their product catalog to WooCommerce and run different types of ads, including [Collection Ads](https://ads.tiktok.com/help/article?aid=10001345), [Dynamic Showcase Ads](https://ads.tiktok.com/help/article?aid=10001002), [Lead Gen Ads](https://ads.tiktok.com/help/article?aid=10001624&q=lead%20generation), and [Spark Ads](https://ads.tiktok.com/help/article?aid=10001881&q=spark%20ads%20).
If you've ever tried your hand at digital marketing, you already know that running ads alone is not enough. You need to know how well your ads are performing and that's why adding the TikTok pixel to your WooCommerce site is so important. The TikTok pixel records events that happen on your site after a visitor lands there through an ad.
The insights this pixel generates can be extremely valuable. For example, if the TikTok pixel tracks a high rate of purchase conversions on a particular item, then you'll know that your ad for that item is performing well.
On the other hand, if you're getting a lot of traffic from a specific TikTok Ad, but the pixel isn't tracking purchase events, there could be a problem with your site that's getting in the way of your customer and preventing them from moving further along the customer journey.
TikTok for WooCommerce is the official WordPress plugin born out of the partnership between TikTok and WooCommerce. It allows you to sync your catalog and create TikTok Ads. It also lets you install the TikTok pixel on your site but its pixel-tracking functionality is fairly limited.
[TikTok for WooCommerce](https://woocommerce.com/products/tiktok-for-woocommerce/) only uses server-to-server tracking at the moment, which can be a problem on websites where most of the content is cached. The server will not detect any activity, which means you won't be able to collect any data about your customers. Plus, the official TikTok plugin ignores user cookie consent, which means that you risk breaching strict privacy laws if you use it on your site.

Considering how important and impactful pixel tracking is, we recommend using a more advanced plugin. [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce) is the best pixel-tracking plugin available, and in this next section, we'll show you why!
## Why Pixel Manager for WooCommerce is the best pixel tracker for TikTok
Pixel Manager for WooCommerce is a powerful pixel tracking plugin that makes it really easy for anyone to add the TikTok pixel to their WooCommerce site and track conversions from ads - even if you aren't tech-savvy.
The pixel sends data to the [TikTok Ads Manager](https://ads.tiktok.com/help/article?aid=10178), where you can find your conversion reports at any time. Pixel Manager for WooCommerce currently uses browser-based tracking, as well as server-to-server tracking via the [TikTok Events API](https://ads.tiktok.com/help/article?aid=10003669&redirected=1).
Pixel Manager for WooCommerce uses the TikTok pixel to track purchase events, purchase transaction ID, purchase currency, and all dynamic remarketing events, and utilizes event deduplication so that your data is consistently accurate. You can use Pixel Manager for WooCommerce to set up dynamic remarketing for TikTok Ads, which means you have the chance to target people who have visited your site and viewed specific products but left without making a purchase. This will keep your products top-of-mind and increase the likelihood that someone will come back to your store and make a purchase at a later stage.
All you need to do to prevent issues with dynamic marketing is to upload your product catalog to TikTok with post ID as the identifier.
Pixel Manager for WooCommerce is far more accurate than any other pixel tracker on the market, with accuracy as high as 100%. This means you will be able to form a reliable picture of how well your ads are performing at any given moment.
Unlike TikTok for WooCommerce, Pixel Manager for WooCommerce detects cookie consent and acts accordingly. You can set the plugin to Implicit Consent Mode (which tracks behavior until consent is denied) or Explicit Consent Mode (which doesn't track behavior until consent is explicitly given). You can choose to process anonymous hits using the plugin, which means that is a user denies consent the Pixel Manager will generate a random ttp ID, and send an anonymized Event API hit to TikTok.
You can also enable TikTok Advanced Matching, which means that the plugin will send additional visitor identifiers to TikTok such as their IP address and email. This makes it possible for TikTok to match the hit to an existing user profile. However, you should only enable this option if it aligns with your local regulation.
As TikTok Ads are relatively new for WooCommerce, it's likely you're running Ads using other platforms too. Pixel Manager for WooCommerce is a horizontal integration plugin that allows you to add pixels from various other platforms you might want to use. These include [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce), [Meta (Facebook) Pixel](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce), [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce), [Twitter Ads](https://ads.twitter.com/), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce), [Snapchat Ads](https://ads.snapchat.com/), and [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce).
## How to add the TikTok pixel to your store with Pixel Manager for WooCommerce
It may sound complicated, but adding a TikTok pixel to your WooCommerce store is surprisingly simple when you use Pixel Manager for WooCommerce.
1. Start by [purchasing the plugin](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce#pricing-section). Pricing is based on how many websites you have and need the plugin for, so if you only have one website, the Starter tier is perfect for you. You'll be able to download your plugin as a zip file.

Then, [upload and activate the plugin](https://sweetcode.com/docs/pmw/setup/plugin-installation/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce) in the WordPress backend as you would any other plugin.

2. Next, you'll need to create the TikTok pixel. Go to the TikTok Ads Manager. In the menu, click Assets and then _Event > Web Events > Manage > Set Up Web Events_. Click on TikTok Pixel as your connection method, and click the Next button.


3. Name your pixel. TikTok recommends that you give the pixel a name that corresponds to your website or domain name, with a maximum length of 128 characters (including spaces). Select Manually Install Pixel Code and click Next.

4. Select Developer Mode, then Create.
5. Copy the TikTok pixel ID and paste it into Pixel Manager for WooCommerce by going to _WooCommerce > Pixel Manager > Main Tab > More Pixels_. The plugin will now send events to the TikTok Ad Manager which you can easily track.


6. To set up Pixel Manager for WooCommerce with the TikTok Events API, you need to generate an access token. To do this, you'll need to go back to _Assets > Events_, and click Manage in the Web Events section. Once you find the pixel you want to use for reporting events, you can click on it to view its setting. You'll then click the Generate Access Token button.
Once you have the access token, paste it into the Pixel Manager by going to _WooCommerce > Pixel Manager > Advanced > TikTok_.
7. If you aren't sure whether or not your pixel is firing correctly, [install TikTok Pixel Helper](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce#pixel-helper), a Chrome extension that helps you verify and troubleshoot pixel installation. TikTok Pixel Helper will check for errors and provide implementation recommendations for your website to ensure tracking is accurate.
## Track your TikTok Ads conversions with Pixel Manager for WooCommerce
Using a pixel to track the conversions coming from your TikTok Ads is the best way to measure whether or not your TikTok Ads are delivering the way they should. You can easily calculate the return on investment of your marketing spend, A/B different messages to see which ones deliver the best conversion rates, and learn more about the behavior of your site visitors.
[Pixel manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce) is the best pixel tracking plugin for TikTok and a number of other ad platforms as well. It's easy and intuitive to use, so you can start tracking conversions in minutes.
[Pick your plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tiktok-pixel-woocommerce#pricing-section) and start reaping the benefit of more accurate and insightful TikTok Ad data today!
---
# How to Set Up Conversion Tracking with Google Analytics 4: Step-by-Step Guide (2022)
URL: https://sweetcode.com/blog/conversion-tracking-google-analytics
Date: 2022-11-17
Tags: woocommerce, conversion tracking, google analytics 4
{`How to Set Up Conversion Tracking with Google Analytics 4: Step-by-Step
Guide (2022)`}

## TLDR
- It's important to track conversions on your WooCommerce site. This is the best way to measure whether your visitors are taking the actions that you want them to.
- When it comes to tracking your organic users, it's time to make the switch to Google Analytics 4. This platform is much more powerful and flexible than Universal Analytics. It tracks events rather than goals, making it a better fit for conversion tracking.
- To make conversion tracking more accurate, you should add a GA4 tracking pixel to your site via the [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics) plugin.
E-commerce businesses expect their customers to take certain actions when they visit their websites. These are known as conversion actions and can be [any action that you've defined as being valuable to your business](https://support.google.com/google-ads/answer/6032150?ctx=glossary). If you run a WooCommerce site, the expected action is purchase conversion.
Conversion tracking is important because better conversion data collection means better-informed marketing strategies for your business. To start tracking conversions, you can use [Google Analytics 4](https://support.google.com/analytics/answer/10089681?hl=en) (GA4). This tool provides a more powerful way to get customer data than previous versions of Google Analytics. Universal Analytics is set to be totally phased out by Google in July 2023; therefore, it's important to start using GA4 in your business for conversion tracking.
In this article, you'll learn how to set up conversion tracking for your [WooCommerce](https://woocommerce.com/) site with GA4 and [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), a plugin that lets you add conversion tracking codes to your site and ensures the accuracy of your data.
The GA4 measurement model is based on parameters and events, while the Universal Analytics model is based on page views and sessions. This makes the GA4 platform more flexible and superior to its Universal Analytics counterpart. The GA4 platform supports website and mobile apps, allowing users to consolidate their data for websites and mobile applications in a single property.
Additionally, GA4 roll-up reporting is much more accurate. That's because it uses the same schema for tracking users' activities for both websites and mobile apps.
The GA4 platform also provides automatic tracking for specific types of events without the need for changing codes. What's more, GA4 has a built-in [enhanced measurement](https://support.google.com/analytics/answer/9216061?hl=en) feature, allowing automatic conversion tracking.
## What Conversion Events Can I Track in Google Analytics 4?
In Universal Analytics and other outdated versions of Google Analytics (GA), conversions are categorized as “goals.” So for conversion tracking, businesses would define goals related to visitor conversions based on factors such as:
- The number of pages viewed
- The duration a visitor spends on your website
- Events (such as a visitor playing video)
- A customer's destination (a customer landing page on a particular page would trigger the completion of a specific goal)
However, GA4 is different. It no longer treats key interactions as “goals” but as “events.” GA4 automatically tracks purchase events as conversions for websites. You can even mark up to 30 app and web events as conversions per analytics property, allowing greater flexibility and refinement in measuring your key user actions.
In GA4, you can track conversion events based on four categories:
1. Automatically collected events
2. Enhanced measurement events (automatically tracks events such as file download, scroll, outbound link click, video engagement, etc.)
3. Recommended events
4. Custom events
In GA4, you have much more flexibility to set up and track new conversion events, view conversion reports, and define event parameters to ensure your conversion data is specific to your needs.
The platform lets you get even more granular with your tracking and helps track micro and macro conversions along your [sales funnel](https://keap.com/product/sales-funnel). The new Google Analytics interface drills down on conversion metrics – to help you understand where customers are coming from and the path they're likely to follow on your website.
There are many events that Google recommends setting up tracking for. But the downside to manually setting up conversion events is that it can get tedious and time-consuming, especially if you're less experienced.
For this reason, we recommend using a conversion tracking pixel plugin to help you track the most important events for your WooCommerce store.
## How to integrate Google Analytics 4 with WooCommerce
Now that we've discussed why you should track conversion events in Google Analytics 4, let's talk about what you need to get started. The reality is that you won't get the most accurate or comprehensive data if you just add your site as a property in GA4.
The best way to optimize conversion tracking on your WooCommerce store is to use a tracking plugin. In essence, having a conversion tracking plugin helps you analyze the performance and measure the growth of your WooCommerce site more effectively. It's also a great way of retargeting your lost visitors and identifying the scope for improvement.
Here are the top three reasons you need a conversion tracking plugin for your online store:
- **You don't need to set up conversion events manually**. You'll just need to add your property ID to the conversion tracking plugin's backend, which will track specific events for you. Online marketers less experienced with GA4 will find this handy.
- **Tracking pixels helps keep the data complete and accurate**. Although GA4 won't be able to track every event in your WooCommerce store, it has different ways to fill in data gaps, such as using modeling to attribute conversions to specific sources.
If you have a tracking pixel plugin, you can record as many conversion events as you like.
- **A plugin connects your WooCommerce store's data to your GA4 conversion reports**. This means the data you access in GA4 is much more complete and accurate.
## Introducing the Pixel Manager for WooCommerce Plugin

The [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics) plugin was built to integrate with WooCommerce and helps you track the behavior and conversions of your shop visitors.
Pixel Manager for WooCommerce is a horizontal integration plugin. Therefore, you can set up conversion tracking for various different platforms, including [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), [GA4 and Universal Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), [Meta Ads](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), [Twitter Ads](https://ads.twitter.com/), [Snapchat Ads](https://forbusiness.snapchat.com/), [TikTok Ads](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics), and [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics).
You have many options to integrate conversion tracking with other platforms to get specific data from their platforms. For example, you may want to run Google Ads, and by integrating Pixel Manager for WooCommerce with your Google Ads account, you can learn how users behave on your site after they interact with your Ads.
Here's why Pixel Manager for WooCommerce is the best conversion tracking plugin available for WooCommerce:
- **Easy to set up**. Install and add the relevant property IDs in the backend. The plugin provides lots of hooks to finetune the output giving you more customizability. That said, the plugin mainly focuses on important conversion-tracking events in WooCommerce, which is ideal for most users.
- **Most accurate pixel-tracking plugin on the market**. With the use of additional cookies, your conversion tracking can be as precise as 96%. The Pixel Manager plugin closes the data gaps, making it easier for your business.
Data gaps happen when you fail to track all conversions. For instance, your online store is missing up to 20% of the conversions or the conversions are inflated by up to 20%, which provides inaccurate data. To avoid such scenarios, it's important to use an accurate tracking plugin like Pixel Manager for WooCommerce.
- **You can track major conversion events**. The plugin tracks all e-commerce events and implements advanced pixel features, especially those recorded in GA4, such as purchase events and customers' total shopping cart values. With this information, you can determine areas that need improvement.
- **Tracks the success rate of different payment methods in your online store**. If you accept different types of payments in your store, you need to know the performance of each. For instance, you may discover that 80% of PayPal payments are successful in your store, which will give you some context about why some purchase conversion actions are failing.
Using the Pixel Manager plugin and Google Analytics 4, you can optimize conversion tracking in several ways, including (but not limited to):
- **Setting up an Enhanced E-Commerce Funnel**. Setting up enhanced e-commerce funnels for Google Analytics helps you track each step of the funnel accurately, including all four stages of the customer journey: Awareness (checkout started), Consideration (billing email added), Decision (payment provider chosen), and Loyalty (order placed).
- **Setting up a GA4 API Secret to track server-to-server conversion events** that don't happen immediately, such as refunds and subscription events. Setting up the API Secret makes conversion tracking practically 100% accurate.
## How to Set Up GA4 Conversion Tracking With Pixel Manager for WooCommerce
With the Pixel Manager for WooCommerce plugin, WooCommerce store owners can quickly start conversion tracking using GA4. This step-by-step guide walks you through how to set up GA4 conversion tracking using the Pixel Manager plugin.
### Step 1: Connect your site to Google Analytics 4
For this step, let's look at the difference between [creating a new GA property](https://support.google.com/analytics/answer/9304153) and [adding a site to GA4 if it's already a Universal Analytics property](https://support.google.com/analytics/answer/9744165?hl=en).
**Create a new Google Analytics 4 property**
To create a new Google Analytics account, follow these steps:
1. Sign in to [Google Analytics](https://analytics.google.com/).
2. At the bottom left of the page, click **“Admin**.” Then click the blue “**Create Account**” button in the Account column.

3. Click **“Next”** to add the first property to your GA account.
4. Next step is to create a GA property. In the Property column, click **“Create Property”**.

5. Enter the name of your property (for example, “my business website”).
6. Click **“Next”** and choose a category for your industry and business size.
7. Click **“Create”** and accept GA's Terms of Service.
**Add a site to GA4 if it is already a Universal Analytics property**
If your site is already connected to Universal Analytics and you want to set it up as a Google Analytics 4 property, these are the steps you need to follow. Please note that if your site pages have a GA tag or a Google Tag Manager container, the following steps are the same.
1. In the [Google Analytics](https://analytics.google.com/) page (lower left), click **“Admin”**.
2. Select your desired account in the Account column (but if you already have a Google Analytics account, it's already selected).
3. In the Property column, select the Universal Analytics property. Then click **“GA4 Setup Assistant”** (It's the first option in the Property column).
4. Then, under “I want to create a new Google Analytics 4 property,” click **“Get started”**.
5. Click **“Create Property”** to create your new GA4 property.

### Step 2: Install and setup Pixel Manager for WooCommerce
Follow these steps to install the Pixel Manager plugin on your site:
1. [Purchase the Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics#pricing-section) plugin. There are five plans to choose from, depending on how many sites you want to track conversions on.
2. Upload the Pixel Manager plugin into your plugins directory (/wp-content/plugins).
3. Go to WordPress's “Plugins” menu to activate the Pixel Manager plugin.
### Step 3: Add the Google Analytics 4 measurement ID into the plugin
After you set up your website as a GA4 property and install Pixel Manager for WooCommerce, the next step is to retrieve your property measurement ID from Google Analytics 4. Here's how to find it:
1. Go to your **Admin** dashboard in Google Analytics and select **Data Streams**. Click on your property when it appears in the tab.

2. Your Measurement ID will be located in the top right corner of the page.

3. Open your WP Dashboard and open the Pixel Manager. In the Main tab, you'll find the GA4 field. Enter the Measurement ID there and save your changes.

By completing this step, the GA4 pixel will be added to your WooCommerce site, and the plugin will start tracking your conversions.
### Step 4: Set up the GA4 API Secret
Setting up the GA4 API secret will automatically enable the measurement protocol for GA4. Since the GA4 measurement protocol is still in beta, it works well but may have a few glitches.
Here's how to set up the GA4 API secret:
Step 1: Open the GA4 property admin interface.
Step 2: On the admin page, open the website data stream.

Step 3: Navigate to “**Additional settings**” to open the API secret setup menu.

Alt text: Open the API secret setup menu
Step 4: Start creating a new API secret.

Step 5: Enter a new API secret name in the text field and click **“Create”**.

Step 6: Copy the new API secret

Step 7: Under the Advanced column, select **“Google”** to find the API secret setting. Then paste the new API secret into the plugin and save the changes.

## Start Tracking Conversions for Your WooCommerce Store With Google Analytics 4
Every day, visitors engage with your WooCommerce website. To better understand where your visitors are coming from and how they behave, you need to track the conversions that occur on your site.
Google Analytics 4 is the obvious platform to use to analyze your website traffic as it gives you more flexibility to set up conversion events than Universal Analytics.
To get even more accurate and consistent data in your conversion reports, you should add a GA4 tracking pixel to your site with the [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics#pricing-section) plugin. [Choose your plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-google-analytics#pricing-section) today and benefit from a 14-day free trial.
---
# News November 2022 (#9)
URL: https://sweetcode.com/blog/newsletter-9
Date: 2022-11-07
Tags: pixel manager, development update, newsletter

## TLDR
- The Pixel Manager is ready for the new HPOS (High Performance Order Storage).
- Google Ads Conversion Adjustments for even higher tracking accuracy.
- You want to optimize for profit margin. You got it.
- Order source data-driven attribution with GA4.
## News November 2022
We've been very busy tweaking and adding new features to the Pixel Manager. Let's dive into what we've been up to.
### HPOS (High Performance Order Storage)
WooCommerce announced the new HPOS (High Performance Order Storage) in [January 2022](https://developer.woocommerce.com/2022/01/17/the-plan-for-the-woocommerce-custom-order-table/). The new HPOS is a new database structure that will be used to store orders. Looking at their current [timeline](https://developer.woocommerce.com/2022/09/14/high-performance-order-storage-progress-report/), the new HPOS will be available in WooCommerce 7.1, which is scheduled for release in November 2022. By August 2023, the new HPOS will be the default order storage mechanism in WooCommerce.
In order for the users of the Pixel Manager to be confident in being able to try out the new HPOS and to be able to use the Pixel Manager with it, we've been working on making the Pixel Manager compatible with the new HPOS. We're happy to announce that we've completed this task and **the Pixel Manager is ready for the new HPOS**.
### Google Ads Conversion Adjustments
Google Ads Conversion Adjustments have been available for more than a year, but have stayed under the radar for most of the time. Like many Google Ads features that feature arrived without much fanfare. But it's a very powerful feature that can help you to improve your tracking accuracy even more.
In one of our last sprints we added support for Google Ads Conversion Adjustments to the Pixel Manager. This means that you can now enable the feature in the Pixel Manager and use it to improve your tracking accuracy. Please read more about Google Ads Conversion Adjustments in [Googles official support article](https://support.google.com/google-ads/answer/7686447) and follow [this guide](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads#conversion-adjustments) to learn more about how to enable it in the Pixel Manager.
### Profit Margin Reporting
We all know, optimizing campaigns for conversions is great. We also know, optimizing campaigns for conversion value is even better. But what if you want to optimize for profit margin? You can do that now out of the box with the Pixel Manager.
While it was possible to do that until recently using a [custom conversion value filter](https://sweetcode.com/docs/pmw/developers/php-filters#marketing-conversion-value-filter), profit margin output is now [available as a setting in the user interface](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings#profit-margin).
It will make it much easier for you to jump to this even more powerful type of campaign optimization.
### Order Source Data-Driven Attribution
You asked for it. We delivered.
Order source data-driven attribution reporting is now available (version 1.26.0) in the Pixel Manager.
There were numerous approaches to creating a working solution for this. Although we are not the first ones to ship this feature, creating it has been a long time on our minds. There is a reason why we waited so long. We are perfectionists and we wanted to make sure that we deliver a solution that is not only working, but brings significant value to our users and is future-proof.
You see, other implementations use various types of cookie-based attributions. None of them take into account if an order came in through a source on the first click, or the last click from a specific source. And none of those implementations take into account how much value each source brought into a specific order if not only one, but several sources contributed to an order.
And here's exactly how our solution is different. We integrated the new GA4 Data API into the Pixel Manager and use it to get the order source attribution data from GA4 directly. This way we don't have to reinvent the wheel to get the order source attribution data. And at the same time, we get the best in class data-driven attribution available out there.

The only downside is, that GA4 typically takes 24 hours to update the order source attribution data after an order is created. But, that's a small price to pay for getting accurate order source attribution data.
To set up the GA4 Data API link, please follow this [support article on sweetcode.com](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#ga4-data-api)
### Numerous Smaller Improvements
- It can happen that Facebook receives traffic from sources like `gtm-msr.appspot.com`. Different reasons on why this is happening are floating around the Internet. But what everyone who's Googling for it has in common is that they want to exclude this traffic from their Facebook campaigns. We've added a new filter to the Pixel Manager that automatically removes `gtm-msr.appspot.com`. Even more, we implemented a new filter that allows you to remove any traffic source from Facebook you want. You can find the new filter in the [Pixel Manager documentation](https://sweetcode.com/docs/pmw/developers/php-filters#add-facebook-tracking-exclusion-patterns).
- A subset of themes and customizations don't follow WooCommerce standards to load and display products on the shop pages. In such cases, the Pixel Manager dynamically loads product data in the background in order to increase tracking accuracy. But until now, loading of that additional data happened on each visit of each visitor, in some cases stressing server resources too much. We have now added a new feature that automatically caches those requests and outputs the product data into the page source. This has two advantages. It relieves the server from the additional load and it makes the additional product data cacheable for server-side caching solutions.
This is available in the free and pro versions of the Pixel Manager and is enabled by default.
- We added support for more Consent Management Platforms (CMPs).
- Usercentrics
- CookiePro by OneTrust
- WP AutoTerms
- We improved the detection of nonstandard purchase confirmation pages.
- And we implemented a new [Scroll Tracker for Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/general-settings#scroll-tracker).
---
# How to Set Up Conversion Tracking on WooCommerce: Complete 2022 Guide
URL: https://sweetcode.com/blog/woocommerce-conversions
Date: 2022-11-07
Tags: woocommerce, ga4
{`How to Set Up Conversion Tracking on WooCommerce: Complete 2022 Guide`}

## TLDR
- Conversion tracking can help you get a much more granular overview of the customer journey, such as tracking abandoned carts, rate of successful checkouts, and conversion rates.
- You can track conversions from Ads and organic traffic.
- The [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions) conversion tracking plugin is the most advanced plugin for your WooCommerce store.
Once you set up your WooCommerce site, you need to know how your visitors are behaving. Conversion tracking will let you measure whether your visitors have been effectively converted to customers. It can identify whether you're losing visitors at any point in the customer journey and help you figure out how you can optimize your site to improve your conversion rate.
A conversion is what we call any event that you consider to be valuable to your site. For most [WooCommerce](https://woocommerce.com/) stores, conversion events would be related to purchasing products, adding items to the cart, or any other item taken along the conversion funnel. However, we can include other relevant events here, such as email subscriptions.
This article looks at why you need to set up conversion tracking for your WooCommerce store, the benefits of conversion tracking, how to set it up for your WooCommerce store and how to implement it using [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions).
## Why Is Conversion Tracking Important for WooCommerce?
WooCommerce users can get some decent insight into their sales with [WooCommerce Analytics](https://woocommerce.com/document/woocommerce-analytics/), such as gross and net sales, number of items sold, average order value, etc. You can even see your top customers and their total expenditure.
While this data is useful, it's fairly limited. By implementing conversion tracking on your site and can get a much more granular overview of the customer journey. Here are some of the insights you can get through conversion tracking:
- **Tracking eCommerce shopping behaviors**: Conversion tracking will help you monitor the behaviors of all your users. For instance, if you run [Google Ads](https://ads.google.com/) and [Meta Ads](https://www.facebook.com/business/tools/ads-manager/), you can track which platform is generating the most ROI and use the information to improve your marketing ad campaigns and optimize your website for better conversion rates.
- **Cart item tracking**: You can see your rate of cart abandonment, and which items customers add to or remove from a cart before checkout. This information is important for your eCommerce store because you can use it to develop new marketing strategies like offering coupons, discounts, and email marketing.
- **Rate of successful checkouts**: Analyzing your checkout rate is vital as a business owner. You should be able to segment this data for each payment provider. If, for example, you see that many of your [iDeal](https://www.ideal.nl/en/) payments fail, then perhaps there's a technical issue you need to address on your site.
This level of detail is incredibly important because you can use this information to improve your marketing campaigns and optimize your website for better conversions.
For example, if you spend $500 on a Meta ad and it only generates a return of $300, then you need to decide whether to optimize that campaign or shift your focus elsewhere.
Similarly, if you find that most of your customers are adding items to their cart but abandoning it before completing the purchase, you might need to work on improving the checkout process.
## What do you need to track conversions in WooCommerce?
Setting up conversion tracking in WooCommerce is easy and can be completed in a few steps.
First, you'll need to analyze your needs and decide on the data you want to capture. There are two main categories of data collection;
- **Conversions coming from organic traffic**: This will require you to connect your store/site to Google Analytics.
- **Conversions coming from Ads**: Whether you use Google Ads, Meta Ads, [Twitter Ads](https://ads.twitter.com/), or any other Ad platform for your store, you'll need to integrate your site with each of them.
This means that you'll need an account for any platform you want to integrate with. For e.g., if you don't have a [Google Analytics](https://analytics.google.com/analytics/web/) account yet, you'll need to create one.
To set up conversion tracking with any specific platform, you'll need to add a pixel to your site. A pixel is a piece of code that lives in your browser and/or server - this is what makes it possible to record conversion purchase events. You will need a different one for every platform you integrate with.
It's simple to add pixels to your WooCommerce site, and we're going to show you how to do this using the [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions) plugin.
## Why Pixel Manager for WooCommerce is the best conversion tracking plugin
Although there are various pixel-tracking plugins available on the market, Pixel Manager for WooCommerce is the most advanced plugin available. It is really easy to set up and use, and it's designed to give you the most accurate conversion tracking possible.
Pixel Manager for WooCommerce plugin lets you set up conversion tracking for various platforms, which gives you plenty of options as a marketer. You can do this for [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-wooCommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions), [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for=woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions), [Meta (Facebook) Ads](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions), [Twitter Ads](https://ads.twitter.com/), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions), [Snapchat Ads](https://ads.snapchat.com/), and [TikTok Ads](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions).
Your WooCommerce data is linked directly to the conversion reports of any platform you integrate with.
Many of the plugin's features are implemented across every pixel, such as:
- Purchase Currency
- Advanced order deduplication. This helps avoid duplicated user orders during report generation. Only the actual or original orders are tracked.
- Purchase transaction ID
- Custom conversions with shortcodes
- Marking events of lazy loaded products for further action
- Total order calculations
- Ignoring orders where payments failed
There are also [features specific to each platform](https://sweetcode.com/docs/pmw/features/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions) that Pixel Manager for WooCommerce integrates with. These are a few major examples:
- You can turn on Enhanced E-Commerce and cart tracking for Google Analytics.
- Set up [dynamic remarketing](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions#dynamic-remarketing) for Meta Ads and Google Ads.
- Track server events for Meta using CAPI
- Add multiple conversion pixels and cart item tracking for Google Ads.
[The plugin is compatible with all on-site payment gateways](https://sweetcode.com/docs/pmw/setup/requirements?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions#payment-gateways). For optimal tracking, SweetCode recommends against using off-site payment gateways. Off-site payment gateways can cause problems and impair conversion tracking. They usually redirect the visitor away from the shop domain to another domain belonging to the payment provider. They also try to redirect the user to the WooCommerce store once the payment has been made.
Here are some of the main reasons why off-site payments affect conversion tracking;
- **It needs to be configured properly**: When you use an off-site payment gateway, it has to be configured first to redirect the user to the WooCommerce purchase confirmation page after the payment goes through. When the redirect fails to work, it's not possible to track conversions. Conversion pixels are only fired from the WooCommerce purchase confirmation page.
- **Customer behavior**: Buyers may even stop automatic redirects to the eCommerce platform purchase confirmation page once they see that the purchase has been confirmed by the payment provider.
- **It affects eCommerce tracking**: Some off-site payment gateways will not automatically redirect the customer back to the purchase confirmation page until the buyer clicks on a button. Many buyers don't click that button.
The Pixel Manager plugin also offers various ways of dealing with visitor consent. By default, it's set to Implicit Consent Mode - it tracks cookies until permission is denied. However, you can change this to Explicit Consent Mode, which doesn't track cookies until consent is given.
Additionally, it integrates with many Consent Management Platforms such as and [Complianz](https://www.complianz.io/). You can find the full list on the [supported consent management platforms](https://sweetcode.com/docs/pmw/consent-management/platforms/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions) page. The plugin also offers a [public API for developers who use custom-made cookie banners](https://sweetcode.com/docs/pmw/consent-management/api/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions).
Pixel Manager for WooCommerce is quite simple to set up - you just need to add pixels to the backend to start tracking. There is plenty of [documentation to help developers fine-tune the output if they want to](https://sweetcode.com/docs/pmw/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions), but everyone else can get started quickly.
## How to set up conversion tracking using Pixel Manager for WooCommerce
It is easy to install and use Pixel Manager for WooCommerce plugin on your eCommerce site. This step-by-step guide walks you through how to integrate the plugin with Google Analytics to track organic traffic and Google Ads (as an example of a popular Ad platform you might want to track conversions from).
### Installing and activating the plugin
1. Choose the [Pixel manager for WooCommerce plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions#pricing-section) that works for your business needs. There are five pricing plans that range from 1 site to 25 sites. You can try the plugin with a 14-day free trial.
2. Go to WordPress > Plugins > Add New, and upload the plugin's zip file.
3. Activate Pixel Manager for WooCommerce in the WordPress plugins menu.
### Setting up conversion tracking for a new Google Analytics property
If you have created a new Google Analytics account, follow these four steps.
**Step 1**: Open your Google Analytics and head over to the Admin settings. Click create property to add a new property.

**Step 2**: Under the property section set up, enter your property name, your preferred reporting time zone, and currency. You can always come back and change these settings later.
Next, show advanced settings. In this section, you can opt to create both a GA4 and Universal Analytics property, but since Universal Analytics will be phased out in July 2023, Google recommends only creating a GA4 property.
In the advanced settings, you can also enable enhanced measurement for Google Analytics 4.

**Step 3**: In the “About your business” fill in details about your WooCommerce store to help Google Analytics tailor your experience. These details include the industry category you're in, the size of your business, and how you intend to use Google Analytics. Once you're done, click create.

**Step 4**: You'll then be prompted to create a web data stream. Enter your Website URL, and enter the Stream name. When you're done, click Create Stream.

**Step 5**: Open the web stream details and copy the Measurement ID located in the top left corner of the screen.

**Step 6**: Go to your WordPress dashboard and open Pixel Manager for WooCommerce. Find the GA4 field under the **Main** tab and paste the Measurement ID. Save your settings.

### Setting up conversion tracking for an existing Universal Analytics property
If you already have an existing Google Universal Analytics property, here's what you need to do:
**Step 1**: Click Admin settings in Google Analytics and choose your Google Universal Property from the drop-down menu under the property column. Then, open your property settings.

**Step 2**: You'll find the Tracking ID in your property settings. Copy it as you'll need to add this to Pixel Manager for WooCommerce.

**Step 3**: Open Pixel Manager for WooCommerce in the plugin backend, and paste the Tracking ID in the Google Analytics UA field under the Main tab. Save your changes.

### Setting up conversion tracking for Google Ads account
For this, you'll need the Google Ads conversion ID and purchase conversion label. Here's how to find them.
**Step 1**: If you haven't yet, you'll need to create a new conversion in Google Ads. We recommend following our guide on [how to set up conversion tracking for Google Ads](https://sweetcode.com/blog/woocommerce-google-ads-conversion-tracking), but the basic idea is that you need to go to the **Tools and Settings** menu under **Measurements**, click 'New Conversion Action', and follow the setup instructions.
**Step 2**: Then, go to the **Google Tag Manager** tab. This is where you'll find the conversion ID and purchase conversion label.

**Step 3**: Go back to your WordPress dashboard, and open Pixel Manager for WooCommerce. Under the Main tab, you'll find the fields for Google Ads Conversion ID and Google Ads Purchase Conversion Label. Paste the tracking codes into the right fields and save your changes.

## Set up conversion tracking on your site with Pixel Manager for WooCommerce
Setting up conversion tracking allows you to understand the specific behaviors of your site visitors. You can see how many visitors are finding your site organically, and which Ad platforms are generating the most ROI for you. You can also track your carts and the rates of successful checkouts to help you develop retargeting strategies.
The best way to track conversions for your WooCommerce store is by using a plugin. The [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions) is a great plugin to use - it's the most accurate plugin available for WooCommerce and integrates with all major analytics and Ad platforms.
[Get started with Pixel Manager for WooCommerce today](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-conversions#pricing-section). Every plan is available as a 14-day free trial, so try it out and see just how much the plugin improves your conversion tracking.
---
# How to Set Up WooCommerce Customer Tracking in Google Analytics 4
URL: https://sweetcode.com/blog/woocommerce-ga4
Date: 2022-11-07
Tags: woocommerce, ga4
{`How to Set Up WooCommerce Customer Tracking in Google Analytics 4`}

## TLDR
- Google Analytics 4, the latest version of Google Analytics, is more advanced than its predecessor, Universal Analytics, which will be phased out in 2023.
- GA4 has more advanced and precise customer tracking features that comply with evolving privacy laws.
- This post will explain how to set up WooCommerce customer tracking in Google Analytics 4 using [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4).
Google Analytics (GA4), launched in 2020, is the latest version of Google Analytics. It is more advanced and compliant than Universal Analytics, which will be phased out in 2023.
If you want better data from [GA4](https://support.google.com/analytics/answer/10089681?hl=en), you should add a Google Analytics tracking pixel to your [WooCommerce](https://woocommerce.com/) store. Tracking pixels are tiny snippets of tracking code that allow you to observe the behavior of your target audience. They're essential for measuring a wide range of engagement metrics and tracking conversions.
Adding a tracking pixel lets you connect your WooCommerce data to Google Analytics' conversion reports. This gives you a bigger picture of who your customers are, what they're interested in, and how they're interacting with your site.
This article looks at how Google Analytics 4 can improve your WooCommerce store. You will also learn how to integrate GA4 with your WooCommerce store using [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4).
## Why You Should Switch From Universal Analytics to Google Analytics 4 for Customer Tracking
You probably use Google Analytics for eCommerce tracking if you have an existing online WooCommerce store.
The new Google Analytics 4 tool is an improved version of the existing Universal Analytics tool but with many new features. But why should current Universal Analytics users switch to GA4?
### Universal Analytics is being phased out
Google has announced that if you're using Universal Analytics, you'll have to [switch to GA4 by July 1, 2023](https://support.google.com/analytics/answer/10089681?hl=en), because the tool will stop collecting data.
Although you'll still be able to see your Universal Analytics data for a period of time after the deadline, it's still advisable to make the switch sooner rather than later. This will allow you to get ahead of the curve and adapt to the new system before the deadline.
### Advanced tracking
Google Analytics 4 introduces [cross-device user journeys](https://support.google.com/analytics/answer/9355653?hl=en). The tool now creates life cycle reports based on event tracking instead of session-based data. This means that it will track web and app data across different devices to create a bigger picture of the customer journey.
With cross-device reporting capabilities, GA4 will help you understand how your customers are interacting with your website, whether they're browsing on a mobile device, computer, or tablet.
In addition, GA4 includes [cross-domain tracking](https://support.google.com/analytics/answer/10071811?hl=en). If your online business has multiple domains, GA4 will transfer first-party cookies between them, allowing you to track users moving from one domain to another.
GA4 can track users when they leave your website as long as they go to another domain owned by your business. This provides your WooCommerce with a clearer customer journey and more accurate data about customers without violating their privacy. Therefore, this helps in strategy building for businesses with multiple domains.
GA4 also introduces [AI predictions](https://support.google.com/analytics/answer/9846734?hl=en). This simply means that it looks at a dataset to predict the future behavior of your users. With this information, the predictive metrics can determine the likelihood of churn, purchase, and even intricate details such as the potential revenue a specific customer can bring to your business.
This makes your planning much easier by showing you how different groups of potential customers will respond to your products and services and what to focus on. Google Analytics 4 will be a helpful tool for identifying where to invest your online store's time and resources for maximum returns.
### Higher accuracy tracking
Google Analytics 4 includes privacy controls such as cookieless measurement and behavioral and conversion modeling. These controls give you a way to estimate conversions without identifying users who don't want to be tracked, so you'll remain compliant with privacy laws such as the [California Consumer Privacy Act](https://oag.ca.gov/privacy/ccpa) and [GDPR](https://gdpr-info.eu/).
For example, [conversion modeling](https://support.google.com/analytics/answer/10710245?hl=en), which is different from attribution modeling, fills the gaps created by cookie-less tracking and cross-device behavior.
Conversion modeling works by analyzing the group of customers who generated high-quality conversion data to identify trends and similarities between key data points and then using the group's behavior to fill gaps in the larger population.
Typically, Google receives high-quality conversion data from users who:
- Have consented to analytics and ad storage;
- Are using the Chrome browser;
- Have logged into their Google account with ad personalization enabled.
If you're planning to track customer data using a pixel, it's better to use GA4 rather than Universal Analytics. This is because, unlike standard tracking, GA4 has conversion modeling, which uses machine learning to fill measurement gaps. This means that you'll have more complete conversion reports to work with.
For instance, without conversion modeling, you'd have to rely on observable data. With conversion modeling, however, Google can predict attributed conversions, such as whether an interaction led to a conversion.
### Fine-tune Events in the GA4 UI
One of the most exciting features of GA4 is a more customizable interface. This means you can fine-tune the time range of your data reports. It also means you can get all your data at a glance rather than fiddling with the tool's interface. With Google's previous analytic tool, you had to change the analytics code to achieve this.
You can even try integrating with the [Google Analytics Measurement Protocol for GA4](https://developers.google.com/analytics/devguides/collection/protocol/ga4), which lets you track server-to-server events and bypasses inaccuracies that could result from browser tracking.
## How to Setup WooCommerce Customer Tracking With Google Analytics 4
Now that you know why GA4 is the best analytics tool you can use for customer tracking, let's show you what you need to integrate it with your WooCommerce store.
The first thing you'll need to do is create an Analytics account (if you don't have one already), and add your website as a property in GA4. This way, GA4 can start tracking customer behavior in your store, and you'll be able to access data reports in the tool directly.
We'll show you how to add your WooCommerce site as a GA4 property later.
You'll also need a plugin to add a tracking pixel from GA4 to your WooCommerce store. Installing the pixel to your site ensures that events are recorded more accurately and consistently, which increases the quality of your data reports in GA4.
While this tracking code can be added manually via HTML, a plugin is typically configured to track important events that occur on your site, which makes it easier for WooCommerce store owners to track customer behavior.
## Why Pixel Manager for WooCommerce Is the Best Conversion Tracking Plugin
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4) is the best and most accurate customer tracking plugin available for WooCommerce users. The plugin is used to track your customer events after they arrive on your website from Google or an online ad.
The plugin integrates with both Universal Analytics and GA4, as well as many other platforms, including [Meta Ads](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4), [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4), [Twitter Ads](https://business.twitter.com/en/help/campaign-measurement-and-analytics/conversion-tracking-for-websites.html), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4), [Snapchat Ads](https://forbusiness.snapchat.com/blog/the-snap-pixel-how-it-works-and-how-to-install-it), and [TikTok Ads](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4).
It also has more [GA4-specific integrations](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4) you can use to ensure your data is as detailed and precise as possible. These include Enhanced Link Attribution and Google User ID.
You can also activate the GA4 API Secret to send purchases and refunds as server-to-server events through the measurement protocol.
Pixel Manager for WooCommerce is highly regarded in the eCommerce industry and is even [recommended by Google Account managers](https://wordpress.org/support/topic/couldnt-be-simpler-thanks/):
“Couldn't be simpler – thanks! Was recommended to use this by my Google account manager who was helping me set up GA4.”
- Wilhas on wp.org.
## How to Up GA4 Customer Tracking Using Pixel Manager for WooCommerce
Setting up GA4 customer tracking using Pixel Manager for WooCommerce is quite straightforward. Here is a step-by-step guide on how to go about it:
### Step 1: Create a new property in GA4
1. Log in to your Analytics account, and go to the **Admin** tab
2. Select **Create Property**

3. Under 'Create a Google Analytics 4 property to measure your web and/or app data', enter your property name. Enter the reporting timezone and currency.
4. Click **Next** and enter helpful information about your business and how you intend to use GA4.
5. Click **Create**

6. Set up a web data stream by choosing **Website** as your platform. Enter your site's URL and give your data stream a name.
### Step 2: Set up Pixel Manager for WooCommerce
To install Pixel Manager for WooCommerce, you need to follow these steps:
1. Choose the [Pixel Manager for WooCommerce plan](https://sweetcode.com/plugins/pmw#pricing-section) that you need. You can try it free for 14 days before purchasing.
2. Upload the plugin into your plugins directory “/wp-content/plugins/.”
3. Activate it through the “Plugins” menu in WordPress.
### Step 3: Connect your GA4 property with the plugin
Open the admin interface of your Google Analytics account and select the Google Analytics 4 property.
1. Select your GA4 property, then open data streams.

2. Click on the existing data stream to open it.

3. Copy the Measurement ID which you'll find in the top right corner of the screen.

4. Go to your WooCommerce site, open the Pixel Manager tab, and copy the Measurement ID under the 'Main tab' of the plugin. Save your changes

### Step 4: Set up the GA4 API secret
Setting up the API secret will enable the measurement protocol for Google Analytics 4. However, it's important to note that the measurement protocol is still in beta. Therefore, while it works quite well, it might have a few quirks in some instances.
1. Open the admin interface for the GA4 property.

2. Open the website data stream.

3. Click on “measurement protocol API secrets.”

4. Click “Create.”

5. Set the name for the new API secret, and click “create.”

6. Copy the new API secret.

7. Go to the WP Dashboard, open the Pixel Manager for WooCommerce plugin, go to the Advanced tab, paste the new API secret under “GA4 API secret” and save the settings.

## Set Up GA4 Customer Tracking in Your WooCommerce Store Today
In this article, we've seen how GA4 is a great option if you want to improve the way you track customer behavior in your WooCommerce store. It has more advanced tracking features than Universal Analytics. GA4 provides a bigger picture of the customer journey, and even incorporates AI models to fill in measurement gaps.
When you use a pixel to connect to your WooCommerce store's data, your GA4's conversion reports will be more precise and comprehensive. If you are looking for a plugin to connect to your online store with GA4, [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4) is the best option because It's accurate, easy to set up, and has lots of tracking features that are compatible with GA4.
[Get started with Pixel Manager for WooCommerce today](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ga4#pricing-section) and benefit from a 30-day money-back guarantee!
---
# Setting up Conversion Tracking on your Website for Facebook Ads: Complete Guide (2022)
URL: https://sweetcode.com/blog/facebook-conversion-tracking
Date: 2022-11-05
Tags: woocommerce, facebook pixel
{`Setting up Conversion Tracking on your Website for Facebook Ads: Complete
Guide (2022)`}

## TLDR
- Conversion tracking is the process of measuring specific actions done by visitors on your website.
- Conversion tracking can help you analyze Ad performance and your conversion funnel and set custom audiences.
- To set up Facebook Ad conversion tracking, you need an accurate, easy-to-set-up plugin like [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking).
- To set up Facebook Ads conversion tracking with Pixel Manager for Woocommerce, you need to install and activate the plugin and add the Meta pixel. You'll also need to set up CAPI and dynamic remarketing to get detailed information you can use in your marketing campaign.
If you sell products on your website, you could be one of the many businesses running Facebook Ads to get people on your site. Recent data shows that [Facebook is still the most popular social media platform for running Ads](https://www.statista.com/statistics/259379/social-media-platforms-used-by-marketers-worldwide/). Facebook Ads offer you a variety of formats (images, video, carousels) that you can use to promote your products and services.
[Facebook Ads Manager](https://www.facebook.com/adsmanager) gives you various ways to measure your Ads' success. You can use metrics like impressions and Cost Per Result to understand the performance of your ads. But what if you want more insight into your customers' actions after they see your ad? That's where conversion tracking comes in.
In this post, we'll show you how to set up conversion tracking on your [WooCommerce](https://woocommerce.com/) site for your Facebook Ads using a plugin called [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking).
## What is conversion tracking, and why is it important for your Facebook Ads?
[Conversion tracking](https://developers.facebook.com/docs/meta-pixel/implementation/conversion-tracking/) is a way of measuring specific actions that visitors take on your website. In this particular scenario, we're interested in how users behave on your site after they land there through your Facebook Ads. Tracked conversions will appear in your Facebook Ads Manager and Facebook Events Manager.
Tracking conversions on your Facebook Ads has the following benefits:
### Analyze your Ad performance
Through conversion tracking, you get more information about the conversion value. You'll have a clear view of which Ads are performing well, which keywords drive the most conversion and how many people are purchasing products after interacting with your Ads.
This kind of information lets you understand the return on investment (ROI) of your Ads, and as a result, you can choose to optimize underperforming Ads or simply focus your efforts on Ads that are doing well.
### Analyze the conversion funnel on your website
It could be that your Ads get great engagement, but conversion events on your website are low.
For example, there's a high rate of cart abandonment. This could mean that users are interested in your products but get stuck at some point in the journey. With this information, you can easily improve your checkout page and customize the checkout process to give your customers a better user experience that can help reduce cart abandonment.
With conversion tracking, you can also analyze if you need to improve your landing pages, content on your web pages, or customer journey to increase conversions. You might be getting more page views, but the traffic is not converting. However, by tracking, you'll be able to see what your customers are responding to the most and what they don't seem to like.
### Set custom audiences
You can define custom audiences based on the actions they take on your website. This is important because you'll have a better idea of which audience you should target in future campaigns.
You can also set up retargeting or remarketing Facebook ad campaigns (showing Ads to people who interacted with your Ad but didn't complete a conversion event on your site) and Dynamic Remarketing (showing Ads to audiences that match the criteria of your custom audience).
### Increase sales
Conversion tracking gives you a comprehensive understanding of your purchase event, including how your ads perform. Therefore, it allows you to optimize your campaigns when needed. Conversion tracking also makes it easy for you to understand the behavior of your target customers. It also enables you to customize your website visitors' buying journey. All these increase your chances of generating more sales.
### Save marketing budget
Since you can see what's working and what's not, you can easily cut off the underperforming ads that you could otherwise be spending money on. Running Facebook advertising is usually expensive, especially if you want to see results that can help determine if you should scale.
## What do I need to set up Facebook Ads conversion tracking?
To set up conversion tracking on your WooCommerce site, you'll need to add the [Meta pixel](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking) to your site. A Meta pixel is a piece of code that lets you record actions that happen on your site and send them to the Facebook Ad Manager.
For WooCommerce stores, the best way to add the Meta pixel to your site is by using a plugin. We recommend [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking), which is the most accurate conversion tracking plugin available.
### How Pixel Manager for WooCommerce works
When visitors land on your site through your Facebook Ads, the plugin will track the following events: Add to cart, Add to wishlist, Initiate checkout, Purchase, Search, and View content.
To make conversion tracking even more accurate, you can set up server-to-server tracking using Facebook's CAPI. Currently, the plugin uses CAPI to track [all the same events as the Meta Pixel](https://sweetcode.com/docs/pmw/features/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking#meta-facebook) and also tracks subscription renewal events that occur offline.
Pixel Manager for WooCommerce creates a unique event ID for every event. This helps avoid errors occurring, like duplication of data that makes your reports less accurate.
The plugin also has additional functional layers to increase measurement accuracy. For example, if the plugin detects issues in your WooCommerce store setup that might affect tracking, it either fixes them or shows warnings and explains what to do.
If you upload your products to the Meta Catalog for Facebook, you can also set up dynamic remarketing for your audiences using Pixel Manager for WooCommerce. The easiest way to upload your products is to use a feed plugin.
Pixel Manager for WooCommerce integrates with various other platforms, not just Facebook Ads. These include [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking), [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking), [Twitter Ads](https://ads.twitter.com/onboarding/), [Snapchat Ads](https://forbusiness.snapchat.com/), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking), and [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking). This is obviously great for any marketer who wants to diversify from just Facebook Ads. It's easy to set up the plugin for any of these platforms.
## How to set up Facebook Ads conversion tracking with Pixel Manager for WooCommerce
Setting up conversion tracking for Facebook Ads on a WooCommerce site is quite simple. Below is a clear step-by-step guide on how to go about it.
### Install and activate Pixel Manager for WooCommerce
The first step is installing the plugin on your WordPress site and activating it. You'll first need to [pick your plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking#pricing-section). The five plans on offer all include the same features, so it's a matter of deciding how many sites you want to set up conversion tracking for (the plans range from 1 site to 25 sites).
Once you have the plugin, upload it into your plugins directory by heading to **Plugins > Add New**.

Next, go to your WordPress dashboard menu and activate the plugin.
### How to find the Meta pixel
You'll now need to [find the Meta tracking code and add it to your site](https://www.facebook.com/business/help/952192354843755?id=1205376682832142). To do this:
1. Go to [Facebook Events Manager](https://facebook.com/events_manager2). It'll open your Ad account.
2. Click Connect data sources on the left side of the screen and choose Web.

3. Choose Meta pixel and click Connect
4. Create your FB pixel name
5. Key in your eCommerce store URL
6. Click Continue
### Add the Meta Pixel to your site using Pixel Manager for WooCommerce
Once your tracking Pixel has been retrieved, it's time to add it to your WooCommerce site. To do this, head over to your WordPress website to add the pixel directly.
- Go to the Pixel Manager for WooCommerce tab in the WP dashboard
- Under the Main section, select Meta (Facebook)
- Paste your pixel ID

Alternatively, you can add the Meta pixel to your website via the Events Manager. This is how to go about it:
- Click save changes
- Visit Facebook [Events Manager](https://business.facebook.com/events_manager2/list).
- Click the Data sources icon.
- Choose the pixel you created.
- Click Continue pixel setup.
- Make sure that the automatic events tracking feature is turned off.

### Set up CAPI
If you want to get more accurate data, you can [set up CAPI](https://sweetcode.com/docs/pmw/plugin-configuration/meta?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking#setting-up-meta-facebook-capi) to track server-side events alongside browser events.
1. Get a Meta (Facebook) CAPI access token.
You'll need to get the CAPI access token through the Events Manager:
- Select the pixel you created
- Select the Settings tab
- Look for the Conversions API section and choose to Generate access token link under Set up manually, and follow the instructions pop-up.
Note that you don't need to request permission for your app to generate token access.
1. Once you have the token access, paste it into the Pixel manager plugin to activate CAPI. To do this:
- Go to your WordPress dashboard and open the Pixel Manager for WooCommerce tab
- Under the Advanced header, click Meta (Facebook)

- Paste the CAPI token access and click save changes
### Set up Dynamic Remarketing for your Facebook Ads
To set up dynamic remarketing, you need to first upload your products to the Meta Catalog for Facebook.
A catalog will hold information about your products, and you can use it with different types of ads and sales channels to promote your items.
Here's how to create a catalog for Facebook.
1. Make sure you have a Facebook page for your business.
2. Create a Business Manager account and ensure you're the business admin so that you can assign your catalog to your business.
3. Next, go to the [Commerce Manager](https://facebook.com/commerce_manager).
4. Click Get Started. Choose to create a catalog and then click Get Started.
5. Choose the type of product you sell, then click Next.
6. Next, select how you want to add products to your catalog. The way we recommend is to use a feed plugin such as [WP Marketing Robot](https://www.wpmarketingrobot.com/).
7. Next, choose the Business Manager account that has your catalog. This will enable you to use your catalog rather than selecting a personal account. It also enables you to assign other people permission to work on the catalog.
8. Name your catalog.
9. Click Create.
Note that you should upload products with the Post ID as the identifier for more accuracy.
Once you have a catalog to work with, you need to go to the Dynamic Remarketing tab of the plugin and enable Dynamic Remarketing.
### How to see your conversions in the Ads manager
If you have set your Facebook ad tracking conversion as explained above, you should be able to see how many conversions happened as a result of your Facebook ads.
Here's how you can measure results by customizing columns in your Ads manager:
1. Visit your Ads Manager.
2. Choose Campaigns> Ad sets or Ads,
3. Choose the Columns drop-down menu.
4. Choose Customize columns and check off the actions you want to measure.
5. Click Apply.
Following the above steps will allow you to see your performance. You'll be able to collect valuable data you can use for conversion optimization, dynamic remarketing, and reporting.
## Set up conversion tracking in WooCommerce to get more out of your Facebook ads
Conversion tracking for your Facebook Ads can help you get more info about your customers, including who they are and what actions they're performing on your site. Conversion tracking helps you understand how your ads are performing, allowing you to put in measures that help increase your conversions. For example, optimize your ads to target more relevant audiences.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking) helps you install the meta pixel in your WooCommerce site and makes your conversion tracking more accurate. The plugin is easy to set up, has a user-friendly interface, and can be used to track conversion from other platforms. Not just Facebook Ads.
It's also the most accurate pixel tracker available for WooCommerce stores.
[Get started with Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-conversion-tracking#pricing-section) today and redefine your digital marketing strategies. The best part, no matter the pricing plan you choose, you get a 14-day free trial and a 30-day money-back guarantee.
---
# How to Set Up Ecommerce Conversion Tracking for Google Ads on Your WooCommerce Store
URL: https://sweetcode.com/blog/woocommerce-ecommerce-tracking
Date: 2022-10-30
Tags: conversion tracking, woocommerce
{`How to Set Up Ecommerce Conversion Tracking for Google Ads on Your
WooCommerce Store`}

## TLDR
- Tracking your conversion rate is vital to creating better [Google Ads](https://ads.google.com/) campaigns but can be tough to do manually.
- A plugin can give you more features and functionality, save you time, and reduce your development costs.
- This tutorial will show you how to set up [WooCommerce](http://woocommerce.com) ecommerce tracking using [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking).
If you want to know whether your Google Ads are generating conversions on your ecommerce store, you'll need to track them. Setting up WooCommerce ecommerce tracking is straightforward if you have the right tools at your disposal.
[Google Ads is one of the most popular advertising platforms](https://w3techs.com/technologies/details/ad-google) on the planet. Lots of online stores use it to target potential customers based on their interests. You can also use Google Ads to increase brand awareness and visibility of your products and services. For instance, you can target platforms such as [YouTube](http://youtube.com), and leverage Google search pages to showcase your WooCommerce items. Using these Ad strategies you can grow your audience, target the right demographic for your business, and increase the chance that people will visit your store.
If you run (or plan to run) Google Ads for your WooCommerce store, you'll want to set up conversion tracking. It's important to know how your Ads perform, so you can make adjustments to improve them. In contrast, it's also vital to know which Ads perform well, so you can invest more in those campaigns.
For this tutorial, we'll explore how to set up WooCommerce ecommerce tracking for your Google Ads conversions using the Pixel Manager for WooCommerce plugin. First, let's discuss why you should track your Google Ads conversions.
## Why you should track your Google Ads conversions
A Google Ads campaign can include many different types of advertising formats. For example, text ads, image ads, and video ads are common. This makes Google Ads campaigns suitable for almost every type of business.
[Conversion tracking](https://sweetcode.com/blog/conversion-tracking-woocommerce/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking) is a key way to figure out the efficacy of your Google Ads campaigns. In general, it helps you analyze how well your online marketing campaigns perform, and whether you need to optimize your Ads in any way.
In practical terms, this means you'll discover more about the shopping behavior of your site's visitors once they hit your site through a Google Ads click. For example, you can find out which product pages garner interest and lead to a conversion, or discover whether your customers are interested in your product upsells. You're also able to understand how many customers complete the checkout process, their Average Order Value (AOV), [Customer Lifetime Value (CLV)](https://sweetcode.com/blog/woocommerce-google-ads-customer-lifetime-value-reporting/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking), and much more.
Using conversion tracking means you can begin to understand whether your target audience is responding to your Google Ads. From there, you can decide whether you should expand your scope to different customer groups, or double down on the group you're currently trying to reach.
## The best way to set up ecommerce tracking for a WooCommerce store
As with many other facets of WordPress functionality, there are two main ways to set up WooCommerce ecommerce tracking:
- **The manual approach**: You can set up conversion tracking using code snippets in the WordPress dashboard, and some extra setup and management within Google Ads. If you have coding knowledge and experience, this advanced method could be a viable option. Regardless, you still might find it a time-consuming and cumbersome experience, as you'll need to input and manage each code snippet for each Google Ad you want to track.
- **Using a plugin**: For most WordPress users, the ideal option is to use a dedicated plugin to set up WooCommerce ecommerce tracking. Plugins can save you time, reduce your development costs, and often provide a non-technical and simple setup process.
A plugin can also give you more features and functionality than you can implement yourself. Such features include order duplication prevention, compatibility with all browsers, and data privacy features (GDPR).
## What a pixel tracking WordPress plugin can do for you
A pixel tracking WordPress plugin implements a single pixel on your site from another platform – Google Ads in this case – that lets you collect and track ecommerce data. This lets you obtain information on the users who hit your site through specific Google Ads.
Keep in mind that if you're running Google Ads as a store owner, you'll want a plugin that lets you add tracking pixels directly from a Google Ads account. In your case, you'll want to avoid installing a plugin that only integrates with [Google Analytics](http://analytics.google.com). Bear in mind that there are a lot of plugins that can [connect to Google Analytics](https://sweetcode.com/blog/woocommerce-google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking), but don't offer the same functionality for Google Ads.
You do have the possibility to set up Google Ads (and your WooCommerce store) as a "property" within your Google Analytics account. However, you'll get more limited data compared to having a Google Ads pixel directly in your WooCommerce store.
You may think it's best to have separate plugins for Google Analytics and Google Ads. However, this is not the case. Single-purpose plugins usually don't set the scope correctly and can cause tracking accuracy issues, which can compromise your data sets across one or both platforms.
The ideal solution is to use a conversion tracking plugin that lets you set up both pixels for both Google Analytics and Google Ads. While your main aim is collecting data about how users interact with your Google Ads, it's also very important to collect conversion data about your organic users, such as the top traffic sources resulting in conversions.
## Choosing the best plugin for WooCommerce ecommerce tracking
While there are lots of WordPress plugins that let you add tracking pixels to your WooCommerce store, not all have compatibility and integration with Google Ads. They might not also provide the best tracking accuracy.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking) is developed specifically for WooCommerce and makes it as easy as possible to track Google Ads conversions using a dedicated tracking pixel.

There are a number of key benefits to the plugin that warrant a mention:
- First, you can add a tracking pixel to your WooCommerce store directly from your Google Ads account.
- The plugin provides horizontal integration across many other platforms too. You're able to set up tracking pixels for [Facebook Ads](https://sweetcode.com/blog/facebook-pixel-woocommerce/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking), [Twitter Ads](https://ads.twitter.com/), [Microsoft Ads](https://about.ads.microsoft.com/en-us/get-started/sign-up-with-microsoft-advertising), Google Analytics, and many more platforms.
- You won't need any prior coding knowledge to use Pixel Manager for WooCommerce. The plugin was designed for performance marketers who want a straightforward solution to set up event tracking.
- For the tech savvy, Pixel Manager for WooCommerce also offers plenty of [documentation on the plugin's official site](https://sweetcode.com/docs/pmw/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking) and hooks that you can use to finetune the output. However, this isn't necessary if you simply want to set up conversion tracking quickly!
On the whole, Pixel Manager for WooCommerce offers superb functionality and unrivaled tracking accuracy. The plugin is available in five different plans ranging from 1 site to 25 sites, each offering the full set of features.
## How to set up Google Ads conversion tracking with Pixel Manager for WooCommerce (in 3 steps)
Over the rest of the article, we're going to show you how to set up WooCommerce ecommerce tracking with Pixel Manager for WooCommerce. The first step in the process is to [install and activate](https://sweetcode.com/docs/pmw/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-trackingsetup/plugin-installation/) the plugin, so let's look at this now.
### 1. Install and activate the Pixel Manager for WooCommerce plugin
Your initial task is to [choose the right plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking#pricing-section) for your needs. Once you do this, you can either choose to pay the cost upfront or select a 14-day free trial. You'll receive a license key and a ZIP file that contains the plugin in your email inbox.
Once you have this ZIP file, log into WordPress and head to the \_Plugins > Add New \_screen:

This will bring you to a list of plugins to download: the [WordPress Plugin Repository](http://wordpress.org/plugins/). Look to the top of the screen and select _Upload Plugin_. This will open a dialog that will let you search for your ZIP file. Once you find it, click the _Install Now_ button:

If you don't see a screen here to activate the plugin, head to the main _Plugins_ page, scroll to find the plugin in the list, and click on the _Activate_ link:

### 2. Add a Conversion ID and Conversion Label from Google Ads
The activation process will automatically bring you to the _WooCommerce > Pixel Manager_ plugin settings screen. You'll see the _Main_ tab first, which contains lots of entry fields.

To set up tracking for Google Ads, you'll want to find the _Conversion ID_ and _Conversion Label_ within your Google Ads account:
- First head to Google Ads, and log into your account.
- Head to **Tools and Settings > Measurement > Conversions**.
- This will display the _Conversion ID_ and _Conversion Label_ values.
Once you have these, head back to WordPress, and enter the values into the appropriate fields on the _WooCommerce > Pixel Manager > Main_ screen. You can then save your changes.

If you haven't created the conversion yet, you will need to do this first:
- Open the _Tools & Settings > Conversions_ screen within Google Ads.
- Click the _Plus_ icon on the _Conversion Actions_ page.
- Next, choose the _Website conversion_ action.
- Enter your site's domain, and click the _Scan_ button.
- Once this process finishes, click the _Add a conversion action manually_ link.
From here, you'll want to configure your conversion action details. We recommend the following default settings:
- **Goal and action optimization**: Purchase.
- **Conversion name**: Purchase.
- **Value**: Use different values for each conversion (and set the default value to Zero.)
- **Set up using**: Event snippet, not Google tag. (Google Ads only shows this option in newer accounts.)
- **Count**: Every.
- **Attribution**: Data-driven.
Once you do this, click the _Done_ button. You'll now have a new purchase conversion set up for your site, and you'll now be able to retrieve your Conversion ID and Purchase Conversion Label.
### 3.a. Conversion cart data
Google lets you add greater detail to your purchase conversion using the Conversions with Cart Data (CwCD) metric. This adds further information about the items you're selling. To set this up, you'll need to add your Google Merchant Center ID to Pixel Manager for WooCommerce.
You'll need a Google Merchant Center account, and you can find the ID either in the top right-hand corner of the screen or within the URL once you log in:

From here, head back to the _WooCommerce > Pixel Manager_ screen in WordPress, and navigate to the _Advanced > Google_ screen. Here, add the ID to the Conversion Cart Data field:

Once you save your changes, you'll be able to leverage CwCD for your purchase conversions.
### 3.b. Phone Conversion number
Pixel Manager for WooCommerce can also track phone conversions. This is where you'll be able to record the conversion data on any phone number link on your site. [Google offers a comprehensive guide](https://support.google.com/google-ads/answer/6095883) to set this up. The process involves Google swapping out your phone number for one of its own under the hood.
To find out whether you have this activated, you can append an anchor to the URL of a page on your site that contains a phone number: `#google-wcc-debug`. If this is active, you'll spot the phone numbers on your site change to Google-approved ones.
### 3.c. Enhanced conversions
Enhanced conversion lets Google send first-party conversion data with greater security. This will lead to even better accuracy in how you measure conversions. Pixel Manager for WooCommerce supports [enhanced conversion tracking](https://sweetcode.com/docs/pmw/plugin-configuration/google?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking#enhanced-conversions).
Before you enable enhanced ecommerce tracking, you'll want to make sure your site complies with Google's [customer data policies](https://support.google.com/adspolicy/answer/7475709). To confirm this, head to the _Tools & Settings > Measurement > Conversions > Settings_ screen within your Google Ads account. From here, read the customer data terms and click to accept them.
Next, head back to the _Tools & Settings > Measurement > Conversions_ screen, and find the _Edit your purchase conversion_ option. From here, open the _Enhanced Conversions_ section, and set the following options:
- Check the box to turn on Enhanced Conversions.
- Select a _Tag type_ as “Global site tag.”
- Use _Edit code_ when asked to confirm how you want to set up enhanced conversions.
- Check the _Use event snippet_ radio button.
Once you save your changes, you'll need to wait around 72 hours for [diagnostic ecommerce reporting](https://support.google.com/google-ads/answer/11956168) to appear in the conversion action. Please note that once diagnostics come in, Google Ads will often still show warnings about data quality, which usually go away after one or two weeks. There's no need to be alarmed by these warnings.
## Set up ecommerce tracking for your WooCommerce store today
Conversion tracking for your Google Ads is one of the most important tasks you can carry out as a store owner. It gives you invaluable data that you can use to improve your Google Ads marketing campaigns and increase your conversions over the long term.
The [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking) plugin is the best way to implement WooCommerce ecommerce tracking on your site. You add a tracking pixel from one of many platforms (including Google Ads) that will give you the most accurate data about how potential customers find you and use your site after they click on a dedicated link.
It's also valuable to set up WooCommerce ecommerce tracking for Google Analytics too, along with platforms such as Facebook Ads, and Twitter Ads, which you can integrate into your marketing strategy.
Pixel Manager for WooCommerce gives you a straightforward way to manage pixels from your WordPress website and comes with a 30-day money-back guarantee. [Choose your plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-ecommerce-tracking#pricing-section) and get started with ecommerce tracking for your WooCommerce store today.
---
# How to Set Up Dynamic Remarketing for Google Ads in WooCommerce
URL: https://sweetcode.com/blog/woocommerce-google-ads-dynamic-remarketing
Date: 2022-10-30
Tags: woocommerce, remarketing, dynamic remarketing
{`How to Set Up Dynamic Remarketing for Google Ads in WooCommerce`}

## TLDR
- "Dynamic remarketing" lets you target potential customers by showing them ads that contain products they have already viewed on your site.
- To implement this in your WooCommerce site, you can use a plugin such as [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing) alongside [Google Merchant Center](https://merchants.google.com/).
- This post will show you how to use Pixel Manager for WooCommerce to set up Google Ads dynamic remarketing.
Do you want to run dynamic remarketing campaigns for your WooCommerce store's Google Ads?'
Dynamic remarketing is a powerful marketing tool that can help you reach potential customers who have previously visited your WooCommerce website but haven't made a purchase. It is an excellent way to re-engage with customers and increase sales.
It might sound complex, but setting up Google Ads dynamic remarketing in your [WooCommerce](http://woocommerce.com) store is quite straightforward. You'll just need a few different tools, including Google Merchant Center, WooCommerce, and a conversion tracking plugin.
In this tutorial, we're going to look at what dynamic remarketing really is, and how to set up Google Ads dynamic remarketing for your website using Pixel Manager for WooCommerce.
## What is dynamic remarketing?
Before we go any further, let's discuss the difference between remarketing and dynamic remarketing.
Remarketing is the act of showing ads to people who have previously visited your e-commerce store and left without converting. This gives them the opportunity to revisit your e-commerce store, engage with your products, and make a purchase.
Dynamic remarketing follows the same principles but is even more specific. Through dynamic remarketing, you can show ads relating to the products and services a previous visitor viewed the last time they were on your site. This gives you the opportunity to send potential customers to specific product pages they may already be interested in, rather than your site's homepage or a less relevant landing page.
Of course, [Google Ads](http://ads.google.com) is a common way to run marketing campaigns, and dynamic remarketing works well with the platform. In fact, there are a lot of benefits to setting up Google Ads dynamic remarketing:
- You can scale your ads alongside your products and services. This dynamic approach can make use of your entire inventory, rather than just a few select products.
- You can create a powerful feed using a variety of common formats, such as a Comma-Separated Values (CSV) file, a Tab-Separated Values (TSV) file, and even spreadsheet documents. This will let the Google Ads product recommendation engine pull the most relevant products from your feed, and display ads based on visitor viewing history and popularity.
- Alongside Google Ads, you can calculate the most optimal bids for each impression, using an enhanced Cost-Per-Click (CPC) and conversion optimization tool.
- What's more, the Google Ads engine can predict the most optimal dynamic ad layout for your visitor, and also perform optimization on the placement and platform.
These benefits outlined above showcase the potential that dynamic remarketing has to increase conversions on your site! Next, we'll look at what you'll need to implement Google Ads dynamic remarketing in WooCommerce.
## What you need to set up Google Ads dynamic remarketing in WooCommerce
If you want to set up Google Ads dynamic remarketing in WooCommerce, there are a few tools and platforms you'll need. Here's a quick rundown of each one:
- **A Google Merchant Center account**: This is where you'll upload your WooCommerce products, and it lets you manage how your product inventory appears with Google.
- **Your Google Ads account**: You need this to create, run and manage your Google Ads campaigns.
- **A feed plugin**: You may also want to consider a dedicated feed plugin for WordPress too. While this isn't required, it makes uploading your products to Google Merchant Center much easier. Without a feed plugin, you'll need to upload your products manually. Two feed plugins we recommend are [Google Product Feed](https://woocommerce.com/products/google-product-feed/) and [WooCommerce Product Feed Manager](https://www.wpmarketingrobot.com/).

- **A tracking pixel plugin**: Adding a Google Ads tracking pixel to your WooCommerce store allows you to connect your data to Google Ads' conversion reports, which means you'll get more accurate data to work with. You can set the plugin up for dynamic remarketing, which means it will collect customer behavior data (such as order value, cart abandoners, and most viewed products), and this helps Google Ads run more targeted and informed dynamic remarketing campaigns.
## Why Pixel Manager for WooCommerce is essential for Google Ads dynamic remarketing
Given that a tracking pixel can supercharge your dynamic remarketing, you'll want the best solution on the market. Enter [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing).

With Pixel Manager for WooCommerce, you can integrate your site with a host of ad platforms, such as [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing), [Meta Ads](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing), [Twitter Ads](https://business.twitter.com/), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing), and [TikTok Ads](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing). You can set up dynamic remarketing for both Google Ads and Meta Ads.
You also have the option to integrate with analytics tools such as [Google Universal Analytics and Google Analytics 4](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing), and [HotJar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing).
However, there is plenty more on offer with Pixel Manager for WooCommerce:
- It gives you an intuitive and quick way to [implement conversion tracking on your WooCommerce website](https://sweetcode.com/blog/conversion-tracking-woocommerce?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing#how-do-i-set-up-conversion-tracking-using-pixel-manager-for-woocommerce). You can begin your journey within minutes, especially with the right guide.
- There are advanced tracking capabilities within Google Ads too. For instance, you can track purchase conversions and conversion cart data. This means you can look at your Average Order Value (AOV), cart size, and much more.
- You can also set up [enhanced conversions](https://sweetcode.com/docs/pmw/plugin-configuration/google?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing#enhanced-conversions) specifically for Google Ads in order to track data with more accuracy.
- Pixel Manager for WooCommerce is extremely accurate and has many features in place to ensure your data is reliable. For example, you can exclude user roles (like shop managers or admins) to ensure their data isn't tracked and mixed in with the report. It also prevents order duplication.
- The plugin integrates with many [Cookie Consent Management](https://sweetcode.com/docs/pmw/consent-management/overview/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing) plugins to avoid injecting the pixel when visitors don't want to be tracked. This ensures all your dynamic remarketing efforts are totally compliant with privacy laws. This ensures your dynamic remarketing campaigns comply with whatever privacy directives you need to follow, such as GDPR.
## How to set up WooCommerce for Google Ads dynamic remarketing (in 4 steps)
Over the rest of this tutorial, we're going to show you how to set up WooCommerce for Google Ads dynamic remarketing. There are four steps you need to take, and you'll also need to switch between a few different dashboards. However, the entire process is easy, and we'll walk you through it.
### 1. Upload your products to Google Merchant Center
Your first step is to upload your product inventory to Google Merchant Center. There is a manual process for this, that involves the following steps:
- Head to the Tools > Setup > Business Data section of Google Merchant Center.
- On the left-hand menu, click Data feeds.
- Click the Plus icon, select Dynamic ad feed, then select your business type.
- Attach your feed file using the Choose file dialog, then click Apply.
As we've discussed above, you can automate this process by using a feed plugin, like Google Product Feed.
When uploading products, make sure you set the product ID as your identifier, rather than Stock-Keeping Units (SKU) or any other value. This will give you greater accuracy with regard to data tracking, and fewer errors when Google matches the products on the website with the ones in the Google Merchant Center.
Once you have your products within Google Merchant Center, you can start setting up your tracking pixel.
### 2. Install and set up Pixel Manager for WooCommerce
Once you [select the right plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing#pricing-section) for your needs, you'll want to [install and activate](https://sweetcode.com/docs/pmw/setup/plugin-installation/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing) the plugin in the usual way with WordPress. You'll need to upload the premium version using the dedicated uploader on the _Plugins > Add New_ screen:

Once you do this, you'll see the _WooCommerce > Pixel Manager_ screen. The _Main_ tab provides you with different fields for various platforms, but the ones you need for this purpose are the _Google Ads Conversion ID_ and _Google Ads Purchase Conversion Label_ fields.

You'll need to find these values within Google Ads: Here's how:
- Open Google Ads and log into your account.
- Navigate to Tools and Settings > Measurement > Conversions.
- This will display the Conversion ID and Purchase Conversion Label values.
- Retrieve those codes and paste them into the Pixel Manager for the WooCommerce backend.
Please note that if you can't find your Conversion ID and Purchase Conversion Label values, it's because you need to create a new conversion. [Follow our guide on how to create a new conversion in Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing#create-a-new-conversion-in-google-ads) if you need help with this.
Once you add the Conversion ID and Purchase Conversion Label to the plugin backend, you can move on to the setup process for dynamic remarketing.
### 3. Set up dynamic remarketing in the plugin
In your WordPress dashboard, head to _WooCommerce > Pixel Manager > Dynamic Remarketing_:

First, tick the box to _Enable dynamic remarketing audience collection_. Then, choose the right _Product Identifier_. As we've discussed above, we recommend using the post ID as the default for your Google Ads.

You'll also notice specific options for Google Product Feed and the [Google Listings & Ads plugin](https://woocommerce.com/products/google-listings-and-ads/) if you use either of these.
Another default setting is Enable variations output. If you tick this, you'll need to upload all of your product variations to your feed along with the `item_group_id`. However, you may find this option is disabled depending on the feed plugin you use.

The final setting is to choose a _Google Business Vertical_. This should be straightforward: Whatever your business type is, select the nearest option using the radio buttons.

Once you fill out all of these fields, click the _Save Changes_ button. While WooCommerce will recognize Google Ads dynamic remarketing from now on, it's not the end of the process.
### 4. Set up dynamic remarketing audiences in Google Ads
To connect everything together, you'll also need to set up [dynamic remarketing audiences](https://sweetcode.com/docs/pmw/plugin-configuration/shop-settings?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing#setting-up-dynamic-remarketing-audiences-in-google-ads) within Google Ads.
Go to your Google Ads account, and head to _Shared Library > Audience Manager > Your Data Sources_ screen. From here, the process is straightforward:
- Under the Google Ads tag section, click the _Set Up Tag_ link.
- Run through the basic setup wizard. This includes enabling remarketing, selecting a business type, excluding Californian users from your remarketing, and including a user ID.
- Click _Save and Continue_.
After this, you'll see a screen that asks you to “Reinstall the tag on your website.” However, you only need to click _Continue_ here as Pixel Manager for WooCommerce inserts all of the necessary Google tags into your WooCommerce shop.
Once this completes, you'll have four new dynamic remarketing audiences: General visitors, past buyers, product viewers, and those who abandon a cart or checkout.
## Set up Google Ads dynamic remarketing for your WooCommerce store
Dynamic remarketing is a fantastic way to increase conversions by targeting users who have interacted with specific products on your website. If a site visitor viewed a product or even added it to their cart, you can show them an ad to entice them to complete the purchase.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing) is a must-have WordPress plugin that can help you set up WooCommerce for Google Ads dynamic remarketing. It helps you to track and collect better data from your users, which makes it easier for you to improve your dynamic remarketing efforts.
Pixel Manager for WooCommerce offers [five different pricing plans](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-dynamic-remarketing#pricing-section) that each offer the same feature set. What's more, it comes with a 30-day, no-questions-asked money-back guarantee.
---
# How To Create and Install a Conversion Pixel On Your WordPress Website: A Complete Guide (2022)
URL: https://sweetcode.com/blog/conversion-pixel
Date: 2022-10-25
Tags: conversion tracking, woocommerce
{`How to create and install a conversion pixel on your WordPress website: A
complete guide (2022)`}

## TLDR
- Conversion tracking is a key step to increasing conversions, and conversion pixels are the most direct way to measure conversion rates
- Analytical best practices enable you to get the most value out of conversion metrics
- [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel) is the best (and easiest) way to get started tracking conversions on WordPress
Conversion tracking is the key to knowing how your website is performing. With a conversion pixel, you can understand what your customers are doing and how they're interacting with your site. This gives you the data you need to fix anything that's impacting the customer journey, so you can increase your conversion rate.
Marketers and business owners use conversion pixels to optimize their sales and marketing campaigns. In this article, we will explore:
- What a conversion pixel is
- Why you should use them on your landing pages and elsewhere
- Use cases
- How to install a conversion pixel on your [WordPress](https://wordpress.com/) web pages
## What is a conversion pixel?
A conversion pixel is a small piece of code you can add to a website. The code enables you to track conversions for meaningful actions such as:
- Sales
- Signups
- Subscriptions
- Click-throughs
- Other standard events
A pixel is generally used for a specific reason, like when a user takes an action such as:
- Opening an email
- Visiting a website
- Viewing a digital ad
When users take these actions, they are requesting the server to download the tracking pixel attached to the content. So, marketing campaigns use them to measure the effectiveness of ads.
## Why should you use a conversion pixel?
You should use a conversion pixel to measure the effectiveness of your ads. They are one of the best methods for gaining insights and metrics and enable you to scrutinize your ads and optimize them accordingly.
The best practice for a conversion pixel is to determine which areas of your website are working well and which are not. For example, a conversion pixel will highlight when a certain CTA on a specific landing page is effective in converting users, and you can create more ads that take users to that page.
On the other hand, you can pinpoint the precise areas that need improvement. As an example, imagine a typical problem: you have many people visiting a product page, but they don't buy the product. In this case, you can clearly see that the product page itself is the weak link.
These discoveries should then prompt the marketing team to engage in product page optimization. They can test different copy, images, and so on. The conversion pixel will still be running and will help them discover which improvements lead to better conversion values.
It's worth noting that a tracking pixel won't be accurate 100% of the time, as it won't be able to record every single event that happens in the browser. Some platforms, like [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel) and [Meta Ads](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), also enable server-to-server tracking, which helps fill your data gaps in these scenarios.
## How conversion pixels can be used (best practices)
The use cases for conversion pixels as an invaluable troubleshooting tool are limitless. They can improve website conversions in many similar ways. Here are two of the main ones:
### A/B Testing
You can A/B test specific parts of your website. Pixels can be applied to discover the conversion rate of each page individually. You can use them to A/B test different:
- Calls to action (CTAs)
- Design elements
- Headers
- Main content
- Landing page copy
A/B testing each underperforming page enables you to optimize your entire website for higher conversion rates.
### User behavior analysis
You can track and analyze customer behavior on each web page. First, you get the raw data on specific behaviors, and then you can analyze them in the context of broader trends.
This process enables you to keep your content relevant. Trends and web page performances change over time. So, you can use pixels to know when content becomes outdated and adjust your marketing as necessary.
Tracking conversions gives you some of the data you need to calculate the ROI of ad campaigns. [Google Ads](https://ads.google.com/) spend on pay-per-click advertising can be compared against your conversions, just as one example.
## How do I install a conversion pixel on my WordPress site?
Pixel Manager for Woocommerce is easy and straightforward to install and also comes with a suite of features to ensure higher reliability. Many different plugins and other tools are available to help you install a conversion pixel. Downloading any one of them should be a straightforward task.
To have the best experience overall, we recommend installing [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel). It's easy to use, has all the features you need, and comes with reasonable pricing. The plugin can be used to add pixels and use many forms of conversion event tracking and analytics solutions. This lets you **understand what your visitors are doing and why**.
Let's have a look at how Pixel Manager for WooCommerce helps you optimize your conversion tracking:
- Set up pixel conversion tracking for [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), [Google Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), [Meta (Facebook)](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), and [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), [Twitter Ads](https://ads.twitter.com/), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel), [Snapchat Ads](https://forbusiness.snapchat.com/), and [TikTok Ads](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel).
- Collect dynamic remarketing audiences for dynamic retargeting (Google Ads and Meta).
- Google Ads Cart Data feature
- Google Ads enhanced conversions
- Google Analytics enhanced e-commerce
- Meta Conversion API and Meta Microdata output
- Google Consent mode
- Google Dynamic Remarketing tracking for all business verticals
- Advanced Order Duplication Prevention
- Duplication Prevention to ensure your conversion reports are precise and don't count failed payments.
- Integration with many [cookie consent management systems](https://sweetcode.com/docs/pmw/consent-management/overview/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel).
- Many filters that you can use to tweak the plugin output.
## How to Install Pixel Manager for WooCommerce
Install and activate the plugin
1. [Select the plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel#pricing-section) that suits your needs best to receive your download link. You can opt-in for a 14-day trial before purchasing the plugin.
2. Log in to your WooCommerce admin.
3. Upload the plugin into your plugin directory
- Go to “Plugins”
- Click “Add New”

- Click “Upload Plugin”
- Click “Choose File”

- Browse to the area in your downloads folder where the Pixel Manager for WooCommerce ZIP file is located
- Click “Install Now”
- Click “Activate Plugin” after the plugin has been downloaded and installed.
Now that the plugin is complete, you can use Pixel Manager for WooCommerce to set up all kinds of pixels.
### Retrieve the Conversion Pixel ID
For every platform you set up pixel tracking for, you will need to add a pixel ID into the plugin backend. You will see various fields for all the different platforms that you can integrate with. The plugin explains what the code is called in each case and what it looks like.
If you want to set up conversion tracking for a specific platform and you're not sure where to retrieve the required ID from, you can refer to [Pixel Manager for WooCommerce's documentation](https://sweetcode.com/docs/pmw/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel) that explains the steps for every single platform. We are going to use Google Ads as just one example.
1. For Google Ads, you need both Google Ads conversion ID and the Purchase Conversion Label. These are located in the Google Ads conversion tracking code.
- Log in to your Google Ads account
- Navigate to “Tools and Settings”
- Click “Measurement”
- Click “Conversions”

2. Next, go to “Use Google Tag Manager” and note your Conversion ID and Conversion Label

3. Navigate to:
- WooCommerce
- Pixel Manager
- The Main tab
4. Enter the Conversion ID and Conversion Label into the fields

### Start creating and installing tracking pixels on your site
Conversion tracking pixels are a simple tool, but they can be applied in many different ways. Tracking every conversion event in your sales funnels enables you to **account for every weak link while capitalizing on what already works**.
For the best integrations and most efficient solution overall, we recommend Pixel Manager for WooCommerce. Here's why this is the best conversion tracking plugin available:
- Typically when you use multiple analytical solutions, you could end up with inaccurate data. With Pixel Manager for WooCommerce, your data is as accurate as it can get.
- This is one of few plugins which enables you to use multiple tracking/digital marketing/analytics tools from the same place. You won't need multiple plugins to track different solutions - which reduces the amount of time, work, and money you'd need to spend on conversion tracking!
- The plugin was built with privacy in mind which means it works seamlessly with your privacy policies like cookies or consent management systems.
Get started with [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-pixel#pricing-section) today! When you choose your pro plan, you can opt-in for a 14-day free trial, or purchase right away to benefit from a 30-day money-back guarantee. Start tracking your conversions and improving your results today!
---
# Automatic Conversion Recovery (ACR)
URL: https://sweetcode.com/blog/automatic-conversion-recovery
Date: 2022-09-15
Tags: general

## TLDR
- The Automatic Conversion Recovery (ACR) can automatically recover conversions that are otherwise lost by payment gateway redirect or similar issues.
- ACR has been invented and developed by the team behind the Pixel Manager.
- No other tracking code manager has this feature.
## What is Automatic Conversion Recovery (ACR)?
Through numerous support requests in the past years, we have discovered that in some cases payment gateways can deteriorate the conversion tracking. This is especially true for payment gateways that redirect the user to a third-party website to complete the payment.
While the Pixel Manager achieves 100% tracking accuracy for statistics and ad platforms that offer a server-to-server tracking method (such as Google Analytics Measurement Protocol and Facebook CAPI), all other platforms that only offer a client-side tracking method (such as Google Ads) can severely be affected by this issue. Every bidding algorithm that relies on client-side tracking will not perform optimally if the conversion tracking is not 100% accurate.
Payment gateways are not always the only culprit. Sometimes slow servers cause issues or in other cases, user browsing behavior prevent conversions to be tracked.
First we developed ways to track if and when conversions are lost. As a result we launched the [Payment Gateway Accuracy](https://sweetcode.com/docs/pmw/diagnostics#payment-gateway-tracking-accuracy-report) report earlier this year. It shows in detail how many conversions are lost for each active payment gateway.
In average, over all shops that we have data on, the payment gateway accuracy is just 84%. This is very low and means that 16% of all conversions are lost!
Then we thought about ways to recover these lost conversions. This led to the development of a new feature that we now call Automatic Conversion Recovery (ACR).
The Automatic Conversion Recovery (ACR) detects when a conversion is lost and automatically recovers the conversion where possible.
## How does ACR work?
In the first step, the ACR detects when a conversion is lost. This is done by comparing the conversion data that is available in the WooCommerce order with the conversion data that the Pixel Manager tracks for each order. ACR doesn't simply include all orders in the analysis. For instance, it won't include failed orders because this would make the result artificially worse than it really is.
Once the ACR has determined that the client-side conversion pixels have not fired on a specific order, that order is marked.
In a second step, the ACR tries to recover the conversion. This is done by detecting if the customer of an order with a missing conversion is re-visiting the shop. If such a customer is re-visiting the shop, ACR will retrieve the order data and fire the conversion pixels again, no matter which page the customer is visiting.
Also, ACR will apply more strict rules if a conversion should be recovered. It will only fire the conversion if the order is in a paid state.
## How to set up ACR?
ACR is only available in the premium version of the Pixel Manager and is automatically enabled by default. You can simply lean back, take a sip from your freshly brewed coffee and let ACR do its job.
The premium version of the Pixel Manager is available over here: [Pixel Manager Pro](https://sweetcode.com/plugins/pmw#pricing-section)
## How well does ACR work?
Our early tests have shown that Automatic Conversion Recovery (ACR) can recover between 30% and up to 65% of lost conversions. These are very good results, considering that the ACR is a completely automatic process.
The ACR works especially well on shops where paying customers are re-visiting the shop soon after the purchase.
This also means that every incentive that you as a shop manager have in place, that will bring back the customer to the shop, will also help the ACR to recover more conversions. Such an incentive can be an email with a discount code or a follow-up email with a link to leave a review on the shop.
## Future of ACR
We started the public beta of ACR in the summer of 2022 and we are still learning. We are surprised how well its fully automated conversion recovery already works on some shops. But, that is not a reason for us to stop inventing. We are already working on improvements that will help increase the conversion recovery rate even further.
## Documentation
Head over to our documentation to learn more about the Automatic Conversion Recovery (ACR): [Automatic Conversion Recovery (ACR)](https://sweetcode.com/docs/pmw/features/acr)
---
# 30+ Reasons to Choose the Pixel Manager for WooCommerce
URL: https://sweetcode.com/blog/reasons-to-choose-the-pixel-manager
Date: 2022-09-15
Tags: general
## TLDR
- The Pixel Manager is specifically designed for WooCommerce.
- The Pixel Manager is the technically most advanced tracking code manager for WooCommerce.
- The Pixel Manager is easy to use and very flexible to customize.
- any many more
# 30+ Reasons to Choose the Pixel Manager for WooCommerce
- The Pixel Manager (PM) is specifically designed for WooCommerce.
- The PM is the most accurate of all WooCommerce tracking code managers.
- The PM library is much smaller as similar plugin libraries.
- The PM library is transpiled and compiled to achieve maximum compatibility with all browsers.
- The PM library is not only minified but also pre-compressed for gzip and brotli to reduce server load and achieve even faster load times.
- The PM loader dynamically adjusts to all types of JavaScript optimization plugins. You can use any optimizer and the PM will keep working as expected.
- The PM loader even can handle JavaScript lazy loading perfectly.
- The PM user interface is reduced to the maximum so you can focus on business relevant decisions. For example, if you enable Google Analytics, the PM will fire **all** enhanced e-commerce events automatically. No need to enable them all in the user interface.
- The PM is the only tracking code manager that analyzes payment gateway tracking accuracy and can reveal potential tracking issues.
- The PM is the only tracking code manager that comes with the Automatic Conversion Recovery (ACR) which can automatically recover lost conversions due to payment gateway tracking issues.
- The PM has the highest average rating of all WooCommerce tracking code managers.
- Our support is among the best in the industry. Fast, reliable and friendly.
- The PM comes with a free 14-day trial.
- The PM comes with a free 30-day, no questions asked, money back guarantee.
- The PM the only tracking code manager that uses the much faster and resource saving WordPress REST API to communicate with the server **and** can use AJAX as fallback if the REST API is not available.
- The PM is the only tracking code manager that can track form submissions by offering dedicated shortcodes.
- The PM can handle Gutenberg blocks.
- The PM can handle WooCommerce blocks.
- The PM can handle WooCommerce subscriptions.
- The PM is compatible with numerous WooCommerce extensions.
- WooCommerce Brands
- WPML
- Yoast SEO
- CartFlows
- Cost of Goods for WooCommerce (WPFactory)
- WooCommerce Composite Products
- WooCommerce Cost of Goods (SkyVerge)
- WooCommerce Deposits
- WooCommerce Google Product Feed
- WooCommerce Product Bundles
- WooCommerce Subscriptions
- WooCommerce Wishlist
- YITH WooCommerce Brands
- YITH WooCommerce Wishlist
- Woo Discount Rules
- WP Marketing Robot Feed Manager
- and more
- The PM uses the Google Analytics Measurement Protocol to send purchases and refunds to Google Analytics. The PM achieves 100% accuracy for purchase event tracking.
- The PM automatically flushes server side caches (if technically possible) each time a PM setting is changed in order to make sure that the new settings are active on the front-end.
- The PM fully integrates with various Consent Management Platforms (CMPs) to achieve highest compliance with GDPR and CCPA.
- The PM offers a seamless integration for Google Ads Enhanced Conversion Tracking.
- The PM offers Google Consent Mode.
- Google Ads Phone Conversion Tracking.
- Google Ads Cart Item Tracking.
- All dynamic remarketing events for all tracking pixels (Google Ads, Facebook, Pinterest, Bing, etc.)
- Basic and advanced oder duplication prevention.
- Public roadmap with upcoming features.
- Many filters to customize the PM to your needs.
- Many example snippets to customize the PM to your needs.
---
# The 8+ Best Google Ads Plugins for Your WooCommerce Shop: A Guide to Better Sales
URL: https://sweetcode.com/blog/google-ads-woocommerce
Date: 2022-09-06
Tags: google ads, conversion tracking, woocommerce
{`The 8+ Best Google Ads Plugins for Your WooCommerce Shop: A Guide to Better
Sales`}

## TLDR
- [Google Ads](https://ads.google.com/home/) needs technical and marketing knowledge to set up manually. A dedicated plugin can make the process more straightforward.
- You'll find lots of Google Ads plugins for [WooCommerce](http://woocommerce.com). One of the most important ones to have is a tracking plugin that helps you track events from your Google Ads.
- This post will round up the 8+ best Google Ads plugins for WooCommerce.
Google Ads can be a significant asset to your WooCommerce store. With [an average conversion rate of 3.75%](https://www.wordstream.com/blog/ws/2016/02/29/google-adwords-industry-benchmarks), they are a proven way of generating more revenue and leads.
However, it can be daunting to set up Google Ads and keep track of their performance. That's why many businesses, especially small businesses that lack technical skills and knowledge of marketing campaigns, use plugins to help them manage their Google Ads.
While a plugin won't create the Ads for you, it does make things easier. Some Google Ads plugins will track all interactions that happen on your WooCommerce site once users click on your ad. This gives you insights into your Ad performance and helps you optimize your ads accordingly.
In this article, we will cover the top 8+ plugins to optimize Google Ads for a WooCommerce website and outline their key benefits so you can decide which ones are best for your needs.
## Why you should set up Google Ads for your WooCommerce store

If you don't already run Google Ads for your WooCommerce store, know that there are lots of benefits in doing so:
- **Targeted advertising**. A Google Ad that is relevant to a user offers a greater chance of engagement. For you, this means more clicks. Targeted Ads sit in front of the right users – those more likely to make a purchase.
- **Better user engagement**. You can use Google Ads to do more than just generate sales. For example, you can redirect people to a landing page that collects email addresses.
- **Greater sales figures**. Want to boost sales on items that aren't performing well? You can use Google Ads to promote less popular items. This way, you can extract as much value from your product lines as possible.
In addition to the benefits we've listed above, there are advantages to understanding how your Ads are performing. It's helpful to know which Ads are doing well and which aren't; and what audiences your Ads are attracting. You should even be able to know what events are happening on your WooCommerce store once people arrive from your Ads. This is all information you can use to improve your Ads or the customer journey on your store.
This is where a Google Ads plugin comes in handy. However, you'll want to ensure that you install the right Google Ads plugin for WooCommerce. In the next section, we'll talk about how many plugins you actually need, and the features and functionality they offer.
## How to decide if you need more than one Google Ads plugin for WooCommerce
In lots of cases when it comes to [WordPress](https://wordpress.org/), one plugin per task is enough. However, when it comes to Google Ads plugins for WooCommerce, you might use more than one. This is because different plugins achieve specific aims:
- For example, feed plugins help with the product upload process and to set up [Google Shopping](https://shopping.google.com/) Ads.
- If you want to see how users interact with your Ads, you will need to install a tracking plugin.
If you combine them, you'll get a full-featured ad setup. Feed plugins and trackers work well together, and feed plugins also integrate well with other solutions too.
You'll also find that a plugin can offer either ‘horizontal' or ‘vertical' integrations. Here's the difference:
- Horizontal integrations let you generate feeds or pixels (not both) across multiple channels.
For example, let's say you run Google Ads, Facebook Ads, and Twitter Ads. A horizontal integration pixel tracking plugin will let you integrate your WooCommerce store with all those platforms.
Another use case is if you want to upload your WooCommerce products to both Google Merchant Center and Meta Catalog for Facebook. A horizontal integration feed plugin is what you'll need here.
- Vertical integrations generate feeds and pixels for one advertising platform. Their use is more singular, but these could be worth looking into if you only want to integrate your WooCommerce store with one platform. For example, if you only plan on running Google Ads, you can install a vertical integration plugin that will help you upload your products to Google Merchant Center, and also set up pixel tracking for your Google Ads.
Is it better to choose a horizontal or vertical integration plugin? Vertical integration plugins are simpler to understand for beginners and could be a good choice. However, as shop managers get more experienced, they will find that horizontal integrations offer more advanced features that vertical integrations don't. They offer greater flexibility regardless of your marketing aims. In this post, we mention both Horizontal and Vertical integration plugins.
## The 8 best Google Ads plugins for your WooCommerce shop
Over the next few sections, we're going to take a look at some of the greatest Google Ads plugins for WooCommerce. Although the list isn't in a particular order, we want to show you our favorite first.
### 1. Pixel Manager for WooCommerce
Our plugin, [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=google-ads-woocommerce), is essential if you run Google Ads on a WordPress website. The plugin lets you install a Google Ads pixel that will capture data from 'leads' who click on your Ads once they land on your site.

The plugin lets you connect your Conversion Reports on Google Ads and WooCommerce data to help you better serve your visitors. Here's why this plugin should be on your site:
- The technology under the hood means the plugin is arguably the most accurate on the market. You have a better quality of data to pore over with this plugin.
- With Pixel Manager for WooCommerce, you'll get data about purchase conversions that occur in your store after customers land on your site through an Ad.
- By adding your Google Merchant Center ID in the plugin, you'll also get Conversion Cart Data, which includes detailed reporting on all items sold, a clear measure of revenue and profit generated by Shopping Ads, and detailed reporting on cart size and average order value.
- The plugin transmits every transaction ID to Google Ads, which helps Google Ads to deduplicate all conversions that have been transmitted multiple times (e.g. if a customer refreshes the page). This ensures your data is even more accurate.
- What's more, the plugin treats the data each pixel collects the same regardless of the platform. This means you can track metrics such as conversion values with more detail, and will even help you add tracking pixels for [multiple platforms](https://sweetcode.com/docs/pmw/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=google-ads-woocommerce), such as [Google Analytics](https://analytics.google.com/analytics/web/#/), [Meta Ads](https://www.facebook.com/business/tools/ads-manager), [Twitter Ads](https://ads.twitter.com/), and others.
- The User Interface (UI) is straightforward and will suit those with no technical knowledge. Professionals favor Pixel Manager for WooCommerce because it is so easy to set up yet still offers advanced functionality compared to other plugins on the market. Everything you'll need to access is within the familiar WordPress interface.
- Developers with technical knowledge can customize the plugin if they want to. This means it's possible to adapt the plugin to your needs regardless of its default setup.
If you run any volume of Google Ads, then it's essential to know your data is accurate. Pixel Manager for WooCommerce offers the most accurate conversion tracking compared to any other solution on the market. You'll get peace of mind that your Ads are being tracked correctly, and for that reason, it's at the top of our list.
The pro version of Pixel Manager for WooCommerce offers great value, as you'll get the full feature set of the plugin. This means you won't need to buy any expensive add-ons or extensions.
### 2. Google Ads & Marketing
The [Google Ads & Marketing](https://woocommerce.com/products/google-ads-and-marketing/) plugin is a great way to automate the setup process. This will suit you if you don't know how to carry out a manual setup of Google Ads.

This isn't the end of the automation either. Your ads get an automatic opt-in to Google Shopping's free listings. This will let you leverage Surfaces Across Google as well as the Google Shopping channels. Speaking of which, you're able to run paid smart shopping campaigns across lots of social media and shopping channels.
Google Ads & Marketing will also sync with various other services. You'll be able to link your WooCommerce site with a Google Center Merchant Account, and the plugin helps to sync your inventory with Smart Product Feeds. This helps potential new customers see in-stock items if they find your site using Google Search.
### 3. Google Ads & Google Shopping Feed
Clever ecommerce's [Google Ads & Shopping Feed](https://woocommerce.com/products/ads-on-google/) plugin is another that helps you to reduce the time it takes to set up Ads. However, it can do more than this.

For example, it auto-generates keywords for your on-site products, and can also take competitor keyword bidding off of your hands. The plugin lets you create a number of Google Ads campaigns and types. You're able to create advertisements for search, [Google Display Ads](https://ads.google.com/home/campaigns/display-ads/), Google Remarketing Ads, and much more.
### 4. Google Listings and Ads
If you want to use an official extension with your WooCommerce site, the [Google Listings and Ads](https://woocommerce.com/products/google-listings-and-ads/) plugin is a solid option.

This is a free, simple plugin that lets you set up Google Ads through the WordPress and WooCommerce dashboard. It lets you leverage Google Shopping's free listings, and has a no-fuss way to create Google Ads campaigns for your site.
However, it doesn't offer some of the functionality you'd see in other Google Ads for WooCommerce solutions. For instance, you have no way to track conversions, and can't generate product keywords. Be aware that the extension has a low rating from other users.
### 5. Google Ads ROI Optimizer
The plugin does what it says on the tin. It lets you optimize your Return On Investment (ROI) in a straightforward way.

The plugin detects repeat customers on your online store who visit through Google Ads and offers them an automatic discount on a purchase. This could be a fantastic sales generator that will obviously impact your ROI.
However, you'll also need to have a Google Ad spend of $2,000 minimum. You'll also need to have a returning customer rate of 15 percent. This might not be viable for most small businesses, which reduces the value of this plugin.
### 6. PixelYourSite
[PixelYourSite](https://www.pixelyoursite.com/) is another Google Ads plugin for WordPress with a clear focus. It lets you add a Google Ads tag to your WordPress website.

Once you add the tag, you can track conversions, run remarketing campaigns, and more. There's a lot in the box, such as support for Facebook and Bing pixels, TikTok and Pinterest tags, and a lot more.
However, there are two drawbacks to PixelYourSite. First, it doesn't focus solely on WordPress, which can impact functionality. Second, it costs between $160-$550 per year to access the plugin, with a reduced feature set for lower tiers.
### 7. Conversion Tracking Pro for WooCommerce
[Conversion Tracking Pro for WooCommerce](https://woocommerce.com/products/woocommerce-conversion-tracking-pro/) has a simple focus: tracking conversion rates for the products on your WooCommerce store. In fact, we'd say this offers a fantastic experience – for tracking purposes at least.

The plugin lets you add your Google Adwords account ID to help you send purchase details, events, and labels directly to Google. This is a handy piece of core functionality we like, and you have a number of channels to opt for here.
Though this plugin is solely focused on WooCommerce stores, we wouldn't recommend it as a top option. It doesn't offer the same amount of features as Pixel Manager for WooCommerce, and has less favorable reviews too.
### 8. MonsterInsights
The [MonsterInsights](https://wordpress.org/plugins/google-analytics-for-wordpress/) plugin is a longstanding way to view [Google Analytics](https://analytics.google.com/analytics/web/) tracking information directly from your WordPress dashboard.

It can also give your automatic tracking of Google Ads conversions, which is valuable and handy. Despite this, MonsterInsights is not a dedicated Google Ads plugin for WooCommerce. If you are a [heavy analytics](https://sweetcode.com/blog/woocommerce-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=google-ads-woocommerce) user, this might be a good supplementary plugin to have.
We'd suggest you could pair this with another dedicated Google Ads plugin, but be mindful of your budget. MonsterInsights is expensive, and you may get better value out of another dedicated plugin that focuses on Google Ads.
## Google Ads plugins for WooCommerce: Some honorable mentions
If none of these solutions work for your needs, you might want to consider some other available plugins. While you won't get an experience here that's similar to Pixel Manager for WooCommerce, it can fill in some of the gaps.
For example, [Conversios](http://Conversios.io) is more of a [Google Analytics tracker](https://sweetcode.com/blog/woocommerce-google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=google-ads-woocommerce), but does come with some robust Google Ads functionality too.

The free [Tracking Code Manager](https://wordpress.org/plugins/tracking-code-manager/) plugin also seems like a good solution on paper.

However, Tracking Code Manager doesn't offer the rich scope of a solution such as Pixel Manager for WooCommerce. What's more, it has [poor reviews and ratings](https://wordpress.org/support/plugin/tracking-code-manager/reviews/) from other WordPress users, so you'd want to investigate the plugin further before you commit.
In contrast, Product Feed PRO for WooCommerce does have good reviews on [WordPress.org](https://wordpress.org/support/plugin/woo-product-feed-pro/reviews/). This is another feed plugin that integrates Google Ads tracking functionality and comes with a comprehensive feature set.

## How to choose what Google Ads plugins you need
The Google Ads plugin you choose will depend a lot on your business needs as a store owner. For example, many small businesses don't have a marketing team. As such, a plugin can bring some efficiency to your ad creation process.
However, pixel integration is necessary to obtain data that gives you a greater set of insights. What's more, if you tailor your site based on direct user behaviors and feedback, you'll see a reward in the form of better conversions and greater income.
This is because pixels are a great way to monitor the traffic after it hits your site from Google Ads. If you measure the traffic and see how those users behave, you'll be able to optimize your site for even greater benefits.
Pixel Manager for WooCommerce is a surefire winner if you need to have the most accurate metrics available. Unlike other solutions, you also don't have a cumbersome setup process involving raw code entry. The plugin removes the margin for error that can cause costly and time-consuming mistakes.
## Conclusion: get started with Pixel Manager for WooCommerce today
Google Ads can help you get your products and services in front of more people than any other ad network. However, you'll want to benefit from a dedicated Google Ads plugin for WooCommerce if you want to optimize your strategy.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=google-ads-woocommerce) should be at the top of your shortlist. It offers advanced pixel tracking without the need for code or technical ability. If you want to get the most out of your Google Ads experience and optimize your marketing, it is one of the best plugins available today.
How many websites do you need the plugin for? Choose between 5 plans with the same pro features, ranging from 1 site to 25 sites. You can get started with a 14-day free trial or purchase now and benefit from a 30-day money-back guarantee with no questions asked.
---
# Why You Need a Tracking Code Manager for Your WooCommerce Website (And Which One You Should Choose in 2022)
URL: https://sweetcode.com/blog/tracking-code-manager
Date: 2022-09-06
Tags: google ads, conversion tracking, woocommerce
{`Why You Need a Tracking Code Manager for Your WooCommerce Website (And Which
One You Should Choose in 2022)`}

## TLDR
- Tracking codes help you to collect visitor data from your WooCommerce store and discover user behaviors. A plugin is the best way to set up and manage your tracking codes.
- [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager) provides comprehensive functionality, superior accuracy, and rich features. It's the best tracking code manager plugin on the market for WooCommerce.
Tracking codes are one way to collect user data for your e-commerce store. They're snippets you add to your site, which will help you discover more about how a user behaves on your site. By using tracking codes, you can answer questions essential to your campaigns, such as how your ads are performing, what demographic your ads are targeting, which items your customers are purchasing, how often carts are being abandoned vs how many customers make it to checkout, and so on.
A tracking code manager plugin enables you to manage all those codes from one place. The plugin mitigates or removes the need for technical knowledge when you want to add, edit, remove, and otherwise manage your tracking codes.
In this post, we'll explore why you should use a tracking code manager for your WooCommerce site. You'll find out why Pixel Manager for WooCommerce is the best tracking code manager available on the market, and how you get started with the plugin.
## Why tracking codes are important for your WooCommerce website
Although [WooCommerce](http://woocommerce.com) comes with the ability to track sales and customer behavior, it has rudimentary built-in functionality and is not suitable for advanced use cases. By adding tracking codes to your store, you have the option to collect much more data on how your visitors behave on-site.
Fundamentally, you can see how visitors come to your site. This is because you can add multiple tracking codes to your site that connect to a multitude of platforms. For instance, you can add codes for [Google Ads](http://ads.google.com), [Google Analytics](http://analytics.google.com), [Facebook ads](https://www.facebook.com/business/ads), [Microsoft ads](https://about.ads.microsoft.com/en-us), and many more.
You also get to track important actions, known as events, such as purchases, cart events, and almost any other action on your site. This gives you a way to study the [customer's journey](https://sweetcode.com/blog/woocommerce-google-ads-customer-lifetime-value-reporting/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager) throughout the lifetime of their visit.
Tracking codes let you understand how visitors interact with your site and which marketing strategies and campaigns work best. From there, you can use this information to improve your WooCommerce store, your marketing campaigns, and the customer journey on your site.
## Why you should use a tracking code manager plugin
While you can add tracking codes to your WooCommerce store manually, this requires some technical knowledge, such as coding, the structure of your WordPress site under the hood, and more. You will also have to factor in working time and maintenance of the code.
There are various reasons why a tracking code manager plugin is the best way to add tracking codes to your site:
- **Straightforward usability**. If you don't have technical knowledge, a plugin will be ideal. It lets you add and manage tracking codes to your store. What's more, you won't need to carry out a manual copy and paste across a multitude of fields.
- **You can save time with a plugin**. A good tracking code manager plugin will help you set up codes for multiple platforms within minutes. In contrast, a manual approach could take hours across various dashboards and platforms. Furthermore, it would take a developer over a year to implement all the features that advanced tracking plugins offer.
- **Better stability**. With a plugin, there's less chance of breaking your site. This is especially true if you don't have confidence in your technical skills. A plugin can offer greater safety than the manual approach. A plugin comes with regular updates to fix any identified bugs and to add new features you can utilize. These updates also ensure that the plugin remains compatible with the latest version of WordPress.
## Why Pixel Manager for WooCommerce is the best tracking code manager plugin
There are a few plugins and tools to help you add and manage tracking codes within WooCommerce. However, if you are looking for your first plugin or even an upgrade to your existing one, the choice can overwhelm you fast.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager) is our top pick because it offers accuracy and advanced functionality and is developed specifically for integration with WooCommerce. It should give you confidence that the data you collect is precise, accurate, and comprehensive.

Pixel Manager for WooCommerce is perfect for WooCommerce stores for a [number of reasons](https://sweetcode.com/docs/pmw/features/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager):
- You don't need any coding knowledge to install the plugin. There are also detailed instructions that will see you ready to rock in minutes.
- You're able to add tracking pixels for a number of different social media platforms, analytics tools, and other platforms. Front and center is Google, with options to add conversion pixels to [Google Analytics (GA4 and Google Analytics)](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager) and [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager). However, you can also add pixels to [Meta](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager), [Twitter Ads](https://business.twitter.com/en/campaign/welcome-to-twitter-ads.html), [Snapchat Ads](https://ads.snapchat.com/), [Pinterest Ads](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=Pixel Manager for WooCommerce&utm_medium=content-marketing&utm_content=tracking-code-manager), [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager), and [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager).
- To track leads as conversions, you'll use the plugin's dedicated shortcodes on the ‘Thank You' page a user redirects to after a form submission.
- Pixel Manager for WooCommerce also integrates with a lot of [privacy plugins](https://sweetcode.com/docs/pmw/consent-management/platforms/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager), such as and [Complianz](https://complianz.io/).
To explain this further, if a user hasn't yet enabled privacy consent on your site, the plugin will take them to a dedicated landing page. This lets the user give consent and change settings. From there, the page can take them back to your site. This is fantastic in order to comply with privacy directives such as GDPR.
What's more, your conversion rate could improve. Users who don't give consent won't be able to access any webpage on your site. A tracking code manager plugin such as Pixel Manager for WooCommerce is the only way you can properly manage data privacy requirements.
## What else Pixel Manager for WooCommerce can do for your store
Pixel Manager for WooCommerce also provides a number of 'quality of life' features and functionality. For example, the tracking code manager plugin will look to fix any issues with your tracking codes.
It will also generate reports that point to possible fixes for tracking problems. You'll also be able to learn more about how efficient your tracking is. This functionality is unique to Pixel Manager for WooCommerce, and you won't find it in other plugins.
Pixel Manager for WooCommerce also offers compatibility with other plugins too. This includes popular WooCommerce add-ons such as [Cartflows for WooCommerce](https://cartflows.com/), [WooCommerce Subscriptions](https://woocommerce.com/products/woocommerce-subscriptions/), and [WooCommerce Google Product Feed](https://woocommerce.com/document/google-product-feed/).
You could also use a dedicated feed plugin (such as [Google Merchant Center](https://www.google.com/retail/solutions/merchant-center/) or [Meta Catalog for Facebook](https://www.facebook.com/business/tools/shopping-catalog)) alongside Pixel Manager for WooCommerce. For example, you can enable dynamic remarketing on your e-commerce store and manage aspects of it from WordPress.
Other tracking code manager plugins are available for WooCommerce, but they don't offer the same depth of features as Pixel Manager for WooCommerce. For example, [WooCommerce Conversion Tracking](https://wordpress.org/plugins/woocommerce-conversion-tracking/) is popular, but doesn't offer a broad range of pixel integration. It also comes with poor ratings and reviews. [Tracking Code Manager by Data433](https://wordpress.org/plugins/tracking-code-manager/) is a similar solution. However, this also comes with a poor set of user reviews, and provides less options to integrate pixels.
You can choose monthly or annual billing for five different pro plans ranging from one site to 25 sites. If you need the plugin for even more sites, you can contact support@sweetcode.com to inquire about getting a bulk deal. Each plan gives you the entire feature set of Pixel Manager for WooCommerce. What's more, you have the best accuracy, the deepest functionality, and the richest flexibility at your disposal.
## How to Get Started with Pixel Manager for WooCommerce
Next, let's show you how simple it is to set up and use Pixel Manager for WooCommerce. In general, WordPress offers a simple way to [install and activate plugins](https://sweetcode.com/docs/pmw/setup/plugin-installation/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager) on your site.
### Installation and Activation
Select the plan that suits your needs best. You can pay right away, or opt for a 14-day free trial. You'll receive a license code and a ZIP file for the plugin.
Once you have your plugin ZIP file, head to the Plugins page within WordPress. Here, you'll spot the Add New link at the top of the screen:

This will bring you to the [WordPress Plugin Directory](http://wordpress.org/plugins/) interface on your dashboard. Here, choose the Upload Plugin button at the top of the screen, which will open up an uploader dialog. You can search for the plugin ZIP file on your computer, then choose Install Now:

You might see another dialog screen to activate the plugin here. If not, head to the Plugins screen again and click on the relevant link:

From here, you can begin to set the plugin up. We'll cover this next.
### Setting Up Pixel Manager for WooCommerce
Once you activate Pixel Manager for WooCommerce, you'll come to the WooCommerce > Pixel Manager screen and rest on the Main tab:

You'll spot red notifications for each field here. This means you'll need to grab the Conversion ID and Conversion Label from [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager), then enter them here. Here are the brief steps:
- Log into Google Ads.
- Open the Conversions > Purchase page, then select the Use Google Tag Manager button under the Tag setup section.
- From here, you'll see the Conversion ID and Conversion Label values.
From here, head back to WordPress and enter these values within the _WooCommerce > Pixel Manager > Main_ screen and save your changes:

To add a pixel to your site, you'll want to add the corresponding pixel ID for the platform you'd like to track. Each platform will have its own method to do this, but most will use an Events Manager screen (for example, Facebook and Twitter do.) We have detailed guidance on how to find the pixel ID for each platform you connect to.
However, once you have the ID, head to WooCommerce > Pixel Manager within WordPress. From the Main tab, select either Meta (Facebook) or more pixels. This will bring up a selection of boxes for different platforms.

Here, add the pixel ID to the field and save your changes. You'll see the _inactive_ notification change to _active_. At this point, you'll have completed the setup process, and can carry out the same steps for any of the other supported platforms.
## Manage your tracking codes with Pixel Manager for WooCommerce
A tracking code manager plugin makes it possible to collect valuable data on your WooCommerce store's visitors. This gives you a way to see where your users come from, and how they behave once they begin to browse your store.
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=tracking-code-manager) is one of the best tracking code manager plugins available. You can use it to set up tracking pixels on your site for lots of different platforms. You'll collect and store all of this data through the plugin. Pixel Manager for WooCommerce also provides unmatched data accuracy, and a richer feature set compared to the competition. It's also simple to set up and use and supports all major pixel solutions.
Pixel Manager for WooCommerce offers unmatched value for its price, and comes with a 30-day, money-back guarantee – no questions asked. [Choose your plan](https://sweetcode.com/plugins/pmw#pricing-section) to start managing your tracking codes today.
---
# How to set up conversion tracking for Google Ads on your WooCommerce store (step-by-step)
URL: https://sweetcode.com/blog/woocommerce-google-ads-conversion-tracking
Date: 2022-09-05
Tags: google ads, conversion tracking, woocommerce
{`How to set up conversion tracking for Google Ads on your WooCommerce store
(step-by-step)`}

## TLDR
- If you have a WooCommerce business and you're running Google Ads, you should be tracking conversions. This is the best way to measure the success of your ad campaigns
- If you don't do this, it's much harder to optimize your campaigns, increase your conversion rate, and control your return on investment.
- [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking) is one of the most effective tools to monitor your marketing efforts, as it accurately tracks your data on a simple and user-friendly interface.
Considering Google is the most frequently used website and search engine, it's no surprise that advertising on Google can boast some impressive results. While it's a powerful platform for digital marketing, it's also saturated, as there are millions of people trying to get their ads in front of people using [Google Ads](https://ads.google.com/).
The best way to get an edge over your competitors is by using conversion tracking to monitor your ads' performance. By doing this, you're able to better understand what is and isn't working for your business when it comes to ads. If you can see precisely what you're doing right, you can put more focus and budget into that aspect of your campaign, resulting in better conversions over time.
Setting up conversion tracking for Google Ads isn't as difficult as you may think, but there are a few crucial steps that you need to take to ensure your conversion tracking is working as it should, and you're getting the most accurate results possible.
If you already have a WooCommerce store and want to better understand how it is performing, then this step-by-step guide on how to track conversions with a plugin will be an invaluable part of your WooCommerce journey.
Let's get started.
## Why should you track Google Ad conversions?
Conversion tracking is incredibly beneficial for any online store as it gives valuable insight into your business' ad performance. Running ads isn't cheap. Not having a way to monitor the success and statistics of your ads is a costly mistake, as you're essentially playing a guessing game as to how well your ads are performing.
Sure, you may notice a few extra sales here and there, but without seeing the finer details of your conversions, you have no way to measure your Google Ads performance. Having the ability to look at customer behavior when it comes to your ads by using a simple WooCommerce plugin lets you put your focus where it matters.
Let's say you have your conversion tracking set up. You begin to notice that one ad for the same product is performing significantly better than others; this could be from CTR (click-through rate), time spent watching or reading your ad, or simply adding to carts or sales that came from that ad alone. Once you have this valuable insight, you decide to ditch the ads that aren't performing well and put all that wasted expense into the successful ad, multiplying these good numbers exponentially.
What we've just mentioned (running multiple ads) is an ad testing technique known as A/B testing. Without the means to track your conversion, A/B testing wouldn't exist. A/B testing can be applied to virtually any ads: video/image ads, text ads, or even product thumbnails.
Having the option to test different ads and gain insight into who is interested in which one can save you a lot of time and money – and get your business scaling quickly.
## How can you track Google Ad conversions for your WooCommerce store?
Considering we're talking about Google Ads, let's take a look at [Google Analytics](https://analytics.google.com/analytics/web/), a simple and user-friendly tool that allows for easy monitoring and conversion tracking for WooCommerce.
Some useful features of Google Analytics include currency conversion, funnel analysis, and general conversion tracking tools. This is not a conversion tool for Google Ads specifically, but more of an overall website analytics tool. Monitoring conversions when using Google Ads is done separately.
When solely using Google Ads for ads and conversion tracking, you can monitor general conversions like app downloads or in-app purchases from [Google Play](https://play.google.com/) without needing a specific tracking code. Google Ads also has its own inbuilt tracking feature to keep things streamlined and efficient, but this comes at a cost: It's complicated to set up and requires a specific tracking code to be used (this can be accessed within the Google Ads Conversion Settings). Another mishap that can happen when using Google Ads as a standalone conversion tracker is the duplication of conversion data.
Due to the possible limitations and annoyances of Google Ads, we highly recommend using a tracking pixel to track Google Ads conversions. This is the only way to accurately track conversions while avoiding the headaches associated with alternative conversion tracking methods.
Some useful advantages of using a tracking pixel:
- A pixel lets you see cart items in a more granular view of cart value and revenue calculation.
- Pixels provide enhanced conversion tracking data. This gives you a deeper understanding of what is and isn't working with your ads and website.
- Pixels provide far more accurate data overall. Considering the entire purpose of conversion tracking is to gain accurate, beneficial data, it's no surprise that using the most accurate solution to find this data is a wise decision. Linear, sub-par conversion tracking tools tend to under or overreport conversions which provides nothing useful to those monitoring conversions in a business.
- Using a tracking tool you can rely on and built specifically for monitoring conversions is a vital business decision for businesses that wish to scale through online advertising.
It's worth keeping in mind that it's impossible to track 100% of conversions with pixels. This is especially due to that trackers can be blocked for various reasons. Users could visit from a browser with strict privacy settings, or use privacy-enhancing browser extensions. Cookie Management Systems could block conversion trackers, too.
## Track Google Ads conversions with Pixel Manager for WooCommerce
Having a way of tracking pixels on your website allows you to gain invaluable information about your website's visitors and customers such as how long they spend on your site, what they click on, their purchase events, the demographics that respond to your ads, and a lot more useful insights.
An excellent plugin that provides pixel tracking is [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking). This plugin integrates seamlessly with your WooCommerce store and provides all the aforementioned benefits of using a pixel. These are the key benefits of using Pixel Manager for WooCommerce:
- Very easy setup. No hurdles or difficult steps are required to start your conversion tracking. The plugin was created for performance marketers who want to get started quickly.
- Includes all advanced pixel features that you would expect from a top-of-the-line Pixel Manager.
- Allows monitoring of all pixels from multiple ad hosting and website hosting platforms. These include [Google Ads](https://sweetcode.com/docs/pmw/plugin-configuration/google-ads/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking), [Meta (Facebook) Pixel](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking), [Google Universal Analytics](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking) and [Google Analytics 4](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking), [Microsoft Ads](https://sweetcode.com/docs/pmw/plugin-configuration/microsoft-advertising/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking), [Twitter](https://ads.twitter.com/), [Pinterest](https://sweetcode.com/docs/pmw/plugin-configuration/pinterest/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking), [TikTok](https://sweetcode.com/docs/pmw/plugin-configuration/tiktok/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking), and [Hotjar](https://sweetcode.com/docs/pmw/plugin-configuration/hotjar/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking).
- Optimized for WooCommerce for easy integration and usability on your WooCommerce store.
- It is the most accurate conversion tracking plugin available for WooCommerce. It even has solutions for inaccuracies you could get with tracking pixels.
- For example, for Google Analytics, the Pixel Manager for WooCommerce uses the Google Analytics Measurement Protocol to send purchase conversions, which ensures the tracking accuracy is 100%
- It also offers compatibility with the Facebook CAPI so you can increase tracking accuracy for your Meta ads.
## Pixel Manager for WooCommerce: the best Google Ads conversion tracking plugin
By now, you likely understand the benefits of having a form of high-quality conversion tracking. We also know now that Pixel Manager for WooCommerce is a top-end conversion tracking tool that outshines many alternative conversion tracking solutions.
Let's look at the simple steps that go into setting up Google Ads conversion tracking with this Pixel Manager plugin.
First things first, you'll want to create new conversions in Google Ads.
1. Head over to Google Ads, sign in, open **Tools and Settings** menu in the top nav, and then open the **Conversions** section under the **Measurements** tab.

2. Initiate a new **Conversion Creation** by clicking the **New conversion action** button.

3. Choose conversion type **Website**

4. Scan your domain

5. Manually create a conversion

6. Configure the Google Ads conversion settings
Use the following default settings. Only change if you know what you're doing.
- Category: **Purchase**
- Conversion name: **Purchase**
- Value: **Use different values for each conversion**
- Set up using: **Event snippet** (not Google tag. Google Ads only shows this option in newer accounts.)
- Default value: **zero**
- Count: **Every**
- Attribution: **Data-driven**

7. You'll then find your Google Ads Conversions ID and Google Ads Purchase Conversion Label from the Google Tag Manager tab. You need to add both of these in Pixel Manager for WooCommerce, so re-open the plugin settings in your WordPress site admin panel and add them in the correct fields under the ‘Main' tab.

## Tracking conversion data
Now that you've got a conversion set up, how exactly do you track conversion data? Say you're making sales, and you want to know how many items have sold; you want a way to measure revenue and profits from your ads, and want detailed reports on cart size and average order value – this is all done with conversion tracking.
Let's look at tracking conversion cart data as an example. Setting this up is simple and only requires a couple of minor steps to get you on your way to tracking conversions.
1.Find your **Google Merchant ID** in the URL after you log into the Google Merchant Center.
2. Open Pixel Manager for WooCommerce in your WordPress dashboard and enter this **Google Merchant ID** in the **Conversion Cart Data** field in the settings under > Advanced > Google.

That's it. You're now tracking conversion cart data.
## Setting up enhanced conversions
You can also use Pixel Manager for WooCommerce to set up enhanced conversions. This is quite a powerful tool that can help boost the accuracy of your conversion measurement. It's not a standalone feature, but more of a supplement to your existing conversion tags. It works by sending hashed first-party conversion data from your shop in a private, safe way.
To set up enhanced conversions, follow these simple steps:
1. Check that you comply with Google's [customer data policies](https://support.google.com/adspolicy/answer/7475709)
2. Accept the customer data terms: **Google Ads account > Tools & Settings > Measurement > Conversions > Settings > Accept customer data terms**.
3. Enable enhanced conversions in your purchase conversion: Open your Google Ads account > Tools & Settings > Measurement > Conversions > Edit your purchase conversion > Open the enhanced conversions tab and save the settings.
4. Diagnostics Report: After 72 hours you will receive a [diagnostics report](https://support.google.com/google-ads/answer/11956168) for enhanced conversions on the conversion action.
## Track Google Ads conversions with Pixel Manager for WooCommerce
If you've come this far, you probably realize just how important accurate conversion tracking for your ecommerce store. Not knowing who's clicking on your ads or what tasks users are performing means you're taking a shot in the dark with every ad you make.
A simple yet potent pixel manager plugin can be the difference between a successful WooCommerce store and a failed one.
It's safe to say that Pixel Manager for WooCommerce is a great option for anyone that wants to better understand their conversion performance and optimize their ad budgeting accordingly.
One look at this list of benefits and it becomes clear just how useful this plugin can be.
- Track all your favorite tracking, analytics, and marketing tools via one plugin. There are not many plugins out there that have this impressive capability.
- Pixel Manager for WooCommerce is designed around privacy. You can configure it to work seamlessly with your privacy stack.
- It helps in combating the major disadvantages of Google Ads' in-built conversion tracker, which is accuracy.
- Reviews. This plugin has a plethora of 5-star reviews that boast its effectiveness and user-friendliness. Check out a couple of the testimonials displayed on Pixel Manager for WooCommerce's official site:
_"Very easy to setup and it just works. A lot better than most pixel plugins." - Sander5 on wp.org_
_“Just drop your many tracking plugins and code snippets and start using Pixel Manager for WooCommerce right now!” - techedge on wp.org_
If you're in the market for a leading pixel manager to take the stress out of conversion tracking and help you point your business in the right direction, why not try out [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-ads-conversion-tracking#pricing-section) in your store? Select your plan to get started today and benefit from a 30-day money-back guarantee.
---
# How To Set up Conversion Tracking for Your WooCommerce Shop: A Complete Guide
URL: https://sweetcode.com/blog/conversion-tracking-woocommerce
Date: 2022-08-16
Tags: general
{`How to set up conversion tracking for your WooCommerce shop: a complete
guide`}

## TLDR
- Conversion tracking is the process of measuring how many visitors complete a desired action - like signing up for a newsletter or completing a purchase - while browsing your site.
- Conversion tracking is also essential to understand customer behavior, which parts of a WooCommerce website are working well, and which ones need improvement.
- The easiest way and most powerful way to track conversions is with a plugin - like Pixel Manager for WooCommerce - which is capable of capturing the data you need without the use of code and with extremely accurate results.
In the world of e-commerce, conversions are always a hot topic as they are the backbone of a successful business. You may have all the web traffic in the world, but if they aren't converting in any way, then there is no real benefit for your ecommerce store.
You'd maybe like to have more newsletter sign-ups or simply more completed checkouts and overall sales. Whatever the goal, you want to convert these store visitors into customers, now or in the future. But how do you know what these people are doing on your online store? Are they buying or merely opening your home page for a matter of seconds before moving on? The way to find out is simple: conversion tracking.
In this article, we walk you through step-by-step how to set up conversion tracking on your WooCommerce store.
## What is conversion tracking?
Conversion tracking in WooCommerce must be harnessed to achieve e-commerce success. It is a powerful tool that allows businesses to better understand what parts of their store are leading to more conversions and what parts could be adjusted to achieve the conversions they're looking for. A healthy conversion rate is the end goal for most WooCommerce sites.
The analysis of conversion data is paramount in any ecommerce business. Without it, you simply can't see what your store visitors are doing. Being able to track a user's behavior allows you to better understand the thought processes customers go through when browsing your store, and see precisely what parts of the website are driving conversions.
As time goes on, more and more analytics are accumulated, further solidifying your understanding of what you are doing right and what elements could be improved or adjusted. This important information allows you to put your time and resources into what matters most for your online business.
## How do you track conversions in WooCommerce?
You can track conversions in WooCommerce in various ways. For example, tech-savvy users or software developers can use code. This approach has many steps and requires some expertise. The easiest and most recommended way is to use a plugin specifically designed for conversion tracking.
WooCommerce conversion tracking plugins are easy to set up, highly effective, and very user-friendly. They have everything you need to help you monitor your conversions as well as other useful tools to assist you in your e-commerce journey. A plethora of plugins are available on the market, but one notable option is [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-woocommerce).
One of the reasons why this plugin is a great option is its seamless implementation of tracking pixels from many platforms: Google Ads and Google Analytics Universal Analytics, Google Analytics 4, Meta (Facebook) Pixel, Microsoft Ads, Twitter, HotJar, and Pinterest to name just a few.
In addition, Pixel Manager for WooCommerce has gained notoriety in the conversion tracking world because it also offers:
- ease-of-use, particularly for those new to conversion tracking or pixel management
- an in-depth, performance-focused design that enables users without prior coding skills to integrate their tracking pixels seamlessly
- support for all previously mentioned platforms, as well as other advanced features that allow for a custom experience depending on your needs (e.g. privacy features, language translation, or custom variables mapping)
- no slowing down of website loading speeds
- impeccable and reliable accuracy
- reasonable pricing to benefits ratios
## How do I set up conversion tracking using Pixel Manager for WooCommerce?
Over the years, countless claims have been made that conversion tracking is difficult to set up, particularly with those using Meta Pixels or Google Analytics.
Pixel Manager for WooCommerce is a [refreshing change of pace when it comes to conversion tracking](https://sweetcode.com/blog/pixel-manager-now-on-the-woocommerce-marketplace?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-woocommerce). This plugin is simple and easy to use to ensure you'll be able to track conversions sooner than later. Thanks to its user-friendliness and simple UI, you'll avoid common frustrations often associated with pixel management and setup.
Follow along with these guides and you'll be tracking your conversions with Pixel Manager for WooCommerce in no time.
**Note:** The most current version of WooCommerce is required to use the plugin.
**Step 1:**
1. Select the Pixel Manager for WooCommerce plan you wish to use. You can purchase your [plan](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-woocommerce#pricing-section) right away, or opt for a 14-day free trial. Once you've completed this process, check your email for your download link.
2. Follow the instructions in this email until you've completed the download and activated the plugin.
**Step 2:**
1. Head to your WordPress plugin directory.
2. Click **Add New** at the top of the page.

**Step 3:**
1. Click the **Upload Plugin** button at the top of the page.
2. Click **Choose file**. Find your recently downloaded Pixel Manager for WooCommerce plugin and select **Install Now**.

**Step 4:**
1. Now that the plugin has been installed and activated, you need to add your Google Ads conversion ID and conversion label. You'll find both values in the Google Ads conversion tracking code.
2. To find these, log in to your Google Ads account and navigate to **Tools and Settings > Measurement > Conversions**.

**Step 5:**
1. If you haven't created the conversion in Google Ads yet, initiate a new conversion action. When asked what kind of conversions you want to track, select 'Website'. Then, enter your domain when prompted and it will be scanned.
2. You will then have two options: 'Create conversion actions automatically from website events' or 'Create conversion actions manually using code'. Select the second option.
3. Configure the Google Ads conversion settings using these details. It is recommended that you don't change these settings unless you know exactly what you're doing:
- **Category**: Purchase
- **Conversion name**: Purchase
- **Value**: Use different values for each conversion
- **Set up using**: Event snippet (not Google tag. Google Ads only shows this option in newer accounts.)
- **Default value**: zero
- **Count**: Every
- **Attribution**: Data-driven

**Step 6:**
1. Once you have your **Google Ads Conversion ID** and **Google Ads Purchase Conversion Label** from the **Google Tag Manager** tab in the conversions section of your Google Ads account, you need to go back to your WordPress site admin panel and go to **WooCommerce > Pixel Manager** and then add your Conversion ID and Purchase Conversion Label into their respective fields.

That's it for setting up your new Pixel Manager on your WooCommerce account. Now it's time to go through the simple integration of third-party analytics in your Pixel Manager for WooCommerce. We'll be using Google Analytics in this example.
Integrating your Google Analytics into your new Pixel Manager allows you to utilize the benefits of Google Analytics within your WooCommerce store. Being able to track your conversion metrics is a fundamental reason for using pixels in the first place. Monitoring key metrics like add-to-cart clicks, conversion rates, cart abandonment rate, traffic sources, completed checkouts, and average order value is something you'll want to keep an eye on when using your conversion tracking plugin.
This visual guide shows you how to create a new Google Analytics property and how to retrieve the relevant property IDs for your Pixel Manager for WooCommerce.
Head to your Google Analytics account to get started.
**Step 1:**

Navigate to your Google Analytics dashboard and head to the Admin section of the website. Find the **Property** section and click **Create Property**.
**Step 2:**

1. Once on the property creation page you will want to add your base settings: **Property name**, **Reporting time zone**, and **Currency**.
2. Click **Show advanced options**.
3. Enable **Create a Universal Analytics property**.
4. Enter the URL of your shop in the **Website URL** section.
5. Select **Create both a Google Analytics 4 and a Universal Analytics property**.
6. If using the pro version of the plugin, check **Enable enhanced measurement for Google Analytics 4 property**.
7. Click **Next**.
**Step 3:**

Click **Create** at the bottom of the page.
**Step 4:**

1. Copy and paste the **Measurement ID** into the **GA4 input** in your Pixel Manager for WooCommerce.
The GA4 **(Google Analytics 4)** input field can be found in the **Main** tab of your Pixel Manager for WooCommerce.

## Tips and best practices when it comes to conversion tracking
- Including relevant keywords for your business in your link URLs allows Google to better understand what your pages are about and helps it rank your pages accordingly.
- Utilizing event-based goals helps you track desired actions taken by your website's visitors like newsletter sign-ups, adding items to their cart, or completing checkout.
- Using goal funnels helps you track how many visitors reach the desired endpoint in a multi-step process, e.g. checkout or signup. (This is particularly useful if you use an affiliate program.)
- When using Google Ads, making sure you check your search terms report gives you an understanding of what search terms your website visitors were using before they saw your ad. This is a powerful tool as it reiterates what keywords you should be focusing on and trying to include in your content.
- When using Google Ads or other popular ad platforms, using split testing helps you gain further conversion tracking metrics. Split testing is the act of testing multiple ads for the same product or service (usually low ad spend budgets) to understand which ad is performing better. Checkouts, add-to-cart, and cost per click are some of the primary metrics you want to pay attention to when split testing.
## Conclusion
Now that you've got your new Pixel Manager for WooCommerce plugin up and running, you're ready to start tracking conversions. This will open your business up to a world of new, important information which will allow you to really get the ball rolling with your business.
For example, you'll be able to harness the bad analytics and use that important information to improve your website where necessary. If you notice something going well with your conversions, use this learning to optimize your future campaigns.
Conversion tracking gives you the ability to know precisely what's performing and start to better understand why these things are working for you.
Built by professional performance marketers, Pixel Manager for WooCommerce has been crafted with e-commerce businesses in mind, with the objective of simplifying pixel management and conversion tracking. It is a truly user-friendly tool and a highly accurate tracking solution.
As you've seen in our tutorial, the plugin is simple to set up and configure. In addition, it can seamlessly support all major pixel solutions so that, no matter what solution you're using or choose to use, you'll be able to easily integrate it into your new plugin without all the fuss that usually accompanies this task.
Pixel Manager for WooCommerce [offers a 30-day money-back guarantee](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=conversion-tracking-woocommerce#pricing-section), so you can test it out risk-free. As far as enhanced ecommerce tracking is concerned, this is a plugin that should be on everyone's radar!
---
# Integrating the Facebook Pixel for Accurate Tracking on Your Woocommerce Shop: A Complete Guide
URL: https://sweetcode.com/blog/facebook-pixel-woocommerce
Date: 2022-08-16
Tags: general
{`Integrating the Facebook Pixel for accurate tracking on your WooCommerce
shop`}

## TLDR
If you run a WooCommerce business and use Facebook Ads you need to know that:
- The performance of Facebook Ads needs to be measured, including on your WooCommerce site
- There are various ways of tracking the success of a Facebook Ad campaign
Read on to learn how to do this easily and seamlessly with Pixel Manager for WooCommerce.
Are you a WooCommerce store owner looking for ways to improve your Facebook advertising? If so, you may be wondering how to track conversions and sales accurately. One of the best ways to do this is by using the [Facebook Pixel](https://www.facebook.com/business/learn/facebook-ads-pixel), a small piece of code that you add to your website which helps Facebook track how people interact with your store.
Gaining insights about people's activity on your website is the first step toward conversion optimization. In this article, we'll show you how to set up the Facebook Pixel on your WooCommerce shop and how to use it to improve the efficacy of your advertising.
## What is the Facebook Pixel, and what are the benefits of using it?
The Facebook Pixel is a piece of code that you add to your website in order to track conversions and measure the effectiveness of your Facebook advertising. When someone visits your website after clicking on one of your ads, the Facebook Pixel will automatically drop a cookie on their computer.
This will allow Facebook to track whether or not that person later converts on your website. If you're running a WooCommerce shop, adding the Facebook Pixel is a must-do if you want to accurately track your ecommerce's performance
## How does it work?
The Facebook Pixel tracks the activity of people who have visited your website after clicking on one of your Facebook ads. It then reports how many of these website visitors completed an action on your ecommerce store, like a purchase or the completion of a form. This information can help you to understand the success of a Facebook advertising campaign and make adjustments to improve your results.
Adding the Facebook Pixel to your WooCommerce shop is very easy, no coding knowledge is required to install it. You will just need to copy and paste a snippet of code into your website's header. If you're not sure how to do this, then your web developer can help you out.
## Benefits of using the Facebook Pixel
There are many benefits to using the Facebook Pixel on your WooCommerce shop. Some of the key benefits include:
### Create custom audiences for better targeting.
Wouldn't it be wonderful to be able to target your adverts to those who have previously expressed interest in your business?
You can indeed achieve that with pixel-based custom audiences.
Retargeting previous customers and urging them to make more purchases will undoubtedly boost your conversion rate and your revenue.
Aside from that, audiences have varied product interests unless you sell a single product. Audience behavior in your business may vary even if you just sell one product.
You may also target different audience segments with customized audiences based on the Meta Pixel data and the items they are interested in.
For example, you may want to target those who have visited your website but never made a purchase. You can also target people based on the pages they have viewed on your website.
### Measure the effectiveness of your Facebook campaigns
Just as importantly, you can use Pixel data to assess and optimize the effectiveness of your Facebook campaigns.
You can track how many people saw your ad, how many clicked on it, and how many made a purchase as a result.
This data will help you to better understand what is working and what isn't with your Facebook campaigns so that you can make necessary changes. The costs of ads can quickly mount, so making sure that your campaigns are as effective as possible is key. Imagine if you could cut down on wasteful spending by optimizing your campaigns.
Tracking ad attribution to conversions on your WooCommerce site is key to determining exactly which advertisements work and which don't in order to allocate your advertising money wisely and get better results. Using the metrics from past campaigns is also important to plan your upcoming promotions.
Additionally, you may examine your effectiveness with various audience subgroups based on their demographics, locations, and devices. You can improve your audience targeting by doing this.
For instance, if you launch a campaign with five distinct ad sets but only one of them generates sales for your WooCommerce store, you may pause the others and scale the top-performing one. You may also focus just on your effective advertising by going down to the level of the ad.
You should make use of the vital information that Meta Pixel gives you about the effectiveness of your ads to enhance your current and upcoming campaigns.
### Dynamic product ads
Facebook dynamic product ads are a type of ad that allow you to target people who have visited your website with ads for products they viewed on your website. This is an incredibly powerful way to market to customers as it allows you to create a custom audience based on their prior interactions with your company.
You can achieve it with the aid of Meta Pixel. Visitors who clicked on goods and even added them to their shopping carts but did not finish the transaction will have their information recorded.
If you configure your catalog, you may utilize the information supplied by your Meta Pixel to run dynamic product advertisements that display the exact same items these customers left in their abandoned carts in an effort to persuade them to make the purchase.
Dynamic product ads have been found to be incredibly effective at recovering lost sales. They are also great for increasing the average order value of your customers.
### Track conversions and ROI
The Facebook Pixel can help you track not just ad clicks but also website purchases and other actions taken on your site that result in a conversion.
This data is essential for measuring the return on investment (ROI) of your Facebook ad campaigns. In order to calculate ROI, you need to know how much money you've spent on ads and compare it to the value of sales generated by those ads.
By tracking website purchases, you can attribute a value to each conversion and determine the exact ROI of your Facebook ad campaigns. Doing so will allow you to make better decisions about where to allocate your advertising budget in order to get the most bang for your buck.
### Create lookalike audiences
One of the great things about the Facebook Pixel is that it can be used to create lookalike audiences.
A lookalike audience is a group of people who are similar to an existing customer base but who have not yet interacted with your company. This is an incredibly valuable way to expand your reach and find new customers.
The Facebook Pixel can help you create a lookalike audience by providing you with data on the interests and demographics of your current customers. With this data, Facebook can find people who share similar interests and demographics to those of your current customer base.
This is a great way to find new potential customers who are likely to be interested in your products or services.
### Optimize your website for better performance
The Facebook Pixel can also help you to optimize your website for better performance.
By using the data from the Facebook Pixel, you can determine which pages on your website are performing poorly and need improvement.
You can also use Pixel data to determine the most effective placements for your Facebook ads.
This information will help you to improve the overall performance of your website and increase the number of sales it generates.
## How do I set up the Facebook Pixel (Meta) on my WooCommerce site?
In this section, we will discuss how to set up the Facebook Pixel (Meta) step-by-step on your WooCommerce site.
**First, you need to have a Facebook Business account.** This is very important. A Facebook business account and a personal account are two different things. If you don't have one yet, follow this guide:
1. Go to business.facebook.com/create and select Create Account.
2. Enter your name and confirm your identity with Facebook login credentials.

3. Follow the prompts to create your business account.
**Next, you need to create a Facebook Pixel account if you don't have one. **
1. Go to https://www.facebook.com/ads/manager/pixel
2. Click on the "Create a Pixel" button.

For the Pixel you're going to make, you may choose a name. To make the setup process simpler, you may also give your website name here. Adding your domain name to the pixel name is also highly advisable as it will be easier for your future co-workers and agencies to understand to which account a pixel belongs.
Be aware that by clicking the Continue button, you are consenting to Facebook's terms.

Before moving on, it is best to carefully read the terms if you have any questions.
4. If you have an existing pixel, you can also find it by going to Ads Manager and selecting Pixels under the Measure & Report column.
5. If you have any questions while creating your pixel, you can find help by clicking on the question marks next to each step.
**Now, on to setting up your pixel on WooCommerce!**
1. The first step is to go to Facebook Events Manager, where you see Partner Integrations.
2. Choose "Add code using Partner Integrations".

3. Scroll down to find WooCommerce.

4. Your WooCommerce store may now be connected, and you'll be prompted by Facebook with on-screen instructions.
Another option is to manually add your website code. Be aware, however, that this poses a risk; it can break your website if done incorrectly.
Thankfully, there is an easier and more effective way to integrate Facebook Pixel with your WooCommerce site and get the most out of it: using a free plugin like Pixel Manager for WooCommerce.
## Easily integrate the Facebook Pixel in WooCommerce with Pixel Manager for WooCommerce
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-pixel-woocommerce) is a plugin that allows you to manage the Facebook Pixel and its data on your WooCommerce site with ease. It was created with the idea of providing an easier and more accurate way for online store owners to collect and use the Facebook Pixel data to improve their sales funnel and marketing strategies.
For example, with Pixel Manager for WooCommerce, you can:
- Create Custom Audiences and Lookalike Audiences directly from your WooCommerce data.
- Track purchase events from every customer who lands your store from Facebook Ads, and other platforms too.
- Retarget customers who have abandoned their carts or viewed specific products on your site.
- Import product data into Facebook Ads to create dynamic ads and more!
The premium version is packed with key features, such as:
- Advanced order duplication prevention
- [Conversion API (CAPI)](https://sweetcode.com/docs/pmw/plugin-configuration/meta/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-pixel-woocommerce)
- Tracking accuracy reports
Install Pixel Manager for WooCommerce in a few easy steps:
**First, get The Facebook Pixel ID from your page.**
**Note:** Follow this step only if you have an existing pixel. If you don't, follow the steps above (how to set up my Facebook Pixel)
1. To get your Pixel ID, go to your Facebook Ads Manager

2. Select Events Manager, then “All Tools”

3. Click on the “Copy Pixel ID” button and paste it into the Pixel ID field in the Pixel Manager for WooCommerce plugin settings.

**Next, install the plugin and activate it.**
1. On your WordPress site, go to Plugins > Add New. Search for “Pixel Manager for WooCommerce” and install the plugin.
2. You can find the plugin settings under WooCommerce > Settings > Integration.
3. Enter your Facebook Pixel ID and you've now successfully installed the Facebook Pixel on your WooCommerce site!

After installing and activating the plugin, you will need to enter your pixel ID in the settings area. You can find the settings area by going to WooCommerce > Settings > Pixel Manager for WooCommerce.
That's it! You're now ready to start tracking your website data with the Facebook Pixel to improve your marketing strategies.
### Use Pixel Manager for WooCommerce to get the most out of the Facebook Pixel
Now that you know how to install the Facebook Pixel on your WooCommerce shop and you installed Pixel Manager for WooCommerce, you're probably wondering how to get the most out of it. Here are some tips:
### Use event tracking to track specific actions on your site.
With event tracking, you can track things like add-to carts, purchases, and lead generation. Sweetcode's Pixel Manager automatically adds the necessary code for the most popular events, so you don't have to worry about it. This will help you to see which actions are most effective in driving sales and leads.
### Create custom audiences for retargeting.
By creating custom audiences, you can target people who have visited your site or taken a specific action on your site. This is a great way to reach out to people who are already interested in your products or services.
### Use the Facebook Pixel to create custom conversions.
If you have a specific goal that you want to track, such as signing up for a newsletter, you can create a custom conversion tracking pixel for that goal. With Pixel Manager, you can easily use shortcodes to track these custom events ([check this guide for help](https://sweetcode.com/docs/pmw/developers/shortcodes/)). This will help you to see how effective your marketing efforts are in driving that goal.
### Experiment with different ad placements.
Not all ad placements are created equal. Try experimenting with different placements to see which ones work best for your shop.
### Use the Facebook Pixel data to create targeted ads.
By using the data from the Facebook Pixel, you can create targeted ads that are more likely to be successful. This data can also help you to fine-tune your targeting criteria for future ads.
## Conclusion
Integrating the Facebook Pixel into your WooCommerce shop is a great way to track your website traffic and conversions. By doing so, you can ensure that your advertising campaigns are effective and provide you with the most accurate data.
Not only that, but you can take advantage of its key benefits, such as creating custom audiences and retargeting, measuring the impact of your ads on sales, tracking conversions, and more.
Finally, there is no other plugin like Pixel Manager for WooCommerce that can help you with the Facebook Pixel integration on your WooCommerce shop. Although the Facebook Pixel is a powerful tool itself, it lacks the ability to properly manage and configure it for a WooCommerce shop. Pixel Manager fills that gap and makes the integration process much easier.
It has all the features you need to get the most out of this powerful tool, such as filters to fine-tune your Pixel data, conversion tracking for different types of products, and more.
This will make you more confident in your marketing decisions and help you improve your WooCommerce shop's performance. Check out [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-anager-for-woocommerce&utm_medium=content-marketing&utm_content=facebook-pixel-woocommerce#pricing-section) today and see for yourself how it can help you take your business to the next level.
---
# Are all Payment Gateways created equal?
URL: https://sweetcode.com/blog/are-all-payment-gateways-created-equal
Date: 2022-08-06
Tags: general, accuracy

## TLDR
Are all payment gateways created equal?
No, they are definitely not. And you will be surprised, maybe even shocked, how relevant this is.
- Deteriorated tracking accuracy caused by payment gateways is a bigger problem than most shop owners and campaign managers are aware of.
- We implemented a new diagnostics section that gives more profound insights into tracking accuracy and reveals tracking gaps.
- The Pixel Manager for WooCommerce is the only tool that gives you access to this type of data.
## Why we care
Since more than a year ago, the Pixel Manager has contained a payment gateway tracking accuracy report in the debug section of the plugin. We created this because, time and again, users reported issues that, after thorough analysis, revealed that the payment gateways were causing those problems.
Deteriorated tracking accuracy, when not all orders are correctly tracked, can create a lot of additional issues:
- Paid ads campaigns can't be optimized efficiently, leading to lost revenue and opportunity.
- Otherwise profitable campaigns are being turned off.
- Business decisions based on analytics data that is incomplete or inaccurate can be wrong and go in the wrong directions.
Not all payment gateways do cause problems. That's why we needed a way to track those problems more closely to pinpoint the causes better and get an idea about the severity.
We also noticed that most shop and campaign managers weren't even aware that there was a problem with the conversion tracking accuracy in conjunction with the payment gateways. The reason is that usually the payments go through just fine, and the customers get purchase confirmations by email too. So there is no reason to grow suspicious and report anything on both sides. Plus, the measured conversions are usually not zero, just deteriorated, sometimes just a little and sometimes a lot.
Over time we collected more data on payment gateway tracking accuracy through support requests. And the data showed us how big the problem really is. Essentially there is **no single shop** that tracks 100% of all orders properly. Most are somewhere between 90% and 98% accuracy. We also found that not in all cases the payment gateways were responsible for those issues, but for the most part, they are.
To increase awareness about the payment gateway tracking accuracy, we created a new section in the Pixel Manager that gives you access to this data in a more readable and actionable form.
Here are few examples we've collected over time.
This is an example with only 38% accuracy:

Here's an example with 81% accuracy:

And here's one with next to 100% accuracy:

## Meet the new Diagnostics Section
:::info
Available from version 1.19.0 of the Pixel Manager
:::
The new Diagnostics Section now contains the Payment Gateway Tracking Accuracy Report. It will show you if and how much your payment gateways affect conversion tracking accuracy.
It uses historical data to give you an overview of how all payment gateways, that you used in the past, compare with each other.
And even more important, it will give you a weighted report that shows how severe the problem currently is and where you should start fixing it.
The Payment Gateway Accuracy Report contains three sections:
1. All payment gateways that are currently available and active in WooCommerce.
2. A list of payment gateways that have been used in the past, active or inactive, and the achieved tracking accuracy.
3. A list of the active payment gateways weighted and ordered by the frequency of their use. That is the essential part of the report.

The weighted report is the most important one. If the total is below 95% accuracy, you must take action. We recommend close monitoring if it is between 90% and 95% and improving accuracy if it falls below 90%.
We ordered the report to see the most used payment gateways first. The ones on the top are also the ones that have the most impact on the tracking accuracy. So that is where your focus should be when fixing the issues.

## List of possible causes why the tracking accuracy is not at 100%
There are many different reasons why the tracking accuracy drops below 100%. Most of the time the payment gateway is the source of the problem. But there are other reasons, which are less frequent but also deteriorate the tracking accuracy.
The most common reasons why the tracking accuracy is not at 100%:
- Off-site payment gateways redirect the customer away from the shop domain. If the setup is incorrect or the customer interrupts the redirect, the customer will not reach the purchase confirmation page.
- The payment gateway doesn't correctly redirect to the purchase confirmation page.
- The server is too slow to load the purchase confirmation page and the customer exits before visiting the purchase confirmation page.
- Issues with the purchase confirmation page base code prevent it from loading every time.
- Customers use script blockers.
- Custom-made purchase confirmation pages, manually coded or using third-party plugins, that are not using the proper WooCommerce hooks.
## Do payment gateway tracking accuracy issues affect all tracking pixels?
Typical conversion tracking pixels work with browser-based tracking libraries. So in all cases where the tracking only uses those libraries, the tracking accuracy will be affected. Unfortunately, this includes Google Ads, which despite being the most commonly used paid ads platform, doesn't offer a server-to-server tracking API yet (apart from the offline conversions tracking feature, which is not suitable here).
But some analytics and ad platforms offer server-to-server based tracking. In those cases, tracking is still possible and can be used to recover otherwise lost conversions.
Google Analytics, Facebook and TikTok are the only ones that offer server-to-server tracking APIs.
In the [Pro version of the Pixel Manager](https://sweetcode.com/plugins/pmw#pricing-section), server-to-server tracking is automatically enabled for Google Analytics Universal. For GA4 and Facebook CAPI you need to go through a simple setup procedure to enable server-to-server tracking. TikTok server-to-server tracking is currently on the [roadmap](https://roadmap.sweetcode.com/pixel-manager-for-woocommerce?card=6180d49ebd5f6b002a273384) and will be available soon.
## Do payment gateway tracking accuracy issues only affect WooCommerce stores?
No. On the contrary. Knowing that pretty much every shop system offers a variety of payment gateways, often developed by external developers, and due to the nature of the problem, this issue is not limited to WooCommerce but appears in all shop systems. However, on WooCommerce, because it is an open platform and you as a user control the server, you can use the Pixel Manager to surface those issues. Without going into technical details, a SaaS shopping system can't offer insight into payment gateway tracking accuracy issues. So WooCommerce is one of the few systems where it is possible, and with the Pixel Manager for WooCommere you have the tool to get that insight.
## What can you do to fix the tracking accuracy?
Depending on what's causing the deteriorated tracking accuracy, you have to do one or several of the following solutions:
- If you are using an off-site payment gateway: Off-site payment gateways almost always create trouble. Switch to an on-site payment gateway.
- If, for some reason, you **have to** use an off-site payment gateway: Try to fix configuration issues with that off-site payment gateway. Or, try out different off-site payment gateways.
- Try using a different payment gateway. Make 100% sure that you've set it up correctly. Test it.
- Try to test the checkout under different conditions (desktop, mobile, different browsers, different products).
- Listen to your customers. If you are lucky, customers will give you feedback that they could not visit the purchase confirmation page. Act on it and try to locate the issue.
- Monitor the diagnostics tab in the Pixel Manager frequently (once a week or once a month) to ensure everything is in the green.
:::info
The users of the premium version of the Pixel Manager can look forward to a new feature that we are currently working on. It will allow the Pixel Manager to automatically recover some of the otherwise lost conversions. We have only started testing it, so we don't know what percentage of lost conversions you can expect to be recovered. And, we might have to iron out a few bugs before we go public with it.
If you want to be part of the beta test, please go ahead and [purchase the premium version](https://sweetcode.com/plugins/pmw#pricing-section) (if you don’t own it already) and let us know through support@sweetcode.com that you want to beta test this new feature.
:::
## How high should the tracking accuracy be?
Our data shows that the tracking accuracy is rarely precisely 100%. It is a distribution where most values are between 80% and 95%. Some are above, and some are below those values.
On reliable servers with well-working payment gateways and well-working themes, the tracking accuracy is usually above 95%. So we think above 95% is an excellent value to aim for.
If your value is slightly below 95%, say between 90% and 95%, you should monitor the tracking accuracy closely. If you take it as seriously as we do, you may want to take action already. But, of course, it also depends on whether you're running paid ads. If you do, it makes sense to act faster on it.
For shops where the tracking accuracy drops below 90%, we generally recommend fixing the issues immediately.
## The Pixel Manager is the only tracking tool with tracking accuracy data
So far, the Pixel Manager for WooCommerce is the **only** tool that offers diagnostics on tracking accuracy. We are performance marketers and developers, so we know how important it is to track all conversions properly. It can make a massive difference if you cannot track all conversions correctly.
We will keep improving the Pixel Manager even more to give you the best possible tracking tool. So stay tuned if you want to see what's coming. We have plenty of ideas and plans for the future.
If you haven't tried out the Pixel Manager yet, you can get the free version from the WordPress repo over [here](https://wordpress.org/plugins/woocommerce-google-adwords-conversion-tracking-tag/).
And if you want to try out the pro version, you can get it from the [SweetCode.com store](https://sweetcode.com/plugins/pmw#pricing-section) or the .
---
# Performance Update - August 2022
URL: https://sweetcode.com/blog/performance-update-august-2022
Date: 2022-08-02
Tags: general, performance

## TLDR
We've implemented several performance improvements into the Pixel Manager, further extending its lead over other tracking managers.
- Full REST API support
- Pre-compressed Pixel Manager JavaScript libraries added to each new distribution
## Full REST API support
We had it on the roadmap for a long time and many of our users have upvoted it: REST API support
Until version `1.17.11` the Pixel Manager was only using the WordPress internal AJAX API to communicate with the server. From version `1.17.12` the Pixel Manager fully supports the REST API.
You probably have questions. What's bad about AJAX? What are the benefits of using the REST API? And, why did it take so long to implement this?
I'll answer one by one.
### What's bad about AJAX?
Nothing's is really bad with AJAX. It works, and it has been working very well for a long time. But, there are a few things that are not so good. For instance, each time you make a request to the server through AJAX, the entire WordPress / WooCommerce instance loads on the back-end. This is a significant performance hit. And this is especially an issue if you have a lot of plugins installed that make the server slow.
Also, the AJAX API only offers one endpoint and all the logic to capture server events have to be built into the plugin. This is not a major issue, but it makes for less clean code and more work to maintain.
So, it made sense to look into a better way to communicate with the server.
### What are the benefits of using the REST API?
Probably the most important benefit of the REST API is that it only loads a minimal version of WordPress / WooCommerce in the back-end, thus making each request much faster. In our tests **REST API calls in average were 30% faster** than AJAX calls. This is not only a speed improvement, which is neat. It also means that the server has to work a lot less to handle those requests, freeing up resources. This is especially important when you use server-to-server event tracking such as [Facebook CAPI](https://developers.facebook.com/videos/2020/conversion-api-capi-overview/). The Pixel Manager exchanges a lot of data with the server, and using the REST API removes a lot of stress from the server compared to using AJAX.
Plus, creating REST API endpoints in the back-end is cleaner and is more streamlined, making the code easier to maintain and to test.
### And, why did it take so long to implement this?
There was a lot of consideration and planning involved in implementing the REST API. You see, AJAX has one big advantage over the REST API. It is active on **all** WordPress installs and it can't be turned off, or at least no one dares to turn it off. So the AJAX endpoint is available on all shops where the Pixel Manager is installed.
The REST API on the other hand is not active on all shops, even though it is enabled by default. The reason is that when WordPress launched its REST API support, there was a way to enumerate all users of the shop (get a list of all users of a shop). So the REST API publicly revealed more data than most of the shop owners wanted to show. WordPress fixed this, but nonetheless the REST API had become discredited and people started to disable it.
So, we had to build in fallbacks and safeguards in order to make server calls work, no matter which endpoint is active. This made the back-end **and** the front-end code architecture significantly more complex.
On top of that we had to think ahead and build in more logic that would make the server calls more efficient. You see, more and more platforms start to offer not only browser tracking pixels, but also server-to-server APIs such as [Facebook CAPI](https://developers.facebook.com/videos/2020/conversion-api-capi-overview/). TikTok for instance now offers a server-to-server [event API](https://ads.tiktok.com/help/article?aid=10003669) too. And in order to handle all of this more efficiently and avoid duplicate data exchange between the front-end and the back-end, we had to restructure the event flow between the front-end and back-end.
All of this took more time than most of us thought it would take. On the bright side, the new architecture is so streamlined and clean, that it will be much easier to scale up and implement new server-to-server event APIs.
### A few interesting things about the new REST API implementation
Because the Pixel Manager now primarily uses the REST API, it also takes advantage of a modern method to send tracking events from the browser to the server: `navigator.sendBeacon`. This method is available in most browsers and has two significant advantages:
- It keeps the connection alive until the data is successfully sent to the server. It does that in a way that doesn't interrupt the visitor experience in any way. And it does this even if the visitor exits a page, making sure that the tracking event is sent to the server, no matter what.
- One additional advantage is that `navigator.sendBeacon` runs with a lower priority than the main thread. This makes sure that the browsing experience is not slowed down or interrupted by tracking events in the background.
But that's not all. The Pixel Manager detects if a request is too big to be sent through `navigator.sendBeacon` and automatically falls back to using `fetch` for sending the event. (`fetch` is another modern way of sending data to the server. It can handle much more data, but runs at a higher priority.)
And, if the REST API is not available, the Pixel Manager detects this too and automatically falls back to using AJAX.
Neat isn't it?
With this new version the Pixel Manager has become the first tracking manager to fully support the REST API in order to deliver the best possible user experience, highest tracking accuracy while keeping the server load as low as possible.
## Pre-compressed Pixel Manager JavaScript libraries added to the distribution
Many shop owners know that JavaScript libraries should be minified. Minification is a way of making the JavaScript libraries smaller and therefore faster to transmit to the browser. That makes a lot of sense. The smaller the code, the faster the transfer to the browser, the faster the page fully loads, the happier the visitor, right?
But, did you know that minification is not as effective as many think and that it takes much more to compress the code to the max?
Minifying a regular JavaScript file only makes it 30% to 40% smaller. That **is** smaller. Take a look at what a modern toolchain can do to decrease the size of a JavaScript file much more:
Our largest library (packed with all bells and whistles) when only minified is about 115kb large. But, if we pre-compress it using `gzip` or `brotli`, it shrinks to only **23kb** using `gzip` and down to **19kb** using `brotli`.
That's an almost 90% reduction of the size of the library **from the minified version**. Nice!
Now, the more informed ones among you will say, that the server is doing the compression for you on the fly anyway. And yes, that is generally true. But, doing the compression also takes time and thus increases the server load unnecessarily. The following article goes into full detail what happens if you serve pre-compressed vs. on-the-fly compressed libraries and makes the point that it makes a lot of sense to bundle pre-compressed libraries with a distribution: https://css-tricks.com/brotli-static-compression/
Therefore we decided to add pre-compressed JavaScript libraries to each release of the Pixel Manager. This way, your server won't have to do the compression for you, and thus will reduce TTFB (Time To First Byte) even more.
And the good thing about the browsers today is, that they will negotiate with the server which file they want to receive, will opt in for the smallest one that they can process, and you won't have to worry about compatibility at all.
---
# woocommerce-analytics
URL: https://sweetcode.com/blog/woocommerce-analytics
Date: 2022-06-30
Tags: Google Analytics, free, pro
{`10+ Best WooCommerce Analytics and Reporting Plugins for Your Online Store
(2022)`}

## TLDR
- Tracking and monitoring your campaigns is essential for the success of your online business
- There are many Analytics and Reporting tools that are compatible with WooCommerce
- We discuss the 10 top options available on the market
WooCommerce is a WordPress plugin that enables you to turn your WordPress site into an online store. It includes key features such as product management, order processing, and payment gateways. This plugin is popular because it is easy to set up and use. However, it is also scalable and can be used by larger businesses.
With over five million website stores using WooCommerce, it is the largest e-commerce platform in the world. But those numbers make you think: what advantages can you get that allow you to operate in a highly competitive market successfully? The answer to this is to understand your customer.
Understanding your visitors and their shopping behavior will lead to a higher conversion rate by knowing what they're buying, why they're buying, and what's causing an abandoned cart or lost conversion. This level of understanding can only be achieved through detailed site analytics reports, and with tools such as Google Analytics.
Ways to leverage Google Analytics data points to improve your online store include:
- **The success of campaigns.** You want to know if the money put into marketing or discounts had a positive ROI compared to other or no promotions.
- **Results of blue-green testing.** If you haven't heard of this, it's where you have two different sites on the same domain, and users are split across them. You use this to validate if a change increases conversion/profits.
- **Grouping of customers on locale, age group, and interests.** This data comparison can feed into marketing campaigns, newsletters, and advertising. Overall it should allow a more personalized experience for the customer and lead to higher retention.
However, WooCommerce doesn't offer great analytics out of the box. The platform is designed to leverage plugins built by experts, letting you build and customize as much as needed. It's a bit like Legos for entrepreneurs such as yourself. Let's explore some of these WooCommerce analytics plugin solutions.
## Top 10 WooCommerce analytics and reporting plugins
The basis of plugin comparison is on: functionality, pricing, support, and ease of setup and use.
### 1. Pixel Manager for WooCommerce

[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-analytics) is the easiest way to track traffic and conversions for your WooCommerce website. The plugin has been built and optimized specifically for WooCommerce, and features consent/privacy mode with the latest tech, easy configuration through a user-friendly UX, granular settings by using filters, and licenses that can be purchased in bulk.
The team is composed of performance marketers who know what you need to succeed online so that you can focus on what you do best: running your business. They've added all the analytic and tracking tools you want with their subject matter experts, making reporting extremely simple.
Setting up Pixel Manager for WooCommerce is simple. The plugin starts with great default settings that let you start straight away. If you want to tune the settings, the user interface is intuitive to use.
Possibly the most significant selling point is the unique ability for Pixel Manager to integrate with all major tracking solutions. Now you can manage your Google Analytics, Google Ads, Microsoft Ads, and other integrations in a single place without needing a plugin for each.
Once installed, it's as simple as:
1. Go to the Pixel Manager for WooCommerce plugin.
2. Fill out the input boxes with IDs relevant to your tracking tool.
3. Find other tracking inputs for Twitter, TikTok, Pinterest, etc.
[Pricing](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-analytics#pricing-section)
starts from $19 a month with discounts when buying annually. You can opt for a Business, Agency, or Agency Plus subscription if you're managing multiple e-commerce stores. Try it risk-free today with a 14-day free trial!
### 2. Metorik

Another WooCommerce Analytics tool is [Metorik](https://metorik.com/). It offers analytics for WooCommerce and other platforms and includes features any good analytics plugin should have. It's used by online businesses to track customers, understand business metrics, and create actionable outcomes.
However, there are two significant drawbacks to Metorik that can't be easily ignored: customer support and pricing.
The customer support of this provider has been criticized as slow and unresponsive. This is a problem as analytics are core to a business in order to understand their customers and the market. Suppose there was a plugin problem due to an update or security vulnerability. In that case, it may be difficult to resolve in a timely manner and could affect your bottom line.
The other drawback is the cost of Metorik. The pricing model is not based on subscription but, instead, on pay-for usage. This is not great for small to medium-sized businesses as there is no certainty of costs and high entry costs.
### 3. Metrilo

[Metrilo](https://www.metrilo.com/) is an analytic company offering products for WooCommerce and other e-commerce platforms. Their product reads data from your websites, analyzes the data, and builds a product report equipped with suggestions for the business. An example of this is recognizing a repeat customer and suggesting a personalized email to acquire feedback.
Pricing for their services starts at $119 a month. However, if you want e-commerce Analytics for your store pricing, you'll have to upgrade your subscription to $199 a month.
Metrilo differs from other e-commerce plugins because they don't leverage established tools like Google Analytics. This allows them to build custom features but comes with the drawback of locking you into their product.
It is riskier to go with Metrilo because if you don't like the experience or the software doesn't work as expected, it can be hard or costly to switch analytic integrations. You also don't get the large community around something like Google Analytics, where you can easily Google the answer to any question you have.
### 4. WP Statistics

[WP Statistics](https://wp-statistics.com/) is a popular WordPress plugin that has been installed over 2 million times. The plugin provides detailed information about traffic to your website including where the traffic came from, what pages they visited, and how long they stayed on your website.
The plugin is free but also offers an add-on model to increase the tool's capabilities. This means it can be cheaper if you're only requiring a specific thing but it will begin to cost more if you need more functionality. Advanced reporting costs $29.00/year for one site, but if you also need real-time data that's an additional $19.00/year.
### 5. Monster Insights

[Monster Insights](https://www.monsterinsights.com/) is a popular plugin for WordPress. It was created by the team behind the popular WordPress plugin Yoast SEO. The plugin provides basic statistics about traffic to your website and can be used to connect to a range of other plugins you may already be using.
The plugin starts at $199 a year, but functionality is limited without the $399 pro version for WooCommerce integrations. There also isn't a monthly option, so it will be a big upfront commitment if you want to try their services.
Monster Insights, unfortunately, does not support integrations with analytics companies other than Google Analytics and Google Ads. If you want to try marketing campaigns with Pinterest, Facebook, or others, you should go with an option that supports this, like [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-analytics).
### 6. Google Site Kit

[Google Site Kit](https://wordpress.org/plugins/google-site-kit/) is a free WordPress plugin that gives you insights into how people find and use your site. It includes data from multiple Google products directly on the WordPress dashboard for easy access.
However, the plugin is still in beta and there are bugs to be ironed out. Users have reported usability issues and integrations with many Google products not working seamlessly. The product does not integrate directly into WooCommerce, limiting some of the functionality other plugins offer.
If you're a diehard Google fan and don't mind some of the early adopter hiccups, you may want to consider adding this to your collection of WordPress plugins. Bear in mind it is heavyweight and can slow down load times.
### 7. Advanced WooCommerce Reporting

Alt-text: Advanced WooCommerce Reporting
[Advanced WooCommerce Reporting](https://codecanyon.net/item/advanced-woocommerce-reporting-/12042129)
is a plugin that gives you customizable reports of your WooCommerce analytics. The reports can be exported into CSV, Excel, or JSON format for further analysis.
The plugin starts at $45.00 per year for a single site license; if you want customer support, that's an additional cost of $35.00 per year.
This solution provides a wide range of reports and the ability to segment data by time period, product, category, or other parameters. This is a good option for someone comfortable with the technical side of WordPress and willing to spend time optimizing the plugin. If you're more on the business savvy side, then it could be cumbersome work.
### 8. WooCommerce Google Analytics Pro

[WooCommerce Google Analytics Pro](https://woocommerce.com/products/woocommerce-google-analytics-pro/) is a plugin that allows you to collect data from your WooCommerce store and send it to Google Analytics. The plugin integrates directly into WooCommerce to see things like shopping analysis and product, marketing, and sales performance.
Pricing is not offered on a monthly subscription. WooCommerce Google Analytics Pro starts at $79.00 billed annually.
The execution of the functionality it has is good, but the tool lacks the crucial support for Google Analytics 4 (GA4). As Google Universal Analytics (GUA) is being deprecated in favor of GA4 in July 2023, it's recommended that you don't make any new dependencies on GUA. So, unless you're already using GUA and not worried about GA4 being unsupported, go with a plugin that offers this support.
### 9. Actionable Google Analytics for WooCommerce

[Actionable Google Analytics for WooCommerce](https://codecanyon.net/item/actionable-google-analytics-for-woocommerce/9899552?) is a plugin that allows you to collect data from your WooCommerce store and send it to Google Analytics. The plugin integrates directly into WooCommerce to see things like shopping analysis and product, marketing, and sales performance.
Pricing starts at $155.00, with customer support billed separately.
The plugin integrates with popular WordPress plugins like Yoast SEO and Gravity Forms. It also includes features like Enhanced E-commerce tracking, checkout funnel analysis, and form abandonment tracking.
However, the plugin doesn't have many subscriptions, so it is hard to gauge public opinion.
### 10. HubSpot for WooCommerce

The plugin [HubSpot for WooCommerce](https://en-gb.wordpress.org/plugins/makewebbetter-hubspot-for-woocommerce/) allows you to collect data from your WooCommerce store and send it straight to HubSpot. The plugin also integrates directly into WooCommerce so you can see things like shopping analysis and product, marketing, and sales performance.
Pricing is on the steep end, costing $1275.00 per license if you intend for your site to make money from customers, which hopefully you are.
This product has good reviews but is a plugin targeted toward marketing rather than e-commerce. You will also need to have a HubSpot subscription to take advantage of the functionality. This is a big commitment as pricing for HubSpot is expensive as you scale your business and hire more people.
Unless you're already using HubSpot, you should go with something more specific to WooCommerce.
### How to choose the best plugin for your WooCommerce store
There is no easy answer for finding the best analytics tool for your WooCommerce store. It depends on several factors, including the size and complexity of your store, your budget, and your specific needs. Here are some things to think about before making a decision.
### Design and intuitiveness of the interface
The interface is the first thing you'll see when you log into your analytics tool, so it's important that it's easy to use and understand. If you're not a tech-savvy person, look for an option with a clean and simple interface.
### Ease of setup
The best analytics tools are easy to set up and don't require any technical knowledge. If you're not comfortable with code, look for a plugin that can be installed and configured in a few clicks.
### Accuracy of tracking with real-time stats
Your analytics tools must be able to track your traffic and conversions accurately. Look for an option that offers real-time stats to see how your store is performing at a glance.
### Integration with other tools like Google Analytics
If you're already using different marketing tools, it's essential to find an option that integrates with them. This will save you time and make it easy to track your results. For example, if you rely on or want to use Google Analytics with Facebook ads, go with a plugin that supports them both.
### Reliability of the product and responsiveness of their support
Before choosing an analytics tool, read reviews and see what other users are saying. It's also a good idea to contact their support team to see how responsive they are.
## Conclusion
WooCommerce is great, but it is designed so that additional plugins can solve the business requirements you have, like reporting and analyzing your e-commerce store. It's also hard to choose a product over others because there are so many out there.
Before you make up your mind and select one of the available options on the market, consider their pricing, customer support, features offered, and supported integrations. The list we've created in this blog article takes each of these into consideration and compares them to one another so that you're better armed to make an informed decision.
If you're looking for somewhere to start, begin at the top and have a closer look at [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-analytics#pricing-section). It's a powerful and accurate solution to track your traffic, and it's built and optimized for WooCommerce.
---
# Facebook CAPI Deduplication and Match Key Parameters
URL: https://sweetcode.com/blog/facebook-capi-deduplication-and-match-key-parameters
Date: 2022-06-26
Tags: general, facebook capi

## TLDR
If have ever run into one of the following errors:
- "Event Missing Some Deduplication Parameters"
- "Invalid Match Key Parameters"
Then using the Pixel Manager for WooCommerce is the right choice.
## What do those errors mean
Facebook uses so-called event IDs to deduplicate events that are being sent from the browser and from the server to Facebook.
If those event IDs are missing, or if they don't match, then Facebook can't deduplicate the events, and as a consequence reports get inflated.
When Facebook detects irregularities that likely indicate problems with the event IDs, then those errors pop up.
## What is Facebook CAPI
After enabling Facebook CAPI the browser pixel **and** the server are sending common events to Facebook in parallel. That means each add-to-cart event, each purchase event, etc. is sent twice to Facebook. So essentially, every event is duplicated.
The idea behind this method is to ensure that at least one of each duplicated event makes it through to Facebook, in order to increase the likelihood that the event is measured by Facebook. If for example, a very old browser is not capable of sending the event through the browser, then in this case the server ensures that Facebook receives the event, and vice versa.
But in those cases where both events, browser, and server, get through to Facebook, we don't want Facebook to count every duplicated event two times. For instance, the purchase conversion value would get inflated by a factor of two. To avoid duplicated data in the reports Facebook deduplicates browser and server events by comparing the event ID that is being sent with each browser and server event. And here comes the important bit. Those browser and server event IDs have to match exactly. Only then Facebook is able to deduplicate those events.
## Common conditions under which missing deduplication parameters or mismatches occur
There are five common conditions when these errors occur:
1. You recently enabled Facebook CAPI: In that case, Facebook mixes up old and new values and throws those errors prematurely. You can dismiss the warning.
2. Server cache has not been deleted after enabling Facebook CAPI: If the server cache is not deleted after enabling Facebook CAPI, it can happen that the server is sending CAPI events, but the browser is not, because the cached pages don't contain the necessary configuration for Facebook CAPI. The solution is to delete the server cache after enabling Facebook CAPI.
3. Custom tracking code on the website: You have some custom tracking code on the website which was added to the page templates or through Google Tag Manager. Those codes don't generate the required event IDs. You have to remove those custom tracking scripts and leave the tracking entirely to a plugin like the Pixel Manager for WooCommerce, which handles all requirements correctly.
4. Facebook event auto tracking is enabled: In the Facebook pixel settings you can enable automatic tracking of events. When this feature is enabled Facebook will try to detect events, such as add-to-cart events, and send them to Facebook. But, they will be missing the correct event ID. Therefore, when this feature is enabled, you will need to disable it and leave the handling to the Pixel Manager for WooCommerce.

5. Most tracking plugins don't handle event IDs properly: There are plugins similar to the Pixel Manager for WooCommerce, that don't handle event IDs very well. The Pixel Manager for WooCommerce uses a very robust implementation with which missing event IDs or ID mismatches cannot happen. Switch to the Pixel Manager for WooCommerce, if you want to find out.
## False positives
You might have read, that in some cases Facebook throws "false positive" warnings.
I know, I am nitpicking about the following, but I am a strong believer that using the right definitions and grammar helps avoid misunderstandings.
When a warning is thrown about something that's missing but in fact, it is there, then it is by definition a "false negative".
Only when a test reveals that something is there, which in fact it is not, then it is a "false positive".
So in this case apparently the correct match key parameters are missing, but in fact, they're not. So by definition that would be a "false negative".
Now having that out of the way, there is one more important piece of information about those "false negatives". "False negatives", warnings about missing deduplication parameters or parameter mismatches, only happen under conditions 1 to 4 in the above [paragraph](#common-conditions-under-which-missing-deduplication-parameters-or-mismatches-occur). But, if none of those apply in your situation, you should switch to the Pixel Manager for WooCommerce.
---
# How To Set Up Google Analytics 4 for Accurate Reporting on WooCommerce: Complete Guide (2022)
URL: https://sweetcode.com/blog/woocommerce-google-analytics
Date: 2022-06-24
Tags: Google Analytics, free, pro
{`How To Set Up Google Analytics 4 for Accurate Reporting on WooCommerce:
Complete Guide (2022)`}

Do you know your customers' shopping behavior, or whether they're abandoning their carts before or during checkout? As an e-commerce merchant, these are questions you want to be able to answer.
If your online store is a site, there are many options to measure its efficiency and track its performance metrics. Of the many tools out there, Google Analytics has been the tried and tested solution for so many.
This tutorial will look at what Google Analytics is, why you should use it, and how to get started by adding it to your WooCommerce store.
## What is Google Analytics, and why should you use it?
Google Analytics is a web analytics tool that helps measure your website's traffic and performance. It was founded in 2005, and since then it's been providing insights into how people find your site, what they're doing on it, where they're coming from, and more. Reports state that 13.2 million websites use the tool to track users and generate reports.
As a business owner, you need to understand your website's traffic. This tool helps you know which marketing channels work and where you should invest more for the best ROI. Google Analytics allows businesses of all sizes to access insights that help them grow.
Some of the features of Google Analytics include:
- Real-time data: See your website's performance at this moment, including which pages are being viewed and how much traffic they're receiving.
- Data import: Upload data from multiple sources to get a complete view of your online presence.
- Custom reporting: Create custom reports tailored to your specific needs.
- Integrated platform: Google Analytics integrates with other Google products to get the most out of your data.
- Detailed data: Get detailed information on how people use your website, including what pages they visit and how long they spend on each one.
In 2020, a new version was released called Google Analytics 4 (GA4). GA4 replaced the previous version, referred to as “Universal Analytics”, and in [2023 Universal Analytics will be defunct](https://sweetcode.com/blog/ga-universal-phasing-out/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-analytics).
Google Analytics 4 combines both apps and website tracking into one platform for real-time analysis. It's built with machine learning to understand trends and user behavior. These capabilities have been a game-changer for marketing, targeted advertising, and understanding what the customer wants.
## How do you set up Google Analytics 4 on a WooCommerce site?
There are two methods to setting up Google Analytics for a WooCommerce site.
1. Use a plugin from the WordPress marketplace.
2. Edit the WordPress files and insert the Google Analytics code snippet.
The first method is the recommended one, as using a plugin is more straightforward and will often give you additional features. On the other hand, option two can be intimidating if you're not a pro at coding.
There are a lot of different plugins out there, such as [Monster Insights](https://www.monsterinsights.com/) and [Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-analytics), to name a few. Before using a plugin, however, you will need to create a Google Analytics account and set it up for your website.
### Setup Google Analytics Account

1. Go to the [Google Analytics](https://analytics.google.com/analytics/web/) home page and click the call to action.

2. Complete the account setup with your business name, property setup with your website name, and complete the business information section.
3. Accept the terms and conditions of the country you operate in.
Inside the dashboard, you'll notice that you can manage other Google tracking products like Google Tag Manager and surveys.
### Setup a data stream for your website
1. Click Data Streams inside the admin panel
2. Click Add Stream

3. Fill out your website URL and name

You will now be on the web stream details page. The page contains your stream ID, measurement ID, and a method for adding new site tags. These values are what you feed into a plugin to get Google Analytics up and running quickly.
So now you're all set up with Google Analytics, it's time to add the data stream to your website via a plugin.
## What is the best plugin to set up analytics?
[Pixel Manager for WooCommerce](https://sweetcode.com/?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-analytics) is a plugin that allows you to connect your WordPress site with Google Analytics. Once installed, it will automatically add the required tracking code to your website. It has additional functionality to track and display shop visitors, provide valuable data for conversion rate optimization, and enable dynamic remarketing and reporting.
A benefit to using Pixel Manager for WooCommerce over other solutions is the integration with e-commerce. It increases the accuracy of the predictions and suggestions that Google Analytics with WooCommerce can make by tagging the data sent with useful identifiers.
Now, let's configure our WordPress website. Pixel Manager for WooCommerce supports both Universal Analytics and Google Analytics 4. As Universal Analytics is being phased out, we're going to be adding Google Analytics 4, but they're both effortless to do.
### Installing the Pixel Manager for WooCommerce plugin
For this, you'll need admin access to your WordPress site.
1. Go to your WordPress dashboard, go to the plugins section, and select Add New.

2. Search for "Pixel Manager" and find Pixel Manager for WooCommerce by SweetCode and select Install Now.

3. Go to WooCommerce > Pixel Manager and see a range of input boxes for different tracking software. Fill in the Google Analytics 4 field.
Now that we've correctly configured your site, you should start to see e-commerce data streaming into your site. It can take up to 24 hours for the data stream to register, but it's usually much quicker. If you do not see data, check the plugin settings and ensure you correctly input the code.
Pixel Manager for WooCommerce supports more than just Google Analytics. Suppose you're running ads with platforms like Facebook, TikTok, Snapchat, etc. Just find your pixel ID and add it like you've added the GA4 one.
A benefit to using a plugin over embedding code is that you get some great features to improve the accuracy of your tracking.

Select the tab Advanced > Google. You'll see additional configuration options. Turning on the pro feature, Enhanced E-Commerce gives you reporting on the checkout behavior of users in the Google Analytics dashboard. It creates a data funnel and then sends purchase and refund events through the measurement protocol for higher accuracy.
## Get proficient with Google Analytics 4
Now that you are all set up, let's explore some of the features of Google Analytics.
### User predictions
User predictions allow you to see what behavior users are exhibiting on your website before they convert. This is useful for seeing what engagement is required to get a sale and can be used to improve your website's design.
Predictive models are trained with the data from your site. Therefore, Google Analytics must have been running for 28 days prior, and your site has experienced 1000 positive and negative conversions.
To access user predictions, click on the User Explorer tab in the left-hand sidebar and then select Predictions. From here, you can see all of the prediction models that Google Analytics has generated. The most useful ones for e-commerce are the purchase probability and the value per visitor prediction.
Click on the info icon next to each model to see what these predictions mean. The purchase probability predicts the likelihood that a user will make a purchase on your online store within the next seven days. The value per visitor prediction shows how much revenue each user is predicted to generate.
These predictions can be segmented by traffic source, so you can see which channels are most likely to result in a purchase. To do this, click on the segment icon and then select Acquisition > User acquisition. You will now see the purchase probability and value per visitor predictions segmented by traffic source.
### Data trends
Data trends allow you to see how your website's traffic, conversion rate, user location, and top-selling products. This feature helps see the effect of changes you've made to your website or marketing campaigns.
To access data trends, click on the Reporting tab in the left-hand sidebar and select Reports snapshot for a nice visual dashboard.
You can also see the effect of changes you've made to your website or marketing campaigns by clicking on the plus below Reports snapshot (Add comparison).
To compare two data sets, select the first data set that you want to compare and then click on the Compare button. A popup will appear where you can select the second data set that you want to compare. You're able to define what data you want to include in the data set. One comparison you may want to make is the average amount spent per user when comparing demographics.
### Real-time data
Real-time data allows you to see how many users are on your website and what they're doing. This information is useful for seeing the immediate effect of changes you've made to your website or marketing campaigns.
To access real-time data, click on the Reporting tab in the left-hand sidebar and then select Realtime. From here, you can see how many users are on your website and what they're doing.
If you make any changes to your website, you should observe how interactions change. This is a valuable insight for active marketing campaigns or if you recently changed your website.
### Custom Collections
Custom collections allow you to create your own views of the most important data to you. This is useful for quickly accessing the data you need without going through all of the different reports.
To create a custom collection, click on the Reports tab in the left-hand sidebar and then select Library at the bottom. From here, you will see your out-of-the-box collections like User. Press the Create new collection tile. Google makes great recommendations on what data to add for your use case.
Once you've published your collection, there will be an overview dashboard to quickly see the trends of your site. You can share this report with anyone by clicking the Share this report button at the top right.
## Conclusion
Google Analytics is a powerful web analytics tool that can help you measure your website's traffic and performance. By understanding how users interact with your website, you can make changes to improve your experience and increase your sales. Use data trends to see the effect of changes and marketing campaigns or real-time data to see how users interact with your website.
Using a plugin with enhanced e-commerce capabilities can give you more detailed insights into your sales performance and more accurate data about how your customers interact with your website. Pixel Manager for WooCommerce makes it easy to set up and manage your e-commerce tracking pixels to get the most out of your data. Check out [Pixel Manager for WooCommerce](https://sweetcode.com/plugins/pmw?utm_source=pixel-manager-for-woocommerce&utm_medium=content-marketing&utm_content=woocommerce-google-analytics#pricing-section) when setting up Google Analytics and see how it can help improve your online sales!
---
# Improving Database Performance Made Easy
URL: https://sweetcode.com/blog/improving-database-performance-made-easy
Date: 2022-05-21
Tags: woocommerce, database, performance
## TLDR
- Out of the box WooCommerce works well for small to medium size shops. But for large shops, with many products and orders, you might hit performance limits.
- Adding high performance database indexes is easy and in some cases can improve database performance a hundredfold.
## Situation
Recently one of our customers contacted us with a performance issue detected on the WooCommerce purchase confirmation page, while the Pixel Manager for WooCommerce was active. The page would take approx 10 seconds to load, which indeed is uncommon and certainly too long. Customers of that shop, who try to purchase a product, might think something is wrong and abort loading the page.
## Analysis
Recently we added several new fields to the output of the Pixel Manager on the purchase confirmation page. Those fields output if a customer is a new customer or an existing customer, plus different types of customer lifetime value calculations.
In order to determine the values of those fields the Pixel Manager requires to query two tables of the the database. In comparison to other queries, these queries use more processing power. In our testing environments, some with hundreds of thousands of orders, those queries don't increase the load time of the purchase confirmation page significantly. But, as the example of one customer showed us, there are system configurations around which can't handle those queries very well, and run into a performance bottleneck.
Interestingly that customers database contained 10 times less orders than the biggest shop where we tested the queries. So the database size clearly doesn't matter. It is some combination of database hardware, software and configuration that can lead to that performance bottleneck. Unfortunately those specific factors can't be influenced by the Pixel Manager.
But, there **is** a solution.
## Solution
In our research we found a simple and impressively well working solution to remove that bottleneck. On a shop with hundreds of thousands of orders the solution brought down the slowest query, which took 0.3729 seconds down to 0.0028 ! seconds. That's 133 times faster than before!


How does the solution work and how can it be implemented on a WooCommerce shop?
WordPress sets up indexes on the tables in order to make queries faster. But, there is a lot of room to improve those indexes. Olliver Jones pointed out in his [StackOverflow answer](https://stackoverflow.com/a/68643148/4688612) how new and improved high-performance indexes can be created on the most commonly used database tables. Simply by adding those new high-performance indexes, those queries can run so much faster.
Olliver also created a simple plugin, called the [Index WP MySQL For Speed](https://wordpress.org/plugins/index-wp-mysql-for-speed/) plugin, which can create those indexes for you. Since WooCommerce uses the same WordPress tables to save orders and order meta data, this solution works equally well for WooCommerce.
---
# WooCommerce Google Ads Customer Lifetime Value reporting
URL: https://sweetcode.com/blog/woocommerce-google-ads-customer-lifetime-value-reporting
Date: 2022-05-11
Tags: advanced features, Google Ads, free, pro
## TLDR
- The Pixel Manager for WooCommerce now outputs the customer lifetime value into the order object on the purchase confirmation page
- The customer lifetime value is automatically being transmitted with the Google Ads purchase event to Google Ads
- PMW outputs the customer lifetime value as a sum of all order totals and as a sum of all filtered order values
:::info
This is available the Pixel Manager for WooCommerce from version 1.17.0, free and pro.
:::
## Why is this interesting
In order for Google Ads to be able to optimize campaigns for new and or existing customers it estimates the customer lifetime value in the background. But every estimation is just an approximation to the real value. Time gaps between orders of the same person vary and and can be very long, and other factors make this estimation difficult. This leads to an inaccurate customer lifetime value which is being used for campaign optimization.
Since WooCommerce has all the data we need for an accurate calculation, we went ahead and built this into the Pixel Manager for WooCommerce.
## The Customer Lifetime Value Output to Google Ads Is Only Available in the Pixel Manager for WooCommerce
As of this writing, the Pixel Manager for WooCommerce is the only tracking plugin that transmits the customer lifetime value directly to Google Ads. The reason is, that Google has not yet written any documentation about how to achieve that using `gtag.js`. It is possible using the Google Tag Manager. But, there is no help article for this either.
With a little bit of reverse engineering we figured out how to transmit the customer lifetime value using `gtag.js`. It's there, it's just not documented _yet_.
Therefore users of the Pixel Manager for WooCommerce belong to the first ones who can start using this feature. And as a user of the WooCommerce Pixel manager you don't even have to do a thing. PMW will send the value to Google Ads automatically in the free and the pro versions.
## How PMW Calculates the Customer Lifetime Value
We have to be careful about what we send as the customer lifetime value to Google Ads. This could be based off of the total order value which includes shipping and taxes, or excludes shipping and taxes.
And, the Pixel Manger for WooCommerce allows you to calculate your own order total logic. What would be the correct customer lifetime value in that case?
The answer is simple. The order total logic for the customer lifetime value must be the same as the order total logic that is being used to sent the purchase conversion value to Google Ads (and the other pixels).
The important bit is, that we use **exactly** the same calculation. And if we use a filter for the output, we need to use the same filter to calculate the customer lifetime value.
The Pixel Manager for WooCommerce makes this really easy for us. It outputs the `clv_order_value_filtered` into the order object on the purchase confirmation page. PMW uses the same calculation logic, including any custom filters, for the customer lifetime value of that specific customer to calculate the `clv_order_value_filtered`.
## How PMW Handles Guest Orders
Many customers don't create a user account and log into the shop before they purchase an order. And even those visitors who have a user account, sometimes purchase as guests, without having logged into the shop beforehand. If we were only looking for existing orders by searching for orders of logged in users, we would miss out a large portion of orders that belong together. This is why PMW doesn't use the WooCommerce customer ID to search for past orders. We think it is safe to assume that customers usually use the same billing email. It might not be true in all the cases, but certainly most of the cases. Therefore the Pixel Manager for WooCommerce takes the sum of all paid orders that have the same billing email to calculate the customer lifetime value.
---
# WooCommerce Google Ads New Customer reporting
URL: https://sweetcode.com/blog/woocommerce-google-ads-new-customer-reporting
Date: 2022-05-11
Tags: advanced features, Google Ads, free, pro
## TLDR
- The Pixel Manager for WooCommerce since April 2021 implements the `new_customer` parameter as specified in the Google Ads support article to [Set up new customer conversion reporting for Smart Shopping campaigns](https://support.google.com/google-ads/answer/12077475)
:::info
This is available in all versions of the Pixel Manager for WooCommerce
:::
## new_customer Parameter
The Pixel Manager for WooCommerce outputs the `new_customer` into the order object on the purchase confirmation page. PMW also sends that parameter, if true or false, with the Google Ads purchase event to Google Ads. The value can then be used by various campaigns to optimize for new customers, for existing customers or for both.
While Google Ads already tries to to figure out [on its own](https://support.google.com/google-ads/answer/9918441?hl=en#:~:text=How%20to%20distinguish%20new%20customers%20from%20existing%20customers), if a purchase is coming from an existing customer, the new_customer parameter in the Pixel Manager for WooCommerce is much more accurate.
## The Logic To Determine the new_customer Value
In order to determine if the order is from a new or an existing customer, PMW uses an optimized logic to check if a customer is an existing customer or not. Optimizing the logic was necessary because the WooCommerce internal logic can be misleading. We've seen examples of code which was checking if an order was created under an existing customer account. But, that would only work for shops where users normally log in before buying a product. On shops where customers can purchase as guests, which is the majority of all shops, that logic wouldn't take into account if a person previously has bought a product as a guest. This is why we decided to follow a different approach in PMW.
PMW takes the billing email of the existing order and checks if there are already **paid** orders in the database with the same billing email. Please note the emphasis on **paid** orders. We only deem a user as customer if at least one payment has been fully processed in one of his earlier orders. This is the most accurate approach to find out if the current order is for a new or an existing customer.
---
# The Pixel Manager has landed on the WooCommerce Marketplace !
URL: https://sweetcode.com/blog/pixel-manager-now-on-the-woocommerce-marketplace
Date: 2022-05-09
Tags: general

## TLDR
- The Pixel Manager for WooCommerce has landed on the WooCommerce marketplace!
## Big News
We are excited to announce that after many months of preparation the Pixel Manager for WooCommerce has finally landed on the WooCommerce marketplace!
You can purchase it right from the page on woocommerce.com
## Why and How
After creating and publishing the first commercial version of the Pixel Manager back in April 2021, for us it was a natural progression to also try to list it on the WooCommerce marketplace. It is the largest plugin marketplace for WooCommerce plugins after all. And trust into the WooCommerce marketplace and its reach would benefit the Pixel Manager.
But listing a plugin on the WooCommerce marketplace is long way to go. We had to jump through many hoops to get there.
## Considerations
Taking the decision to list the plugin on the WooCommerce marketplace took a lot of consideration in the first place. Taking the decision is not as clear cut as one would think.
We wanted to avoid to run into bad reviews from day one, so the code had to be squeaky clean. During 2021 the Pixel Manager went through a number of larger refactors to make the code easy to manage, fast to load, be compatible on as many browsers as possible and much more. And not every refactor went as seamless as expected. So we were afraid to publish the code on the WooCommerce marketplace while we were still planning more refactors. We added many pre-deployment tests to our workflow which not only massively lowered the risk of releasing the plugin with critical bugs, but it also enabled us to increase our release frequency significantly.
Another consideration was the WooCommerce marketplace revenue share. We wanted to keep selling the plugin from our own website, which meant until November 2021 that we had to give WooCommerce a revenue share of 60%. That was hard to bite, as we had no experience how well selling on woocommerce.com would go, and especially how much support we would have to give. Luckily in November 2021 WooCommerce lowered the revenue share to 30% at which point we decided to send in our application to list the plugin.
After a short period WooCommerce approved our application. So we thought, great, in a few days the plugin would be listed. But, from the approving the application to listing the plugin, there's a lengthy process that a new developer has to go through. I think showing each step of the process deserves an own blog post. Here are just a few bullet points that show what else needed to be done before the plugin finally got listed beginning of May 2022.
- We had to find a new name and rebrand the plugin as the old name was colliding with the WooCommerce brand policy
- Migrate the existing website, including the documentation to an entirely new framework ([docusaurus.io](https://docusaurus.io)), just because it is so much more fun to maintain and write new documentation with [docusaurus.io](https://docusaurus.io)
- Create new brand images
- Make the entire codebase compatible with WooCommerce's PHP_CodeSniffer rules (There are many. More than 10'000 lines of code had to be updated)
- Copy the entire documentation to woocommerce.com
- Create a new version of the plugin code just for the WooCommerce market, and make it easily testable and maintainable
- Set up a new support platform that fulfills the WooCommerce requirements
- Educate our support staff on how to deal with support tickets coming in for the plugin
- Go through a final business review, which in our case took a few weeks by itself
## Finally the Listing
Finally, beginning of May 2022 the plugin was officially listed as Pixel Manager for WooCommerce on the WooCommerce marketplace.
Going through the process was very educational and was worth it by itself. There were many elements we learned along the way which are transferable to new projects. And listing another plugin will not take that much time anymore, maybe just a third of the time it took us for the Pixel Manager (which took us approx. 7 months).
---
# Exclude User Roles from Tracking
URL: https://sweetcode.com/blog/exclude-user-roles-from-tracking
Date: 2022-04-16
Tags: advanced features, pro
## TLDR
- The Pixel Manager for WooCommerce now has a feature to exclude certain users roles from tracking
- Orders placed in the back-end manually can be tracked
- Even the source attribution of manual orders works
:::info
This is a pro feature. If you need this feature for your WooCommerce shop head over to the [pricing page](https://sweetcode.com/plugins/pmw#pricing-section) where you can acquire the pro version.
:::
## Tracking Exclusion by User Role has been added to WPM
We added tracking exclusion by user role to WPM, as this has been a long requested feature. It is simple to use and allows to exclude default and custom roles from being tracked by WPM. It excludes the specified users roles from tracking in all active pixels, such as Google Analytics, Google Ads, Facebook Ads, etc.
Tracking prevention can only work for logged in users.

## Tracking of Orders created in the Back-End
### Scenario 1: Testing orders
Every now and then shop owners might want to create orders in the back-end. Some of them want to test orders and therefore want to prevent inflating measured revenue. They can prevent to track orders created by logged in admins, by adding the `Administrator` role to the exclusion list.
### Scenario 2 A: Create orders in WooCommerce for clients who place orders by phone
Other shop owners work in businesses where it is common to receive calls from clients who place orders by phone. In that case the sales person enters the order manually in the back-end and those orders need to be tracked.
Pixel Manager for WooCommerce can take care of this distinction.
We recommend to create custom roles if you want a role for testing and exclude it from tracking, and another role for sales people who place orders that need to be tracked.
But there's more.
### Scenario 2 B: Create order in WooCommerce for clients who place orders by phone and then send the client a link to pay for the order
When a manual, pending order is created in the back-end, WooCommerce provides a payment link that can be sent to the client. The client then can use that link to pay for the order.
The Pixel Manager for WooCommerce can take care of this as well. Same as in scenario 2A the role of the person who is placing the order in the back-end needs to active for tracking.
One thing where we've spent extra care to detail is source attribution. If the client pays the order with the same browser that he used to click on the ad or link to reach the website, then WPM will send the correct identifiers in order to allow attribution to the original source. That can massively help with campaign optimization in case a large portion of orders are placed by phone.




---
# Google Universal Analytics Is Phasing Out
URL: https://sweetcode.com/blog/ga-universal-phasing-out
Date: 2022-04-07
Tags: ga4, google analytics
## TLDR
- Google Universal Analytics is phasing out
- Last date when Google Universal Analytics will process new data is 1 July 2023
- Pixel Manager for WooCommerce already supports GA4
## Google Universal Analytics Deprecation Notification
By now you might have noticed the new notification in Google Universal Analytics.

> Universal Analytics will no longer process new data in standard properties beginning 1 July 2023. Prepare now by setting up and switching over to a Google Analytics 4 property.
Since the announcement of GA4 everyone knew that at some point Google Universal Analytics will become obsolete. Only the date was not clear until now. Google has finally announced that this will be the 1. July 2023. It gives everyone plenty of time to prepare.
For those of you who haven't already activated GA4 we strongly recommend to do this sooner than later. So you will have time to work with both Google Analytics in parallel and get accommodated to the new GA4.
## Pixel Manager for WooCommerce Is GA4 Ready
We got you covered ! Since beginning of 2021 the Pixel Manager for WooCommerce is ready for GA4. It only takes you a few steps to activate GA4 in the WooCommerce Pixel Manager as outlined in our [setup guide](https://sweetcode.com/docs/pmw/plugin-configuration/google-analytics#connect-an-existing-google-analytics-4-property).

From the moment onward when you save the GA4 measurement ID the Pixel Manager for WooCommerce will automatically send e-commerce events to GA4. In the free version it is just the purchase event. In the [pro version](https://sweetcode.com/plugins/pmw#pricing-section) **all** e-commerce events, including the enhanced e-commerce events will be sent to GA4.
---
# Welcome
URL: https://sweetcode.com/blog/welcome
Date: 2022-02-13
Tags: sweetcode
This is the very first blog post on [sweetcode.com](https://sweetcode.com)
I've invested quite a bit of time finding a better CMS for sweetcode.com as WordPress was not checking all the boxes that I was looking for. In order to write nice documentation faster and still structurally concise and visually appealing we needed a different approach. First I found https://docsify.js.org/ which I used for the documentation for the Pixel Manager for WooCommerce. I liked it because of its use of markdown to write documentation pages. Soon I got addicted to that approach and wanted to use it for blog posts too. But Docsify is too limited in that regard.
So my search continued and I took a deep dive into Gatsby. But, I had to realize, while Gatsby gives a lot of flexibility, it would also require to develop an entire new framework for the website with exactly the components that I needed. Gatsby just didn't feel right.
Luckily I looked at other tools again, and suddenly Docusaurus stood out of the crowd. I disregarded it earlier when I chose Docsify, because at that time I didn't know how powerful editing with markdown can be and how much I would like to use it not only for documentation, but for everything.
Once I decided to use Docusaurus the implementation went fast and only took me a few days from zero to having almost the entire website, including the documentation, migrated to Docusaurus.
On top of that Docusaurus provides am much better search, driven by algolia.
Having moved to Docusaurus, despite the additional work, feels like a big relief. I'd recommend every developer to look into Docusaurus. It is a great tool!
---