___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___ { "type": "TAG", "id": "cvt_temp_public_id", "version": 1, "securityGroups": [], "displayName": "Piwik PRO", "categories": [ "ANALYTICS" ], "brand": { "id": "github.com_PiwikPRO", "displayName": "Piwik PRO", "thumbnail": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAFGmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNi4wLWMwMDYgNzkuMTY0NjQ4LCAyMDIxLzAxLzEyLTE1OjUyOjI5ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjIuMiAoTWFjaW50b3NoKSIgeG1wOkNyZWF0ZURhdGU9IjIwMjAtMDMtMjVUMTA6MzE6MTMrMDE6MDAiIHhtcDpNb2RpZnlEYXRlPSIyMDIxLTAzLTA5VDE1OjAzOjMzKzAxOjAwIiB4bXA6TWV0YWRhdGFEYXRlPSIyMDIxLTAzLTA5VDE1OjAzOjMzKzAxOjAwIiBkYzpmb3JtYXQ9ImltYWdlL3BuZyIgcGhvdG9zaG9wOkNvbG9yTW9kZT0iMyIgcGhvdG9zaG9wOklDQ1Byb2ZpbGU9InNSR0IgSUVDNjE5NjYtMi4xIiB4bXBNTTpJbnN0YW5jZUlEPSJ4bXAuaWlkOjRhYjE1Y2QwLTJjNTAtNGQ1MS1iYTc3LWM1NzExYzAyN2M5NyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDo0YWIxNWNkMC0yYzUwLTRkNTEtYmE3Ny1jNTcxMWMwMjdjOTciIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDo0YWIxNWNkMC0yYzUwLTRkNTEtYmE3Ny1jNTcxMWMwMjdjOTciPiA8eG1wTU06SGlzdG9yeT4gPHJkZjpTZXE+IDxyZGY6bGkgc3RFdnQ6YWN0aW9uPSJjcmVhdGVkIiBzdEV2dDppbnN0YW5jZUlEPSJ4bXAuaWlkOjRhYjE1Y2QwLTJjNTAtNGQ1MS1iYTc3LWM1NzExYzAyN2M5NyIgc3RFdnQ6d2hlbj0iMjAyMC0wMy0yNVQxMDozMToxMyswMTowMCIgc3RFdnQ6c29mdHdhcmVBZ2VudD0iQWRvYmUgUGhvdG9zaG9wIDIyLjIgKE1hY2ludG9zaCkiLz4gPC9yZGY6U2VxPiA8L3htcE1NOkhpc3Rvcnk+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+GEGNzQAAK09JREFUeJzt3XmcVXXBx/HvOXefuXdWZtjcEtFcUAwUy6U0ccM9NavHFjXNykczLU2tNLdMM3fT1DQjwxRxwS0UBMQAt1KRHWVnYJjt7vee8/wxUln4iMjMb+75fd6vl/+E4PcFN87nnnPuPU5d46AVkpICAAC26ApLGmh6BQAA6FUpV1Kn6RUAAKBXdbqmFwAAgN5HAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALhU0PgD08z1OxWFSpVJbve/J9X57nS/JNT0MPclxXIdeV+/4/juMqFHIVCoVMTwOsRgBgi3McR57nKZ/PK5fNSV7mXz/oVimZSioSiSgcDikSjsgNcSIqsHypUCgol88rny8ol8vJLxUkFf/jXwxLoajC4YgikYii0Yhc15XvE4dATyEAsEVsOOhnMhkVc+2SJDeS0pAdtteIEXtqx6FDNXDgAO0wZHsNGjRQVYmEYvG4qqsSCocjhtej5/jq6kqrvb1dHR2d6ujsVGdnp9aua1XLmhatWLlSq1at0oqVq7Ry5Sq1tq5X+/r1ynbl/vVLuAlFYzHFYjGFw2GiANhCnLrGQR2SUqaHoDI5jqtCIa90R4skKVnbrC98fn998YsHap+999Lw4bsrHo8bXolKkM1mtXLlas2dN0/z5y/Qknff0/wFCzV37jwtW7ZC2a617/+brpxwlRKJuKLRqNHNQAXrJACwWRzXVTabVa5rnSRH++5/kE468XiNOeIwDRmyvel5CJB8Pq8FCxZp5uxXNGfOO3r1tdf1zjtztfy9pZLykqRQtEaJRFyRSIQzBMCmIQDw8Tiuq0K+oHTHGklRHXnUGJ31nTN1xBGHmp4Gi3R0dmrGSy/rbzNna8qLU/XG39/UujVL3//RuKpSScViMWIA+HAEADaN4zjyfalt3XJJ0uFjjtVFPz5f+++/r+FlgLRq1WpNnjJVL730sp59bpLmznlL3TcaRpRI1igejxMDwAcRAPhorusqk8kol27Vp3cepl/84uc64UvHm54FbFShWNTkyS9q0vOT9fTTz+rvb/xd8nOSYkrV1XEjIdCNAMCHcxxHjuuqdc0KSWX97znn6dprr1Esyl37qAy+72vq1OkaP+EJPfb4k1o0/01JUjhWo2Qy+f6ZLWIAViIAsHGO48jzpfZ1y9WveaB++9s7dPyxR5ueBWy2fKGg8eMn6JGHH9XTzz2vzrZVksJK1fdTOBQiBGAbAgD/zXEcFUtldbWt0t6j9te4cWO17TZbmZ4FbDGLFi3R2AfH6Q8PjNW8OW9IkhKpforHY/I9QgBWIADwQf9+l//Rx35Jj/zlz3xlKwLL8zz9ceyDuvfe+/TC889LKile3aCqqip5nmd6HtCTCAD8i+M4KhQKSne06NtnnKU7f3ub6UlAr3n++cm65dY7NP6RRyXlFa2qV3VVFZcGEFQEALo5jqNisayu9lU69bQzdffv7jA9CTBi+kszdNNNt2vcQw9LXoYzAggqAgAbbvjz1b5uhY49/kSNf3ic6UmAcbNmvaJf/+ZmPTh2rKSiqmqaFYtF5RMCCAYCAN3X/de3LNM++x6gl6ZOluM4picBfcaLL07TVVdfq2eeflySVFM/UKFQSL5PCKCiEQC2c92QWltWqLa+nxbMf0v9GhtNTwL6pAkTHtc1v7xWL8+YJimqhqZm+b7PPQKoVJ08iN1ijuMom+mSVNaDf/oDB3/g/3HMMUdpxktTddttd6i5f5NaW5Ypm83KdflrFJWJV67Fyp6vbHq9LvjxJTrs0NGm5wAV4ayzztRrr87S1795unLpVrW2LJPvi0tnqDhcArCU67pqbVmuIUN30fy5/+AvL2AzPPfcJF18yaWaNXOGwtGUamrr5Hll07OATcElAFvlcnlJvm6+6QYO/sBmGj36i5r5t5d0yaU/U6mQUWvLUs4GoGIQABZyHFeZzhYdfeyXdfhhnPoHPqlfXP5zTZs+TXuO2FvtrSuU7krLdfkGTfRtoXhV6iJJMdND0Huy2azKpbIeefhBNTU1mZ4DBMI2W2+lM8/4trK5gl6c8ldlMx2qStaangV8mAJnACzjuK7ymVYdc9zx2mWXnU3PAQLnl9dcpWefe16Dt95OrS3LVCyV5Tj8VYu+h1elZbKZnKSQLvrReaanAIE1+uADNXvWTB1x5LHqalulrs52LgmgzyEALOI4jnLpdTrgwNEaNWov03OAQBvQv0lPPj5eV1xxlYr5TrW2LJfLkzXRhxAAFul+mImvL590vOkpgDUuvvgiPfPcX1Xf2E+ta5ZKcviUAPoEAsAiXZ1dStX21/HHHmN6CmCVQw7+omb+bYaGDRuhtnXLVSyW5PANgjCMV6AlHMdRudipQw45WAMGNJueA1hnhyHba+as6TrhxJPV1b5a2UyarxGGUbz6LLHhWeZfPOjzhpcA9orHYnpo3J904UUXK5der472Nm4OhDEEgCWyubzcSFKj9ubmP8C0q6+6Qr++4WaVCl1qXdfCzYEwggCwRCGb1o5Dh2r48N1NTwEg6Qfnfl8PjP2z5BXUumYFEYBeRwDYws9rxIjhXHME+pCvfeUkPfvcc4rFq9S6ZikRgF7F0cAin/rUdqYnAPgPow8+SFOnTlFVdS0RgF5FAFigXO5+POm222xjeAmAjdlr5J6aOvVFVSffjwBuDEQvIAAsUCqV5IaqtP32nzI9BcCH+Myeu2vatKlKpurV2kIEoOcRABYolcpKJJPq38yT/4C+bPgewzRt+r9FAJcD0IMIAAv4vqdIOKx4PG56CoCPsMewXfX885MUjiTUumYlZwLQYwgAC3i+r2gkoqrqKtNTAGyCvUbuqScnPinJ6/6eACIAPYAAsIDveYpEIqqqIgCASnHIwQfqwXEPSV5OHe3r+QgvtjheUZZwXFfhUNj0DAAfw5dPPF633X6XSoUuZTIZHiCELYpXkzV8+b5vegSAj+ms75yuH114qXLpVhULRR4ljC2GAACAPu6XV1+uY48/SV3tq0XHY0shAACgAvz5wQc0bPhIta1bzqUAbBG8igCgAkQjET098XHVNfTX+pYVfDIAnxgBAAAVYtDAAXr4L+Mkeerq7OCTAfhEePUAQAU56MADdOXV16mQa1eBmwLxCRAAAFBhfnLhD3X4mOO6bwoUAYDNQwAAQAV6cOx9GrT19mpbu5z7AbBZCAAAqEA1NSk9OPYPknyl051cCsDHRgAAQIXaf7/P6YILL1U+06ayxxcE4OMhAACggl179eUatsde6mhdwacC8LHwagGACvfA/fdITkidnR1cCsAmIwAAoMLtvvtuuuLKa1TMdahc5lIANg0BAAABcPFF52vXYSPUsZ5LAdg0vEoAICDuuP0WSVImk+ZSAD4SAQAAAbHfvvvotG9/T7n0enEhAB+FAACAAPn19Verqf/Wal+/jksB+H/x6gCAAKlJpXT1VVfIL+dULJZMz0EfRgAAQMCcdurXNWyPUepsW8VZAHwoXhkAEEDXX3eVJCmXyxlegr6KAACAABp98EE69IjjlOlcK4ezANgIXhUAEFDX/fIXkhNRJp02PQV9EAEAAAG122676uSv/o/ymfVyHP66xwfxigCAALv0JxdITkyZTJfpKehjCAAACLBddtlZXz75ZOUzbZwFwAfwagCAgLv0kh/JcWPKZLgXAP9CAABAwO26yy464aSTuu8FcHlGALoRAABggfPO/b4kR9lM3vQU9BEEAABYYJ9Re2u/z49WLr2WJwVCkhQ2PQDoiwqFom697Q51dHYqHoubnmOUL1/yperqKtXX16u2tkapVEoD+jdr2223USKRMD0Rm+j73ztT06Y8q2KppHAoZHoODHPqGgd1SEqZHoKe097ersGDB2nOm68pmaw2PacidHR0qra2xvSMPioqNxpTIh5Xc3Ozdhw6REOH7qDtt/+U9v3sPtpzzz0UiURMj8RGlL2yPr3LCC2YN0f1jU3yfR4abLFOzgAAG+G6rrbadqiWL1+h2tpa03P6BN/3VS6X5XmePM9ToVDU4sWLtXjB23rmqe4DiRtJascdh2r//fbVqL1H6sgjj1D/5ibDy7FByA3p9FNP0YU/Pl+e54srAXbjDIAFOAPw8XV1pbXzbnsSAJvIcRx5nqd8Pq9cOiOp+wE0/QZsoyMOPUQnnnCcjjzyCLMjIUlavnyFhn56mIrFkpLJpOk5MKeTmwABfGK+78txHMXjcdU1Nqi+32DV1A/QurWtuv++3+moo8Zot2Gf0Q2/uVmZTNb0XKsNHjxIhx16qEr5Dm4GtBwBAGCL831fruuqtrZG9f0Gq7qmWW+9+YbO+8H/atfdPqPrrv+N0umM6ZnWOuWUr0iSCsWS4SUwiQAA0KN831ckElZ9v4GqbRykJYsX6oLzf6Bdd9tDd911t+l5VjpyzOHabsiuSne2m54CgwgAAL3C9305kur7NauucZDeXbJYZ5xxug486FDNnPWK6XlWiYTDOuFLR0tejhsBLUYAAOhVGz56Vt9voFJ1AzT5hWc1au/P6eJLfmp4mV2OO/ZoSRFlcwXTU2AIAQDACN/3FAq5amjaSqFoTFdd+Qsd8IXReve9paanWeFzn91HO++2u3LpDtNTYAgBAMAoz/NUU1OjmvqBmjrlrxq51yg9OfEZ07OscMThh0g+ZwBsRQAAMM73fYVCjhqat9baNat15JjDdP2vbzI9K/COPmqMpIhyeSLARgQAgD7B9yWvXFZD02CFokmd/8NzdMmlPzc9K9D23+9z2mnXYVwGsBQBAKBP8byyamvrFK+u15VXXKbvn32u6UmB5TiODvzC/pJf4EuBLEQAAOhzPM9ToqpaVcl+uvWWG3XWd88xPSmwDthvX0lSqcSXAtmGAADQJ/mep1girqpUP91x+0269GdXmJ4USF/4/AFK1g5Qmq9otg4BAKDP8j1P8Xhc8ep6XXH5pbr5ljtMTwqcgQP7a6+99pRX6DI9Bb2MAADQp3mep6qqpMKxlP737LP01NPPmZ4UOF/4/P6SPNMz0MsIAAB9nueVVVNTJymkk796ita0rDU9KVBG7T1SciIqFPg4oE0IAAAVwfPKqm8aqI71q3XCSV8xPSdQRnzmM2roN0C5XN70FPQiAgBA5fA9peoHaOrkv+rnl19tek1g9OvXqF12+bS8Ytr0FPQiAgBAxfB9KRwKKRxL6bKfXaK3355jelJgjByxpySP7wOwCAEAoKL4vq+amlpJnr7zvXNNzwmMPYfvIYnvA7AJAQCg4niep2Rtf02d/Kzu/8OfTM8JhOHDd1c0Uc9zASxCAACoSNFoRFJEP7rwJ8pm+RKbT2rHoTuof/9mFQkAaxAAACqS53mqaWjS6hVLdPsdd5meU/Hi8bh22GF7ySOmbEEAAKhYIdeR48Z0w4238hn2LWCnHXcUNwLagwAAULF831eqtkHL3p2n3955j+k5FW/HoUMkdZ9dQfARAAAqWijkSgrpltvuND2l4u2441DJiahYLJqegl5AAACoaL7vqyrVqHlzXtOkSZNNz6lo226zjaqSdSryUUArEAAAKl4sFpEk/XHsg4aXVLbBgwcqlUqqTABYgQAAUPF835cbrtJjTzyl9evXm55Tserr69Tc3CSvyA2VNiAAAARCdapG69a8pyeefNr0lArmaOvBgyURADYgAAAEQjgUkiS9OHW64SWVbautBpuegF5CAAAIBN/3JSeml1562fSUijZgYH/TE9BLCAAAgRFNVOuduXP12utvmJ5Sserq6kxPQC8hAAAERiIek1fs0lQuA2y2utpaSVK5XDa8BD2NAAAQGK7b/Vfa3HnzDS+pXLW1tZJCBIAFCAAAgeH7viRHCxctMT2lYtXX18oJJ97/vUSQEQAAgsWNa8GChSqW+DrbzVFXV694PM4ZAAsQAAACJRyNafXq1Vq8+F3TUypSdXVC0WhEHmcAAo8AABAo4VBI6XRGy5evMD2lIkXCke57KTj+Bx4BACBQXNeVXyoo3ZU2PaUiRSIRhUIh+T6PBA46AgBAoLiuI6mgjs5O01MqUiQS+eenKRBs/CkDCJTuAJDa29sNL6lMG84AcA9A8BEAAALFdbufCdDZ2WV4SWWKRiMKua5EAAQeAQAgUDZ8fj0cDhteUpnKZe/9d/+O6SnoYQQAgEDZEABVVQnDSypTvlBQuVyW4xAAQUcAAAiUDQEQi8UML6lMpVJRXtkTx//gIwAABMqGAIhEIoaXVKZisSTP5wyADQgAAIFS9jzJiamurtb0lIpUKhbleXwHgA0IAACBUiqVlEjWaLtttzE9pSLl8nmVSpwBsAEBACBQSsWS6mprtPU2W5ueUpHa2zuUzeUVCnF4CDr+hAEEil/Ka8CA/qqtqTE9pSK1tbWplMvxbYAW4E8YQMAUtd1225oeUbHa2tol5eQ4IdNT0MMIAACBM3z3YaYnVKwNX6EcChEAQUcAAAiMQqEoKaK9Ro4wPaVitXd0SPrXMxUQXAQAgMDIZnOqbxqgvfceaXpKxWppWWt6AnoJAQAgEBzHkV/q0rDddlFjY4PpORVr+fIVpieglxAAAAKh+xsAfR180BdMT6loy5Ytl8T1fxsQAAACIZPJyo0kdfzxx5ieUrHy+bxWrFgpuTxHwQYEAICK5ziOCtl2jRq1t3bdZWfTcyrW6tVrtL6tTaEIj1K2AQEAoOJ1P7/e0zFHHWl6SkVbunSZOjs6FQ4TADYgAABUvK7OTiWSjfraV08yPaWizV+4SOVip6I8SdEKBACAiuY4jsqFTn3l5JO01VaDTc+paPPnzZckhcPcBGgDAgBARctkspKiOvec75meUvHmLVggSfJ9w0PQKwgAABXLdV3lM606/MgjNWy3XU3PqXhz586XFDU9A72EAABQkRzHUTqdluTosp9dbHpOxVu5cpWWLluuUDRuegp6CQEAoGLlM+v19W9+W3uN/IzpKRXv7/94U22taxWLcQbAFgQAgIrjOI7a29qUqK7XL6++3PScQHjt9TckL69olACwBQEAoOKUy568Ulo//eklGjCgv+k5gfDaa29I6o4r2IEAAFBRHNdVx/qV2muf/XThj84zPScQSuWyXn3tDcmJv/9MBdiAAABQMVzXVfv6VoUjVRr7wH2m5wTGnLfnaMmSdxWJJ0xPQS8iAABUBMdxlM/l5ZUyuvW2W7XDkO1NTwqMmbNeUSnfrkSchwDZhAAA0Oc5jqOy5yvd2aL/+fppOuP0b5qeFCjTps+QJIVCfAOgTQgAABXAUUfrCn1uvwP1h/t+Z3pMoJTKZb047SXJ5fq/bQgAAH2a64a0fu0ybb3tED3x2COm5wTOzJmztWj+fMWrqk1PQS8jAAD0Wa4bUmvLUtXWNWrSc8+ovr7O9KTAefHFaZKfUzzG9X/bEAAA+qQNB//Gfv0146WXNHToENOTAmnylKmSHD7/b6Gw6QEA8O8cx5EvqbVlqZr7b6Wp0yZrxx04+PeE5ctXaNr0GQpFU1z/txBnAAD0GY7jqlgqq23tcu24066aMWMaB/8e9PiTTyndsUbV1Vz/txEBAKBPcF1XmXSXutpW6ZhjT9Ds2S9r+09ta3pWoD3x5FOSpFCIQ4GN+FMHYJTjOHJcV60ty5TPtumin1yiR8c/pFQyaXpaoK1avVpTpkyTy+l/a3EPAABjXNdVJptVrmudttluiG668UYdc/QY07Os8OTEp9XVvlo19QNMT4EhBACAXuc4rsrlstrWLZMkfeObp+vX1/9KDQ11ZodZZNxD4yV1f/sfZwDsRAAA6DWO48j3fa1fu1JSWcP3HKnLL/u5jjqKd/29af78BZo0aZKiiToO/hYjAAD0OMdxVCqV1dnWIqmsIUN31gU/PE9nnnm66WlW+sMDD6pc6FKqcZDpKTCIAADQIza828/mcsqnWyVJO+40TKed9k2dffZ3lYjHDS+0k+/7evChhyUn+s8/I9iJAACwxTiOI8/zlM1mVci2S/Llhqp12GFH6ZRTvqaTv3KSXL5xzqhnnpuk+XNeV1VNMwd/yxEAADbLhnePhUJBhUJBpXxeUl6SVJXqp70OOEiHHjJahx96sEaOHGF2LP7pzjvvkSTFohECwHIEALARvu+rvaNDfimt9nbTa/qC7nftfqkgqfAfPxZVXWM/bbvrLtp92G7ae6+RGj36IO2049BeX4n/37z5CzRhwmOKxrn5DwQAsFGu62rQwIFa6Us1tTWm5xjn+b7kS/2bmzVo0AA1NTWpqalRTf2a9OlP76Q9hw/ToEGD5Lp8t1hfduttd8orpVVdN5gAAAEAbExVVUKvzJwmz/fliGvWki/fl5LJap4aV6Ha2zv0wB/Hyg3zvf/oRgAAG+E4Dg9IQaDcfe/9am1ZrtqGQbz7hySeBQAAgVcsFnXzLbdLblSuyxkcdCMAACDg7rr791qy8G3V1Dby7h//RAAAQICVSiVd+6sbJCfCY3/xAbwaACDAfnfPfXp30RzV1PXj3T8+gAAAgIAql8v65bXX8+4fG8UrAgAC6jc33aolC+eopr6Jd//4LwQAAARQW1ubrrzyGrmhKoW48x8bQQAAQAD99LIrtX7dStXU1fPuHxtFAABAwCxYsFC33nKrIvFa8cWN+DAEAAAEzA/Ov0heKatkKsW7f3woAgAAAuSxJ57SExMeUnVNk3zPMz0HfRgBAAABkc/l9f3vnyMppFgsZnoO+jgCAAAC4qJLL9fSd+ertnGAPN794yMQAAAQAK+/8Q/dcN3ViibqxKf+sCkIAAAIgG+deoYkX8lkkhv/sEkIAACocBdf+gu9/urLqqkfxKl/bDICAAAq2Mt/m6mrrvipoolahUKc+8emIwAAoEKVSiWd8vVTJUnJJJ/5x8dDAABAhfru98/TgnlvqbZxMKf+8bERAABQgR4YO053/fZmVaX6cdc/NgsBAAAVZu7c+frWN78hx40rHo9z6h+bhQAAgApSKpV13JdOUqmYU31jP079Y7MRAABQQb512pma89brXPfHJ0YAAECFuPa6G/XA/XeruqaJ6/74xAgAAKgA4x99Qj++4FxFE7WKxWJc98cnRgAAQB/393+8pZNOOlFSVMlkDaf+sUUQAADQh61du06HHn6kSsWcGpr6y/PKpichIAgAAOijMpmsDh59mFYtX6L6pq04+GOLIgAAoA/yfWnMkcfqjddnq65xcPf/AGxBBAAA9EFfOvHLmvzCs6ppGCTHETf9YYsjAACgjzn19DM1/uFxStb2V8h1OPijRxAAANCHnHHmd3Xv3XequqZZkUiYgz96TNj0AABAt9PPOEt333WHqlNNisai8vm4H3oQAQAAfcCpp5/Z/c4/1aRoPMbBHz2OAAAAw075xql64P57VV3TzDt/9BoCAAAMKRSKOu74EzXxyQmqru2vaDTMwR+9hgAAAAPWrWvV4UccrVkzpytVP1DhkCvf44Y/9B4CAAB62YKFi3XooWO0aOEc1TYOkuvwUT/0Pj4GCAC96IXJUzVq1Ge1aOEc1ffbioM/jCEAAKCX3Hb7nTrowM+rdd0aNTRvLd/3OPjDGAIAAHrBOef+UN/77plywwk1NG8lr8yDfWAW9wAAQA9asXK1vvHNU/XXZycqUd2oRFWCgz/6BAIAAHrIM89O0rdOPVUrl7+nmvqBCoVceXzMD30ElwAAoAf87GeX6bBDD9bK5e+poWkrhUIu1/vRp3AGAAC2oIWLlujM73xPk56bqGi8VslUjTyPU/7oezgDAABbyO/uvkcjRu6tSc9NVKp+oKqTKQ7+6LM4AwAAn9B7S5fr7LPP1WMT/iIpqsbmreV5nnyf6/3ouwgAAPgEfv/7+/WjH1+kljUrVF3brGg0qjJ3+aMCcAkAADbD7Fde1ehDxuhb3/qGWta0qKFpK0UjER7mg4rBGQAA+Biy2Zx+9vPL9atf/Ubys0rW9lckEuHjfag4BAAAbKKxYx/UZZdfoXlz31IoWqPa2kau9aNiEQAA8BEmTnxaV19zraZNfUGSo7rGwXIc8a4fFY0AAIAP8dKMl3X11b/SE48/IklK1g1QJBx+/yE+hscBnxABAAD/Ydq06brxptv1l4celpRTVapJsXhMPqf7ESAEAAC87/kXJuvmm27To49OkFRQrLpB1VX9uq/zc7ofAUMAALDeww+P1z333qeJTz4pqaR4daOqqhLyPI/r/AgsAgCAlVpa1mrsn8bp3nvv0xuvz5QkJVL9FI/H5XPghwUIAABWmTz5RY37y3g9Mv5RrV6xRJLz/mf5w/J9n1P9sAYBACDw5i9YqAkTHteD4x7WKzNnSipIoWrVNgyU63Y/ppdH9cI2BACAQHr33ff01DPP6cmJT+uFF6Yo3dEiyVEi1ah4LPbPAz4HftiKAAAQGO+8M1fPPDtJE596Wi//bbY61q+UJEXitaprHCTHcXi3D7yPAABQsda0tGjKlKmaNftVTZkyVf948y1lu9ZJksKxWtXUD1AoFOLdPrARBACAilAue1q6dJlmzX5Fc955R9Onz9Brr/9dLavek+RLCiuaSH7gur7EQR/4MAQAgD4nm81q2bLlmjtvvubPX6A333pbr7zymhYveU8d61dL6r5TPxRNKVnbpEgk8oEDPQd94KMRAAB6XalUUkdHp1auXKWVq1ZpxYqVWrV6tZYuXaZ58+Zr/sJFamlZq662Nkn5939WTOF4XNU1jYpEIh/49TjgAx8fAQB8iHvu/YMWLZyneCJpekpF2nDDXVdXl9rbO9TR2amOjg51dnVp7dp1Wrt2ndLptLq60lI5/W8/05XcuCLRiKpSKUUiDR84pQ9gyyAAgA9x1TW/0sJ5/zA9I4BCkiJyI2GFQmElEnGFQkmFw6EP/Rkc/IEtjwAAPsR2226jhfPeUl3jANNTAGCLc00PAAAAvY8AAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgBs4UiO45heUVH4/QIQZASAFRx5ZU/FUtH0kIrS/ftFBAAIJgLAAq7rqFgsKZPJmJ5SUTKZrKSQ6RkA0CMIAAs4jqNSqahsNmd6SsUolz3lcllxBgBAUBEAFnAcR4ViWbkcAbCpyuVS9xkAl/+LAAgm/nazQDgcVqarQ6tWrTY9pWK0tKxVW1u73HDE9BQA6BEEgAXC4bD8claLFy82PaViLF68ROvXtykaCZueAgA9ggCwQCjUfSPbe0uXG15SOd5bukxesVPhMAEAIJgIAIssWsQZgE21aPESSSIAAAQWAWALJ65Zs1+VVy6bXlIRZs2aLT4BACDICABLRBNVWrBggd74+z9MT+nz0um0Zs1+TU4oYXoKAPQYAsASiXhMXrFLf5s52/SUPu+VV1/XyuVLFU9UmZ4CAD2GALCE+/7n2f86abLZIRVg0vOTJT+vWCxqegoA9BgCwBK+7ysUSemZZ5/TqlVrTM/p0x4Z/5jk8Pl/AMFGAFgkmUqqq32Nxk94zPSUPmv6SzP05huvKF5da3oKAPQoAsAi3ZcBHP153COmp/RZY//0kKSyEvGY6SkA0KOcusZBHZJSpoegd+RyBeXSrZrx8gztM2pv03P6lLVr12roTrurs7NTqZoa03MAoCd1cgbAMomquCRPv7z2BtNT+pybb/mt2lpXKlXD6X8AwccZAAtls1nls2m99dYb2mXnT5ue0yfkcnltt/1OalmzRrX1DfJ93/QkAOhJnAGwUVVVleQXdOFFPzU9pc+48uprtXrlu0rV1nPwB2AFzgBYqlAoKtPZoolPPaPDDzvE9ByjFi1eop122k1yQ0qlUgQAABtwBsBW8XhMkqOzzznP9BTjzj7nfJWKaaVqajj4A7AGAWApz/NU0zBQC+e9pR9deKnpOcaMffAhTXz8YVXXNMv3PNNzAKDXcAnAYo7jKJfNKJter6eeflaHHTra9KRetWjxu9p5l91ULJZV39AojwAAYA8uAdjM930lqpKSQvrKV7+udetaTU/qVSeeeLIKuS7VNfTj4A/AOgSA5TyvrPqmgWprXaUjjz7emgPht047U6++8rJqGgbJ98qm5wBAryMAIPm+ahsH6eWXpuj4E042vabHXXTxz/X7e+5UdU2zQq5jeg4AGEEAQL7vy3UcJesGaML4h3T6t88yPanHXPfrm3TNVZcpXt2gWCzKXf8ArEUAQFJ3BETCIVXXNOnu392hb58RvAi4+prrdMEPz1E0UauqqiprLncAwMYQAPgn3/cVjcVUXdOs3911h4497gSVA3J9/Pzzf6yfXHSBoolaJZM1HPwBWI8AwAf4nqdoNKJU3QBNePRhfW7fA/Xue0tNz9ps+XxBX/ufb+j6669VItmoZDIlLyBRAwCfBAGA/+L7vsLhkGobB2vmy1M1cq9ReuTRx0zP+thmznpFnxmxt8b+8X4la/srnkjwzh8A3kcAYKO6bwyUGpq31to1a/Sl447ROeeer3yhYHraJvn1DTdqn8/uq7ffekN1jYMViYT5pj8A+DcEAD6U7/vyymU1NA1UvLpBN914vYYPH6G/PPyI6Wkf6vkXpuiAzx+kH553rhwnrIbmrSX53O0PAP+BrwLGJnEcR74vta1bLkk6YsxxuvDHP9T+++9reFm3t99+R7+6/jf6/T13SfKUqh+ocCgk3+ddPwBsRCcBgI/FcV0V8gWlO9ZIiurIo8bou985U4cfcaiRPS//baZuu/0ujRv3sPLZ9YpVN6iaj/gBwEchALB5HNdVNptVrmudJEf77n+QTjrxeI0Zc7iGbP+pHv1vt7Ss1YTHntT4Rydo4lPPSuW0wrFapVJJSeJ0PwB8NAIAn4zjuCoU8kp3tEiSknX99YUD9tMXDzpQ++yzl4bvsbvi8fgn+m+USiXNeWeupk+foWnTZ+ivk17Q6hWLJUnx6gYlEgkO+gDw8RAA2DIcx5HnecpkMirm2iVJbjSlT223nUaO2FNDhw7RwIEDtcOQ7TVo0EBVJRKKx+Oqrq6S47rKpDPdZxRyea1es0YLFizUipUrtXjxu5o1+xUtWLBI+Uz30wrdSFLJZFKhUIgDPwBsHgIAW96GGMjn88plc5KX+dcPulVKppKKRCIKh0OKRKJyHKlYLKlYLKpUKiudTssrdv7brxhXNJFQPB7joA8AWwYBgN7jed4/D/K+73V/zNDrPpg7riPXceQ4jkKhkCKRiEKhkOHFABBYnWHTC2AP13UVi8UUi5leAgDgi4AAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAsRAAAAGAhAgAAAAsRAAAAWIgAAADAQgQAAAAWIgAAALAQAQAAgIUIAAAALEQAAABgIQIAAAALEQAAAFiIAAAAwEIEAAAAFiIAAACwEAEAAICFCAAAACxEAAAAYCECAAAACxEAAABYiAAAAMBCBAAAABYiAAAAsBABAACAhQgAAAAs5EpKmR4BAAB6VSosaaWkpOklAACg13T9H++0soqHDWl9AAAAAElFTkSuQmCC" }, "description": "Privacy-friendly customer journey analytics. Our server-side tag template lets you send Analytics events to the Piwik PRO HTTP API. Compatible Clients include Piwik PRO and Google Analytics 4.", "containerContexts": [ "SERVER" ] } ___TEMPLATE_PARAMETERS___ [ { "type": "TEXT", "name": "instanceName", "displayName": "Account Name", "simpleValueType": true, "valueHint": "my-instance", "valueUnit": ".piwik.pro", "valueValidators": [ { "type": "NON_EMPTY" } ] }, { "type": "TEXT", "name": "websiteId", "displayName": "Site or App ID", "simpleValueType": true, "valueValidators": [ { "type": "REGEX", "args": [ "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" ], "errorMessage": "The Application ID needs to be in UUID format." }, { "type": "NON_EMPTY" } ], "alwaysInSummary": true, "help": "Your website or meta site ID in Piwik Pro. \u003ca href\u003d\"https://help.piwik.pro/support/questions/find-website-id/\"\u003eMore information.\u003c/a\u003e" }, { "type": "SELECT", "name": "anonymous", "displayName": "Anonymous Tracking", "macrosInSelect": false, "selectItems": [ { "value": "inherit", "displayValue": "Inherit from Client" }, { "value": "rmip", "displayValue": "Remove IP (rmip)" }, { "value": "uia", "displayValue": "User Is Anonymous (uia)" } ], "simpleValueType": true, "help": "\u003ca href\u003d\"https://piwik.pro/blog/the-ultimate-guide-to-data-anonymization-in-analytics/\"\u003eMore info about User Is Anonymous\u003c/a\u003e. \u003ca href\u003d\"https://changelog.piwik.pro/version-17/17-2-0/\"\u003eMore info about rmip\u003c/a\u003e.", "defaultValue": "inherit" }, { "type": "GROUP", "name": "event", "displayName": "Event Configuration", "groupStyle": "ZIPPY_OPEN", "subParams": [ { "type": "SELECT", "name": "eventType", "displayName": "Event Type", "macrosInSelect": false, "selectItems": [ { "value": "inherit", "displayValue": "Inherit from Client" }, { "value": "pageview", "displayValue": "Page / App View" }, { "value": "ecommerce", "displayValue": "Ecommerce" }, { "value": "search", "displayValue": "Search" }, { "value": "link", "displayValue": "External Link Click" }, { "value": "download", "displayValue": "File download" }, { "value": "custom", "displayValue": "Custom" } ], "simpleValueType": true, "defaultValue": "inherit" }, { "type": "TEXT", "name": "action_name", "displayName": "Event (Action) Name", "simpleValueType": true, "help": "Set to the page title or application path that describes the page or screen that was viewed. Leave empty to inherit from the Client.", "enablingConditions": [ { "paramName": "eventType", "paramValue": "pageview", "type": "EQUALS" } ], "valueHint": "Inherit from Client", "valueValidators": [] }, { "type": "TEXT", "name": "link", "displayName": "External Link URL", "simpleValueType": true, "help": "Set to the URL of the external link that was clicked. Leave empty to inherit from the Client.", "valueHint": "Inherit from Client", "enablingConditions": [ { "paramName": "eventType", "paramValue": "link", "type": "EQUALS" } ] }, { "type": "TEXT", "name": "download", "displayName": "File Download URL", "simpleValueType": true, "help": "Set to the URL of the file that was downloaded. Leave empty to inherit from the Client.", "valueHint": "Inherit from Client", "enablingConditions": [ { "paramName": "eventType", "paramValue": "download", "type": "EQUALS" } ] }, { "type": "TEXT", "name": "url", "displayName": "Event URL", "simpleValueType": true, "help": "Set to the URL where the event occurred. Leave empty to inherit from the Client.", "valueValidators": [ { "type": "REGEX", "args": [ "^(https?://|mailto:).+$" ], "errorMessage": "Must be a valid URL/URI (starts with https:// or mailto:)." } ], "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "urlref", "displayName": "Referrer URL", "simpleValueType": true, "help": "Set to the URL of the page that linked to the current page. This value is typically found in the HTTP Referer header. Leave empty to inherit from the Client.", "valueValidators": [ { "type": "REGEX", "args": [ "^(https?://|mailto:).+$" ], "errorMessage": "Must be a valid URL/URI (starts with https:// or mailto:)." } ], "valueHint": "Inherit from Client" }, { "type": "GROUP", "name": "eventDetails", "displayName": "Custom Event Details", "groupStyle": "ZIPPY_OPEN", "subParams": [ { "type": "TEXT", "name": "e_c", "displayName": "Custom Event Category", "simpleValueType": true, "help": "Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/reports/custom-event-report/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "e_a", "displayName": "Custom Event Action", "simpleValueType": true, "help": "Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/reports/custom-event-report/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "e_n", "displayName": "Custom Event Name", "simpleValueType": true, "help": "Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/reports/custom-event-report/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "e_v", "displayName": "Custom Event Value", "simpleValueType": true, "help": "Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/reports/custom-event-report/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" } ], "enablingConditions": [ { "paramName": "eventType", "paramValue": "custom", "type": "EQUALS" } ] }, { "type": "GROUP", "name": "searchDetails", "displayName": "Search Event Details", "groupStyle": "ZIPPY_OPEN", "subParams": [ { "type": "TEXT", "name": "search", "displayName": "Search Query", "simpleValueType": true, "help": "Internal search query / keyword. Leave empty to inherit from client. \u003ca href\u003d\"https://help.piwik.pro/support/questions/how-can-i-track-internal-search-with-javascript-function/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "search_cats", "displayName": "Search Categories", "simpleValueType": true, "help": "Comma-separated list of search query categories. Leave empty to inherit from client. \u003ca href\u003d\"https://help.piwik.pro/support/questions/how-can-i-track-internal-search-with-javascript-function/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "search_count", "displayName": "Search Results Count", "simpleValueType": true, "valueHint": "Inherit from Client", "help": "Number of search results. Leave empty to inherit from client. \u003ca href\u003d\"https://help.piwik.pro/support/questions/how-can-i-track-internal-search-with-javascript-function/\"\u003eRead more\u003c/a\u003e.", "valueValidators": [ { "type": "NON_NEGATIVE_NUMBER" } ] } ], "enablingConditions": [ { "paramName": "eventType", "paramValue": "search", "type": "EQUALS" } ] } ] }, { "type": "GROUP", "name": "ecommerceGroup", "displayName": "Ecommerce", "groupStyle": "ZIPPY_CLOSED", "subParams": [ { "type": "SELECT", "name": "e_t", "displayName": "Ecommerce Event Type", "macrosInSelect": false, "selectItems": [ { "value": "product-detail-view", "displayValue": "product-detail-view" }, { "value": "add-to-cart", "displayValue": "add-to-cart" }, { "value": "cart-update", "displayValue": "cart-update" }, { "value": "remove-from-cart", "displayValue": "remove-from-cart" }, { "value": "order", "displayValue": "order" } ], "simpleValueType": true, "notSetText": "Inherit from Client" }, { "type": "TEXT", "name": "ec_id", "displayName": "Order ID", "simpleValueType": true, "help": "Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "revenue", "displayName": "Revenue", "simpleValueType": true, "help": "Total revenue of order. Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "ec_st", "displayName": "Sub-total", "simpleValueType": true, "help": "Total order cost minus shipping. Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "ec_sh", "displayName": "Shipping", "simpleValueType": true, "valueHint": "Inherit from Client", "help": "Order shipping cost. Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e." }, { "type": "TEXT", "name": "ec_tx", "displayName": "Tax", "simpleValueType": true, "valueHint": "Inherit from Client", "help": "Order tax. Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e." }, { "type": "TEXT", "name": "ec_dt", "displayName": "Discount", "simpleValueType": true, "valueHint": "Inherit from Client", "help": "Discount amount. Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e." }, { "type": "SELECT", "name": "ec_products", "displayName": "Products", "macrosInSelect": true, "selectItems": [], "simpleValueType": true, "help": "Set to a variable that returns an \u003cstrong\u003earray\u003c/strong\u003e of \u003ca href\u003d\"https://developers.google.com/tag-platform/gtagjs/reference/events#purchase_item\"\u003ecorrectly formatted \u003ccode\u003eitem\u003c/code\u003e objects\u003c/a\u003e. Choose \"Inherit from Client\" to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/track-ecommerce/\"\u003eRead more\u003c/a\u003e.", "notSetText": "Inherit from Client" } ], "enablingConditions": [ { "paramName": "eventType", "paramValue": "ecommerce", "type": "EQUALS" } ] }, { "type": "GROUP", "name": "customDimGroup", "displayName": "Custom Dimensions \u0026 Variables", "groupStyle": "ZIPPY_CLOSED", "subParams": [ { "type": "LABEL", "name": "customDimLabel", "displayName": "By default, custom dimensions and variables are inherited from the Client. Anything you set here will override the inherited values." }, { "type": "SIMPLE_TABLE", "name": "custom_dims", "displayName": "Custom Dimensions", "simpleTableColumns": [ { "defaultValue": "", "displayName": "Dimension index", "name": "index", "type": "TEXT", "valueValidators": [ { "type": "POSITIVE_NUMBER" } ], "isUnique": true }, { "defaultValue": "", "displayName": "Dimension value", "name": "value", "type": "TEXT" } ] }, { "type": "SIMPLE_TABLE", "name": "cvars_event", "displayName": "Custom Variables (Event)", "simpleTableColumns": [ { "defaultValue": "", "displayName": "ID", "name": "id", "type": "TEXT", "isUnique": true }, { "defaultValue": "", "displayName": "Name", "name": "name", "type": "TEXT" }, { "defaultValue": "", "displayName": "Value", "name": "value", "type": "TEXT" } ] }, { "type": "SIMPLE_TABLE", "name": "cvars_session", "displayName": "Custom Variables (Session)", "simpleTableColumns": [ { "defaultValue": "", "displayName": "ID", "name": "id", "type": "TEXT", "isUnique": true }, { "defaultValue": "", "displayName": "Name", "name": "name", "type": "TEXT" }, { "defaultValue": "", "displayName": "Value", "name": "value", "type": "TEXT" } ] } ] }, { "type": "GROUP", "name": "userGroup", "displayName": "User Configuration", "groupStyle": "ZIPPY_CLOSED", "subParams": [ { "type": "TEXT", "name": "_id", "displayName": "Visitor ID", "simpleValueType": true, "help": "Set to the Visitor ID. Value should be a hexadecimal string of 16 characters. Leave empty to inherit from the Client.", "valueHint": "Inherit from Client", "valueValidators": [ { "type": "REGEX", "args": [ "^[0-9a-fA-F]{16}$" ], "errorMessage": "The value must be a hexadecimal string of 16 characters." } ] }, { "type": "TEXT", "name": "uid", "displayName": "User ID", "simpleValueType": true, "help": "Set to a login or authentication ID that persists across devices or within the application. Leave empty to inherit from the Client. \u003ca href\u003d\"https://help.piwik.pro/support/getting-started/userid/\"\u003eRead more\u003c/a\u003e.", "valueHint": "Inherit from Client" }, { "type": "TEXT", "name": "cip", "displayName": "Override User IP", "simpleValueType": true, "help": "Set to a custom IP address (XXX.XXX.XXX.XXX) to override the IP address gathered from the request headers. Leave empty to inherit from the Client.", "valueHint": "Inherit from Client" } ] }, { "type": "GROUP", "name": "additionalParametersGroup", "displayName": "Additional Parameters", "groupStyle": "ZIPPY_CLOSED", "subParams": [ { "type": "LABEL", "name": "additionalParamsLabel", "displayName": "Add parameters supported by the \u003ca href\u003d\"https://developers.piwik.pro/en/latest/data_collection/api/http_api.html#/paths/~1ppms.php/get\"\u003eHTTP API\u003c/a\u003e here. Anything you add to this table will override the previously set (or inherited) parameters in the API requests." }, { "type": "SIMPLE_TABLE", "name": "additionalParameters", "simpleTableColumns": [ { "defaultValue": "", "displayName": "Parameter name", "name": "key", "type": "TEXT", "isUnique": true }, { "defaultValue": "", "displayName": "Parameter value", "name": "value", "type": "TEXT" } ] } ] }, { "displayName": "Logs Settings", "name": "logsGroup", "groupStyle": "ZIPPY_CLOSED", "type": "GROUP", "subParams": [ { "type": "RADIO", "name": "logType", "radioItems": [ { "value": "no", "displayValue": "Do not log" }, { "value": "debug", "displayValue": "Log to console during debug and preview" }, { "value": "always", "displayValue": "Always log to console" } ], "simpleValueType": true, "defaultValue": "debug" } ] } ] ___SANDBOXED_JS_FOR_SERVER___ // API declarations, alphabetical order const createRegex = require('createRegex'); const encodeUriComponent = require('encodeUriComponent'); const eventData = require('getAllEventData')(); const getContainerVersion = require('getContainerVersion'); const getRequestHeader = require('getRequestHeader'); const getType = require('getType'); const JSON = require('JSON'); const logToConsole = require('logToConsole'); const makeNumber = require('makeNumber'); const makeString = require('makeString'); const Object = require('Object'); const sendHttpRequest = require('sendHttpRequest'); const setResponseHeader = require('setResponseHeader'); const setResponseStatus = require('setResponseStatus'); const sha256Sync = require('sha256Sync'); const testRegex = require('testRegex'); // Template constants const ENDPOINT = 'https://' + data.instanceName + '.piwik.pro/ppms.php'; const HEADERS = { 'content-type': 'application/x-www-form-urlencoded' }; const LIBRARY_NAME = 'sgtm'; const LIBRARY_VERSION = '1.0.3'; const LOGGING_ENABLED = isLoggingEnabled(); const TRACE_ID = LOGGING_ENABLED ? getRequestHeader('trace-id') : undefined; /** * Returns if logging is enabled based on the logType value and the container version. * * @returns {boolean} */ function isLoggingEnabled() { const containerVersion = getContainerVersion(); const isDebug = !!( containerVersion && (containerVersion.debugMode || containerVersion.previewMode) ); if (!data.logType) { return isDebug; } if (data.logType === 'no') { return false; } if (data.logType === 'debug') { return isDebug; } return data.logType === 'always'; } /** * Checks if Client ID is already a 16 character hexadecimal hash. * If it isn't, the hash is generated and returned. */ const getClientIdHash = () => { const clientId = eventData.client_id; if (!clientId) return; const clientIdRegex = createRegex('^[0-9a-fA-F]{16}$'); return testRegex(clientIdRegex, clientId) ? clientId : sha256Sync(clientId, {outputEncoding: 'hex'}).substring(0,16); }; /** * Returns an array of trimmed strings. * * @param {String} str - the string to be split and trimmed. */ const stringToArrayAndTrim = str => str.split(',').map(item => item.trim()); /** * Returns an object with top-level undefined/null keys removed. * * @param {Object} obj - the object to be cleaned. */ const cleanObject = (obj) => { const target = {}; Object.keys(obj).forEach((k) => { if (obj[k] != null) target[k] = obj[k]; }); return target; }; /** * Converts a GA4 ecommerce array into Piwik Pro format. * * @param {Array} itemArr - A valid GA4 items array. * @returns {Array} – An array of Piwik PRO product arrays. */ const convertEcommerce = itemArr => { if (getType(itemArr) !== 'array') return; return itemArr .filter(item => getType(item) === 'object') .map(item => { return [ makeString(item.item_id), item.item_name, [item.item_category, item.item_category2, item.item_category3, item.item_category4, item.item_category5].filter(category => category), item.price, item.quantity, item.item_brand, item.item_variant, Object.keys(item).reduce((acc, cur) => { if (cur.slice(0,9) === 'dimension') acc[cur.slice(9)] = item[cur]; return acc; }, {}) ]; }); }; // Build a map of all params defined in the UI const uiParamMap = { idsite: data.websiteId, rec: 1, uia: data.anonymous === 'uia' ? 1 : eventData['x-pp-uia'] || 0, rmip: data.anonymous === 'rmip' ? 1 : eventData['x-pp-rmip'] || 0, action_name: data.action_name || eventData['x-pp-action_name'] || (data.eventType === 'pageview' || eventData.event_name === 'page_view' ? eventData.page_title : undefined), url: data.url || eventData.page_location, urlref: data.urlref || eventData.page_referrer, search: data.search || eventData['x-pp-search'], search_cats: JSON.stringify(data.search_cats ? stringToArrayAndTrim(data.search_cats) : eventData['x-pp-search_cats']), search_count: data.search_count ? makeNumber(data.search_count) : eventData['x-pp-search_count'], link: data.link || eventData['x-pp-link'], download: data.download || eventData['x-pp-download'], e_c: data.e_c || eventData['x-pp-e_c'], e_a: data.e_a || eventData['x-pp-e_a'], e_n: data.e_n || eventData['x-pp-e_n'], e_v: data.e_v || eventData['x-pp-e_v'], _id: data._id || getClientIdHash(), uid: data.uid || eventData.user_id, cip: data.cip || eventData.ip_override, e_t: data.e_t || eventData['x-pp-e_t'], ec_id: data.ec_id || eventData['x-pp-ec_id'] || eventData.transaction_id, revenue: data.revenue || eventData.value, ec_st: data.ec_st || eventData['x-pp-ec_st'], ec_sh: data.ec_sh || eventData['x-pp-ec_sh'], ec_tx: data.ec_tx || eventData['x-pp-ec_tx'], ec_dt: data.ec_dt || eventData['x-pp-ec_dt'], ec_products: JSON.stringify(convertEcommerce(data.ec_products)) || JSON.stringify(eventData['x-pp-ec_products']) || JSON.stringify(convertEcommerce(eventData.items)) }; // Set the common event data params uiParamMap.ua = eventData.user_agent; uiParamMap.lang = eventData.language; uiParamMap.res = eventData.screen_resolution; // Add Custom Dimensions to the map (data.custom_dims || []).forEach(dim => { uiParamMap['dimension' + dim.index] = dim.value; }); // Add cvar to the map uiParamMap.cvar = JSON.stringify( data.cvars_event && data.cvars_event.length ? data.cvars_event.reduce((acc, cur) => { acc[cur.id] = [cur.name, cur.value]; return acc; }, {}) : eventData['x-pp-cvar'] ); // Add _cvar to the map uiParamMap._cvar = JSON.stringify( data.cvars_session && data.cvars_session.length ? data.cvars_session.reduce((acc, cur) => { acc[cur.id] = [cur.name, cur.value]; return acc; }, {}) : eventData['x-pp-_cvar'] ); // Overwrite any keys in the map with those set in Additional Parameters (data.additionalParameters || []).forEach(param => { uiParamMap[param.key] = param.value; }); let requestBody = {}; // Get all Piwik-specific parameters from eventData Object.keys(eventData) .filter(key => key.slice(0,5) === 'x-pp-') .forEach(key => requestBody[key.replace('x-pp-', '')] = eventData[key]); // Overwrite the base request body with values from uiParamMap Object.keys(uiParamMap) .forEach(key => requestBody[key] = uiParamMap[key]); // Add the library name and version requestBody.ts_n = LIBRARY_NAME; requestBody.ts_v = LIBRARY_VERSION; requestBody = cleanObject(requestBody); if (LOGGING_ENABLED) { logToConsole( JSON.stringify({ Name: 'PiwikPro', Type: 'Request', TraceId: TRACE_ID, EventName: requestBody.action_name || 'page_view', RequestMethod: 'POST', RequestUrl: ENDPOINT, RequestHeaders: HEADERS, RequestBody: requestBody }) ); } // Build the query string const postBody = Object.keys(requestBody) .reduce((acc, cur) => { acc += cur + '=' + encodeUriComponent(requestBody[cur]) + '&'; return acc; }, '') .slice(0, -1); sendHttpRequest(ENDPOINT, { headers: HEADERS, method: 'POST', timeout: 1000 }, postBody).then(response => { if (LOGGING_ENABLED) { logToConsole( JSON.stringify({ Name: 'PiwikPro', Type: 'Response', TraceId: TRACE_ID, EventName: requestBody.action_name || 'page_view', ResponseStatusCode: response.statusCode, ResponseHeaders: response.headers, ResponseBody: response.body, }) ); } setResponseStatus(response.statusCode); setResponseHeader('cache-control', response.headers['cache-control']); if (response.statusCode < 400) { data.gtmOnSuccess(); } else { data.gtmOnFailure(); } }); ___SERVER_PERMISSIONS___ [ { "instance": { "key": { "publicId": "logging", "versionId": "1" }, "param": [ { "key": "environments", "value": { "type": 1, "string": "debug" } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "read_event_data", "versionId": "1" }, "param": [ { "key": "eventDataAccess", "value": { "type": 1, "string": "any" } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "send_http", "versionId": "1" }, "param": [ { "key": "allowedUrls", "value": { "type": 1, "string": "specific" } }, { "key": "urls", "value": { "type": 2, "listItem": [ { "type": 1, "string": "https://*.piwik.pro/ppms.php" } ] } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "access_response", "versionId": "1" }, "param": [ { "key": "writeResponseAccess", "value": { "type": 1, "string": "any" } }, { "key": "writeHeaderAccess", "value": { "type": 1, "string": "specific" } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "read_request", "versionId": "1" }, "param": [ { "key": "headerWhitelist", "value": { "type": 2, "listItem": [ { "type": 3, "mapKey": [ { "type": 1, "string": "headerName" } ], "mapValue": [ { "type": 1, "string": "trace-id" } ] } ] } }, { "key": "headersAllowed", "value": { "type": 8, "boolean": true } }, { "key": "requestAccess", "value": { "type": 1, "string": "specific" } }, { "key": "headerAccess", "value": { "type": 1, "string": "specific" } }, { "key": "queryParameterAccess", "value": { "type": 1, "string": "any" } } ] }, "clientAnnotations": { "isEditedByUser": true }, "isRequired": true }, { "instance": { "key": { "publicId": "read_container_data", "versionId": "1" }, "param": [] }, "isRequired": true } ] ___TESTS___ scenarios: [] ___NOTES___ Created on 02/05/2022, 12:44:51