Overview
Google Tag Manager (GTM) provides a centralized platform to manage all your tracking tags without modifying code for each change:
- One container for all tracking codes
- No code deployment for tag updates
- Version control with rollback capability
- Preview mode for testing before publishing
- Built-in templates for GA4, Meta Pixel, and more
Prerequisites
- GTM Account created - Create GTM Account
- Container created - Get Container ID (GTM-XXXXXX)
- FTP/File access - To modify OSCommerce templates
- Backup - Complete site backup before modifications
Step 1: Create GTM Container
- Go to Google Tag Manager
- Click Create Account
- Account Name: Your business name
- Container Name: Your website domain
- Target Platform: Web
- Click Create
Copy your Container ID (format: GTM-XXXXXX)
Step 2: Install GTM Code in OSCommerce
GTM requires two code snippets: one in <head> and one in <body>.
OSCommerce 2.3.x Installation
File: catalog/includes/header.php
Add in the <head> section, as high as possible:
<head>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>
<!-- End Google Tag Manager -->
<!-- Rest of head content -->
</head>
Add immediately after the opening <body> tag:
<body>
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
<!-- Rest of body content -->
Replace GTM-XXXXXX with your actual Container ID.
OSCommerce 2.4.x Installation
File: catalog/includes/modules/header_tags/ht_google_tag_manager.php
Create a new module file:
<?php
class ht_google_tag_manager {
var $code = 'ht_google_tag_manager';
var $group = 'header_tags';
var $title;
var $description;
var $sort_order;
var $enabled = false;
function __construct() {
$this->title = 'Google Tag Manager';
$this->description = 'Add Google Tag Manager container to all pages';
$this->sort_order = 50;
$this->enabled = (defined('MODULE_HEADER_TAGS_GTM_STATUS') && MODULE_HEADER_TAGS_GTM_STATUS == 'True');
}
function execute() {
global $oscTemplate;
if ($this->enabled) {
$container_id = MODULE_HEADER_TAGS_GTM_CONTAINER_ID;
// Head script
$gtm_head = <<<EOD
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','{$container_id}');</script>
<!-- End Google Tag Manager -->
EOD;
$oscTemplate->addContent($gtm_head, $this->group);
// Body noscript (add to page content)
$gtm_body = <<<EOD
<!-- Google Tag Manager (noscript) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id={$container_id}"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<!-- End Google Tag Manager (noscript) -->
EOD;
$oscTemplate->addContent($gtm_body, 'content_top');
}
}
function isEnabled() {
return $this->enabled;
}
function check() {
return defined('MODULE_HEADER_TAGS_GTM_STATUS');
}
function install() {
tep_db_query("INSERT INTO configuration (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, set_function, date_added) VALUES ('Enable Google Tag Manager', 'MODULE_HEADER_TAGS_GTM_STATUS', 'True', 'Enable Google Tag Manager?', '6', '1', 'tep_cfg_select_option(array(\'True\', \'False\'), ', now())");
tep_db_query("INSERT INTO configuration (configuration_title, configuration_key, configuration_value, configuration_description, configuration_group_id, sort_order, date_added) VALUES ('GTM Container ID', 'MODULE_HEADER_TAGS_GTM_CONTAINER_ID', '', 'Enter your GTM Container ID (GTM-XXXXXX)', '6', '2', now())");
}
function remove() {
tep_db_query("DELETE FROM configuration WHERE configuration_key IN ('" . implode("', '", $this->keys()) . "')");
}
function keys() {
return array('MODULE_HEADER_TAGS_GTM_STATUS', 'MODULE_HEADER_TAGS_GTM_CONTAINER_ID');
}
}
?>
Then install via admin:
Admin > Modules > Header Tags > Install Module > Google Tag Manager
OSCommerce CE Installation
File: catalog/includes/header.php
Add GTM code the same way as 2.3.x version.
Step 3: Verify Installation
Method 1: View Page Source
- Visit your store homepage
- Right-click > View Page Source
- Search (Ctrl+F) for
GTM- - Verify your Container ID appears twice (head and body)
Method 2: Browser Console
// Open console (F12) and type:
dataLayer
// Should return an array
typeof google_tag_manager
// Should return "object"
Object.keys(google_tag_manager)
// Should show your container ID
Method 3: Network Tab
F12 > Network tab > Filter by "gtm.js"
Should see request to googletagmanager.com/gtm.js?id=GTM-XXXXXX
Step 4: Set Up GTM Preview Mode
Test your installation:
- In GTM, click Preview (top right)
- Enter your store URL
- Click Connect
- New debug window opens showing tag status
You should see:
- Container Loaded - GTM is working
- Tags Fired - Which tags have fired
- Variables - Available data
Step 5: Configure Basic Data Layer
For enhanced tracking, initialize dataLayer with page info.
File: catalog/includes/header.php
Add BEFORE the GTM code:
<script>
window.dataLayer = window.dataLayer || [];
dataLayer.push({
'pageType': '<?php echo basename($_SERVER['PHP_SELF'], '.php'); ?>',
'userStatus': '<?php echo (tep_session_is_registered('customer_id') ? 'logged_in' : 'guest'); ?>'
<?php if (isset($_SESSION['currency'])): ?>
,'currency': '<?php echo $_SESSION['currency']; ?>'
<?php endif; ?>
<?php if (tep_session_is_registered('customer_id')): ?>
,'userId': '<?php echo $customer_id; ?>'
<?php endif; ?>
});
</script>
Then add the GTM head code.
Common GTM Tags for OSCommerce
Tag 1: Google Analytics 4
In GTM:
- Tags > New
- Tag Configuration > Google Analytics: GA4 Configuration
- Measurement ID:
G-XXXXXXXXXX - Triggering: All Pages
- Save
Tag 2: Meta Pixel Base Code
- Tags > New
- Tag Configuration > Custom HTML
- Paste Meta Pixel code:
<script> !function(f,b,e,v,n,t,s) {if(f.fbq)return;n=f.fbq=function(){n.callMethod? n.callMethod.apply(n,arguments):n.queue.push(arguments)}; if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; n.queue=[];t=b.createElement(e);t.async=!0; t.src=v;s=b.getElementsByTagName(e)[0]; s.parentNode.insertBefore(t,s)}(window, document,'script', 'https://connect.facebook.net/en_US/fbevents.js'); fbq('init', 'YOUR_PIXEL_ID'); fbq('track', 'PageView'); </script> - Triggering: All Pages
- Save
Tag 3: GA4 Pageview (if not automatic)
- Tags > New
- Tag Configuration > Google Analytics: GA4 Event
- Configuration Tag: Select your GA4 Config tag
- Event Name:
page_view - Triggering: All Pages
- Save
GTM Variables Setup
Configure variables to capture OSCommerce data.
Variable 1: Page Type
- Variables > User-Defined Variables > New
- Variable Configuration > Data Layer Variable
- Data Layer Variable Name:
pageType - Name:
DLV - Page Type - Save
Variable 2: User Status
- Variables > New
- Data Layer Variable
- Data Layer Variable Name:
userStatus - Name:
DLV - User Status - Save
Variable 3: User ID
- Variables > New
- Data Layer Variable
- Data Layer Variable Name:
userId - Name:
DLV - User ID - Save
GTM Triggers Setup
Trigger 1: Product Page View
- Triggers > New
- Trigger Configuration > Page View
- This trigger fires on: Some Page Views
- Fire this trigger when:
Page Pathcontainsproduct_info.php
- Name:
Page View - Product - Save
Trigger 2: Checkout Pages
- Triggers > New
- Page View
- Some Page Views
- Fire when:
Page Pathcontainscheckout
- Name:
Page View - Checkout - Save
Trigger 3: Purchase Success
- Triggers > New
- Page View
- Some Page Views
- Fire when:
Page Pathcontainscheckout_success.php
- Name:
Page View - Purchase Success - Save
Publishing Your Container
- Click Submit (top right)
- Version Name: "Initial GTM Setup for OSCommerce"
- Version Description: "Added GA4, Meta Pixel, basic dataLayer"
- Click Publish
Your tags are now live!
Testing GTM Installation
Checklist
- GTM code appears in page source (head and body)
- dataLayer exists in console
- google_tag_manager object exists
- GTM Preview mode connects successfully
- GA4 Configuration tag fires on all pages
- Meta Pixel fires on all pages
- Variables populate correctly
- No JavaScript errors in console
Common Issues
Issue 1: GTM Container Not Loading
Solutions:
- Verify Container ID is correct
- Check for JavaScript errors
- Clear browser cache
- Check file permissions on header.php
Issue 2: dataLayer Not Defined
Solutions:
- Ensure dataLayer initialization comes BEFORE GTM code
- Check for syntax errors in dataLayer.push
- Verify proper PHP tag closures
Issue 3: Tags Not Firing in Preview Mode
Solutions:
- Check trigger conditions
- Verify page matches trigger criteria
- Check for ad blockers
- Review GTM debug console errors
Issue 4: Duplicate Tags
Solutions:
- Remove old hard-coded tracking (GA, Meta Pixel)
- Check for multiple GTM containers
- Review all header/footer files for duplicate code
Best Practices
1. Remove Direct Tracking Code
After GTM is working, remove:
- Direct GA4 code from header.php
- Direct Meta Pixel code
- Any other direct tracking scripts
Manage everything through GTM instead.
2. Use Consistent Naming
Tags: "GA4 - Event - Add to Cart"
Triggers: "Event - Add to Cart"
Variables: "DLV - Product Name"
3. Add Descriptions
Document what each tag/trigger/variable does for future reference.
4. Use Folders
Organize tags by type:
- Google Analytics
- Meta Pixel
- Utilities
- Third-party tags
5. Test Before Publishing
Always use Preview mode before publishing changes.
6. Version Control
Use descriptive version names and descriptions for easy rollback.
Advanced Configuration
Custom JavaScript Variables
Create variables to extract data from the page:
Variable: Product ID from URL
- Variables > New
- Custom JavaScript
- Code:
function() { var params = new URLSearchParams(window.location.search); return params.get('products_id'); } - Name:
JS - Product ID
Debug Mode
Enable GTM debug in console:
// Enable debug
window.gtmDebug = true;
// View dataLayer pushes
dataLayer.push = new Proxy(dataLayer.push, {
apply: function(target, thisArg, args) {
console.log('dataLayer.push:', args);
return target.apply(thisArg, args);
}
});
Server-Side GTM (Advanced)
For enhanced privacy and tracking reliability, consider Server-Side GTM:
- Set up GTM Server container
- Configure server in Google Cloud/other provider
- Point OSCommerce to server endpoint
- Benefits: Better data control, bypasses ad blockers, improved accuracy