Files
ODOO4projects.com/odoo-black-friday/index.html
T
webmaster 0e832d8fd1 perf(site-wide): render-blocking /style.css on 17 pages; <main> landmark; BF footer form action
Same defect the bootcamp carried (2aa9b19), fixed site-wide in one mechanical pass.

P0 (17 pages): /style.css was deferred via media="print" onload=... -> unstyled
first paint -> a BODY layout shift. Now a normal render-blocking
<link rel="stylesheet">; the now-redundant no-JS <noscript> for style.css is
dropped. Web fonts + Font Awesome keep their legitimate deferral.
Pages: index.html, odoo-black-friday/, odoo-hosting-offers/, de/index.html,
es/index.html, odoo-hosting-2027.html (+de/+es), odoo-community-upgrade.html
(+de/+es), odoo-staging-environment/, odoo-community-ai/,
odoo-n8n-masterclass/, australia.html, workshops/, what-can-i-use-odoo-for/.

P1 (1 page): /odoo-black-friday/ footer form action mailto: -> CRM webhook
(Lighthouse is-on-https). Changed only because the page already loads a handler
for #footerContactForm (static/black-friday.js). The other 13 mailto-form pages
load no handler and are left alone on purpose (no drive-by handler copy-in).
Added the no-JS <noscript> fallback so a JS-off visitor keeps a path.

P2 (35 pages): add a single <main> landmark wrapping the primary content; top
bar and footer stay outside. Additive only, no redesign.

Guards held: bootcamp EN/DE/ES and every JS/static file untouched; Buy forms
product_id 4/17 intact; one [data-bc-seats]; ads-consent gate intact.
verify-html.py PROBLEMS 0; competitor QC 74 pre-existing, 0 added.
2026-11-02 18:18:46 +00:00

