Marketing Integrations
Klaviyo for email/SMS marketing, BazaarVoice for reviews, Google Tag Manager for analytics, and Meta Pixel for advertising.
Overview
StealthCam uses a comprehensive marketing technology stack for customer engagement, product reviews, analytics tracking, and advertising attribution.
Klaviyo Integration
Platform: Klaviyo
Implementation: Multiple plugins + custom theme integration
Purpose
Email and SMS marketing automation with sophisticated product tracking, customer segmentation, and behavioral triggers.
Integration Components
- Back in Stock Notifications - v1.2.1
- Gravity Forms Klaviyo - v1.7.3
- Custom Product Tracking - Theme integration
Back in Stock Notifications for Klaviyo v1.2.1
Plugin Location: wp-content/plugins/back-in-stock-notifications-for-klaviyo/
Purpose
Allow customers to subscribe to email alerts when out-of-stock products become available again.
Features
- Product Feed - Custom XML feed of out-of-stock products
- Sign-up Forms - Klaviyo-powered subscription forms
- Automatic Integration - Works with BigCommerce inventory
- Form Templates - Overrideable templates
- AJAX Submission - No page reload on form submit
- Double Opt-In - GDPR-compliant subscription process
Display
Automatically appears on product pages when stock level = 0.
<div class="back-in-stock-form">
<h4>Notify me when available</h4>
<form class="bis-form" data-product-id="<?php echo $product->bc_id(); ?>">
<input
type="email"
name="email"
placeholder="Enter your email"
required
/>
<button type="submit" class="btn btn-primary">
Notify Me
</button>
</form>
<p class="bis-disclaimer">
We'll email you when this item is back in stock.
<a href="/privacy-policy">Privacy Policy</a>
</p>
</div>
Shortcode
[back_in_stock_form product_id="123"]
Klaviyo List
Subscribers are added to a dedicated Klaviyo list: "Back in Stock Subscribers"
Custom Properties:
product_id- BigCommerce product IDproduct_name- Product titleproduct_url- Product page URLsubscribed_at- Timestamp
Klaviyo Flow
Flow Name: Back in Stock Alert
Trigger: When product inventory increases from 0 to >0
Email Template:
- Subject: "Good News! [Product Name] is Back in Stock"
- Product image and details
- Direct "Shop Now" link
- Limited time urgency copy
Product Feed XML
Feed URL: /wp-content/uploads/back-in-stock/products.xml
Generation: Daily via cron
<?xml version="1.0" encoding="UTF-8"?>
<products>
<product>
<id>123</id>
<name><![CDATA[Trail Camera Pro]]></name>
<url><![CDATA[https://stealthcam.com/products/trail-camera-pro]]></url>
<image><![CDATA[https://cdn.stealthcam.com/image.jpg]]></image>
<price>199.99</price>
<stock_status>out_of_stock</stock_status>
<subscriber_count>47</subscriber_count>
</product>
</products>
Gravity Forms Klaviyo v1.7.3
Plugin Location: wp-content/plugins/gravityforms-klaviyo/
Purpose
Send Gravity Forms submissions to Klaviyo lists with custom field mapping.
Use Cases
- Newsletter signups
- Contest entries
- Product registrations
- Dealer applications
- Customer feedback forms
Configuration
Admin: Forms → Settings → Klaviyo
- API Key: Klaviyo Private API key
- Default List: Default Klaviyo list ID
Form-Level Setup
Forms → [Select Form] → Settings → Klaviyo
- List ID: Target Klaviyo list
- Field Mapping: Map GF fields to Klaviyo properties
- Double Opt-In: Enable/disable
- Conditional Logic: Send only if conditions met
Field Mapping
| Gravity Form Field | Klaviyo Property |
|---|---|
| $email (required) | |
| First Name | $first_name |
| Last Name | $last_name |
| Phone | $phone_number |
| Custom Field 1 | product_interest |
| Custom Field 2 | referral_source |
Example Form: Newsletter Signup
// Gravity Forms newsletter form (ID: 5)
[gravityform id="5" title="false" description="false"]
Form Fields:
- Email (required)
- First Name
- Last Name
- Product Interests (checkboxes)
Klaviyo Settings:
- List: Newsletter Subscribers
- Mapping:
email→$emailfirst_name→$first_namelast_name→$last_nameproduct_interests→interests(comma-separated)
Custom Product Tracking
Implementation: Theme inc/class-klaviyo.php
Purpose
Track customer product interactions and send behavioral data to Klaviyo for segmentation and triggered campaigns.
Tracked Events
- Viewed Product - Product page view
- Viewed Item - For Klaviyo product recommendations
- Added to Cart - Add to cart action
- Started Checkout - Checkout initiation
- Placed Order - Order completion
Klaviyo Onsite Script
Loaded in: <head> tag on all pages
var _learnq = _learnq || [];
_learnq.push(['account', 'KLAVIYO_PUBLIC_KEY']);
(function() {
var b = document.createElement('script');
b.type = 'text/javascript';
b.async = true;
b.src = 'https://static.klaviyo.com/onsite/js/klaviyo.js?company_id=COMPANY_ID';
var a = document.getElementsByTagName('script')[0];
a.parentNode.insertBefore(b, a);
})();
Product Page Tracking
Location: Single product template footer
// 1. Viewed Product Event
_learnq.push(['track', 'Viewed Product', {
'ProductID': '<?php echo $product->bc_id(); ?>',
'Name': '<?php echo esc_js($product->name); ?>',
'ImageURL': '<?php echo esc_url($product->featured_image('large')); ?>',
'URL': '<?php echo get_permalink(); ?>',
'Brand': '<?php echo esc_js($product->brand()); ?>',
'Price': <?php echo $product->calculated_price(); ?>,
'CompareAtPrice': <?php echo $product->retail_price(); ?>,
'Categories': <?php echo json_encode($product->categories()); ?>
}]);
// 2. Viewed Item (for recommendations)
_learnq.push(['trackViewedItem', {
'Title': '<?php echo esc_js($product->name); ?>',
'ItemId': '<?php echo $product->bc_id(); ?>',
'Categories': <?php echo json_encode($product->categories()); ?>,
'ImageUrl': '<?php echo esc_url($product->featured_image('large')); ?>',
'Url': '<?php echo get_permalink(); ?>',
'Metadata': {
'Brand': '<?php echo esc_js($product->brand()); ?>',
'Price': <?php echo $product->calculated_price(); ?>,
'CompareAtPrice': <?php echo $product->retail_price(); ?>
}
}]);
Add to Cart Tracking
Trigger: Click on .bc-btn--add_to_cart button
document.addEventListener('DOMContentLoaded', function() {
document.querySelectorAll('.bc-btn--add_to_cart').forEach(function(button) {
button.addEventListener('click', function(e) {
var productData = JSON.parse(this.dataset.productTracking || '{}');
_learnq.push(['track', 'Added to Cart', {
'ProductID': productData.id,
'Name': productData.name,
'Price': productData.price,
'Quantity': parseInt(document.querySelector('[name="quantity"]').value || 1)
}]);
});
});
});
Checkout Tracking
BigCommerce Embedded Checkout: Events tracked via GTM + BigCommerce webhooks
Klaviyo Flows Using Product Events
Browse Abandonment
- Trigger: Viewed Product but no purchase in 24 hours
- Wait: 2 hours after last product view
- Email: Product reminder with similar items
Cart Abandonment
- Trigger: Added to Cart but no checkout in 1 hour
- Wait: 1 hour
- Email: Cart reminder with discount code
Post-Purchase
- Trigger: Placed Order
- Wait: 3 days
- Email: Product setup tips, cross-sell recommendations
BazaarVoice Integration
Plugin: Suma BazaarVoice Integrator v1.1.4
Location: wp-content/plugins/suma-bazaarvoice-integrator/
Purpose
Display and collect product reviews and ratings with BazaarVoice's moderation and syndication platform.
Features
- Reviews & Ratings - Star ratings and detailed reviews
- Questions & Answers - Product Q&A module
- Inline Ratings - Display rating summary on product cards
- Syndication - Cross-site review sharing
- SEO - Schema.org structured data
- Moderation - Professional review moderation
BazaarVoice Widgets
Ratings Summary (Product Cards)
Display star rating and review count on product grid/list.
<div
data-bv-show="inline_rating"
data-bv-product-id="<?php echo $product->bc_id(); ?>"
></div>
Renders:
<div class="bv-inline-rating">
<span class="bv-rating-stars">★★★★☆</span>
<span class="bv-rating-count">(47 reviews)</span>
</div>
Reviews Container (Product Page)
Full reviews display with filtering, sorting, and submission form.
<div id="BVRRContainer" data-bv-show="reviews" data-bv-product-id="<?php echo $product->bc_id(); ?>"></div>
Features:
- Star rating distribution
- Review list with filtering (rating, helpful, recent)
- Review submission form
- Image upload
- Verified purchase badges
Rating Summary (Product Page)
Star rating summary above reviews.
<div id="BVRRSummaryContainer" data-bv-show="rating_summary" data-bv-product-id="<?php echo $product->bc_id(); ?>"></div>
Questions & Answers
Product Q&A module.
<div id="BVQAContainer" data-bv-show="questions" data-bv-product-id="<?php echo $product->bc_id(); ?>"></div>
BazaarVoice Script Loading
Loaded in: Footer on product pages
$BV.configure('global', {
productId: '<?php echo $product->bc_id(); ?>'
});
$BV.ui('rr', 'show_reviews', {
productId: '<?php echo $product->bc_id(); ?>'
});
Product Feed
Feed URL: /wp-content/uploads/bazaarvoice/product-feed.xml
Cron Schedule: Daily at 2:00 AM
BazaarVoice Ingestion: Feed URL provided to BV for automatic import
Schema.org Markup
Aggregate Rating Markup (injected on product pages):
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Trail Camera Pro",
"aggregateRating": {
"@type": "AggregateRating",
"ratingValue": "4.6",
"reviewCount": "47",
"bestRating": "5",
"worstRating": "1"
}
}
Google Tag Manager
GTM4WP v1.20.3
Plugin: GTM4WP (Google Tag Manager for WordPress)
Location: wp-content/plugins/duracelltomi-google-tag-manager/
Purpose
Implement Google Tag Manager container for unified tracking code management.
Configuration
Admin: Settings → Google Tag Manager
- GTM Container ID: GTM-XXXXXXX
- Container Placement: Header + Body (recommended by Google)
- Data Layer: Enhanced ecommerce enabled
Data Layer Events
Page View:
dataLayer.push({
'event': 'page_view',
'page_type': 'product',
'page_title': 'Trail Camera Pro'
});
Product Impression:
dataLayer.push({
'event': 'view_item_list',
'ecommerce': {
'items': [
{
'item_id': '123',
'item_name': 'Trail Camera Pro',
'item_brand': 'StealthCam',
'item_category': 'Trail Cameras',
'price': 199.99,
'index': 0
}
]
}
});
Add to Cart:
dataLayer.push({
'event': 'add_to_cart',
'ecommerce': {
'items': [
{
'item_id': '123',
'item_name': 'Trail Camera Pro',
'price': 199.99,
'quantity': 1
}
]
}
});
Purchase (order confirmation):
dataLayer.push({
'event': 'purchase',
'ecommerce': {
'transaction_id': 'ORD-12345',
'value': 199.99,
'tax': 15.00,
'shipping': 10.00,
'currency': 'USD',
'items': [...]
}
});
GTM Tags
Google Analytics 4 (GA4):
- Configuration Tag: GA4 Config (Measurement ID: G-XXXXXXXXXX)
- Event Tags: page_view, add_to_cart, purchase, etc.
Google Ads Conversion:
- Conversion ID: AW-XXXXXXXXX
- Conversion Labels: Purchase, Lead, etc.
Facebook Pixel (via GTM):
- Pixel ID: Managed through Meta Pixel plugin (see below)
GTM Server Side v2.1.29
Plugin: GTM Server Side Tracking
Location: wp-content/plugins/gtm-server-side-tracking/
Purpose
Send conversion events to server-side Google Tag Manager for improved accuracy, privacy compliance, and ad platform integration.
Features
- Server-Side Tracking - Bypass ad blockers
- Webhook Integration - BigCommerce order webhooks
- Enhanced Conversions - First-party data hashing
- Privacy Controls - GDPR/CCPA compliance
- API Gateway - Secure event forwarding
Configuration
Admin: Settings → GTM Server Side
- Server Container URL:
https://gtm.stealthcam.com - Webhook Secret: Shared secret with BigCommerce
- Event Forwarding: Enabled for orders
Webhook Endpoint
URL: https://stealthcam.com/wp-json/gtm-ss/v1/webhook
BigCommerce Webhook:
- Scope:
store/order/created - Destination: StealthCam webhook endpoint
- Headers:
X-Webhook-Secret: [secret]
Order Event Processing
// Receive BigCommerce order webhook
// Send to GTM Server Container
// GTM forwards to GA4, Google Ads, Facebook CAPI
{
"event": "purchase",
"transaction_id": "ORD-12345",
"value": 199.99,
"currency": "USD",
"items": [...],
"user_data": {
"email_hash": "sha256_hash",
"phone_hash": "sha256_hash",
"address": {...}
}
}
Meta Pixel Integration
Plugin: Meta Pixel for WordPress v4.1.2
Location: wp-content/plugins/official-facebook-pixel/
Purpose
Track website events for Facebook/Instagram advertising campaigns with Facebook Conversions API support.
Features
- Pixel Tracking - Standard and custom events
- Conversions API (CAPI) - Server-side tracking
- Product Catalog - Dynamic product ads
- Custom Audiences - Retargeting segments
- Attribution - Track ad performance
Configuration
Admin: Settings → Facebook Pixel
- Pixel ID: Meta Pixel ID (16-digit number)
- Access Token: System user access token
- Advanced Matching: Enabled (email, phone hashing)
- Automatic Events: Enabled
Standard Events
PageView (automatic):
fbq('track', 'PageView');
ViewContent (product pages):
fbq('track', 'ViewContent', {
content_name: 'Trail Camera Pro',
content_ids: ['123'],
content_type: 'product',
value: 199.99,
currency: 'USD'
});
AddToCart:
fbq('track', 'AddToCart', {
content_ids: ['123'],
content_name: 'Trail Camera Pro',
value: 199.99,
currency: 'USD'
});
InitiateCheckout:
fbq('track', 'InitiateCheckout', {
value: 199.99,
currency: 'USD',
num_items: 1
});
Purchase (order confirmation):
fbq('track', 'Purchase', {
value: 199.99,
currency: 'USD',
contents: [
{id: '123', quantity: 1}
],
content_type: 'product'
});
Conversions API (CAPI)
Server-Side Events: Order events sent via webhook → server → Facebook CAPI
Benefits:
- Bypass ad blockers
- Improve attribution accuracy
- First-party data integration
- iOS 14+ privacy compliance
Product Catalog Feed
Feed URL: /wp-content/uploads/facebook/product-catalog.xml
Format: RSS 2.0 / Atom
Cron: Daily generation
Facebook Business Manager: Import feed for dynamic product ads
Analytics Workflow
Event Flow
User Action (Product Page Visit)
↓
1. Client-Side Events
- GTM4WP Data Layer Push
- Klaviyo Product Tracking
- Meta Pixel ViewContent
- BazaarVoice Impression
↓
2. GTM Processing
- Triggers GA4 event
- Triggers Google Ads conversion
- Forwards to Meta Pixel
↓
3. Server-Side Events (on purchase)
- BigCommerce Order Webhook
- GTM Server Container
- Conversions API (Facebook)
- GA4 Measurement Protocol
- Klaviyo Order Event
Cross-Platform Attribution
Purchase Attribution (single order tracked across):
- GA4 Enhanced Ecommerce
- Google Ads Conversions
- Facebook CAPI
- Klaviyo Revenue Tracking
- BigCommerce Admin
Deduplication: Transaction ID used across all platforms for deduplication.
GDPR Compliance
Consent Management
Plugin: Cookie Notice & Compliance (not documented separately)
Cookie Categories:
- Necessary: WordPress core, security
- Analytics: GA4, GTM
- Marketing: Klaviyo, Meta Pixel, Google Ads
User Controls:
- Accept all / Reject all
- Granular category selection
- Withdraw consent
Conditional Script Loading
Scripts load only after user consent:
// Check consent before loading marketing scripts
if (hasConsent('marketing')) {
loadKlaviyoScript();
loadMetaPixelScript();
}
if (hasConsent('analytics')) {
loadGA4Script();
}
Data Processing
- Email Hashing: SHA256 for Klaviyo, Meta
- IP Anonymization: GA4 setting enabled
- Data Retention: 26 months (GA4), per Klaviyo settings
- User Deletion: GDPR deletion requests handled manually
Performance Considerations
Script Loading Strategy
- Defer Marketing Scripts: Load after page interactive
- Async GTM: GTM container loads asynchronously
- Conditional Loading: Load only on relevant pages
- Resource Hints:
preconnectto external domains
<link rel="preconnect" href="https://static.klaviyo.com">
<link rel="preconnect" href="https://www.googletagmanager.com">
<link rel="preconnect" href="https://connect.facebook.net">
Impact Monitoring
Core Web Vitals: Monitor impact of marketing scripts on LCP, FID, CLS
Optimization Actions:
- Defer non-critical scripts
- Use Partytown for web worker execution
- Implement request batching