diff --git a/.github/workflows/typecheck.yml b/.github/workflows/typecheck.yml
index f20939f9df0a..88d4d24a5723 100644
--- a/.github/workflows/typecheck.yml
+++ b/.github/workflows/typecheck.yml
@@ -30,7 +30,7 @@ jobs:
# - git diff is used to see the files that were added on this branch
# - gh pr view is used to list files touched by this PR. Git diff may give false positives if the branch isn't up-to-date with main
# - wc counts the words in the result of the intersection
- count_new_js=$(comm -1 -2 <(git diff --name-only --diff-filter=A origin/main HEAD -- 'src/*.js' '__mocks__/*.js' '.storybook/*.js' 'assets/*.js' 'config/*.js' 'desktop/*.js' 'jest/*.js' 'scripts/*.js' 'tests/*.js' 'web/*.js' 'workflow_tests/*.js' '.github/libs/*.js' '.github/scripts/*.js') <(gh pr view ${{ github.event.pull_request.number }} --json files | jq -r '.files | map(.path) | .[]') | wc -l)
+ count_new_js=$(comm -1 -2 <(git diff --name-only --diff-filter=A origin/main HEAD -- 'src/*.js' '__mocks__/*.js' '.storybook/*.js' 'assets/*.js' 'config/*.js' 'desktop/*.js' 'jest/*.js' 'scripts/*.js' 'tests/*.js' 'workflow_tests/*.js' '.github/libs/*.js' '.github/scripts/*.js') <(gh pr view ${{ github.event.pull_request.number }} --json files | jq -r '.files | map(.path) | .[]') | wc -l)
if [ "$count_new_js" -gt "0" ]; then
echo "ERROR: Found new JavaScript files in the project; use TypeScript instead."
exit 1
diff --git a/config/webpack/webpack.common.ts b/config/webpack/webpack.common.ts
index 7cafafca9973..9d397b9557a3 100644
--- a/config/webpack/webpack.common.ts
+++ b/config/webpack/webpack.common.ts
@@ -98,7 +98,7 @@ const getCommonConfiguration = ({file = '.env', platform = 'web'}: Environment):
{from: 'web/apple-touch-icon.png'},
{from: 'assets/images/expensify-app-icon.svg'},
{from: 'web/manifest.json'},
- {from: 'web/gtm.js'},
+ {from: 'web/thirdPartyScripts.js'},
{from: 'assets/css', to: 'css'},
{from: 'assets/fonts/web', to: 'fonts'},
{from: 'assets/sounds', to: 'sounds'},
diff --git a/web/gtm.js b/web/gtm.js
deleted file mode 100644
index ee96d01b9a67..000000000000
--- a/web/gtm.js
+++ /dev/null
@@ -1,11 +0,0 @@
-/* eslint-disable no-param-reassign, prefer-template */
-(function (w, d, s, l, i) {
- w[l] = w[l] || [];
- w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
- const f = d.getElementsByTagName(s)[0];
- const j = d.createElement(s);
- const dl = l !== 'dataLayer' ? '&l=' + l : '';
- j.async = true;
- j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
- f.parentNode.insertBefore(j, f);
-})(window, document, 'script', 'dataLayer', 'GTM-N4M3FLJZ');
diff --git a/web/index.html b/web/index.html
index 115803573bbd..be6396190d25 100644
--- a/web/index.html
+++ b/web/index.html
@@ -122,9 +122,9 @@
<% if (htmlWebpackPlugin.options.isProduction) { %>
-
-
-
+
+
+
<% } %>
<% } %>
diff --git a/web/thirdPartyScripts.js b/web/thirdPartyScripts.js
new file mode 100644
index 000000000000..15e77dbd490e
--- /dev/null
+++ b/web/thirdPartyScripts.js
@@ -0,0 +1,155 @@
+/* eslint-disable */
+// Google Tag Manager
+(function (w, d, s, l, i) {
+ w[l] = w[l] || [];
+ w[l].push({'gtm.start': new Date().getTime(), event: 'gtm.js'});
+ const f = d.getElementsByTagName(s)[0];
+ const j = d.createElement(s);
+ const dl = l !== 'dataLayer' ? '&l=' + l : '';
+ j.async = true;
+ j.src = 'https://www.googletagmanager.com/gtm.js?id=' + i + dl;
+ f.parentNode.insertBefore(j, f);
+})(window, document, 'script', 'dataLayer', 'GTM-N4M3FLJZ');
+
+// FullStory
+window['_fs_host'] = 'fullstory.com';
+window['_fs_script'] = 'edge.fullstory.com/s/fs.js';
+window['_fs_org'] = 'o-1WN56P-na1';
+window['_fs_namespace'] = 'FS';
+!(function (m, n, e, t, l, o, g, y) {
+ var s,
+ f,
+ a = (function (h) {
+ return !(h in m) || (m.console && m.console.log && m.console.log('FullStory namespace conflict. Please set window["_fs_namespace"].'), !1);
+ })(e);
+ function p(b) {
+ var h,
+ d = [];
+ function j() {
+ h &&
+ (d.forEach(function (b) {
+ var d;
+ try {
+ d = b[h[0]] && b[h[0]](h[1]);
+ } catch (h) {
+ return void (b[3] && b[3](h));
+ }
+ d && d.then ? d.then(b[2], b[3]) : b[2] && b[2](d);
+ }),
+ (d.length = 0));
+ }
+ function r(b) {
+ return function (d) {
+ h || ((h = [b, d]), j());
+ };
+ }
+ return (
+ b(r(0), r(1)),
+ {
+ then: function (b, h) {
+ return p(function (r, i) {
+ d.push([b, h, r, i]), j();
+ });
+ },
+ }
+ );
+ }
+ a &&
+ ((g = m[e] =
+ (function () {
+ var b = function (b, d, j, r) {
+ function i(i, c) {
+ h(b, d, j, i, c, r);
+ }
+ r = r || 2;
+ var c,
+ u = /Async$/;
+ return u.test(b) ? ((b = b.replace(u, '')), 'function' == typeof Promise ? new Promise(i) : p(i)) : h(b, d, j, c, c, r);
+ };
+ function h(h, d, j, r, i, c) {
+ return b._api ? b._api(h, d, j, r, i, c) : (b.q && b.q.push([h, d, j, r, i, c]), null);
+ }
+ return (b.q = []), b;
+ })()),
+ (y = function (b) {
+ function h(h) {
+ 'function' == typeof h[4] && h[4](new Error(b));
+ }
+ var d = g.q;
+ if (d) {
+ for (var j = 0; j < d.length; j++) h(d[j]);
+ (d.length = 0), (d.push = h);
+ }
+ }),
+ (function () {
+ ((o = n.createElement(t)).async = !0),
+ (o.crossOrigin = 'anonymous'),
+ (o.src = 'https://' + l),
+ (o.onerror = function () {
+ y('Error loading ' + l);
+ });
+ var b = n.getElementsByTagName(t)[0];
+ b && b.parentNode ? b.parentNode.insertBefore(o, b) : n.head.appendChild(o);
+ })(),
+ (function () {
+ function b() {}
+ function h(b, h, d) {
+ g(b, h, d, 1);
+ }
+ function d(b, d, j) {
+ h('setProperties', {type: b, properties: d}, j);
+ }
+ function j(b, h) {
+ d('user', b, h);
+ }
+ function r(b, h, d) {
+ j(
+ {
+ uid: b,
+ },
+ d,
+ ),
+ h && j(h, d);
+ }
+ (g.identify = r),
+ (g.setUserVars = j),
+ (g.identifyAccount = b),
+ (g.clearUserCookie = b),
+ (g.setVars = d),
+ (g.event = function (b, d, j) {
+ h(
+ 'trackEvent',
+ {
+ name: b,
+ properties: d,
+ },
+ j,
+ );
+ }),
+ (g.anonymize = function () {
+ r(!1);
+ }),
+ (g.shutdown = function () {
+ h('shutdown');
+ }),
+ (g.restart = function () {
+ h('restart');
+ }),
+ (g.log = function (b, d) {
+ h('log', {level: b, msg: d});
+ }),
+ (g.consent = function (b) {
+ h('setIdentity', {consent: !arguments.length || b});
+ });
+ })(),
+ (s = 'fetch'),
+ (f = 'XMLHttpRequest'),
+ (g._w = {}),
+ (g._w[f] = m[f]),
+ (g._w[s] = m[s]),
+ m[s] &&
+ (m[s] = function () {
+ return g._w[s].apply(this, arguments);
+ }),
+ (g._v = '2.0.0'));
+})(window, document, window._fs_namespace, 'script', window._fs_script);