diff --git a/odoo/upsell.html b/odoo/upsell.html
index e7eb6c4..4ce3b23 100644
--- a/odoo/upsell.html
+++ b/odoo/upsell.html
@@ -342,6 +342,41 @@
powerhouse: 5,
};
+ // ── UTM tracking (source / medium / campaign) ─────────────────────────────
+ const UTM_KEYS = ["source", "medium", "campaign"];
+
+ function getCookie(name) {
+ const match = document.cookie.match(new RegExp("(^| )" + name + "=([^;]+)"));
+ return match ? decodeURIComponent(match[2]) : null;
+ }
+
+ function setCookie(name, value, days) {
+ const date = new Date();
+ date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
+ document.cookie =
+ name + "=" + encodeURIComponent(value) +
+ "; expires=" + date.toUTCString() +
+ "; path=/; SameSite=Lax";
+ }
+
+ UTM_KEYS.forEach(function (key) {
+ const val = params.get("utm_" + key);
+ if (val) setCookie("utm_" + key, val, 90);
+ });
+
+ function appendUTM(form) {
+ UTM_KEYS.forEach(function (key) {
+ const val = getCookie("utm_" + key);
+ if (val) {
+ const input = document.createElement("input");
+ input.type = "hidden";
+ input.name = "utm_" + key;
+ input.value = val;
+ form.appendChild(input);
+ }
+ });
+ }
+
// ── Buy handler ───────────────────────────────────────────────────────────
function buyProduct(productId) {
if (!uuid) {
@@ -369,6 +404,7 @@
clear.name = "clear";
clear.value = "1";
form.appendChild(clear);
+ appendUTM(form);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
diff --git a/script.js b/script.js
index a97c449..049b48a 100644
--- a/script.js
+++ b/script.js
@@ -57,7 +57,33 @@ var si = 0,
return data;
}
- window.UTM = { parse: parseUTM, getStored: getStoredUTM, inject: injectUTM };
+ function appendToForm(form) {
+ var stored = getStoredUTM();
+ var keys = ['source', 'medium', 'campaign'];
+ for (var i = 0; i < keys.length; i++) {
+ if (stored[keys[i]]) {
+ var input = document.createElement('input');
+ input.type = 'hidden';
+ input.name = 'utm_' + keys[i];
+ input.value = stored[keys[i]];
+ form.appendChild(input);
+ }
+ }
+ }
+
+ function toQuery() {
+ var stored = getStoredUTM();
+ var parts = [];
+ var keys = ['source', 'medium', 'campaign'];
+ for (var i = 0; i < keys.length; i++) {
+ if (stored[keys[i]]) {
+ parts.push('utm_' + keys[i] + '=' + encodeURIComponent(stored[keys[i]]));
+ }
+ }
+ return parts.join('&');
+ }
+
+ window.UTM = { parse: parseUTM, getStored: getStoredUTM, inject: injectUTM, appendToForm: appendToForm, toQuery: toQuery };
window.UTM.parse(); // Parse on page load
})();
@@ -196,13 +222,15 @@ var si = 0,
yearlySave.style.display = "block";
var buyBtn = document.getElementById("orderBuyBtn");
var loc = document.getElementById("orderServerLocation").value;
+ var utmQuery = UTM.toQuery();
buyBtn.href =
"/3/" +
price.toFixed(2) +
"/4/" +
encodeURIComponent(plan) +
"?location=" +
- encodeURIComponent(loc);
+ encodeURIComponent(loc) +
+ (utmQuery ? "&" + utmQuery : "");
widget.style.display = "flex";
orderPopupShown = true;
}
@@ -233,13 +261,15 @@ var si = 0,
.trim();
var price = parseFloat(priceText);
var loc = this.value;
+ var utmQuery = UTM.toQuery();
document.getElementById("orderBuyBtn").href =
"/3/" +
price.toFixed(2) +
"/4/" +
encodeURIComponent(plan) +
"?location=" +
- encodeURIComponent(loc);
+ encodeURIComponent(loc) +
+ (utmQuery ? "&" + utmQuery : "");
});
function applyCoupon() {
var input = document.getElementById("orderCouponInput");
@@ -719,6 +749,7 @@ var si = 0,
clear.name = 'clear';
clear.value = '1';
form.appendChild(clear);
+ UTM.appendToForm(form);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);