Skip to content

Commit 44ef4ea

Browse files
committed
fix utm parsing for manual pageview
1 parent e38d8f6 commit 44ef4ea

File tree

3 files changed

+59
-13
lines changed

3 files changed

+59
-13
lines changed

dist/latest/latest.dev.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-29; 36a5; v12) */
1+
/* Simple Analytics - Privacy-first analytics (docs.simpleanalytics.com/script; 2025-05-30; 8e6f; v12) */
22
/* eslint-env browser */
33

44
(function (
@@ -216,9 +216,11 @@
216216
overwriteOptions.strictUtm ||
217217
attr(scriptElement, "strict-utm") == trueText;
218218

219-
var getQueryParams = function (ignoreSource) {
219+
var getQueryParams = function (ignoreSource, overrideQuery) {
220+
var search =
221+
overrideQuery !== undefinedVar ? "?" + overrideQuery : loc.search;
220222
return (
221-
loc.search
223+
search
222224
.slice(1)
223225
.split("&")
224226
.filter(function (keyValue) {
@@ -511,6 +513,7 @@
511513

512514
var page = {};
513515
var lastSendPath;
516+
var queryOverwrite;
514517

515518
var getReferrer = function () {
516519
// Customers can overwrite their referrer, here we check for that
@@ -619,6 +622,7 @@
619622

620623
var getPath = function (overwrite) {
621624
var path = "";
625+
queryOverwrite = undefinedVar;
622626

623627
// decodeURIComponent can fail when having invalid characters
624628
// https://github.com/simpleanalytics/roadmap/issues/462
@@ -628,6 +632,12 @@
628632
warn(error);
629633
}
630634

635+
if (overwrite && overwrite.indexOf("?") > -1) {
636+
var overwriteParts = overwrite.split("?");
637+
path = overwriteParts[0];
638+
queryOverwrite = overwriteParts.slice(1).join("?").split("#")[0];
639+
}
640+
631641
var pathOverwriterFunction = window[pathOverwriter];
632642
if (isFunction(pathOverwriterFunction)) {
633643
try {
@@ -656,18 +666,19 @@
656666
isPushState,
657667
deleteSourceInfo,
658668
sameSite,
659-
metadata
669+
metadata,
670+
queryOverwrite
660671
) {
661672
if (isPushState) sendOnLeave("" + payload.page_id, trueVar);
662673
if (collectDataOnLeave) payload.page_id = uuid();
663674

664-
var currentPage = definedHostname + getPath();
675+
var currentPage = definedHostname + page.path;
665676

666677
sendData({
667678
id: payload.page_id,
668679
type: pageviewText,
669680
referrer: !deleteSourceInfo || sameSite ? referrer : null,
670-
query: getQueryParams(deleteSourceInfo),
681+
query: getQueryParams(deleteSourceInfo, queryOverwrite),
671682

672683
metadata: stringify(metadata),
673684
});
@@ -759,7 +770,8 @@
759770
isPushState,
760771
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
761772
sameSite,
762-
metadata
773+
metadata,
774+
queryOverwrite
763775
);
764776
};
765777

src/default.js

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -232,9 +232,11 @@
232232
overwriteOptions.strictUtm ||
233233
attr(scriptElement, "strict-utm") == trueText;
234234

235-
var getQueryParams = function (ignoreSource) {
235+
var getQueryParams = function (ignoreSource, overrideQuery) {
236+
var search =
237+
overrideQuery !== undefinedVar ? "?" + overrideQuery : loc.search;
236238
return (
237-
loc.search
239+
search
238240
.slice(1)
239241
.split("&")
240242
.filter(function (keyValue) {
@@ -586,6 +588,7 @@
586588

587589
var page = {};
588590
var lastSendPath;
591+
var queryOverwrite;
589592

590593
var getReferrer = function () {
591594
// Customers can overwrite their referrer, here we check for that
@@ -702,6 +705,7 @@
702705

703706
var getPath = function (overwrite) {
704707
var path = "";
708+
queryOverwrite = undefinedVar;
705709

706710
// decodeURIComponent can fail when having invalid characters
707711
// https://github.com/simpleanalytics/roadmap/issues/462
@@ -711,6 +715,12 @@
711715
warn(error);
712716
}
713717

718+
if (overwrite && overwrite.indexOf("?") > -1) {
719+
var overwriteParts = overwrite.split("?");
720+
path = overwriteParts[0];
721+
queryOverwrite = overwriteParts.slice(1).join("?").split("#")[0];
722+
}
723+
714724
/** if pathoverwriter **/
715725
var pathOverwriterFunction = window[pathOverwriter];
716726
if (isFunction(pathOverwriterFunction)) {
@@ -745,18 +755,19 @@
745755
isPushState,
746756
deleteSourceInfo,
747757
sameSite,
748-
metadata
758+
metadata,
759+
queryOverwrite
749760
) {
750761
if (isPushState) sendOnLeave("" + payload.page_id, trueVar);
751762
if (collectDataOnLeave) payload.page_id = uuid();
752763

753-
var currentPage = definedHostname + getPath();
764+
var currentPage = definedHostname + page.path;
754765

755766
sendData({
756767
id: payload.page_id,
757768
type: pageviewText,
758769
referrer: !deleteSourceInfo || sameSite ? referrer : null,
759-
query: getQueryParams(deleteSourceInfo),
770+
query: getQueryParams(deleteSourceInfo, queryOverwrite),
760771

761772
/** if metadata **/
762773
metadata: stringify(metadata),
@@ -864,7 +875,8 @@
864875
isPushState,
865876
isPushState || userNavigated || !collectMetricByString("r"), // r = referrers
866877
sameSite,
867-
metadata
878+
metadata,
879+
queryOverwrite
868880
);
869881
};
870882

test/unit/manual-utm.test.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const { expect } = require("chai");
2+
const { createDOM } = require("./helpers/dom");
3+
4+
describe("manual pageview utm", function () {
5+
it("parses utm params from manual path", function (done) {
6+
const dom = createDOM({ settings: { autoCollect: false } });
7+
8+
dom.window.sa_pageview("/sa/1/1/1/1?utm_source=test&utm_medium=email");
9+
10+
setTimeout(() => {
11+
const req = dom.sent.find(
12+
(r) => r.type === "image" && /path=%2Fsa%2F1%2F1%2F1%2F1/.test(r.url)
13+
);
14+
expect(req, "pageview request").to.exist;
15+
const url = new URL(req.url);
16+
expect(url.searchParams.get("query")).to.equal(
17+
"utm_source=test&utm_medium=email"
18+
);
19+
done();
20+
}, 10);
21+
});
22+
});

0 commit comments

Comments
 (0)