___TERMS_OF_SERVICE___ By creating or modifying this file you agree to Google Tag Manager's Community Template Gallery Developer Terms of Service available at https://developers.google.com/tag-manager/gallery-tos (or such other URL as Google may provide), as modified from time to time. ___INFO___ { "displayName": "Outbrain Enhanced", "description": "Outbrain Pixel allows you to track conversions and create Custom Audiences on your web site.\nThis version allow advanced options.", "categories": [ "ATTRIBUTION", "REMARKETING" ], "securityGroups": [], "id": "cvt_temp_public_id", "type": "TAG", "version": 1, "brand": { "thumbnail": "data:image/png;base64,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", "displayName": "Custom template created by Luratic", "id": "brand_custom_template" }, "containerContexts": [ "WEB" ] } ___TEMPLATE_PARAMETERS___ [ { "notSetText": "You must set the Marketer Id field.", "help": "You can find your Marketer Id on the Amplify Dashboard. Navigate to the Conversions page and click on the \"View Outbrain Pixel\" button. Then you can copy your Marketer Id from the code snippet (It is a string of numbers and letters named \"OB_ADV_ID\").", "valueValidators": [ { "args": [ "([0-9a-zA-Z]{10,50},)*[0-9a-zA-Z]{10,50}$" ], "type": "REGEX" }, { "type": "NON_EMPTY" } ], "displayName": "Marketer Id (OB_ADV_ID)", "simpleValueType": true, "name": "MarketerId", "type": "TEXT" }, { "type": "RADIO", "name": "type", "displayName": "Select an event:", "radioItems": [ { "value": "PAGE_VIEW", "displayValue": "Pageview", "help": "Track a PAGE_VIEW event." }, { "value": "Purchase", "displayValue": "Purchase", "help": "Track a purchase event.", "subParams": [] }, { "value": "customEvent", "displayValue": "Custom Event", "help": "Custom Event Name", "subParams": [ { "type": "TEXT", "name": "name", "displayName": "Custom Event Name:", "simpleValueType": true, "help": "Set a custom event name", "valueHint": "Register" } ] } ], "simpleValueType": true }, { "type": "GROUP", "name": "info", "displayName": "Additional parameters", "subParams": [ { "type": "SIMPLE_TABLE", "name": "parameters", "displayName": "", "simpleTableColumns": [ { "defaultValue": "", "displayName": "Name parameter", "name": "name", "type": "TEXT", "isUnique": true, "valueHint": "currency" }, { "defaultValue": "", "displayName": "Value parameter", "name": "value", "type": "TEXT", "valueHint": "EUR" } ] } ], "enablingConditions": [ { "paramName": "type", "paramValue": "Purchase", "type": "EQUALS" }, { "paramName": "type", "paramValue": "customEvent", "type": "EQUALS" } ], "groupStyle": "ZIPPY_OPEN" }, { "type": "LABEL", "name": "customInfo", "displayName": "\u003ca href\u003d\"https://www.luratic.com/posts/templates/tags/outbrain-enhanced\"\u003eInfo \u003c/a\u003e" } ] ___SANDBOXED_JS_FOR_WEB_TEMPLATE___ const injectScript = require('injectScript'); const setInWindow = require('setInWindow'); const log = require('logToConsole'); const makeTableMap = require('makeTableMap'); const copyFromWindow = require('copyFromWindow'); const callInWindow = require('callInWindow'); log("data", data); const getEventName = () => { const type = data.type; if(type === 'customEvent') { return data.name; } return type; }; const getParameters = () => { var parameterTable = data.parameters; if(parameterTable) { return makeTableMap(parameterTable, 'name', 'value'); } return false; }; const initApi = () => { const api = function () { const apiDispatch = copyFromWindow('obApi.dispatch'); if(apiDispatch) { callInWindow('obApi.dispatch.apply', api, arguments); } else { callInWindow('obApi.queue.push', arguments); } }; api.version = '1.1'; api.loaded = true; api.marketerId = id.split(','); api.queue = []; return api; }; const getApi = () => { let obApi = copyFromWindow('obApi'); if(obApi) { return obApi; } const api = initApi(); setInWindow('obApi', api); return copyFromWindow('obApi'); }; const sendEvent = () => { if(parameters) { obApi('track', eventName, parameters); } else { obApi('track', eventName); } }; const id = data.MarketerId; const eventName = getEventName(); const parameters = getParameters(); log("parameters", parameters); log('eventName', eventName); const url = 'https://amplify.outbrain.com/cp/obtp.js'; const obApi = getApi(); sendEvent(); injectScript(url, data.gtmOnSuccess, data.gtmOnFailure, 'outbrain'); ___WEB_PERMISSIONS___ [ { "instance": { "key": { "publicId": "access_globals", "versionId": "1" }, "param": [ { "key": "keys", "value": { "type": 2, "listItem": [ { "type": 3, "mapKey": [ { "type": 1, "string": "key" }, { "type": 1, "string": "read" }, { "type": 1, "string": "write" }, { "type": 1, "string": "execute" } ], "mapValue": [ { "type": 1, "string": "obApi" }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true }, { "type": 8, "boolean": false } ] }, { "type": 3, "mapKey": [ { "type": 1, "string": "key" }, { "type": 1, "string": "read" }, { "type": 1, "string": "write" }, { "type": 1, "string": "execute" } ], "mapValue": [ { "type": 1, "string": "obApi.queue" }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true }, { "type": 8, "boolean": false } ] }, { "type": 3, "mapKey": [ { "type": 1, "string": "key" }, { "type": 1, "string": "read" }, { "type": 1, "string": "write" }, { "type": 1, "string": "execute" } ], "mapValue": [ { "type": 1, "string": "obApi.dispatch" }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true } ] }, { "type": 3, "mapKey": [ { "type": 1, "string": "key" }, { "type": 1, "string": "read" }, { "type": 1, "string": "write" }, { "type": 1, "string": "execute" } ], "mapValue": [ { "type": 1, "string": "obApi.dispatch.apply" }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true } ] }, { "type": 3, "mapKey": [ { "type": 1, "string": "key" }, { "type": 1, "string": "read" }, { "type": 1, "string": "write" }, { "type": 1, "string": "execute" } ], "mapValue": [ { "type": 1, "string": "obApi.queue.push" }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true }, { "type": 8, "boolean": true } ] } ] } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "inject_script", "versionId": "1" }, "param": [ { "key": "urls", "value": { "type": 2, "listItem": [ { "type": 1, "string": "https://amplify.outbrain.com/*" } ] } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "logging", "versionId": "1" }, "param": [ { "key": "environments", "value": { "type": 1, "string": "debug" } } ] }, "isRequired": true } ] ___TESTS___ scenarios: - name: gtmOnSuccess is invoked on injectScript success code: |- // test that gtmOnSuccess() is called when injectScript succeeds mock('injectScript', (url, onSuccess, onFailure) => { onSuccess(); }); // Call runCode to run the template's code. runCode(); // Verify that the tag finished successfully. assertApi('gtmOnSuccess').wasCalled(); - name: gtmOnFailure is invoked when injectScript fails code: |- // test gtmOnFailure() is called when injectScript fails mock('injectScript', (url, onSuccess, onFailure) => { onFailure(); }); // Call runCode to run the template's code. runCode(); // Verify onFailure was called assertApi('gtmOnFailure').wasCalled(); ___NOTES___ Developed with ❤ by: Alfonso, Txema and Brais. Web: www.luratic.com Linkedin: https://www.linkedin.com/in/braiscalvo/ https://www.linkedin.com/in/alfonsorc/ https://www.linkedin.com/in/txema-s%C3%A1nchez-a48482ba/