{ "exportFormatVersion": 2, "exportTime": "2026-03-03 01:00:03", "containerVersion": { "path": "accounts/13152216/containers/235565883/versions/6", "accountId": "13152216", "containerId": "235565883", "containerVersionId": "6", "name": "Smart Pages template V6", "description": "Latest version.", "container": { "path": "accounts/13152216/containers/235565883", "accountId": "13152216", "containerId": "235565883", "name": "Engaging Networks Smart Pages 2025", "publicId": "GTM-KG82X6TT", "usageContext": [ "WEB" ], "fingerprint": "1772494745546", "tagManagerUrl": "https://tagmanager.google.com/#/container/accounts/13152216/containers/235565883/workspaces?apiLink=container", "features": { "supportUserPermissions": true, "supportEnvironments": true, "supportWorkspaces": true, "supportGtagConfigs": false, "supportBuiltInVariables": true, "supportClients": false, "supportFolders": true, "supportTags": true, "supportTemplates": true, "supportTriggers": true, "supportVariables": true, "supportVersions": true, "supportZones": true, "supportTransformations": false }, "tagIds": [ "GTM-KG82X6TT" ] }, "tag": [ { "accountId": "13152216", "containerId": "235565883", "tagId": "4", "name": "Google Tag - All pages", "type": "googtag", "parameter": [ { "type": "TEMPLATE", "key": "tagId", "value": "{{Google Tag Measurement ID}}" } ], "fingerprint": "1772469733211", "firingTriggerId": [ "2147479573" ], "parentFolderId": "5", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "13152216", "containerId": "235565883", "tagId": "18", "name": "GA4 Smart Pages Ecommerce Events", "type": "gaawe", "parameter": [ { "type": "BOOLEAN", "key": "sendEcommerceData", "value": "true" }, { "type": "TEMPLATE", "key": "getEcommerceDataFrom", "value": "dataLayer" }, { "type": "TEMPLATE", "key": "eventName", "value": "{{Event}}" }, { "type": "TEMPLATE", "key": "measurementIdOverride", "value": "{{Google Tag Measurement ID}}" } ], "fingerprint": "1768928626856", "firingTriggerId": [ "17" ], "parentFolderId": "5", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NOT_SET" } }, { "accountId": "13152216", "containerId": "235565883", "tagId": "22", "name": "META Smart Pages Ecommerce events", "type": "cvt_5RM3Q", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{META Pixel ID}}" }, { "type": "TEMPLATE", "key": "variableEventName", "value": "{{META Pixel Ecommerce Events}}" }, { "type": "LIST", "key": "objectPropertyList", "list": [ { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "name", "value": "content_type" }, { "type": "TEMPLATE", "key": "value", "value": "smartpages_donation_page" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "name", "value": "contents" }, { "type": "TEMPLATE", "key": "value", "value": "{{DLV - ecommerce.items.0.item_name}}" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "name", "value": "content_ids" }, { "type": "TEMPLATE", "key": "value", "value": "{{DLV - ecommerce.items.0.item_id}}" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "name", "value": "value" }, { "type": "TEMPLATE", "key": "value", "value": "{{DLV - ecommerce.value}}" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "name", "value": "currency" }, { "type": "TEMPLATE", "key": "value", "value": "{{DLV - ecommerce.currency}}" } ] } ] }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "false" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "TEMPLATE", "key": "eventName", "value": "variable" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1772493785147", "firingTriggerId": [ "17" ], "blockingTriggerId": [ "26" ], "parentFolderId": "5", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NEEDED", "consentType": { "type": "LIST", "list": [ { "type": "TEMPLATE", "value": "ad_storage" } ] } } }, { "accountId": "13152216", "containerId": "235565883", "tagId": "23", "name": "META Pixel - All Pages", "type": "cvt_5RM3Q", "parameter": [ { "type": "BOOLEAN", "key": "disablePushState", "value": "false" }, { "type": "TEMPLATE", "key": "pixelId", "value": "{{META Pixel ID}}" }, { "type": "TEMPLATE", "key": "standardEventName", "value": "PageView" }, { "type": "BOOLEAN", "key": "disableAutoConfig", "value": "false" }, { "type": "BOOLEAN", "key": "enhancedEcommerce", "value": "false" }, { "type": "BOOLEAN", "key": "dpoLDU", "value": "false" }, { "type": "TEMPLATE", "key": "eventName", "value": "standard" }, { "type": "BOOLEAN", "key": "objectPropertiesFromVariable", "value": "false" }, { "type": "BOOLEAN", "key": "consent", "value": "true" }, { "type": "BOOLEAN", "key": "advancedMatching", "value": "false" } ], "fingerprint": "1772486911558", "firingTriggerId": [ "2147479573" ], "parentFolderId": "5", "tagFiringOption": "ONCE_PER_EVENT", "monitoringMetadata": { "type": "MAP" }, "consentSettings": { "consentStatus": "NEEDED", "consentType": { "type": "LIST", "list": [ { "type": "TEMPLATE", "value": "ad_storage" } ] } } } ], "trigger": [ { "accountId": "13152216", "containerId": "235565883", "triggerId": "17", "name": "GA4 Ecommerce Events", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "MATCH_REGEX", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "view_item|add_to_cart|begin_checkout|add_payment_info|add_shipping_info|purchase" } ] } ], "fingerprint": "1772492882303", "parentFolderId": "5" }, { "accountId": "13152216", "containerId": "235565883", "triggerId": "26", "name": "Event - add_shipping_info", "type": "CUSTOM_EVENT", "customEventFilter": [ { "type": "EQUALS", "parameter": [ { "type": "TEMPLATE", "key": "arg0", "value": "{{_event}}" }, { "type": "TEMPLATE", "key": "arg1", "value": "add_shipping_info" } ] } ], "fingerprint": "1772493489449", "parentFolderId": "5" } ], "variable": [ { "accountId": "13152216", "containerId": "235565883", "variableId": "9", "name": "DLV - ecommerce.items", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce.items" } ], "fingerprint": "1768926372719", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "10", "name": "DLV - ecommerce.transaction_id", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce.transaction_id" } ], "fingerprint": "1768926452074", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "11", "name": "DLV - ecommerce.value", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce.value" } ], "fingerprint": "1768926473861", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "12", "name": "DLV - ecommerce.currency", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce.currency" } ], "fingerprint": "1772471695742", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "16", "name": "Google Tag Measurement ID", "type": "c", "parameter": [ { "type": "TEMPLATE", "key": "value", "value": "REPLACE THIS" } ], "fingerprint": "1772499495329", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "19", "name": "META Pixel Ecommerce Events", "type": "smm", "parameter": [ { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "input", "value": "{{Event}}" }, { "type": "LIST", "key": "map", "list": [ { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "key", "value": "view_item" }, { "type": "TEMPLATE", "key": "value", "value": "ViewContent" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "key", "value": "add_to_cart" }, { "type": "TEMPLATE", "key": "value", "value": "AddToCart" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "key", "value": "begin_checkout" }, { "type": "TEMPLATE", "key": "value", "value": "InitiateCheckout" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "key", "value": "add_payment_info" }, { "type": "TEMPLATE", "key": "value", "value": "AddPaymentInfo" } ] }, { "type": "MAP", "map": [ { "type": "TEMPLATE", "key": "key", "value": "purchase" }, { "type": "TEMPLATE", "key": "value", "value": "Purchase" } ] } ] } ], "fingerprint": "1772491838991", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "21", "name": "META Pixel ID", "type": "c", "parameter": [ { "type": "TEMPLATE", "key": "value", "value": "REPLACE_THIS" } ], "fingerprint": "1772499481917", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "24", "name": "DLV - ecommerce.items.0.item_id", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce.items.0.item_id" } ], "fingerprint": "1772470237534", "parentFolderId": "5", "formatValue": {} }, { "accountId": "13152216", "containerId": "235565883", "variableId": "25", "name": "DLV - ecommerce.items.0.item_name", "type": "v", "parameter": [ { "type": "INTEGER", "key": "dataLayerVersion", "value": "2" }, { "type": "BOOLEAN", "key": "setDefaultValue", "value": "false" }, { "type": "TEMPLATE", "key": "name", "value": "ecommerce.items.0.item_name" } ], "fingerprint": "1772470225598", "parentFolderId": "5", "formatValue": {} } ], "folder": [ { "accountId": "13152216", "containerId": "235565883", "folderId": "5", "name": "Engaging Networks Smart Pages", "fingerprint": "1768925931830" } ], "builtInVariable": [ { "accountId": "13152216", "containerId": "235565883", "type": "PAGE_URL", "name": "Page URL" }, { "accountId": "13152216", "containerId": "235565883", "type": "PAGE_HOSTNAME", "name": "Page Hostname" }, { "accountId": "13152216", "containerId": "235565883", "type": "PAGE_PATH", "name": "Page Path" }, { "accountId": "13152216", "containerId": "235565883", "type": "REFERRER", "name": "Referrer" }, { "accountId": "13152216", "containerId": "235565883", "type": "EVENT", "name": "Event" } ], "fingerprint": "1772499591288", "tagManagerUrl": "https://tagmanager.google.com/#/versions/accounts/13152216/containers/235565883/versions/6?apiLink=version", "customTemplate": [ { "accountId": "13152216", "containerId": "235565883", "templateId": "20", "name": "Facebook Pixel", "fingerprint": "1772468819719", "templateData": "___TERMS_OF_SERVICE___\n\nBy creating or modifying this file you agree to Google Tag Manager's Community\nTemplate Gallery Developer Terms of Service available at\nhttps://developers.google.com/tag-manager/gallery-tos (or such other URL as\nGoogle may provide), as modified from time to time.\n\n\n___INFO___\n\n{\n \"displayName\": \"Facebook Pixel\",\n \"__wm\": \"VGVtcGxhdGUtQXV0aG9yX0ZhY2Vib29rLVNpbW8tQWhhdmE\\u003d\",\n \"description\": \"This is an unofficial Google Tag Manager template for the Facebook Pixel.\",\n \"categories\": [\n \"ADVERTISING\",\n \"ANALYTICS\"\n ],\n \"id\": \"cvt_5RM3Q\",\n \"type\": \"TAG\",\n \"version\": 1,\n \"brand\": {\n \"displayName\": \"facebook\",\n \"id\": \"github.com_facebook\",\n \"thumbnail\": \"data:image/png;base64,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\"\n },\n \"containerContexts\": [\n \"WEB\"\n ]\n}\n\n\n___TEMPLATE_PARAMETERS___\n\n[\n {\n \"alwaysInSummary\": true,\n \"valueValidators\": [\n {\n \"errorMessage\": \"You must provide a Pixel ID\",\n \"type\": \"NON_EMPTY\"\n },\n {\n \"args\": [\n \"^[0-9,]+$\"\n ],\n \"errorMessage\": \"Invalid Pixel ID format\",\n \"type\": \"REGEX\"\n }\n ],\n \"displayName\": \"Facebook Pixel ID(s)\",\n \"simpleValueType\": true,\n \"name\": \"pixelId\",\n \"type\": \"TEXT\",\n \"valueHint\": \"e.g. 12345678910\"\n },\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"enhancedEcommerce\",\n \"checkboxText\": \"Enhanced Ecommerce dataLayer Integration\",\n \"simpleValueType\": true,\n \"help\": \"If you check this, then the Facebook pixel will populate \\u003cstrong\\u003eEvent Name\\u003c/strong\\u003e and \\u003cstrong\\u003eObject Properties\\u003c/strong\\u003e automatically from the last \\u003ca href\\u003d\\\"https://developers.google.com/tag-manager/enhanced-ecommerce\\\"\\u003eecommerce\\u003c/a\\u003e object pushed into the dataLayer array.\"\n },\n {\n \"type\": \"RADIO\",\n \"name\": \"eventName\",\n \"displayName\": \"Event Name\",\n \"radioItems\": [\n {\n \"value\": \"standard\",\n \"displayValue\": \"Standard\",\n \"subParams\": [\n {\n \"type\": \"SELECT\",\n \"name\": \"standardEventName\",\n \"macrosInSelect\": false,\n \"selectItems\": [\n {\n \"displayValue\": \"PageView\",\n \"value\": \"PageView\"\n },\n {\n \"displayValue\": \"AddPaymentInfo\",\n \"value\": \"AddPaymentInfo\"\n },\n {\n \"displayValue\": \"AddToCart\",\n \"value\": \"AddToCart\"\n },\n {\n \"displayValue\": \"AddToWishlist\",\n \"value\": \"AddToWishlist\"\n },\n {\n \"displayValue\": \"CompleteRegistration\",\n \"value\": \"CompleteRegistration\"\n },\n {\n \"displayValue\": \"Contact\",\n \"value\": \"Contact\"\n },\n {\n \"displayValue\": \"CustomizeProduct\",\n \"value\": \"CustomizeProduct\"\n },\n {\n \"displayValue\": \"Donate\",\n \"value\": \"Donate\"\n },\n {\n \"displayValue\": \"FindLocation\",\n \"value\": \"FindLocation\"\n },\n {\n \"displayValue\": \"InitiateCheckout\",\n \"value\": \"InitiateCheckout\"\n },\n {\n \"displayValue\": \"Lead\",\n \"value\": \"Lead\"\n },\n {\n \"displayValue\": \"Purchase\",\n \"value\": \"Purchase\"\n },\n {\n \"displayValue\": \"Schedule\",\n \"value\": \"Schedule\"\n },\n {\n \"displayValue\": \"Search\",\n \"value\": \"Search\"\n },\n {\n \"displayValue\": \"StartTrial\",\n \"value\": \"StartTrial\"\n },\n {\n \"displayValue\": \"SubmitApplication\",\n \"value\": \"SubmitApplication\"\n },\n {\n \"displayValue\": \"Subscribe\",\n \"value\": \"Subscribe\"\n },\n {\n \"displayValue\": \"ViewContent\",\n \"value\": \"ViewContent\"\n }\n ],\n \"simpleValueType\": true,\n \"defaultValue\": \"PageView\"\n }\n ]\n },\n {\n \"value\": \"custom\",\n \"displayValue\": \"Custom\",\n \"subParams\": [\n {\n \"type\": \"TEXT\",\n \"name\": \"customEventName\",\n \"displayName\": \"\",\n \"simpleValueType\": true\n }\n ]\n },\n {\n \"value\": \"variable\",\n \"displayValue\": \"Variable\",\n \"subParams\": [\n {\n \"type\": \"SELECT\",\n \"name\": \"variableEventName\",\n \"macrosInSelect\": true,\n \"selectItems\": [],\n \"simpleValueType\": true\n }\n ]\n }\n ],\n \"simpleValueType\": true,\n \"enablingConditions\": [\n {\n \"paramName\": \"enhancedEcommerce\",\n \"paramValue\": true,\n \"type\": \"NOT_EQUALS\"\n }\n ]\n },\n {\n \"type\": \"RADIO\",\n \"name\": \"eecEventName\",\n \"displayName\": \"Event Name\",\n \"radioItems\": [\n {\n \"value\": \"eec\",\n \"displayValue\": \"Set automatically from dataLayer\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"The Enhanced Ecommerce integration populates the Event Name automatically depending on what type of \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object was last pushed into dataLayer (\\\"detail\\\" -\\u003e \\\"ViewContent\\\", \\\"add\\\" -\\u003e \\\"AddToCart\\\", \\\"checkout\\\" -\\u003e \\\"InitiateCheckout\\\", \\\"purchase\\\" -\\u003e \\\"Purchase\\\").\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhancedEcommerce\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"SELECT\",\n \"name\": \"consent\",\n \"displayName\": \"Consent Granted (GDPR)\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"value\": true,\n \"displayValue\": \"True\"\n },\n {\n \"value\": false,\n \"displayValue\": \"False\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"If you set Consent Granted to \\u003cstrong\\u003efalse\\u003c/strong\\u003e, the pixel will not send any hits until a tag is fired where Consent Granted is set to \\u003cstrong\\u003etrue\\u003c/strong\\u003e. See \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/facebook-pixel/implementation/gdpr/\\\"\\u003ethis article\\u003c/a\\u003e for more information.\"\n },\n {\n \"simpleValueType\": true,\n \"name\": \"advancedMatching\",\n \"checkboxText\": \"Enable Advanced Matching\",\n \"type\": \"CHECKBOX\"\n },\n {\n \"type\": \"GROUP\",\n \"name\": \"dataProcessingOptionsGroup\",\n \"displayName\": \"Data Processing Options\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"subParams\": [\n {\n \"type\": \"LABEL\",\n \"name\": \"dpoInfo\",\n \"displayName\": \"Data Processing Options force this Facebook event to comply to regional regulations with regard to the processing and selling of user data. Read \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-apis/data-processing-options\\\"\\u003ethis\\u003c/a\\u003e for more information about how to configure this section.\"\n },\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"dpoLDU\",\n \"checkboxText\": \"Limited Data Use (LDU)\",\n \"simpleValueType\": true\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"dpoCountry\",\n \"displayName\": \"Country\",\n \"simpleValueType\": true,\n \"defaultValue\": 0,\n \"enablingConditions\": [\n {\n \"paramName\": \"dpoLDU\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ],\n \"valueValidators\": [\n {\n \"type\": \"NUMBER\"\n }\n ]\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"dpoState\",\n \"displayName\": \"State\",\n \"simpleValueType\": true,\n \"defaultValue\": 0,\n \"enablingConditions\": [\n {\n \"paramName\": \"dpoLDU\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ],\n \"valueValidators\": [\n {\n \"type\": \"NUMBER\"\n }\n ]\n }\n ]\n },\n {\n \"enablingConditions\": [\n {\n \"paramName\": \"advancedMatching\",\n \"type\": \"EQUALS\",\n \"paramValue\": true\n }\n ],\n \"displayName\": \"Customer Information Data Parameters\",\n \"name\": \"advancedMatchingGroup\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"type\": \"GROUP\",\n \"subParams\": [\n {\n \"displayName\": \"\",\n \"name\": \"advancedMatchingList\",\n \"simpleTableColumns\": [\n {\n \"selectItems\": [\n {\n \"displayValue\": \"City\",\n \"value\": \"ct\"\n },\n {\n \"displayValue\": \"Country\",\n \"value\": \"cn\"\n },\n {\n \"displayValue\": \"Date of Birth\",\n \"value\": \"db\"\n },\n {\n \"displayValue\": \"Email\",\n \"value\": \"em\"\n },\n {\n \"displayValue\": \"External ID\",\n \"value\": \"external_id\"\n },\n {\n \"displayValue\": \"First Name\",\n \"value\": \"fn\"\n },\n {\n \"displayValue\": \"Gender\",\n \"value\": \"ge\"\n },\n {\n \"displayValue\": \"Last Name\",\n \"value\": \"ln\"\n },\n {\n \"displayValue\": \"Phone\",\n \"value\": \"ph\"\n },\n {\n \"displayValue\": \"State\",\n \"value\": \"st\"\n },\n {\n \"displayValue\": \"Zip Code\",\n \"value\": \"zp\"\n }\n ],\n \"defaultValue\": \"\",\n \"displayName\": \"Parameter name\",\n \"name\": \"name\",\n \"isUnique\": true,\n \"type\": \"SELECT\"\n },\n {\n \"defaultValue\": \"\",\n \"displayName\": \"Parameter value\",\n \"name\": \"value\",\n \"type\": \"TEXT\"\n }\n ],\n \"type\": \"SIMPLE_TABLE\",\n \"newRowButtonText\": \"Add parameter\",\n \"valueValidators\": [\n {\n \"type\": \"NON_EMPTY\"\n }\n ]\n }\n ]\n },\n {\n \"displayName\": \"Object Properties\",\n \"name\": \"objectPropertiesGroup\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"type\": \"GROUP\",\n \"subParams\": [\n {\n \"type\": \"LABEL\",\n \"name\": \"enhancedEcommerceObject\",\n \"displayName\": \"\\u003cstrong\\u003eWarning!\\u003c/strong\\u003e Object properties are populated automatically based on the most recent \\u003cstrong\\u003eecommerce\\u003c/strong\\u003e object pushed into dataLayer. If you add properties here that are already set by the integration (content_type, contents, num_items, value, currency), then the properties you add here will override those set automatically by the integration!\",\n \"enablingConditions\": [\n {\n \"paramName\": \"enhancedEcommerce\",\n \"paramValue\": true,\n \"type\": \"EQUALS\"\n }\n ]\n },\n {\n \"type\": \"SELECT\",\n \"name\": \"objectPropertiesFromVariable\",\n \"displayName\": \"Load Properties From Variable\",\n \"macrosInSelect\": true,\n \"selectItems\": [\n {\n \"value\": false,\n \"displayValue\": \"False\"\n }\n ],\n \"simpleValueType\": true,\n \"help\": \"You can use a variable that returns a JavaScript object with the properties you want to use. This object will be merged with any additional properties you add via the table below. Any conflicts will be resolved in favor of the properties you add to the table.\"\n },\n {\n \"name\": \"objectPropertyList\",\n \"simpleTableColumns\": [\n {\n \"valueValidators\": [],\n \"defaultValue\": \"\",\n \"displayName\": \"Property Name\",\n \"name\": \"name\",\n \"isUnique\": true,\n \"type\": \"TEXT\"\n },\n {\n \"defaultValue\": \"\",\n \"displayName\": \"Property Value\",\n \"name\": \"value\",\n \"type\": \"TEXT\"\n }\n ],\n \"type\": \"SIMPLE_TABLE\",\n \"newRowButtonText\": \"Add property\"\n }\n ]\n },\n {\n \"displayName\": \"More Settings\",\n \"name\": \"moreSettingsGroup\",\n \"groupStyle\": \"ZIPPY_CLOSED\",\n \"type\": \"GROUP\",\n \"subParams\": [\n {\n \"help\": \"Facebook collects some metadata (e.g. structured data) and user interactions (e.g. clicks) automatically. Check this box to disable this automatic configuration of the pixel.\",\n \"simpleValueType\": true,\n \"name\": \"disableAutoConfig\",\n \"checkboxText\": \"Disable Automatic Configuration\",\n \"type\": \"CHECKBOX\"\n },\n {\n \"type\": \"CHECKBOX\",\n \"name\": \"disablePushState\",\n \"checkboxText\": \"Disable History Event Tracking\",\n \"simpleValueType\": true,\n \"help\": \"The Facebook Pixel tracks history events (pushState and replaceState) automatically as PageViews. Check this box to prevent the pixel from tracking such events automatically.\"\n },\n {\n \"type\": \"TEXT\",\n \"name\": \"eventId\",\n \"displayName\": \"Event ID\",\n \"simpleValueType\": true,\n \"help\": \"Set the Event ID parameter in case you are tracking the same event server-side as well. The Event ID can be used to deduplicate the same event if sent from multiple sources. See more \\u003ca href\\u003d\\\"https://developers.facebook.com/docs/marketing-api/conversions-api/deduplicate-pixel-and-server-events/\\\"\\u003ehere\\u003c/a\\u003e.\"\n }\n ]\n }\n]\n\n\n___SANDBOXED_JS_FOR_WEB_TEMPLATE___\n\nconst createQueue = require('createQueue');\nconst callInWindow = require('callInWindow');\nconst aliasInWindow = require('aliasInWindow');\nconst copyFromWindow = require('copyFromWindow');\nconst setInWindow = require('setInWindow');\nconst injectScript = require('injectScript');\nconst makeTableMap = require('makeTableMap');\nconst makeNumber = require('makeNumber');\nconst getType = require('getType');\nconst copyFromDataLayer = require('copyFromDataLayer');\nconst math = require('Math');\nconst log = require('logToConsole');\n\nconst initIds = copyFromWindow('_fbq_gtm_ids') || [];\nconst pixelIds = data.pixelId;\nconst standardEventNames = ['AddPaymentInfo', 'AddToCart', 'AddToWishlist', 'CompleteRegistration', 'Contact', 'CustomizeProduct', 'Donate', 'FindLocation', 'InitiateCheckout', 'Lead', 'PageView', 'Purchase', 'Schedule', 'Search', 'StartTrial', 'SubmitApplication', 'Subscribe', 'ViewContent'];\nconst ecommerce = copyFromDataLayer('ecommerce', 1);\n\n// Helper methods\nconst fail = msg => {\n log(msg);\n data.gtmOnFailure();\n};\n\nconst mergeObj = (obj, obj2) => {\n for (let key in obj2) {\n if (obj2.hasOwnProperty(key)) {\n obj[key] = obj2[key];\n }\n }\n return obj;\n};\n\nconst parseEecObj = prod => {\n return {\n id: prod.id,\n quantity: prod.quantity\n };\n};\n\n// Initialize EEC integration\nlet eventName, action, eecObjectProps;\nif (data.enhancedEcommerce) {\n if (!ecommerce) return fail('Facebook Pixel: No valid \"ecommerce\" object found in dataLayer');\n if (ecommerce.detail) { eventName = 'ViewContent'; action = 'detail'; }\n else if (ecommerce.add) { eventName = 'AddToCart'; action = 'add'; }\n else if (ecommerce.checkout) { eventName = 'InitiateCheckout'; action = 'checkout'; }\n else if (ecommerce.purchase) { eventName = 'Purchase'; action = 'purchase'; }\n else return fail('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n \n if (!ecommerce[action].products || getType(ecommerce[action].products) !== 'array') return fail('Facebook pixel: Most recently pushed \"ecommerce\" object did not have a valid \"products\" array.');\n eecObjectProps = {\n content_type: 'product',\n contents: ecommerce[action].products.map(parseEecObj),\n value: ecommerce[action].products.reduce((acc, cur) => {\n const curVal = math.round(makeNumber(cur.price || 0) * (cur.quantity || 1) * 100) / 100;\n return acc + curVal;\n }, 0.0),\n currency: ecommerce.currencyCode || 'USD'\n };\n if (['InitiateCheckout', 'Purchase'].indexOf(eventName) > -1) eecObjectProps.num_items = ecommerce[action].products.reduce((acc,cur) => {\n return acc + makeNumber(cur.quantity || 1);\n }, 0);\n}\n\n// Build the fbq() command arguments\nconst cidParams = data.advancedMatchingList && data.advancedMatchingList.length ? makeTableMap(data.advancedMatchingList, 'name', 'value') : {};\nconst objectProps = data.objectPropertyList && data.objectPropertyList.length ? makeTableMap(data.objectPropertyList, 'name', 'value') : {};\nconst objectPropsFromVar = getType(data.objectPropertiesFromVariable) === 'object' ? data.objectPropertiesFromVariable : {};\nconst mergedObjectProps = mergeObj(objectPropsFromVar, objectProps);\nconst finalObjectProps = mergeObj(eecObjectProps || {}, mergedObjectProps);\neventName = eventName || (data.eventName === 'custom' ? data.customEventName : (data.eventName === 'variable' ? data.variableEventName : data.standardEventName));\n\nconst command = standardEventNames.indexOf(eventName) === -1 ? 'trackSingleCustom' : 'trackSingle';\nconst consent = data.consent === false ? 'revoke' : 'grant';\n\n// Utility function to use either fbq.queue[]\n// (if the FB SDK hasn't loaded yet), or fbq.callMethod()\n// if the SDK has loaded.\nconst getFbq = () => {\n // Return the existing 'fbq' global method if available\n let fbq = copyFromWindow('fbq');\n if (fbq) {\n return fbq;\n }\n \n // Initialize the 'fbq' global method to either use\n // fbq.callMethod or fbq.queue)\n setInWindow('fbq', function() { \n const callMethod = copyFromWindow('fbq.callMethod.apply');\n if (callMethod) { \n callInWindow('fbq.callMethod.apply', null, arguments); \n } else { \n callInWindow('fbq.queue.push', arguments);\n }\n });\n aliasInWindow('_fbq', 'fbq');\n \n // Create the fbq.queue\n createQueue('fbq.queue');\n \n // Return the global 'fbq' method, created above\n return copyFromWindow('fbq');\n};\n\n// Get reference to the global method\nconst fbq = getFbq();\n\nfbq('consent', consent);\n\n // Set Data Processing Options\nif (data.dpoLDU) {\n fbq('dataProcessingOptions', ['LDU'], makeNumber(data.dpoCountry), makeNumber(data.dpoState));\n}\n\n// Handle multiple, comma-separated pixel IDs,\n// and initialize each ID if not done already.\npixelIds.split(',').forEach(pixelId => {\n if (initIds.indexOf(pixelId) === -1) {\n \n // If the user has chosen to disable automatic configuration\n if (data.disableAutoConfig) {\n fbq('set', 'autoConfig', false, pixelId);\n }\n \n // If the user has chosen to disable pushState and replaceState tracking\n if (data.disablePushState) {\n setInWindow('fbq.disablePushState', true);\n }\n \t\n \n // Initialize pixel and store in global array\n fbq('init', pixelId, cidParams);\n\n // Monitoring agent string for Tag Setup\n fbq('set','agent','tmSimo-GTM-WebTemplate', pixelId);\n\n initIds.push(pixelId);\n setInWindow('_fbq_gtm_ids', initIds, true);\n \n }\n\n // Call the fbq() method with the parameters defined earlier\n if (data.eventId) {\n fbq(command, pixelId, eventName, finalObjectProps, {eventID: data.eventId});\n } else {\n fbq(command, pixelId, eventName, finalObjectProps);\n }\n});\n\ninjectScript('https://connect.facebook.net/en_US/fbevents.js', data.gtmOnSuccess, data.gtmOnFailure, 'fbPixel');\n\n\n___WEB_PERMISSIONS___\n\n[\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"access_globals\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keys\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"_fbq_gtm\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"_fbq\"\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"_fbq_gtm_ids\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.callMethod.apply\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.queue.push\"\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": false\n },\n {\n \"type\": 8,\n \"boolean\": true\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.queue\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n },\n {\n \"type\": 3,\n \"mapKey\": [\n {\n \"type\": 1,\n \"string\": \"key\"\n },\n {\n \"type\": 1,\n \"string\": \"read\"\n },\n {\n \"type\": 1,\n \"string\": \"write\"\n },\n {\n \"type\": 1,\n \"string\": \"execute\"\n }\n ],\n \"mapValue\": [\n {\n \"type\": 1,\n \"string\": \"fbq.disablePushState\"\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": true\n },\n {\n \"type\": 8,\n \"boolean\": false\n }\n ]\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"inject_script\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"urls\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 1,\n \"string\": \"https://connect.facebook.net/en_US/fbevents.js\"\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"logging\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"environments\",\n \"value\": {\n \"type\": 1,\n \"string\": \"debug\"\n }\n }\n ]\n },\n \"isRequired\": true\n },\n {\n \"instance\": {\n \"key\": {\n \"publicId\": \"read_data_layer\",\n \"versionId\": \"1\"\n },\n \"param\": [\n {\n \"key\": \"keyPatterns\",\n \"value\": {\n \"type\": 2,\n \"listItem\": [\n {\n \"type\": 1,\n \"string\": \"ecommerce\"\n }\n ]\n }\n }\n ]\n },\n \"clientAnnotations\": {\n \"isEditedByUser\": true\n },\n \"isRequired\": true\n }\n]\n\n\n___TESTS___\n\nscenarios:\n- name: Library is injected\n code: |-\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('injectScript').wasCalledWith(scriptUrl, success, failure, 'fbPixel');\n assertApi('gtmOnSuccess').wasCalled();\n- name: fbq does not exist - method created\n code: |-\n let fbq;\n\n mock('copyFromWindow', key => {\n if (key === 'fbq') return fbq;\n });\n\n mock('createQueue', key => {});\n\n mock('setInWindow', (key, val) => {\n if (key === 'fbq') fbq = val;\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('aliasInWindow').wasCalledWith('_fbq', 'fbq');\n assertApi('setInWindow').wasCalled();\n assertApi('gtmOnSuccess').wasCalled();\n- name: fbq exists - method copied\n code: |-\n mock('setInWindow', key => {\n if (key === 'fbq') fail('setInWindow called with fbq even though variable exists');\n });\n\n mock('createQueue', key => {});\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: makeTableMap called\n code: |-\n mockData.advancedMatching = true;\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('makeTableMap').wasCalledWith(mockData.advancedMatchingList, 'name', 'value');\n assertApi('makeTableMap').wasCalledWith(mockData.objectPropertyList, 'name', 'value');\n assertApi('gtmOnSuccess').wasCalled();\n- name: Consent set\n code: |-\n mock('copyFromWindow', key => {\n if (key === 'fbq') return function() {\n if (arguments[0] === 'consent') {\n assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n }\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU set\n code: |-\n mockData.dpoLDU = true;\n mockData.dpoCountry = '0';\n mockData.dpoState = '0';\n\n mock('copyFromWindow', key => {\n if (key === 'fbq') return function() {\n if (arguments[0] === 'consent') {\n assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n }\n if (arguments[0] === 'dataProcessingOptions') {\n assertThat(arguments[1], 'LDU array value not set').isEqualTo(['LDU']);\n assertThat(arguments[2], 'LDU country not set').isEqualTo(0);\n assertThat(arguments[3], 'LDU state not set').isEqualTo(0);\n }\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: DPO LDU not set\n code: |-\n mock('copyFromWindow', key => {\n if (key === 'fbq') return function() {\n if (arguments[0] === 'consent') {\n assertThat(arguments[1], 'Consent set incorrectly').isEqualTo('grant');\n }\n if (arguments[0] === 'dataProcessingOptions') {\n fail('dataProcessingOptions called even though DPO was not set');\n }\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs set - do not initialize\n code: |-\n mock('copyFromWindow', key => {\n if (key === '_fbq_gtm_ids') return ['12345', '23456'];\n if (key === 'fbq') return function() {\n if (arguments[0] === 'init') fail('init called even though pixel IDs already initialized');\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('gtmOnSuccess').wasCalled();\n- name: Pixel IDs not set - run init process\n code: \"let index = 0;\\nlet count = 0;\\nlet _fbq_gtm_ids;\\n\\nmockData.advancedMatching\\\n \\ = true;\\nmockData.disableAutoConfig = true;\\nmockData.disablePushState = true;\\n\\\n \\nmock('setInWindow', (key, val) => {\\n if (key === 'fbq.disablePushState') count\\\n \\ += 1;\\n if (key === '_fbq_gtm_ids') _fbq_gtm_ids = val;\\n});\\n\\nconst initObj\\\n \\ = {\\n ct: 'Helsinki',\\n cn: 'Finland',\\n external_id: 'UserId'\\n};\\n\\nmock('copyFromWindow',\\\n \\ key => {\\n if (key === 'fbq') return function() {\\n if (arguments[0] ===\\\n \\ 'set' && arguments[1] === 'autoConfig' && arguments[2] === false) {\\n assertThat(arguments[3],\\\n \\ 'autoConfig called with incorrect pixelId').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ }\\n if (arguments[0] === 'set' && arguments[1] === 'agent') {\\n assertThat(arguments[2],\\\n \\ 'agent set with invalid value').isEqualTo('tmSimo-GTM-WebTemplate');\\n \\\n \\ assertThat(arguments[3], 'agent set with invalid pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ index += 1;\\n }\\n if (arguments[0] === 'init') {\\n assertThat(arguments[1],\\\n \\ 'init called with incorrect pixelId').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'init called with incorrect initObj').isEqualTo(initObj);\\n\\\n \\ } \\n };\\n});\\n\\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\\n \\nassertThat(_fbq_gtm_ids, '_fbq_gtm_ids has incorrect contents').isEqualTo(mockData.pixelId.split(','));\\n\\\n assertThat(index, 'init called incorrect number of times: ' + index).isEqualTo(2);\\n\\\n assertThat(count, 'fbq.disablePushState called incorrect number of times: ' +\\\n \\ count).isEqualTo(2);\\n\\n// Verify that the tag finished successfully.\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send standard event\n code: \"const eventParams = {\\n prop1: 'val1',\\n prop2: 'val2'\\n};\\n\\nlet index\\\n \\ = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send custom event\n code: \"mockData.eventName = 'custom';\\n\\nconst eventParams = {\\n prop1: 'val1',\\n\\\n \\ prop2: 'val2'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if\\\n \\ (key === 'fbq') return function() {\\n if (arguments[0] === 'trackSingleCustom')\\\n \\ {\\n assertThat(arguments[1], 'trackSingleCustom called with incorrect pixel\\\n \\ ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n assertThat(arguments[2],\\\n \\ 'trackSingleCustom called with incorrect event name').isEqualTo(mockData.customEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingleCustom called with incorrect event\\\n \\ parameters').isEqualTo(eventParams);\\n index += 1;\\n }\\n };\\n});\\n\\\n \\ \\n// Call runCode to run the template's code.\\nrunCode(mockData);\\n\\n//\\\n \\ Verify that the tag finished successfully.\\nassertThat(index, 'trackSingleCustom\\\n \\ called incorrect number of times').isEqualTo(2);\\nassertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with standard name\n code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'PageView';\\n\\\n \\nconst eventParams = {\\n prop1: 'val1',\\n prop2: 'val2'\\n};\\n\\nlet index =\\\n \\ 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.variableEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send variable event with custom name\n code: \"mockData.eventName = 'variable';\\nmockData.variableEventName = 'custom';\\n\\\n \\nconst eventParams = {\\n prop1: 'val1',\\n prop2: 'val2'\\n};\\n\\nlet index =\\\n \\ 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingleCustom') {\\n assertThat(arguments[1],\\\n \\ 'trackSingleCustom called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingleCustom called with incorrect event\\\n \\ name').isEqualTo(mockData.variableEventName);\\n assertThat(arguments[3],\\\n \\ 'trackSingleCustom called with incorrect event parameters').isEqualTo(eventParams);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingleCustom called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event parameters from a variable\n code: \"mockData.objectPropertiesFromVariable = {\\n prop1: 'val1',\\n prop2: 'val2'\\n\\\n };\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return\\\n \\ function() {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo(mockData.standardEventName);\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockData.objectPropertiesFromVariable);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce integration fails with invalid object\n code: |-\n mockData.enhancedEcommerce = true;\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('logToConsole').wasCalledWith('Facebook Pixel: No valid \"ecommerce\" object found in dataLayer');\n assertApi('gtmOnFailure').wasCalled();\n assertApi('gtmOnSuccess').wasNotCalled();\n- name: Enhanced Ecommerce integration fails with invalid action\n code: |-\n mockData.enhancedEcommerce = true;\n\n mock('copyFromDataLayer', key => {\n if (key === 'ecommerce') return {\n invalid: true\n };\n });\n\n // Call runCode to run the template's code.\n runCode(mockData);\n\n // Verify that the tag finished successfully.\n assertApi('logToConsole').wasCalledWith('Facebook Pixel: Most recently pushed \"ecommerce\" object must be one of types \"detail\", \"add\", \"checkout\" or \"purchase\".');\n assertApi('gtmOnFailure').wasCalled();\n assertApi('gtmOnSuccess').wasNotCalled();\n- name: Enhanced Ecommerce ViewContent works\n code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n mock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return {\\n currencyCode:\\\n \\ 'EUR',\\n detail: {\\n products: mockEec.gtm.products\\n }\\n };\\n});\\n\\\n \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return\\\n \\ function() {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('ViewContent');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce AddToCart works\n code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertyList = {};\\n\\n\\\n mock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return {\\n currencyCode:\\\n \\ 'EUR',\\n add: {\\n products: mockEec.gtm.products\\n }\\n };\\n});\\n\\\n \\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return\\\n \\ function() {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('AddToCart');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce InitiateCheckout works\n code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return\\\n \\ {\\n currencyCode: 'EUR',\\n checkout: {\\n products: mockEec.gtm.products\\n\\\n \\ }\\n };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key\\\n \\ === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle') {\\n\\\n \\ assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('InitiateCheckout');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Enhanced Ecommerce Purchase works\n code: \"mockData.enhancedEcommerce = true;\\nmockEec.fb.num_items = 3;\\nmockData.objectPropertyList\\\n \\ = {};\\n\\nmock('copyFromDataLayer', key => {\\n if (key === 'ecommerce') return\\\n \\ {\\n currencyCode: 'EUR',\\n purchase: {\\n products: mockEec.gtm.products\\n\\\n \\ }\\n };\\n});\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if (key\\\n \\ === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle') {\\n\\\n \\ assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable and list works\n code: \"mockData.objectPropertiesFromVariable = {\\n prop1: 'var1',\\n prop2: 'var2',\\n\\\n \\ prop3: 'var3'\\n};\\n\\nconst expected = {\\n prop1: 'val1',\\n prop2: 'val2',\\n\\\n \\ prop3: 'var3'\\n};\\n\\nlet index = 0;\\nmock('copyFromWindow', key => {\\n if\\\n \\ (key === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle')\\\n \\ {\\n assertThat(arguments[1], 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('PageView');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(expected);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Object merge with variable, list and eec works\n code: \"mockData.enhancedEcommerce = true;\\nmockData.objectPropertiesFromVariable\\\n \\ = {\\n content_type: 'product_group'\\n};\\nmockData.objectPropertyList = [{\\n\\\n \\ name: 'currency',\\n value: 'USD'\\n}];\\nmockEec.fb.num_items = 3;\\nmockEec.fb.content_type\\\n \\ = 'product_group';\\nmockEec.fb.currency = 'USD';\\n\\nmock('copyFromDataLayer',\\\n \\ key => {\\n if (key === 'ecommerce') return {\\n currencyCode: 'EUR',\\n \\\n \\ purchase: {\\n products: mockEec.gtm.products\\n }\\n };\\n});\\n\\nlet\\\n \\ index = 0;\\nmock('copyFromWindow', key => {\\n if (key === 'fbq') return function()\\\n \\ {\\n if (arguments[0] === 'trackSingle') {\\n assertThat(arguments[1],\\\n \\ 'trackSingle called with incorrect pixel ID').isEqualTo(mockData.pixelId.split(',')[index]);\\n\\\n \\ assertThat(arguments[2], 'trackSingle called with incorrect event name').isEqualTo('Purchase');\\n\\\n \\ assertThat(arguments[3], 'trackSingle called with incorrect event parameters').isEqualTo(mockEec.fb);\\n\\\n \\ index += 1;\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertThat(index, 'trackSingle called incorrect number of times').isEqualTo(2);\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\n- name: Send event ID\n code: \"mockData.eventId = 'eventId';\\n\\nmock('copyFromWindow', key => {\\n if (key\\\n \\ === 'fbq') return function() {\\n if (arguments[0] === 'trackSingle') {\\n\\\n \\ assertThat(arguments[4], 'eventID not included in hit').isEqualTo({eventID:\\\n \\ mockData.eventId});\\n }\\n };\\n});\\n \\n// Call runCode to run the template's\\\n \\ code.\\nrunCode(mockData);\\n\\n// Verify that the tag finished successfully.\\n\\\n assertApi('gtmOnSuccess').wasCalled();\"\nsetup: \"const mockData = {\\n pixelId: '12345,23456',\\n eventName: 'standard',\\n\\\n \\ standardEventName: 'PageView',\\n customEventName: 'custom',\\n variableEventName:\\\n \\ 'standard',\\n consent: true,\\n advancedMatching: false,\\n advancedMatchingList:\\\n \\ [{name: 'ct', value: 'Helsinki'},{name: 'cn', value: 'Finland'},{name: 'external_id',\\\n \\ value: 'UserId'}],\\n objectPropertiesFromVariable: false,\\n objectPropertyList:\\\n \\ [{name: 'prop1', value: 'val1'},{name: 'prop2', value: 'val2'}],\\n disableAutoConfig:\\\n \\ false,\\n disablePushState: false,\\n enhancedEcommerce: false,\\n eventId: ''\\n\\\n };\\n\\nconst mockEec = {\\n gtm: { \\n products: [{\\n id: 'i1',\\n name:\\\n \\ 'n1',\\n category: 'c1',\\n price: '1.00',\\n quantity: 1\\n },{\\n\\\n \\ id: 'i2',\\n name: 'n2',\\n category: 'c2',\\n price: '2.00',\\n\\\n \\ quantity: 2\\n }]\\n },\\n fb: {\\n content_type: 'product',\\n contents:\\\n \\ [{\\n id: 'i1',\\n quantity: 1\\n },{\\n id: 'i2',\\n quantity:\\\n \\ 2\\n }],\\n currency: 'EUR',\\n value: 5.00\\n }\\n};\\n\\nconst scriptUrl\\\n \\ = 'https://connect.facebook.net/en_US/fbevents.js';\\n\\n// Create injectScript\\\n \\ mock\\nlet success, failure;\\nmock('injectScript', (url, onsuccess, onfailure)\\\n \\ => {\\n success = onsuccess;\\n failure = onfailure;\\n onsuccess();\\n});\\n\\n\\\n mock('copyFromWindow', key => {\\n if (key === 'fbq') return () => {};\\n});\"\n\n\n___NOTES___\n\nCreated on 18/05/2019, 21:57:16\n\n\n", "galleryReference": { "host": "github.com", "owner": "facebook", "repository": "GoogleTagManager-WebTemplate-For-FacebookPixel", "version": "11c004614f6b8f7cc999caabef521086116ce302", "signature": "8eaf791b5fb175da7c334a7537d2e05d457cdb6e3cd0b9bd751ed96b6f3ea0bb", "galleryTemplateId": "5RM3Q" } } ] } }