1281 lines
62 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Black Friday 2026: $100 Off Your First Year</title>
<meta
name="description"
content="Our Black Friday and Cyber Monday offers: $100 off your first year of hosting, and a Bootcamp place with a second hosted year. 2–30 Nov 2026."
/>
<link rel="canonical" href="https://odoo4projects.com/odoo-black-friday/" />
<meta property="og:title" content="Odoo Black Friday 2026: $100 Off Your First Year" />
<meta
property="og:description"
content="Our Black Friday and Cyber Monday offers: $100 off your first year of hosting, and a Bootcamp place with a second hosted year. 2–30 Nov 2026."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/odoo-black-friday/" />
<meta property="og:image" content="https://odoo4projects.com/images/black-friday/bf2026-hosting-og.png" />
<meta property="og:image:width" content="1200" />
<meta property="og:image:height" content="630" />
<meta
property="og:image:alt"
content="Black Friday 2026 poster: 'Black Friday — 2–30 November', 'Save $100 on Odoo hosting', with the Black Friday code HOST27."
/>
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://odoo4projects.com/images/black-friday/bf2026-hosting-og.png" />
<link rel="icon" href="/images/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link rel="preconnect" href="https://cdnjs.cloudflare.com" crossorigin />
<link
rel="stylesheet"
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap"
media="print"
onload="this.media='all'"
/>
<noscript><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=Marcellus&display=swap" /></noscript>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
media="print"
onload="this.media='all'"
/>
<noscript><link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" /></noscript>
<link rel="stylesheet" href="/style.css" />
<style>
/* ---- Odoo Black Friday 2026 page (page-scoped; additive) ---- */
.bf-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* Language selector in the hero — copied from the homepage's inline critical CSS, because
style.css does not carry the hero variant of the switcher slot. */
.hero .lang-switch-slot {
display: flex;
justify-content: flex-end;
margin-bottom: 1rem;
}
.hero .lang-switch {
color: rgba(255, 255, 255, 0.65);
}
.hero .lang-switch a:hover,
.hero .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.hero .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* The offer boxes (Hosting, then Bootcamp at the foot of the page): one centred column. */
.bf-box .container {
display: grid;
grid-template-columns: minmax(0, 620px);
justify-content: center;
gap: 1.5rem;
align-items: start;
}
.bf-box-inner {
background: var(--ivory);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 2rem 2rem 1.5rem;
}
.bf-box-title {
text-align: center;
margin-bottom: 1.25rem;
}
/* The offer card is always open: the Black Friday price and the code are readable on
arrival, with no reveal and no click. The scroll animation further down is presentation
only — the base state is fully visible, so the offer is complete with JavaScript off,
under reduced motion, or if the animation never runs. */
.bf-teaser {
font-size: 1.02rem;
color: var(--ink);
line-height: 1.6;
margin: 0 0 1rem;
}
.bf-panel {
padding: 0.25rem 0 1.25rem;
border-top: 1px solid var(--line);
}
.bf-price {
font-size: 1.05rem;
color: var(--ink);
margin: 1rem 0 0.75rem;
}
.bf-price strong {
font-family: Marcellus, Georgia, serif;
font-weight: 400;
font-size: 1.55rem;
color: var(--brass-deep);
letter-spacing: 0.02em;
}
.bf-included {
font-size: 0.9rem;
color: var(--ink-soft);
line-height: 1.7;
margin: 0 0 0.9rem;
}
.bf-mechanism {
font-size: 0.98rem;
color: var(--ink);
background: rgba(201, 162, 39, 0.12);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 0.85rem 1.1rem;
margin: 0 0 0.75rem;
}
.bf-mechanism strong {
color: var(--midnight);
}
/* The code lives on the offer surface only. It is readable on arrival; the chip is easy to
select so it can be copied at checkout. */
.bf-code-wrap {
display: flex;
flex-wrap: wrap;
align-items: baseline;
gap: 0.4rem 0.7rem;
}
.bf-code-label {
font-family: Inter, sans-serif;
font-weight: 600;
font-size: 0.72rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--brass-deep);
}
.bf-code {
font-family: Marcellus, Georgia, serif;
font-size: 1.3rem;
letter-spacing: 0.12em;
color: var(--midnight);
background: var(--brass);
border-radius: var(--radius-pill);
padding: 0.2rem 0.9rem;
user-select: all;
}
.bf-code-note {
font-size: 0.9rem;
color: var(--ink-soft);
}
/* Presentation only: the code fades and rises a little as it scrolls into view. Opacity and
transform only — never visibility. The base state is fully opaque, so a build where the
animation never fires still shows the code. Everything here is behind @supports, so an
unsupported browser renders the static, visible code. */
@media (prefers-reduced-motion: no-preference) {
@supports (animation-timeline: view()) {
.bf-code {
animation-name: bf-code-in;
animation-timing-function: linear;
animation-fill-mode: both;
animation-duration: auto;
animation-timeline: view();
animation-range: entry 0% cover 45%;
}
}
}
@keyframes bf-code-in {
from {
opacity: 0.8;
transform: translateY(8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.bf-deadline {
font-size: 0.85rem;
color: var(--ink-soft);
margin: 0 0 1.25rem;
}
/* Time remaining (Fix 10). The day count is written into the span by /static/black-friday.js
from one documented end instant. The span is empty until then, so with JavaScript off the
static sentence "Ends Monday 30 November 2026." still carries the deadline on its own.
No visibility/opacity animation touches this element. */
.bf-days {
font-weight: 600;
color: var(--ink);
}
.bf-days-line {
margin: 0 0 0.75rem;
font-size: 0.85rem;
color: var(--ink-soft);
}
.pcard-buy {
margin: 0;
}
/* Fix 1: the deal card's year-one framing is a sentence, not a "/ year" tag — give it its own
line instead of wrapping mid-phrase beside the number. */
.pcard.featured .price small {
display: block;
}
.bf-cta {
margin: 0;
}
.bf-cta a {
display: inline-block;
font-family: Marcellus, Georgia, serif;
font-size: 0.9rem;
letter-spacing: 0.04em;
color: var(--midnight);
background: var(--brass);
border-radius: var(--radius-pill);
padding: 0.8rem 1.75rem;
text-decoration: none;
transition: background 0.2s;
}
.bf-cta a:hover {
background: var(--brass-bright);
color: var(--midnight);
}
.bf-cta a:focus-visible {
outline: 3px solid var(--midnight);
outline-offset: 2px;
}
/* Hosting CTA: a native form that posts the plan straight to the shop basket, so one click
from this page lands the visitor in checkout with the plan already in the cart. Works with
JavaScript off (it is a plain form POST). */
.bf-cta-form {
margin: 0 0 0.75rem;
}
.bf-cta-form .btn {
display: inline-block;
font-family: Marcellus, Georgia, serif;
font-size: 0.9rem;
letter-spacing: 0.04em;
color: var(--midnight);
background: var(--brass);
border: 0;
border-radius: var(--radius-pill);
padding: 0.8rem 1.75rem;
cursor: pointer;
}
.bf-cta-form .btn:hover {
background: var(--brass-bright);
color: var(--midnight);
}
.bf-cta-form .btn:focus-visible {
outline: 3px solid var(--midnight);
outline-offset: 2px;
}
/* The deal's CTA row (2026-11-02): the brass/large Buy keeps its weight and stays the ONE
dominant action; the Server Location selector sits beside it as a compact, quiet form
control, never a second button. The row wraps on a narrow screen — the selector holds a
~190px basis and the Buy takes the line below — so nothing overflows at 375px. */
.bf-cta-row {
display: flex;
flex-wrap: wrap;
align-items: flex-end;
gap: 0.6rem 0.9rem;
}
.bf-cta-location {
display: flex;
flex-direction: column;
gap: 0.35rem;
flex: 0 1 190px;
min-width: 0;
}
.bf-cta-location label {
font-family: Inter, sans-serif;
font-weight: 600;
font-size: 0.72rem;
letter-spacing: 0.08em;
text-transform: uppercase;
color: var(--brass-deep);
}
/* The homepage's .pricing-server-select is styled for its dark section and lives only in
index.html's inline CSS — style.css carries neither. On this ivory card the selector
needs the light twin, so it is defined page-scoped here. */
.bf-cta-location .pricing-server-select {
width: 100%;
padding: 0.5rem 1rem;
border-radius: var(--radius);
border: 1px solid var(--line-brass);
background: #fff;
color: var(--ink);
font-family: Inter, sans-serif;
font-size: 0.85rem;
cursor: pointer;
}
.bf-cta-location .pricing-server-select:focus-visible {
outline: 3px solid var(--midnight);
outline-offset: 2px;
}
.bf-cta-row .btn {
flex: 1 1 auto;
}
.bf-cta-secondary {
font-size: 0.85rem;
margin: 0;
}
.bf-cta-secondary a {
color: var(--brass-deep);
text-decoration: underline;
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.
Alignment (2026-11-02): the aside column is flush with the container's right content
edge — the same edge the Sydney cell of the server grid above ends on. The left column
takes the whole rest of the row, so the deal box is centred in the space that remains
to the left of the aside rather than sitting in its own fixed 620px lane. The grid gap
is 0 on this row (the deal carries its own breathing room, see below) so the two edges
that must read as centred do: whitespace left of the deal == whitespace between the
deal and the aside. The row gap stays 1.5rem for the stacked (<=900px) layout. */
#offer .container {
grid-template-columns: minmax(0, 1fr) minmax(0, 300px);
column-gap: 0;
}
/* The deal keeps its 620px working width: base .bf-box-inner is a full-width block, so
without this it would stretch to fill the flexible left column and lose the centred
measure. `margin-inline: auto` is what centres it in that column. */
#offer .bf-box-inner {
width: 100%;
max-width: 620px;
margin-inline: auto;
}
/* Two columns only: cap the deal at the column width minus one gap so the deal box and the
aside can never touch when the row is at its narrowest (just above the 900px stack). */
@media (min-width: 901px) {
#offer .bf-box-inner {
max-width: min(620px, calc(100% - 1.5rem));
}
}
.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;
grid-template-columns: 1fr 1fr;
gap: 1rem;
max-width: 1000px;
margin: 0 auto;
}
.cmp-faq {
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
padding: 0.4rem 1.25rem;
box-shadow: var(--shadow-rest);
transition: box-shadow 0.25s;
}
.cmp-faq[open] {
box-shadow: var(--shadow-hover);
}
.cmp-faq:hover {
box-shadow: var(--shadow-hover);
}
.cmp-faq summary {
cursor: pointer;
list-style: none;
padding: 0.85rem 0;
display: flex;
justify-content: space-between;
align-items: center;
gap: 0.75rem;
font-family: Marcellus, Georgia, serif;
font-size: 0.98rem;
color: var(--midnight);
}
.cmp-faq summary::-webkit-details-marker {
display: none;
}
.cmp-faq summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
transition: transform 0.25s;
}
.cmp-faq[open] summary::after {
content: "\2212";
}
.cmp-faq summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.cmp-faq .faq-a,
.cmp-faq .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .faq-a p:last-child,
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
}
/* Related links */
.bf-links {
display: flex;
gap: 1.25rem;
flex-wrap: wrap;
justify-content: center;
max-width: 900px;
margin: 2.5rem auto 0;
}
.bf-links a {
font-size: 0.88rem;
color: var(--brass-deep);
text-decoration: underline;
text-underline-offset: 3px;
}
.bf-links a:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.btn:focus-visible,
.bf-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
/* ---- Google Ads consent banner (page-scoped; additive). Default DENY: the tag does
not load until the visitor accepts. Fallback colour values guard the first paint,
before /style.css (loaded async) defines the tokens. ---- */
.ads-consent {
position: fixed;
left: 0;
right: 0;
bottom: 0;
z-index: 1000;
background: var(--midnight, #0d1b2e);
color: var(--cream, #f4f0e8);
border-top: 2px solid var(--brass, #c9a227);
box-shadow: 0 -8px 30px rgba(13, 27, 46, 0.28);
}
.ads-consent[hidden] {
display: none;
}
.ads-consent-inner {
width: 86%;
max-width: 1200px;
margin: 0 auto;
padding: 1rem 0;
display: flex;
align-items: center;
gap: 1.25rem;
flex-wrap: wrap;
}
.ads-consent-title {
font-family: "Marcellus", Georgia, serif;
font-size: 1rem;
letter-spacing: 0.03em;
color: var(--brass-bright);
margin: 0;
flex: 0 0 auto;
}
.ads-consent-text {
font-size: 0.85rem;
line-height: 1.5;
color: rgba(244, 240, 232, 0.9);
margin: 0;
flex: 1 1 340px;
}
.ads-consent-text a {
color: var(--brass-bright);
text-decoration: underline;
text-underline-offset: 2px;
}
.ads-consent-actions {
display: flex;
gap: 0.6rem;
flex: 0 0 auto;
margin-left: auto;
}
.ads-consent-btn {
font-family: "Marcellus", Georgia, serif;
font-size: 0.9rem;
letter-spacing: 0.04em;
border-radius: var(--radius-pill, 2rem);
padding: 0.55rem 1.4rem;
cursor: pointer;
border: 1px solid var(--brass, #c9a227);
transition: background 0.2s, color 0.2s, border-color 0.2s;
}
.ads-consent-btn--accept {
background: var(--brass, #c9a227);
color: var(--midnight, #0d1b2e);
}
.ads-consent-btn--accept:hover,
.ads-consent-btn--accept:focus-visible {
background: var(--brass-bright);
border-color: var(--brass-bright);
}
.ads-consent-btn--decline {
background: transparent;
color: var(--cream, #f4f0e8);
border-color: rgba(244, 240, 232, 0.45);
}
.ads-consent-btn--decline:hover,
.ads-consent-btn--decline:focus-visible {
border-color: var(--cream, #f4f0e8);
color: #fff;
}
@media (max-width: 640px) {
.ads-consent-inner {
padding: 0.85rem 0;
gap: 0.6rem;
}
.ads-consent-actions {
margin-left: 0;
width: 100%;
}
.ads-consent-btn {
flex: 1 1 auto;
}
}
/* The "change your choice later" link in the footer: brass for AA contrast on midnight
(the generic .fcopy a is rgba(255,255,255,.4) = 3.8:1). */
.fcopy a#adsConsentOpen {
color: var(--brass, #c9a227);
}
.fcopy a#adsConsentOpen:hover {
color: var(--brass-bright);
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Organization",
"@id": "https://odoo4projects.com/#organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"foundingDate": "2020",
"sameAs": ["https://www.linkedin.com/company/odoo4projects/"],
"contactPoint": {
"@type": "ContactPoint",
"contactType": "customer support",
"url": "https://odoo4projects.com/support.html#contact"
}
},
{
"@type": "WebPage",
"@id": "https://odoo4projects.com/odoo-black-friday/",
"url": "https://odoo4projects.com/odoo-black-friday/",
"name": "Odoo Black Friday 2026: $100 Off Your First Year",
"description": "Our Black Friday and Cyber Monday offers: $100 off your first year of hosting, and a Bootcamp place with a second hosted year. 2–30 Nov 2026.",
"isPartOf": { "@id": "https://odoo4projects.com/#organization" },
"about": [
{ "@type": "Thing", "name": "Odoo Black Friday" },
{ "@type": "Thing", "name": "managed Odoo Community hosting" },
{ "@type": "Thing", "name": "Odoo ERP automation Bootcamp" }
]
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://odoo4projects.com/" },
{ "@type": "ListItem", "position": 2, "name": "Odoo Black Friday 2026", "item": "https://odoo4projects.com/odoo-black-friday/" }
]
},
{
"@type": "Product",
"name": "On the Rise — managed Odoo Community hosting",
"description": "Managed Odoo Community hosting on the On the Rise plan: the server, backups and SSL certificate are run for you and your Odoo is kept current within its version, on one yearly price with no per-user licence. Moving to a new major version is a migration and is quoted separately.",
"brand": { "@id": "https://odoo4projects.com/#organization" },
"offers": [
{
"@type": "Offer",
"name": "On the Rise — Black Friday 2026",
"price": "295.00",
"priceCurrency": "USD",
"url": "https://odoo4projects.com/odoo-black-friday/"
}
]
},
{
"@type": "Product",
"name": "Odoo ERP automation Bootcamp",
"description": "A ten-session live Bootcamp that ends with your business running on a working Odoo system: ten live Thursday sessions, 18:00–19:00 Central Time, starting Thursday 21 January 2027, with a year of hosted Odoo Community Edition included.",
"brand": { "@id": "https://odoo4projects.com/#organization" },
"offers": [
{
"@type": "Offer",
"name": "Odoo ERP automation Bootcamp — January 2027 cohort",
"price": "595.00",
"priceCurrency": "USD",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/"
}
]
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "When does the Odoo Black Friday offer run?",
"acceptedAnswer": {
"@type": "Answer",
"text": "From 2 to 30 November 2026. It ends on Cyber Monday, 30 November 2026."
}
},
{
"@type": "Question",
"name": "What does the hosting discount give me?",
"acceptedAnswer": {
"@type": "Answer",
"text": "One hundred dollars off your first year of hosting. It is once per customer, one redemption."
}
},
{
"@type": "Question",
"name": "Is the Bootcamp part of the Black Friday offer?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. The Bootcamp's Black Friday offer is a second year of hosted Odoo Community Edition, on top of the one that is already included. It runs 2–30 November 2026, and the cohort is six seats."
}
},
{
"@type": "Question",
"name": "What does On the Rise cost in the offer?",
"acceptedAnswer": {
"@type": "Answer",
"text": "It is $395.00 a year, and $295.00 for your first year. After the first year it renews at the $395 list price."
}
},
{
"@type": "Question",
"name": "Does the discount apply to renewals?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. It applies to your first year only. After that, hosting renews at its normal price, $395.00 a year on On the Rise."
}
},
{
"@type": "Question",
"name": "What happens if I miss the deadline?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The price goes back to normal on 1 December 2026 and the offer stops working. It returns with next year's offer."
}
}
]
}
]
}
</script>
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
<script defer src="/static/lang.js"></script>
</head>
<body>
<!-- Hero — copied from the homepage (index.html): same component, same behaviour. On load the
fastest server's city photo slides in with a "fits your location" label; the Location
Selector below slides any city into it on click. The headline and copy are adapted to the
Black Friday offer so the page leads with the deal; the stats row is the homepage's. -->
<main>
<section class="hero" id="hero">
<div class="hero-bg"></div>
<div class="container">
<div data-lang-switcher class="lang-switch-slot"></div>
<div class="hero-kicker">Black Friday 2026 · Fully Managed Odoo Community Hosting</div>
<h1>Odoo Hosting: <span>$100 Off</span> Your First Year</h1>
<p class="hero-sub">Black Friday 2026: $100 off your first year of managed Odoo Community hosting — $295 for year one, then $395 a year. Code HOST27, 2–30 November 2026.</p>
<div class="hero-stats">
<span class="hero-stat"><i class="fas fa-check-circle"></i> 6 global locations</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> Deploy in 5 min</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> AI support included</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> Instant backups</span>
</div>
<div class="hero-actions">
<a href="#offer" class="btn btn-brass">See the Black Friday deal &rarr;</a>
<a href="#trialCard" class="btn btn-outline">Start the 30-day free trial</a>
</div>
</div>
</section>
<!-- Location selector — the homepage's server banner. Picking a location slides that city's
photo into the hero above; the fastest server is chosen automatically on load. -->
<section class="server-banner" id="serverBanner">
<div class="container">
<div class="server-banner-header">
<span class="server-banner-kicker">Our Server Locations</span>
</div>
<div class="server-grid">
<div class="server-card"><div class="server-city">Amsterdam</div><div class="server-region">Netherlands</div></div>
<div class="server-card"><div class="server-city">Boston</div><div class="server-region">United States</div></div>
<div class="server-card"><div class="server-city">Manchester</div><div class="server-region">United Kingdom</div></div>
<div class="server-card"><div class="server-city">Mumbai</div><div class="server-region">India</div></div>
<div class="server-card"><div class="server-city">S&atilde;o Paulo</div><div class="server-region">Brazil</div></div>
<div class="server-card"><a class="server-city" href="/australia.html" title="Managed Odoo hosting in Australia — Sydney">Sydney</a><div class="server-region">Australia</div></div>
</div>
</div>
</section>
<!-- The Black Friday offer — Hosting, On the Rise. The card is always open: the price and the
code are readable on arrival, with no reveal and no click. -->
<section class="section-light bf-box" id="offer">
<div class="container">
<!-- The offer box — Hosting, On the Rise -->
<div class="bf-box-inner">
<h2 class="bf-box-title">Hosting: On the Rise</h2>
<div class="bf-panel">
<p class="bf-teaser">Your whole business in one system. The Black Friday price is right here — no code to hunt for.</p>
<p class="bf-price"><strong>$295</strong> for your first year — then <strong>$395</strong> a year after that.</p>
<p class="bf-included">One price a year, no per-user licence, no setup fee. We run the server, the backups and your certificate, and we keep your Odoo current within its version. Moving to a new major version is a migration, and we quote that separately.</p>
<!-- mechanism string, used verbatim — see §3. The code is the offer surface: it stays out
of meta, alt text, structured data and build comments. -->
<p class="bf-mechanism bf-code-wrap"><span class="bf-code-label">Your code</span><span class="bf-code">HOST27</span><span class="bf-code-note">takes $100 off your first year at checkout. One redemption per customer.</span></p>
<!-- Fix 10: the static deadline sentence stands alone with JavaScript off; the day count
is appended by /static/black-friday.js. -->
<p class="bf-deadline">Ends Monday 30 November 2026. <span class="bf-days" data-bf-days></span></p>
<!-- Buy = CLICK PROXY (offer-CTA click), NOT a sale.
See wiki/concepts/conversion-tracking-contract. The form posts the On the Rise
product (id 4) straight to the shop basket, so one click lands the visitor in
checkout with the plan already in the cart. -->
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="bf-cta-form plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":4,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<input type="hidden" name="redirect" value="/coupon/HOST27?r=/shop/checkout" />
<!-- Server Location, MOVED here from the pricing block below (2026-11-02): this is
the ONE element with id pricingServerLocation on the page, so buyNow() — which
reads it by id — and both native buy forms keep working untouched. Its options
are built and its fastest server auto-selected by /static/black-friday.js. It
is a quiet form control (no `name`, so it is not itself submitted), never a
second button; the brass Buy beside it stays the one dominant action. -->
<div class="bf-cta-row">
<div class="bf-cta-location">
<label for="pricingServerLocation">Server Location</label>
<select id="pricingServerLocation" class="pricing-server-select"></select>
</div>
<button type="submit" class="btn btn-brass btn-lg">Buy On the Rise — $295 first year</button>
</div>
</form>
<p class="bf-cta-secondary"><a href="/odoo-hosting-offers/">See everything a year of hosting includes</a></p>
</div>
</div>
<!-- The secondary actions that sit beside the deal: the free trial (moved here from the
features grid, same form, same consent gate) and a booking link. Both are deliberately
smaller and quieter than the deal's buy button, so the row keeps ONE primary action.
The buy stays the dominant, brass, large button in the box on the left. -->
<aside class="bf-aside" aria-label="Other ways to get started">
<!-- Free-trial card: moved verbatim from the features grid. Its id (#trialCard), the
form (#trialForm) and the static/black-friday.js submit handler are unchanged, so it
fires the already-wired Google Ads trial conversion behind the same consent gate —
no second trial mechanism. -->
<div class="feature-card-trial" id="trialCard">
<h3>Free Trial</h3>
<p>Start your 30-day free trial. No credit card required.</p>
<form class="trial-form" id="trialForm">
<input type="email" id="trialEmail" placeholder="Your email address" required />
<select id="trialLocation"></select>
<button type="submit" class="btn btn-brass">Send</button>
</form>
<div class="trial-success" id="trialSuccess">&#10003; Check your inbox to confirm your email address.</div>
</div>
<!-- Booking — a 30-minute call with a named person, NOT "contact us". It opens the
Google appointment page in a NEW TAB (a plain <a>, no iframe: nothing loads until the
visitor chooses to go, so the consent gate on this page is not defeated). Its click
fires the booking conversion through the same consent gate
(window.o4pAds.bookConversion); because the click is never preventDefault-ed, a
blocked tag can never stop the link opening. -->
<div class="bf-booking">
<h3>Prefer to talk first?</h3>
<p>Book a 30-minute call with Oliver, our technical lead, to walk through your setup.</p>
<a
class="bf-booking-link"
id="bookingCTA"
target="_blank"
rel="noopener"
href="https://calendar.google.com/calendar/u/0/appointments/schedules/AcZssZ3DDbaiHFlhNhWySszAQoPXE_H73QLqYT3w7H9IYWC76RA_TgNIhLESjb4N7ep_D2D_OyW9q4-c"
>Book a 30-minute call with Oliver &rarr;</a
>
</div>
</aside>
</div>
</section>
<!-- Trust bar — the homepage's section#trust-bar -->
<section class="trust-bar" id="trust-bar">
<div class="container">
<p class="trust-label">Trusted by businesses worldwide</p>
<div class="partner-carousel-wrap">
<div class="partner-grid">
<!-- Trust Bar Partners (no duplicates - CSS animation handles seamless loop) -->
<a href="https://paraguayservice.com/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/paraguayservice-favicon.png" alt="Paraguay Service" /><span>Paraguay Service</span></a>
<a href="https://estancia-agape.com/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/estancia-agape-logo.png" alt="Estancia Agape" /><span>Estancia Agape</span></a>
<a href="https://kate-group.de/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/kate-group-favicon.png" alt="KATE Group" /><span>KATE Group</span></a>
<a href="https://agilnova.de/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/agilnova-favicon.png" alt="agilnova" /><span>agilnova</span></a>
<a href="https://006-002-bc5bb1cb-984d-42c3-8580-63439f4924c5.odoo4projects.com/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/ramani-kenya-logo.png" alt="Ramani Kenya" /><span>Ramani Kenya</span></a>
<a href="https://startparaguay.net/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/startparaguay-favicon.png" alt="Start Paraguay" /><span>Start Paraguay</span></a>
<a href="https://accelersales.com/" target="_blank" rel="noopener noreferrer" class="partner-item"><img src="/images/accelersales-logo.png" alt="AccellerSales" /><span>AccellerSales</span></a>
<a href="#pricing" class="partner-item" style="opacity:0.55"><img src="/images/your-company-logo.svg" alt="Your Company" /><span>Your Company</span></a>
</div>
</div>
</div>
</section>
<!-- Black Friday questions — the page's own deal FAQ (native details/summary, no JS). The
Bootcamp answer matches what the page now shows: the Bootcamp box is back, at the foot. -->
<section class="section-light" id="faq">
<div class="container">
<h2 class="section-title">Black Friday questions</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">When does the Odoo Black Friday offer run?</summary>
<div class="faq-a"><p>From 2 to 30 November 2026. It ends on Cyber Monday, 30 November 2026.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What does the hosting discount give me?</summary>
<div class="faq-a"><p>One hundred dollars off your first year of hosting. It is once per customer, one redemption.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Is the Bootcamp part of the Black Friday offer?</summary>
<div class="faq-a"><p>Yes. The Bootcamp's Black Friday offer is a second year of hosted Odoo Community Edition, on top of the one that is already included. It runs 2–30 November 2026, and the cohort is six seats.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What does On the Rise cost in the offer?</summary>
<div class="faq-a"><p>It is $395.00 a year, and $295.00 for your first year. After the first year it renews at the $395 list price.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Does the discount apply to renewals?</summary>
<div class="faq-a"><p>No. It applies to your first year only. After that, hosting renews at its normal price, $395.00 a year on On the Rise.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What happens if I miss the deadline?</summary>
<div class="faq-a"><p>The price goes back to normal on 1 December 2026 and the offer stops working. It returns with next year's offer.</p></div>
</details>
</div>
<nav class="bf-links" aria-label="Related pages">
<a href="/odoo-hosting-offers/">Everything a year of hosting includes</a>
<a href="/odoo-hosting-2027.html">Odoo hosting in 2027, compared</a>
<a href="#trialCard">Start the 30-day free trial</a>
</nav>
</div>
</section>
<!-- Features + free-trial card — the homepage's section -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Everything you need, nothing you don't</h2>
<div class="features-grid">
<div class="feature-card">
<i class="fas fa-rocket"></i>
<h3>5-Minute Deployment</h3>
<p>No DevOps team needed. Pick a plan, choose your region, and your Odoo instance is live in minutes.</p>
</div>
<div class="feature-card">
<i class="fas fa-shield-alt"></i>
<h3>Automatic Backups &amp; SSL</h3>
<p>Backups run on a schedule and are kept in rotating slots — one on Side Hustle, four on On the Rise and Powerhouse. Free SSL certificates on every domain — always secure.</p>
</div>
<div class="feature-card">
<i class="fas fa-cubes"></i>
<h3>Management Within Odoo</h3>
<p>The one-stop shop for your entire business. No need for several accounts — manage your applications, users, and modules from one control panel.</p>
</div>
<div class="feature-card">
<i class="fas fa-code-branch"></i>
<h3>Git-Based Module Deployment</h3>
<p>Push custom modules via Git or use one-click Quick Git. No FTP, no hassle.</p>
</div>
<div class="feature-card">
<i class="fas fa-headset"></i>
<h3>Support Bot &amp; Human Support</h3>
<p>AI support bot for instant fixes. Human team for everything else. Your UUID is your key.</p>
</div>
<!-- The Free Trial card was moved up beside the Black Friday deal (see #offer), so the
trial widget and the deal sit together. No second card: the same #trialCard/form. -->
</div>
</div>
</section>
<!-- FAQ — the homepage's section -->
<section class="section-dark" id="faq-general">
<div class="container">
<h2 class="section-title">Frequently asked questions</h2>
<div class="faq-grid">
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>What if I outgrow my plan?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Grow from Side Hustle to Empire without data migration or downtime. Upgrade in your Odoo Settings panel — your instance stays live, your data moves with you.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Can I customize it?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Yes. On the Rise and above support Git-based modules. Install custom apps, build your own, or use Quick GIT for one-click installs.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>How fast can I get started?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Five minutes. Pick a plan, choose your region — your Odoo instance is live. No setup fee. Stripe payment. Cancel anytime.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Can I run Odoo Enterprise?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Powerhouse and Empire are Enterprise-ready. Bring your license; we provide the infrastructure.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>ODOO Community? What can it do?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Inventory, accounting, CRM, sales, manufacturing, HR — all in one system. Free and fully open-source. <a href="/what-can-i-use-odoo-for/">What you can use Odoo for, in plain English</a>.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Do you need an Odoo staging environment?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Most small businesses do not. If you change Odoo's code you do; if you install a finished module, a backup and a careful test is enough. <a href="/odoo-staging-environment/">Do you need an Odoo staging environment?</a></p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Do you have an affiliate program?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>No. We believe it is in our best interest to have competitive prices for our shared clients.</p></div>
</div>
</div>
<a href="/support.html" class="faq-link">Full FAQ &rarr;</a>
</div>
</section>
<!-- Pricing / buy section — the homepage's section -->
<section class="section-dark" id="pricing">
<div class="container">
<p class="section-kicker">Order & Pricing</p>
<h2 class="section-title">Your Plan, Your Timing: Upgrade Anytime</h2>
<div class="pricing-server-row">
<!-- The Server Location selector was moved into the Black Friday deal card (#offer):
there must be exactly ONE element with id pricingServerLocation, and the deal card
is where the buyer commits. The pricing buttons read that same global selection by
id via buyNow(). Only the version selector stays here. -->
<label for="pricingOdooVersion">Odoo Version</label>
<select id="pricingOdooVersion" class="pricing-server-select">
<option value="19.0">19.0 — Tons of OCA supported modules</option>
<option value="20.0" selected>20.0 — Latest Greatest</option>
</select>
</div>
<div class="pricing-grid">
<!-- Side Hustle -->
<div class="pcard">
<div class="pcard-body">
<h3>Side Hustle</h3>
<div class="price">
<strong>$ 214.00</strong>
<small class="price-period">/ year</small>
</div>
<p class="desc">"ODOO Standard .. that is all my business needs"</p>
<!-- Fix 2 (this page only): the list-price buy buttons are removed here. They are
not what paid traffic came for, and a list-price purchase must not sit one
click away beside the deal. The plan stays as a price anchor. -->
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Launch Odoo CE in 5 minutes</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic backups — no remembering</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 1 domain & SSL cert</li>
</ul>
</div>
<div class="pcard-foot">No setup fee. Stripe Payment<br />Cancel at any time</div>
</div>
<!-- On the Rise -->
<div class="pcard featured">
<div class="pcard-body">
<h3>On the Rise</h3>
<!-- Fix 1 (this page only): the card must agree with the offer block above. On this
page the On the Rise card shows the Black Friday price — $295 for the first year,
then the $395 list price. $395 remains correct on every other page. -->
<div class="price">
<strong>$ 295.00</strong>
<small class="price-period">for your first year, then $395 a year</small>
</div>
<p class="desc">"I need some modules and professional reports"</p>
<!-- Fix 2: the On the Rise buy is the Black Friday deal purchase — the same one-click
checkout as the offer block above (product 4, coupon HOST27 auto-applied,
redirect to /shop/checkout). Native POST form, so it works with JavaScript off.
Deliberately NOT marked with the Plausible Buy goal class: the offer-block form
above is the single Buy-marked element on this page, so the click proxy counts
one deal intent, not two. -->
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="pcard-buy">
<input type="hidden" name="basket" value='[{"product_id":4,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<input type="hidden" name="redirect" value="/coupon/HOST27?r=/shop/checkout" />
<button type="submit" class="btn btn-brass">Buy On the Rise — $295 first year</button>
</form>
<!-- Fix 10: time remaining, filled in by /static/black-friday.js from one documented
end instant. Empty with JavaScript off. -->
<p class="bf-days-line"><span class="bf-days" data-bf-days></span></p>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Launch Odoo CE in 5 minutes</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic backups — no remembering</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 domains & SSL certs</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Install custom modules via Git/QuickGIT</li>
</ul>
</div>
<div class="pcard-foot">No setup fee. Stripe Payment<br />Cancel at any time</div>
</div>
<!-- Powerhouse -->
<div class="pcard">
<div class="pcard-body">
<h3>Powerhouse</h3>
<div class="price">
<strong>$ 595.00</strong>
<small class="price-period">/ year</small>
</div>
<p class="desc">"ODOO Enterprise is a must have!"</p>
<!-- Fix 2 (this page only): list-price buy button removed — see the Side Hustle card. -->
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Launch Odoo CE in 5 minutes</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic backups — no remembering</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 domains & SSL certs</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Install custom modules via Git/QuickGIT</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 2 workers for reliability</li>
</ul>
</div>
<div class="pcard-foot">No setup fee. Stripe Payment<br />Cancel at any time</div>
</div>
<!-- Empire -->
<div class="pcard">
<div class="pcard-body">
<h3>Empire</h3>
<div class="price">
<strong>&gt;$ 950.00</strong>
<small class="price-period">/ year</small>
</div>
<p class="desc">"My house! My Horse! My Server!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-empire">Get Custom Quote</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Our service on your server</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> All modules & features</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Unlimited customization</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Priority support & dedicated onboarding</li>
</ul>
</div>
</div>
</div>
<p class="pricing-cta-note">Save money, less administration</p>
<p class="pricing-cta-note"><a href="/odoo-hosting-2027.html"><strong>Compare every way to host Odoo in 2027 &rarr;</strong></a></p>
</div>
</section>
<!-- Custom Quote Modal — the homepage's modal (Empire CTA) -->
<div id="customQuoteModal" class="ow-overlay" onclick="if(event.target===this)closeCustomQuoteModal()">
<div id="customQuotePanel" class="ow-panel" style="display:none">
<button class="ow-close" onclick="closeCustomQuoteModal()">&times;</button>
<div class="ow-content">
<h2 class="ow-title">Get Custom Quote</h2>
<p class="ow-sub">Tell us about your needs and we'll prepare a tailored offer.</p>
<form id="customQuoteForm" class="biz-form" style="text-align:left">
<div class="biz-field">
<label for="cqName">Name</label>
<input type="text" id="cqName" placeholder="Your full name" required />
</div>
<div class="biz-field">
<label for="cqEmail">Email</label>
<input type="email" id="cqEmail" placeholder="your@email.com" required />
</div>
<div class="biz-field">
<label for="cqRequirements">Your Requirements</label>
<textarea id="cqRequirements" placeholder="Describe your requirements (how many users? onsite, cloud? how many workers?)" required></textarea>
</div>
<button type="submit" class="btn btn-brass btn-lg">Submit Request</button>
</form>
<div class="biz-success" id="customQuoteSuccess" style="display:none">
<i class="fas fa-check-circle"></i>
<h3>Request received</h3>
<p>We'll review your requirements and get back to you shortly.</p>
</div>
</div>
</div>
</div>
<!-- The Bootcamp offer — restored from the 2026-11-02 archive (webmaster/out/
2026-11-02-bootcamp-box-removed-archive.md) and moved here, to the foot of the page:
the last content section before the footer. Heading, USD 595.00 price, mechanism line,
deadline and CTA are exactly as archived. -->
<section class="section-light bf-box" id="bootcamp">
<div class="container">
<!-- Box — Bootcamp -->
<div class="bf-box-inner">
<h2 class="bf-box-title">Bootcamp: ten live sessions to a working system</h2>
<div class="bf-panel">
<p class="bf-teaser">A working system for your business in ten live sessions, USD 595 — with a second hosted year added for Black Friday.</p>
<p class="bf-price"><strong>USD 595.00</strong> for the full programme. Black Friday adds <strong>a second year of hosted Odoo Community Edition</strong>, on top of the one already included.</p>
<p class="bf-included">Ten live Thursday sessions, 18:00–19:00 Central Time, starting Thursday 21 January 2027. Six seats, and no more. Your first hosted year is included as standard; the second year is the Black Friday add-on.</p>
<!-- Bootcamp mechanism string — ONE reusable line, isolated exactly as the Hosting box's is
(copy §3b). Whether the discount code applies to the Bootcamp is UNCONFIRMED
(BOOTCAMP-CONFIRM), so the discounted figure stays a build placeholder and is NOT
printed. Swap this one line when it is confirmed. -->
<p class="bf-mechanism">Black Friday: <strong>a second year of hosted Odoo Community Edition</strong>. One redemption per customer.<!-- OPEN-SLOT: bootcamp Black Friday price line --></p>
<p class="bf-deadline">Ends Monday 30 November 2026.</p>
<!-- Buy = CLICK PROXY (offer-CTA click), NOT a sale. The real purchase event is fired on the
checkout host (20.odoo4projects.com) by odoo-dev. See wiki/concepts/conversion-tracking-contract.
Fix 2: the existing Plausible Buy goal class was removed here — this is a
navigation link to the Bootcamp page, not a deal purchase, and the deal purchase
(the Hosting form above) is the single element that may carry the class. -->
<p class="bf-cta"><a href="/odoo-erp-automation-bootcamp/">See the Bootcamp and what you build</a></p>
</div>
</div>
</div>
</section>
<!-- Footer (copied from index.html; icon-font glyphs replaced with inline SVG so the page
carries no external icon dependency) -->
</main>
<footer class="footer">
<div class="container">
<div class="fgrid">
<div>
<h4>Useful Links</h4>
<ul>
<li><a href="/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/odoo-hosting-2027.html">ODOO Hosting in 2027</a></li>
<li><a href="/support.html">Support</a></li>
<li><a href="/legal.html">Legal</a></li>
</ul>
</div>
<div>
<h4>Partners</h4>
<div class="partner-list">
<a href="https://oc-guy.com" target="_blank" rel="noopener" class="partner-item"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#c9a227" stroke-width="2" aria-hidden="true"><path d="M20 7h-9M14 17H5M20 7l-4-4M20 7l-4 4M4 17l4 4M4 17l4-4" /></svg> OC Guy</a>
<a href="https://oca-py.org" target="_blank" rel="noopener" class="partner-item"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#c9a227" stroke-width="2" aria-hidden="true"><path d="M20 7h-9M14 17H5M20 7l-4-4M20 7l-4 4M4 17l4 4M4 17l4-4" /></svg> OCA Paraguay</a>
<a href="https://OD8N.com" target="_blank" rel="noopener" class="partner-item"><svg width="14" height="14" viewBox="0 0 24 24" fill="none" stroke="#c9a227" stroke-width="2" aria-hidden="true"><path d="M20 7h-9M14 17H5M20 7l-4-4M20 7l-4 4M4 17l4 4M4 17l4-4" /></svg> OD8N</a>
</div>
</div>
<div class="fcol-desc">
<h4>About us</h4>
<p>We build smart, scalable business solutions by combining the <strong>stability</strong> of Odoo ERP with the <strong>power</strong> of AI Agents and N8N automations.</p>
<p>From streamlined sales to global rollouts, our <strong>lean, eco-friendly</strong> approach helps businesses cut costs, boost efficiency, and grow without limits.</p>
</div>
<div>
<h4>Follow us on</h4>
<div class="social">
<a href="https://www.linkedin.com/company/odoo4projects/" target="_blank" aria-label="LinkedIn"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M4.98 3.5a2.5 2.5 0 1 1 0 5 2.5 2.5 0 0 1 0-5zM3 9h4v12H3zM9 9h3.8v1.7h.05c.53-.95 1.83-1.95 3.76-1.95 4.02 0 4.76 2.5 4.76 5.75V21h-4v-5.5c0-1.31-.02-3-1.9-3-1.9 0-2.19 1.42-2.19 2.9V21H9z" /></svg></a>
<a href="https://www.youtube.com/@ODOO4projects" target="_blank" aria-label="YouTube"><svg width="18" height="18" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M23 12s0-3.2-.41-4.73a2.5 2.5 0 0 0-1.76-1.77C19.3 5.1 12 5.1 12 5.1s-7.3 0-8.83.4A2.5 2.5 0 0 0 1.4 7.27C1 8.8 1 12 1 12s0 3.2.41 4.73a2.5 2.5 0 0 0 1.76 1.77c1.53.4 8.83.4 8.83.4s7.3 0 8.83-.4a2.5 2.5 0 0 0 1.76-1.77C23 15.2 23 12 23 12zM9.75 15.02V8.98L15.5 12z" /></svg></a>
</div>
<form class="footer-contact-form" id="footerContactForm" action="https://n8n.odoo4projects.com/webhook/ODOO4projects/crm" method="post" enctype="text/plain">
<label class="bf-sr-only" for="footerContactEmail">Your email address</label>
<input type="email" id="footerContactEmail" name="email" placeholder="Your email address" required />
<div class="footer-textarea-wrap">
<label class="bf-sr-only" for="footerContactText">Your message</label>
<textarea id="footerContactText" name="message" placeholder="Your message..." required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Send message"><svg width="14" height="14" viewBox="0 0 24 24" fill="currentColor" aria-hidden="true"><path d="M2 21l21-9L2 3v7l15 2-15 2z" /></svg></button>
</div>
<div class="footer-form-status" id="footerFormStatus" role="status"></div>
</form>
<noscript><p>JavaScript is off. Email us directly at <a href="mailto:support@ODOO4projects.com">support@ODOO4projects.com</a>.</p></noscript>
</div>
</div>
<div class="fcopy">Copyright &copy; ODOO4projects LLC &middot; <a href="#" id="adsConsentOpen">Cookie settings</a></div>
</div>
</footer>
<!-- Google Ads consent banner — default DENY. The tag loads only after "Accept".
Markup lives in the page; JS (static/ads-consent.js) reveals it and drives it.
Three conversions are wired here, all click proxies, all behind this one gate: the buy
forms (data-ads-send-to), the free-trial form (data-ads-trial-send-to) and the booking
link (data-ads-book-send-to). With JavaScript off it stays hidden and every action
(the native buy POSTs, the trial's own submit, the booking <a>) runs untouched.
See wiki/concepts/conversion-tracking-contract. -->
<div
id="adsConsent"
class="ads-consent"
role="region"
aria-label="Advertising cookie consent"
data-ads-id="AW-18065522009"
data-ads-send-to="AW-18065522009/vnDUCPDxt7AdENn6p6ZD"
data-ads-trial-send-to="AW-18065522009/AtAPCIjjvrAdENn6p6ZD"
data-ads-book-send-to="AW-18065522009/P0j5CPiCv7AdENn6p6ZD"
hidden
>
<div class="ads-consent-inner">
<p class="ads-consent-title">Advertising cookies</p>
<p class="ads-consent-text">
We would like to measure our Black Friday ads with Google. That uses optional
advertising cookies. Accept or decline: the page works the same either way, and you
can change your choice later from the &ldquo;Cookie settings&rdquo; link in the footer.
See our <a href="/privacy.html">privacy policy</a>.
</p>
<div class="ads-consent-actions">
<button type="button" id="adsConsentAccept" class="ads-consent-btn ads-consent-btn--accept">
Accept
</button>
<button type="button" id="adsConsentDecline" class="ads-consent-btn ads-consent-btn--decline">
Decline
</button>
</div>
</div>
</div>
<script defer src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script defer src="/static/black-friday.js"></script>
<script defer src="/static/ads-consent.js"></script>
</body>
</html>