General Guide: See Events Not Firing for universal debugging.
Volusion Template Architecture
Volusion uses a proprietary template system where tracking code placement depends on the template file type. Unlike tag-manager-first platforms, Volusion requires direct code edits to specific template files, and the template cache aggressively caches rendered output.
Key template files for tracking:
| Template File | Purpose | Events to Place Here |
|---|---|---|
template.html |
Global site wrapper | GA4 base snippet, GTM container, Facebook Pixel base |
article.html |
Product detail pages | view_item, ViewContent events |
order_success.html |
Order confirmation | purchase, Purchase conversion events |
searchresults.html |
Search results | view_search_results events |
shoppingcart.html |
Cart page | view_cart, begin_checkout events |
Access templates at Design > File Editor or via FTP at /v/vspfiles/templates/YOUR_TEMPLATE/.
Common Cause 1: Code in Wrong Template File
Volusion does not process JavaScript placed in arbitrary locations. If your tracking code is in the wrong file, it simply will not render.
Verify placement by viewing page source (Ctrl+U) on the live page. Search for your tracking snippet. If it is missing, the code is in the wrong template or has a syntax error that breaks Volusion's template parser.
<!-- Correct: GA4 base code in template.html, inside <head> -->
<head>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXX');
</script>
</head>
Common Cause 2: Volusion Variable Placeholders Not Populating
Volusion uses %variable% syntax for dynamic values. If the variable name is wrong or used on the wrong page type, it renders as an empty string with no error.
Test variable output by adding a temporary debug block to order_success.html:
<!-- DEBUG: Remove after testing -->
<div id="volusion-debug" style="border:2px solid red; padding:10px; margin:10px;">
<p>Order ID: %order_id%</p>
<p>Order Total: %order_total%</p>
<p>Product Names: %product_names%</p>
<p>Product Prices: %product_prices%</p>
<p>Quantity: %quantities%</p>
</div>
Known working variables for conversion tracking:
| Variable | Page | Returns |
|---|---|---|
%order_id% |
order_success.html | Order number |
%order_total% |
order_success.html | Total with tax/shipping |
%product_names% |
order_success.html | Pipe-delimited product names |
%product_prices% |
order_success.html | Pipe-delimited prices |
%quantities% |
order_success.html | Pipe-delimited quantities |
%product_name% |
article.html | Single product name |
%product_price% |
article.html | Single product price |
%product_code% |
article.html | SKU / product code |
Variables only work on their designated page types. Using %order_id% on article.html returns nothing.
Common Cause 3: Template Cache
Volusion caches rendered templates aggressively. After editing any template file, you must clear the cache or changes will not appear.
- Go to Settings > Maintenance in the Volusion admin
- Click Reset Site Cache (or Clear Template Cache depending on your version)
- Wait 2-3 minutes for cache invalidation to propagate
- Hard-refresh the browser with
Ctrl+Shift+R - Test in an incognito window to rule out browser-level caching
If the cache clear does not work, append a cache-busting query parameter to the URL (e.g., ?nocache=1) to confirm whether the issue is cache-related.
Common Cause 4: JavaScript Errors Blocking Execution
Volusion's built-in scripts can conflict with custom tracking code. Open the browser console (F12 > Console) and look for errors before your tracking code runs.
Common conflicts:
- jQuery version conflicts -- Volusion loads its own jQuery. If your tracking code loads another version,
$conflicts break both. UsejQuery.noConflict()or wrap code in an IIFE. - Prototype.js interference -- Older Volusion templates load Prototype.js, which overwrites
Array.prototypemethods. This breaks modern analytics libraries. - Template parser errors -- Unescaped
%characters in JavaScript are interpreted as Volusion variables. Escape them with%%or encode as\x25.
// Wrong: Volusion interprets %d as a variable
var formatted = value.replace(/%d/g, count);
// Correct: escape the percent sign
var formatted = value.replace(/%%d/g, count);
// Or use Unicode escape
var formatted = value.replace(/\x25d/g, count);
Purchase Event Debug Workflow
For purchase events not firing on the confirmation page:
// Add to order_success.html to debug the full purchase dataLayer push
<script>
var orderData = {
transaction_id: '%order_id%',
value: parseFloat('%order_total%'.replace(/[^0-9.]/g, '')),
currency: 'USD',
items: []
};
// Parse pipe-delimited product data
var names = '%product_names%'.split('|');
var prices = '%product_prices%'.split('|');
var qtys = '%quantities%'.split('|');
for (var i = 0; i < names.length; i++) {
if (names[i]) {
orderData.items.push({
item_name: names[i].trim(),
price: parseFloat(prices[i].replace(/[^0-9.]/g, '')),
quantity: parseInt(qtys[i]) || 1
});
}
}
console.log('Volusion Purchase Data:', JSON.stringify(orderData, null, 2));
// Uncomment below once data looks correct:
// dataLayer.push({ event: 'purchase', ecommerce: orderData });
</script>
Verification Checklist
- Tracking code present in page source (View Source, not Inspect Element)
- Template cache cleared after last edit
- Variables populating with real data (check debug div)
- No JavaScript errors in console before tracking code executes
- Events appearing in GA4 DebugView or GTM Preview mode
- Purchase events tested with a real test order (not just page refresh)
- No
%%escaping issues with percent signs in JavaScript