diff --git a/odoo-black-friday/index.html b/odoo-black-friday/index.html
index b9367f4..c0e63f7 100644
--- a/odoo-black-friday/index.html
+++ b/odoo-black-friday/index.html
@@ -284,6 +284,65 @@
text-underline-offset: 3px;
}
+ /* The offer row: the deal on the left, its two secondary actions (free trial + booking) on
+ the right. The deal keeps its full width and weight and stays the ONE dominant action;
+ the right column is deliberately narrower and quieter so the row never reads as three
+ equal primaries. At 901px and up the row is two columns; below that it stacks, deal
+ first. Scoped to #offer so the Bootcamp box further down is untouched. */
+ #offer .container {
+ grid-template-columns: minmax(0, 620px) minmax(0, 300px);
+ }
+ .bf-aside {
+ display: grid;
+ gap: 1.25rem;
+ align-content: start;
+ }
+ /* Booking: a quiet, secondary action on its own line — an outlined pill, never a second
+ brass button. */
+ .bf-booking {
+ background: var(--ivory);
+ border: 1px solid var(--line-brass);
+ border-radius: var(--radius-lg);
+ padding: 1.25rem;
+ text-align: center;
+ }
+ .bf-booking h3 {
+ font-family: Marcellus, Georgia, serif;
+ font-weight: 400;
+ font-size: 1rem;
+ color: var(--midnight);
+ margin: 0 0 0.35rem;
+ }
+ .bf-booking p {
+ font-size: 0.85rem;
+ color: var(--ink);
+ line-height: 1.5;
+ margin: 0 0 1rem;
+ }
+ .bf-booking-link {
+ display: inline-block;
+ font-family: Marcellus, Georgia, serif;
+ font-size: 0.85rem;
+ letter-spacing: 0.03em;
+ color: var(--brass-deep);
+ background: transparent;
+ border: 1px solid var(--line-brass);
+ border-radius: var(--radius-pill);
+ padding: 0.6rem 1.25rem;
+ text-decoration: none;
+ transition: background 0.2s, color 0.2s;
+ }
+ .bf-booking-link:hover,
+ .bf-booking-link:focus-visible {
+ background: var(--brass);
+ color: var(--midnight);
+ }
+ @media (max-width: 900px) {
+ #offer .container {
+ grid-template-columns: minmax(0, 620px);
+ }
+ }
+
/* FAQ (native details/summary — no JS) */
.cmp-faq-grid {
display: grid;
@@ -691,6 +750,44 @@
See everything a year of hosting includes
+
+
@@ -784,16 +881,8 @@
Support Bot & Human Support
AI support bot for instant fixes. Human team for everything else. Your UUID is your key.
-
-
Free Trial
-
Start your 30-day free trial. No credit card required.
-
-
✓ Check your inbox to confirm your email address.
-
+
@@ -1063,9 +1152,10 @@
diff --git a/static/ads-consent.js b/static/ads-consent.js
index 23d0a71..341320d 100644
--- a/static/ads-consent.js
+++ b/static/ads-consent.js
@@ -170,6 +170,7 @@
id: id,
sendTo: sendTo,
trialSendTo: banner.getAttribute("data-ads-trial-send-to"),
+ bookSendTo: banner.getAttribute("data-ads-book-send-to"),
};
var choice = readChoice();
@@ -210,6 +211,21 @@
fireConversion(cfg.trialSendTo, action);
};
+ /* ---- the booking conversion: fired on a click of the booking link ---- *
+ * The booking happens on Google's domain, off-site, so a click is all we can observe. The
+ * caller does NOT preventDefault: the link opens in a new tab on its own, so even a blocked,
+ * slow or absent tag can never stop the booking page from opening — this only ADDS the event.
+ * Without consent (or the label) it fires nothing and simply runs the (optional) action.
+ */
+ window.o4pAds.bookConversion = function (action) {
+ if (typeof action !== "function") action = function () {};
+ if (!cfg || !cfg.bookSendTo || !isGranted() || typeof window.gtag !== "function") {
+ action();
+ return;
+ }
+ fireConversion(cfg.bookSendTo, action);
+ };
+
if (document.readyState === "loading") {
document.addEventListener("DOMContentLoaded", init);
} else {
diff --git a/static/black-friday.js b/static/black-friday.js
index 50c887d..dceb230 100644
--- a/static/black-friday.js
+++ b/static/black-friday.js
@@ -375,6 +375,20 @@
}
})();
+ /* ---- Booking link — fire the Google Ads booking conversion on the click, through the same
+ consent gate as the buy and trial conversions. The link is a plain
, so
+ the click is never preventDefault-ed: the Google appointment page opens regardless, and a
+ blocked, slow or absent tag merely skips the event. Fires nothing without consent. ---- */
+ (function () {
+ var link = document.getElementById('bookingCTA');
+ if (!link) return;
+ link.addEventListener('click', function () {
+ if (window.o4pAds && typeof window.o4pAds.bookConversion === 'function') {
+ window.o4pAds.bookConversion();
+ }
+ });
+ })();
+
/* ---- Footer contact form ---- */
(function () {
var form = document.getElementById('footerContactForm');