From b4e0faa62e1e93244300cc39db5a5f5026bc3867 Mon Sep 17 00:00:00 2001 From: oliver Date: Sat, 17 Oct 2026 10:40:05 -0300 Subject: [PATCH] UTM --- odoo/upsell.html | 36 ++++++++++++++++++++++++++++++++++++ script.js | 37 ++++++++++++++++++++++++++++++++++--- 2 files changed, 70 insertions(+), 3 deletions(-) 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);