This is probably a rare problem to have, but it can happen: You may have a lot of events already implemented for one type of data layer, but now you need to switch systems and the name of your data layer array changes.
Note that I am deliberately writing “data layer” to refer to the concept used by all tag managers, not just specificly Google Tag Manager.
While you should still aim to actually change your implementation so that your events are pushed directly to your desired data layer, dev resources are sometimes hard to come by and you have to bridge a gap for a while.
Example:
Your events are pushed to Matomo’s _mtm
array, but now you need to push them to Google Tag Manager’s dataLayer
array.
With this very simple code, you can forward events from one array to another:
// Imagine this to be your full Matomo code
window._mtm = window._mtm || [];
function proxyDataLayer(sourceDataLayer, targetDataLayer) {
// Check if there are existing events in target data layer
if (targetDataLayer.length > 0) {
// If there are, store them in a variable
var existingEvents = targetDataLayer;
}
targetDataLayer = new Proxy(sourceDataLayer, {});
// If there are existing events, add them to the new data layer
if (existingEvents) {
targetDataLayer.push(...existingEvents);
}
return targetDataLayer;
}
// This would be your GTM code
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
'event': 'gtm.js',
'gtm.start': new Date().getTime()
});
// This is whery the magic happens
window.dataLayer = proxyDataLayer(window._mtm, window.dataLayer);
// You'll see this in your GTM Preview Mode
// as if it was pushed to dataLayer
window._mtm.push({
event: "someEvent",
myVar: "myValue"
});
And voilá - your events are now pushed to GTM’s dataLayer.
Meanwhile in Matomo’s _mtm
array, the events are still processed by Matomo Tag Manager.
I have only tested this with the combination with GTM and Matomo, but it should work with most other solutions as well.