Public Access
A filtered-out directory card stayed visible. The card is targeted by an
id-based ready-state selector (`.js #directory[data-dir-state="ready"]
#dirGrid > .dev-card`, two ids), which outranked the old per-element patch
`.dev-card[hidden] { display:none }` — so `card.hidden = true` set the
attribute and every card stayed on screen while the count line correctly
read "Showing 1 of 4".
Fix: one rule, `[hidden] { display:none !important }`, early in /style.css.
A class- or id-based `display` can no longer beat the attribute, so this
cannot recur with the next class that sets `display`. The per-element
`[hidden]` patches are removed so a single mechanism governs:
- odoo-community-developers: cards + filter row + pager + modal
(load-bearing — each sets `display`); focus-sliders/noscript (redundant)
- index/de/es `.hero-notice[hidden]`, odoo-black-friday `.ads-consent[hidden]`
(redundant — those elements set no `display`)
Re-fingerprint local assets (style.css changed): /style.css?v 3332fbba93 ->
061517baef across 51 pages.
Measured in a real browser (local harness, stubbed webhook; no record created,
no probe write) — computed display + geometry, never the `hidden` property:
- filtered to one card: the other three report display:none and height 0;
the visible set (1) equals the count line ("Showing 1 of 4") — 1 == 1
- HEAD (pre-fix) reproduces the defect: 3 cards hidden=true yet display:flex,
height 599.38 each; 4 visible vs the count's 1
- pager: display:none height 0 with one page; display:flex height 66.83 with
12 cards (Page 1 of 2); page 2 hides page-1 cards (display:none)
- modals closed: display:none height 0; load state: cards 0, pager/empty
display:none, filter row visibility:hidden by design
- 375 px: same result, no horizontal overflow; avatar ask-row top identical
across a row (2053.97 / links 2086.91)
1282 lines
63 KiB
HTML
1282 lines
63 KiB
HTML
<!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?v=061517baef" />
|
||
<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}` used to live here. The banner sets no
|
||
`display` of its own, so the UA rule already hid it — the patch was redundant;
|
||
it is gone so the site-wide `[hidden]` rule in /style.css is the one mechanism. */
|
||
.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?v=3ec49a7e62"></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 →</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ã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">✓ 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 →</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 & 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 & 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 →</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>>$ 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 →</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()">×</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="/odoo-community-developers/">Odoo Freelancer Directory</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 © ODOO4projects LLC · <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 “Cookie settings” 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?v=df1f299dc5"></script>
|
||
<script defer src="/static/ads-consent.js?v=0cc2bfb809"></script>
|
||
</body>
|
||
</html>
|