Files
ODOO4projects.com/odoo-black-friday/index.html
T
webmaster 9715a3b01f price(bootcamp): EN pages print USD 595.00 to match the shop
The ODOO ERP Automation Bootcamp price is now USD 595.00 (shop product
already set). Every printed EN bootcamp price now reads 595.00 so the page
no longer loses the sale at the cart (page said 465.00, cart charged 595.00).

EN surfaces changed (price strings only — term, dates, six-seat cap and the
one-year hosted Odoo Community wording untouched):
- odoo-erp-automation-bootcamp/index.html: 3 buy buttons, JSON-LD Offer
  price, .bc-price sentence
- odoo-black-friday/index.html: Bootcamp box JSON-LD Offer price, bf-teaser,
  bf-price
- workshops/index.html: both meta descriptions, JSON-LD Offer price,
  .bc-card-price, comparison-table cell
- what-can-i-use-odoo-for/index.html: the line naming the bootcamp
- llms.txt: workshops line

verify-html.py 0 problems, node --check script.js clean; competitor checker
unchanged (74 pre-existing Odoo Online hits, 0 added by this diff).
2026-11-01 14:55:26 +00:00

679 lines
29 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. 16–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. 16–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 — 16–30 November', 'Save $100 on Odoo hosting' with a secret deal on the Bootcamp."
/>
<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="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="/style.css" media="print" onload="this.media='all'" />
<noscript><link rel="stylesheet" href="/style.css" /></noscript>
<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;
}
/* Top bar (page-scoped: the site has no global header) */
.bf-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.bf-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.bf-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.bf-brand span {
color: var(--brass);
}
.bf-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.bf-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.bf-topbar-links a:hover {
color: var(--brass);
}
/* Language selector — slides into the top-bar row, right of the links, behind a hairline brass
divider. CI §1/§2: brass marks the active language; lang.js owns the markup. */
.bf-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.bf-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.bf-topbar .lang-switch a:hover,
.bf-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.bf-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.bf-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.bf-hero .hero-sub {
max-width: 640px;
}
.bf-hero .hero-window {
font-size: 0.95rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.6;
margin: 0 0 0.25rem;
}
.bf-hero .hero-deadline {
font-size: 0.95rem;
color: rgba(255, 255, 255, 0.6);
line-height: 1.6;
margin: 0 0 1.5rem;
}
/* The two product boxes — one grid, two equal cards (Bootcamp, then Hosting). Side by side
from the desktop breakpoint down to 900 px; they stack, in the same order, below it. */
.bf-box .container {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1.5rem;
align-items: start;
}
@media (max-width: 900px) {
.bf-box .container {
grid-template-columns: 1fr;
}
}
.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;
}
/* Reveal mechanic — native <details>/<summary>: the panel is in the DOM in both states,
keyboard-operable, and works with JavaScript disabled. CSS reveals it; JS only mirrors
the open state to aria-expanded. The panel is never display:none by our stylesheet. */
.bf-reveal {
border-top: 1px solid var(--line);
}
.bf-reveal-summary {
cursor: pointer;
list-style: none;
display: block;
padding: 1.25rem 0 1rem;
}
.bf-reveal-summary::-webkit-details-marker {
display: none;
}
.bf-reveal-summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.bf-teaser {
font-size: 1.02rem;
color: var(--ink);
line-height: 1.6;
margin: 0 0 1rem;
}
.bf-open-label {
display: inline-flex;
align-items: center;
gap: 0.5rem;
font-family: Inter, sans-serif;
font-weight: 600;
font-size: 0.82rem;
letter-spacing: 0.04em;
text-transform: uppercase;
color: var(--midnight);
background: var(--brass);
border-radius: var(--radius-pill);
padding: 0.6rem 1.25rem;
}
.bf-open-label::after {
content: "+";
font-size: 1.05rem;
line-height: 1;
}
/* closed state only: the label is the invitation, so it goes once the panel is open.
`[open]` is set by the browser natively — this needs no JavaScript. */
.bf-reveal[open] .bf-open-label {
display: none;
}
.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);
}
.bf-deadline {
font-size: 0.85rem;
color: var(--ink-soft);
margin: 0 0 1.25rem;
}
.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;
}
/* 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-topbar-links a:focus-visible,
.bf-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
</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. 16–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, SSL certificate and version upgrades are run for you on one yearly price, with no per-user licence.",
"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 16 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 16–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>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="bf-topbar">
<div class="container">
<a class="bf-brand" href="/">ODOO4<span>projects</span></a>
<nav class="bf-topbar-links" aria-label="Page links">
<a href="/index.html#pricing">Plans &amp; pricing</a>
<a href="/support.html">Support</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero bf-hero">
<div class="container">
<p class="hero-kicker">16–30 NOVEMBER 2026 · ONCE A YEAR</p>
<h1>Odoo Black Friday 2026</h1>
<p class="hero-sub">Two Black Friday offers: $100 off a year of hosting, and a Bootcamp place with a second hosted year.</p>
<p class="hero-window">The window is 16–30 November 2026.</p>
<p class="hero-deadline">Last day to use it: Monday 30 November 2026.</p>
<div class="hero-actions">
<a href="/index.html#trialCard" class="btn btn-brass btn-lg">Start the 30-day free trial</a>
</div>
</div>
</section>
<!-- The two Black Friday offers — one section, two boxes, Bootcamp first. Each box carries the
same reveal mechanic: a native <details class="bf-reveal"> with a closed teaser <summary>,
then the open panel. -->
<section class="section-light bf-box" id="offer">
<div class="container">
<!-- Box 1 — Bootcamp -->
<div class="bf-box-inner">
<h2 class="bf-box-title">Bootcamp: ten live sessions to a working system</h2>
<details class="bf-reveal">
<summary class="bf-reveal-summary" aria-expanded="false">
<p class="bf-teaser">A working system for your business in ten live sessions, USD 595. Open to see the Black Friday offer.</p>
<span class="bf-open-label">Open the Black Friday offer</span>
</summary>
<div class="bf-panel">
<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>
<p class="bf-cta"><a href="/odoo-erp-automation-bootcamp/">See the Bootcamp and what you build</a></p>
</div>
</details>
</div>
<!-- Box 2 — Hosting, On the Rise -->
<div class="bf-box-inner">
<h2 class="bf-box-title">Hosting: On the Rise</h2>
<details class="bf-reveal">
<summary class="bf-reveal-summary" aria-expanded="false">
<p class="bf-teaser">Your whole business in one system, $395 a year. Open to see the Black Friday price.</p>
<span class="bf-open-label">Open the Black Friday price</span>
</summary>
<div class="bf-panel">
<p class="bf-price"><strong>$395.00</strong> a year — <strong>$295.00</strong> for your first year.</p>
<p class="bf-included">Then it renews at the $395 list price. One yearly price, no per-user licence, no setup fee. We run the server, the backups, your certificate and the version upgrades for you.</p>
<!-- mechanism string, used verbatim — see §3 -->
<p class="bf-mechanism">Black Friday: <strong>$100 off your first year</strong> with code <strong>HOST27</strong>. One redemption per customer.</p>
<p class="bf-deadline">Ends Monday 30 November 2026.</p>
<p class="bf-cta"><a href="/odoo-hosting-offers/">See what a year of hosting includes</a></p>
</div>
</details>
</div>
</div>
</section>
<!-- FAQ -->
<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 16 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 16–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-2027.html">Odoo hosting in 2027, compared</a>
<a href="/blog/posts/community-vs-enterprise-cost.html">What Community costs compared with Enterprise</a>
<a href="/index.html#trialCard">Start the 30-day free trial</a>
</nav>
</div>
</section>
<!-- Footer (copied from index.html; icon-font glyphs replaced with inline SVG so the page
carries no external icon dependency) -->
<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="mailto:hello@odoo4projects.com" 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>
</div>
</div>
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
</div>
</footer>
<script>
/* Enhancement only: mirror each reveal's open state to aria-expanded. Without JS the native
<details> still toggles, keyboard-operable, and exposes its state. */
(function () {
var reveals = document.querySelectorAll(".bf-reveal");
Array.prototype.forEach.call(reveals, function (reveal) {
var summary = reveal.querySelector("summary");
function sync() {
if (summary) summary.setAttribute("aria-expanded", reveal.open ? "true" : "false");
}
sync();
reveal.addEventListener("toggle", sync);
});
})();
</script>
</body>
</html>