102 Commits
Author SHA1 Message Date
webmaster ada11e42cf chore(odooityourself): remove the page at the user's request
Deleted odooityourself.html ('delete the site we did for odooityourself').
The URL was already out of sitemap.xml and llms.txt, so no dead URL
stays advertised. The file is removed from the working tree; git history
retains it in full (recoverable from any earlier commit). The two SVGs
it used (images/andrew/ai-agent-on-server.svg and
ai-agent-on-server-mobile.svg) are kept — candidate art for
/odoo-community-ai/ — not part of this removal.
2026-11-01 14:24:41 +00:00
webmaster f457858a0f fix(bf): strip the last off-panel mentions of the discount code
The code may not be named where a visitor or crawler can read it before
opening a reveal panel. Three off-panel leaks removed:

- /odoo-black-friday/ FAQ (visible answer + its FAQPage JSON-LD twin,
  byte-identical): 'the code stops working' -> 'the offer stops working'.
- /odoo-hosting-offers/ og:image:alt: the trailing ', and the code
  HOST27' dropped; the offer and the 16-30 November window stay.
- /odoo-hosting-offers/ date-scoped Black Friday block: the line no
  longer names the code; it states the offer and links to
  /odoo-black-friday/ (the only page with a reveal panel), marked with a
  dated comment for removal after 30 November 2026.

HOST27 now survives only inside the .bf-panel on /odoo-black-friday/;
/odoo-hosting-offers/ carries zero.
2026-11-01 14:24:39 +00:00
webmaster 937e79b59d feat(odoo-community-ai): publish /odoo-community-ai/ as a draft
New page "Run Odoo Community with your own AI agent", built from the copywriter's
build-ready copy (copywriter/out/2026-11-01-odoo-community-ai-copy.md) on the newest
page pattern (what-can-i-use-odoo-for/ , odoo-staging-environment/): page-scoped top
bar + language switcher, hero, alternating bands, shared footer, page-scoped CSS only.

Draft contract (all five): <meta name="robots" content="noindex, nofollow">; not added
to sitemap.xml; not added to llms.txt; no inbound link from any page (footer untouched);
self-canonical kept, no og:image. No file outside odoo-community-ai/ is touched.

Copy carried verbatim: title (53), meta (148), one H1, the seven H2s, the FAQ pairs
byte-identical between the visible FAQ and the FAQPage JSON-LD, the two MCP settings
shown apart (a table), the "for your developer" <details> after the offer, and the
fence sentence "does not move data". The copy's DRAFT(R1) marker and its [OPEN-SLOT:…]
marks ship as HTML comments, never as visible text.
2026-11-01 13:17:27 +00:00
webmaster 137bd1a2ae feat(staging): inbound links so /odoo-staging-environment/ is not an orphan
The copy's 'Into this page' table, applied as single additive sentences:
- support.html: the 'error 500 after a git check in' FAQ answer links
  'test it safely first'.
- blog/posts/speed-run-backup.html: end of the post links
  'what a staging environment is, and why you probably do not need one'.
- odoo-hosting-2027.html: one contextual note by the backup/module rows
  links 'do you need a staging environment?'.
- index.html: one FAQ card 'Do you need an Odoo staging environment?'.
No footer change. No new impeccable finding category.
2026-11-01 09:32:52 +00:00
webmaster 3dad3c61db feat(staging): publish /odoo-staging-environment/ guide page
New standalone page answering 'odoo staging environment': what staging is,
how odoo.sh's staging branches work (sourced to odoo.sh's own docs and
pricing page), why most small businesses do not need one, and the
back-up-install-test route we offer instead.

- Built on the newest page pattern (top bar, band rhythm, hero, FAQ,
  language switcher, footer), page-scoped CSS only; no new framework.
- ICP review R1-R7 applied: backup plan-gate and slot limit stated,
  the 'ask us' claim resolved against the Side Hustle limit, the restore
  stated as a rollback of live work, the restore routed through support,
  the meta de-claims 'one-click ... safely', 'module' defined at first
  use, and a scope/price boundary added to the escalation.
- Title 51 chars, meta 148; one H1; six FAQ pairs byte-identical to the
  FAQPage JSON-LD; @graph WebPage+Article+FAQPage+BreadcrumbList parses.
- CTA -> support.html#contact (existing route). og:image reuses the
  established hero share image.
- sitemap.xml + one llms.txt line; blog/index.json untouched.
2026-11-01 09:31:31 +00:00
webmaster a7a428c66e Stop submitting /odooityourself.html to search
Remove the odooityourself.html <url> block from sitemap.xml (42 -> 41 <loc>)
and its line from llms.txt. The page stays published and crawlable: no
noindex, no canonical change, no internal links. It is a deliberate orphan
for a single affiliate, not a search target.
2026-10-30 14:31:58 +00:00
webmaster 5c3b66c90b fix(bf): keep the code out of the served source — strip HOST27 from the two build comments
The Bootcamp note comment and its inline [OPEN-SLOT: …] marker named the code
HOST27 in the served HTML, so view-source leaked it before anyone opened the
reveal. Both mark the same still-open decision (BOOTCAMP-CONFIRM / bootcamp BF
price line), so the markers are kept and rewritten without the code string.
The reveal content that names the code on open is untouched.
2026-10-30 14:29:34 +00:00
webmaster 91e4162230 fix(bf): keep HOST27 behind the reveal — drop 'What the code does' section and every off-panel mention
- delete the whole 'What the code does' <section> (heading, both .bf-lead paragraphs, markup)
- remove HOST27 from meta/og/twitter descriptions, og:image:alt and the WebPage JSON-LD description
- rewrite the two FAQ strings (question + 'On the Rise cost' answer) and their JSON-LD twins so no code is named
- drop the now-dead .bf-lead CSS block and its dangling comment
- reveal mechanic untouched: the code stays inside each native <details> .bf-panel
2026-10-30 14:27:37 +00:00
webmaster 6c488a443f feat(seo): set the Black Friday share image on the two BF pages
/odoo-black-friday/ gains og:image + og:image:width/height/alt + twitter:image
pointing at the 1200x630 OG card; /odoo-hosting-offers/ reuses the same card.
Both pages declared no og:image before.
2026-10-30 13:33:24 +00:00
webmaster 740e5650a9 chore(images): replace Black Friday 2026 social stills with the cream/midnight rebuild
Same base filenames (bf2026-hosting-og, bf2026-hosting-linkedin,
bf2026-bootcamp-lastcall-linkedin), so the pipeline records' image URLs stay
valid. PNGs byte-identical to thumbnail-designer's rendered files:
og 161923B, linkedin 99673B, bootcamp 169572B. WebP siblings regenerated.
2026-10-30 13:33:23 +00:00
webmaster 185e7ab419 feat(black-friday): add the Bootcamp box beside the Hosting box
The page carried only the Hosting offer; it now carries both Black Friday
offers. Bootcamp box first, then Hosting, in the same <section class="bf-box">,
each in its own .bf-box-inner card, each with the same native
<details class="bf-reveal"> reveal (closed teaser, panel in the DOM in both
states, keyboard-operable, no display:none, JS-off safe, aria-expanded synced
for both). Copy is the copywriter's v3 verbatim: USD 465.00, ten live Thursday
sessions 18:00-19:00 Central Time from Thursday 21 January 2027, the Black
Friday second hosted year, six seats, deadline 30 November 2026. No discounted
Bootcamp figure is printed (HOST27 applicability unconfirmed): the value slot
stays a build placeholder in the one greppable bf-mechanism line. Hero value
statement, meta/og description, WebPage description, FAQ (6 pairs) and the
@graph (second Product+Offer, 465.00 USD) follow the same copy file.
2026-10-30 13:28:24 +00:00
webmaster 2a62ac871a fix(bf-pages): restore ODOO Bootcamp footer link; add HOST27 to the BF block
Both pages shipped (355c5d0) with a three-item footer; the site footer is a
four-item commitment. The /odoo-erp-automation-bootcamp/ entry is restored on
both pages, matching index.html / odoo-hosting-2027.html.

/odoo-hosting-offers/: the code HOST27 is added inside the date-scoped Black
Friday block only (BF-BLOCK-START..END), so it disappears with the block after
30 Nov. Title, meta description and H1 are untouched — the intent split holds.

verify-html.py: PROBLEMS 0. node --check script.js: OK.
2026-10-30 13:22:48 +00:00
webmaster 14029c1074 chore(images): host Black Friday 2026 social stills (PNG + WebP)
Three stills from the thumbnail-designer render pipeline, copied byte-identical
(md5 verified against the handoff) into images/black-friday/ so the two BF
pipeline records can reference stable public URLs. WebP siblings added to match
how the site serves images. Not referenced from any page yet — hosting only.

  bf2026-hosting-og.png                 1200x630
  bf2026-hosting-linkedin.png           1200x627
  bf2026-bootcamp-lastcall-linkedin.png 1200x627
2026-10-30 13:22:46 +00:00
webmaster 355c5d022e feat(hosting): add /odoo-black-friday/ and /odoo-hosting-offers/ pages
Page A /odoo-black-friday/ owns "odoo black friday": hero, one On the Rise
box with a CSS-only reveal (native <details>) of the HOST27 offer, "what the
code does", FAQ. Page B /odoo-hosting-offers/ is the evergreen hub owning
"odoo hosting offers/deals/discount", with a date-scoped Black Friday block
(BF-BLOCK-START/END) linking to Page A. Both carry the copy's title/meta/H1,
@graph JSON-LD (Organization, WebPage, BreadcrumbList, Product+Offer, FAQPage).
sitemap.xml and llms.txt updated. Copy source: copywriter 2026-10-30.
2026-10-30 13:18:16 +00:00
oliver 48266e8e77 i18n(bootcamp): add the 6-seat cohort cap to the DE/ES pages
Mirror the EN cap from 2940d33 in native register, cap only — the Black
Friday call-out (window, second hosted year, BF2026) is not added; it was
dropped from EN in fd3f1dc and stays out of every language.

- de|es/odoo-erp-automation-bootcamp/index.html: Class-size fact row
  (Begrenzt auf 6 Teilnehmer / Limitado a 6 participantes), the .bc-price
  cap line, and JSON-LD CourseInstance maximumAttendeeCapacity: 6.
- No workshops DE/ES copies exist, so no card / comparison row applies.
- why-odoo4projects.html left untracked.
2026-10-30 13:08:58 +00:00
oliver fd3f1dc53e revert(bootcamp): drop the Black Friday call-out, keep the 6-seat cap
The bootcamp has no Black Friday offer. Remove the .bc-cards call-out block
(16-30 Nov 2026 dates, second hosted year, BF2026 code, six-seats line) and
the OPEN-SLOT(olchi) landing-page comment. No BF string existed in llms.txt
or workshops/index.html. The 6-seat capacity stays: Class size fact row, the
bc-price cap line, CourseInstance maximumAttendeeCapacity: 6, the workshops
card cap + comparison row, and the llms.txt six-participants sentence.
2026-10-30 13:06:36 +00:00
oliver 2940d33273 feat(bootcamp): state the 6-seat cohort cap and add the Black Friday call-out (EN)
- bootcamp page: Class size fact row (Limited to 6 participants), a cap line by
  the price, JSON-LD CourseInstance maximumAttendeeCapacity: 6, and a compact
  Black Friday call-out (16-30 Nov 2026, second hosted year + $100 off BF2026,
  six seats) with the landing-page slot left open for olchi
- workshops page: the cap on the bootcamp card and a Class size comparison row
- llms.txt: durable 'limited to six participants per cohort' on the bootcamp line
  (evergreen - no dated Black Friday offer in llms.txt)
2026-10-30 13:02:49 +00:00
oliver 46e874b1e7 feat(i18n): move DE/ES bootcamp pages to Q1 2027 (21 Jan – 25 Mar 2027)
Mirror the EN term change (01c5dd3) into the published German and Spanish
bootcamp pages: hero kicker, hero first-session stat, the four schedule
facts, the DST note and both JSON-LD dates. Text/date splice only — the
verifier reports the tag sequence, attribute list, <style>/<script> bytes
and JSON-LD shape identical before and after, english_leftovers: none.
2026-10-30 12:45:28 +00:00
oliver 01c5dd35e3 feat(bootcamp): move EN term to Q1 2027 (21 Jan – 25 Mar 2027)
Splice the bootcamp term on the EN page to the Q1 2027 January term:
hero kicker, hero stat, schedule <dd>s (Term/First/Last/Dates), DST note
(8 March -> 14 March), and JSON-LD CourseInstance startDate/endDate
(2026-01-22/2026-03-26 -> 2027-01-21/2027-03-25). llms.txt: 'Q1 2026,
starting 8 January 2026' -> 'Q1 2027, starting 21 January 2027' (retires
the 8-Jan vs 22-Jan conflict). sitemap.xml: bump lastmod on the three
bootcamp <loc> entries to 2026-10-30. No structural/CSS change.
2026-10-30 12:28:17 +00:00
oliver e37acde30c feat(seo): wire internal links between the 17 blog posts and the pages that sell
The blog was an island: zero post→page links to hosting/upgrade/support/courses,
and only one page→post link in the whole site. Posts ranked for nothing while the
old blog host ranked for our long-tail queries.

Posts → pages (26 new in-body contextual links across 17 posts):
each post now carries one or two links to the page that answers its reader's next
question — odoo-hosting-2027, odoo-community-upgrade, support, the workshops hub,
the n8n masterclass, and the plan pricing on index.html#pricing.

Pages → posts (7 pages, one contextual link each):
index.html (OCA section), odoo-hosting-2027, odoo-community-upgrade, support,
workshops/, odoo-n8n-masterclass/, odoo-erp-automation-bootcamp/ now link into the
post that fits their own subject. The clearest miss is fixed — the
community-vs-enterprise-cost post and the odoo-community-upgrade page now link
to each other.

Anchors wrap existing sentences where the text already said the thing; four short
linking sentences were added (index OCA section, support first-steps FAQ, masterclass
lessons, bootcamp included section). No new components, no related-posts widget,
in-body anchors only. English pages only; DE/ES untouched (translator follow-up).
2026-10-29 15:15:00 +00:00
oliver bfa7f595cc feat(blog): publish OCA Paraguay Internationalization Hackathon post
New post blog/posts/oca-paraguay-internationalization-hackathon.html (News,
2026-10-29), body verbatim from the supplied source (sha256 cca84c45...),
chrome copied from how-to-install-odoo-modules-using-git.html with the inline
style trimmed to the figureless variant. Adds the newest-first entry to
blog/index.json (16 -> 17), one 0.6 <url> to sitemap.xml (39 -> 40) and the
top line of the llms.txt blog list (16 -> 17).
2026-10-29 09:03:21 +00:00
webmaster c6adb31afc feat(seo): add /what-can-i-use-odoo-for/ guide page, linked from the homepage and support FAQ
Modelled on odoo-community-upgrade.html (top bar, band rhythm, FAQ details).
Copy published verbatim from the copywriter's 2026-10-28 file: 58-char title,
157-char meta, the six outbound internal links and the WebPage+Article+FAQPage+
BreadcrumbList @graph. Nine FAQ questions marked plausible-event-name=FAQ (no
event fires on page load). Sitemap + llms.txt list the new URL. Inbound links:
one from the homepage FAQ card, one from the support FAQ answer. Nothing else
moves; no footer change.
2026-10-28 23:10:12 +00:00
oliver 5f647c055a fix(analytics): put the Buy class on the <form> so the goal actually fires
Plausible's click handler walks up from the clicked element and bails out the
moment it meets a <form>, so a plausible-event-name=Buy class on a
<button type="submit"> inside a plain form never fires Buy — the tracker sends
its automatic "Form: Submission" event instead and the goal records nothing.
Measured live on /odoo-erp-automation-bootcamp/ before this change:
{"n":"Form: Submission"}.

- odoo-erp-automation-bootcamp/index.html (3 CTAs): class moved from the
  <button type="submit"> to the enclosing <form>.
- australia.html (2 CTAs): same move.
- de|es/odoo-erp-automation-bootcamp/index.html (3 forms each): the buy forms
  carried no Buy marking at all, so the DE and ES bootcamp sales were invisible
  to the goal. Class added to the <form>.
- odoo/upsell.html: the three .plan-btn buttons drive the same JS buy path and
  were unmarked. A class on a plain <button> (not a form submit) does fire, so
  it was added there and browser-verified. The disabled Trial button is left
  unmarked.

Class attribute only: every button label, every form action and every basket
payload is byte-identical. No CSS or JS rule references the class.

Verified in a real browser (fetch shimmed, tracker's localhost/automation gates
bypassed): EN bootcamp 3/3, australia 2/2, DE 3/3, ES 3/3, upsell 1/1 clicks
each send exactly one {"n":"Buy"} to /api/event and never "Form: Submission".
2026-10-28 22:37:32 +00:00
oliver 91ce3d9a4f fix(analytics): put the Buy class on the masterclass basket forms too
Browser measurement on the live page: with plausible-event-name=Buy only on the
<button type="submit">, clicking it sends Plausible's automatic "Form: Submission"
event and no "Buy". With the class on the enclosing <form> the click sends exactly
one {"n":"Buy"}. The button keeps its class as specified; the form now carries it as
well, so the Buy goal fires once per click.

Same behaviour measured on the live bootcamp page (its three CTAs also emit only
"Form: Submission") - left untouched, reported as a site-wide follow-up.
2026-10-28 22:29:13 +00:00
oliver 622d9f0310 feat(seo): restore /odoo-n8n-masterclass/ and /workshops/, both 404ing but indexed
Two directory URLs Google still has indexed were 404ing after the old site was
torn down. Both are rebuilt as trailing-slash directories (same model as
/odoo-erp-automation-bootcamp/, so the non-slash form 301s to the slash form).

odoo-n8n-masterclass/index.html
- copy from copywriter, structure and page-scoped CSS reused from the bootcamp page
- next session: four Thursdays of February 2027, 17:00 Central Time (hero eyebrow,
  price and booking, JSON-LD startDate 2027-02-04)
- booking: native POST form to 20.odoo4projects.com/shop/post_basket, basket
  product_id 44, zero JavaScript, three CTAs
- n8n environment corrected: we do not hand out n8n workspaces; the participant
  uses n8n's own free plan. Body, hero fact, FAQ and JSON-LD say so plainly.
- JSON-LD Course + FAQPage; Plausible snippet; FAQ and Buy markings

workshops/index.html
- hub page, two cards (masterclass USD 120.00 / bootcamp USD 465.00), pull quote,
  routing section, FAQ, comparison table
- the bootcamp card carries no term or date; the "ERP Automation Quick Wins" free
  offer is gone entirely (no card, no 1-hour format, no /free-webinar link)
- JSON-LD ItemList; Plausible snippet; FAQ markings

SEO: canonical to the slash URL, OG tags, the bootcamp's font/style.css loading
pattern, sitemap.xml (+2 urls, lastmod 2026-10-28, bootcamp lastmod bumped for the
two links added there), llms.txt (+2 lines). Cross-linked both ways and both to the
bootcamp; the bootcamp page gains the inbound links.

English only. No DE/ES twins yet - translator follow-up.

Checks: verify-html.py 0 problems, check-links.py clean, check-links-2026-10-28.py
56 PASS / 0 FAIL, verify-plausible-events 71 PASS / 0 FAIL, JSON-LD parses.
2026-10-28 22:26:35 +00:00
oliver 0cd0fa1af1 feat(analytics): Plausible snippet on every page, FAQ marked on the bootcamp
The snippet was on 10 of 40 pages, so the Trial / FAQ / Buy / Custom Quote /
search posts / Project Plan goals were inert everywhere else. It now sits
verbatim, in the same <head> position as index.html, on all 39 visitor-facing
pages. email/trial-confirmation.html is deliberately left out (email template).

FAQ: the five <details class="bc-faq"> <summary> elements on the bootcamp page
and its DE/ES twins now carry plausible-event-name=FAQ, and the 15
.faq-question buttons on de/es/support.html get the marking they were believed
to already have. No goal renamed: one FAQ goal across all languages.

No markup, copy or behaviour change, and no third-party request beyond the
snippet itself. verify-html.py PROBLEMS 0; check-links.py OK; event checker
59 PASS / 0 FAIL; impeccable detector +0/-0 findings on the changed files.
2026-10-28 21:50:53 +00:00
webmaster 73b3f34696 feat(analytics): add Plausible custom-event markings for six goals
Mark the six conversion goals on the self-hosted Plausible instance so the
events match the goals to be registered in Plausible. Event names verbatim:
Trial, FAQ, Buy, Custom Quote, search posts, Project Plan.

CSS-class markings (work without JS logic, on the clickable element):
- FAQ  -> index/de/es index .faq-card; odoo-hosting-2027 + odoo-community-upgrade
          (de/es twins) and australia <summary>; support.html .faq-question
- Buy  -> index/de/es index .btn-buy anchors; australia + bootcamp native
          post_basket submit buttons (forms stay native POST)

JS call markings in script.js (loaded by index, de/index, es/index):
- Trial        on the successful trial-form POST (.then branch)
- Custom Quote on the successful custom-quote POST (.then branch)
- Project Plan on the successful business-wizard submit
- search posts on the FIRST input of #blogSearch only (guard flag, one per
  pageview, not on every keystroke, not on #ocaSearch)

Nothing fires on page load; the 'Start the free trial' anchors that only
scroll to #trialCard are deliberately not tagged. One goal per topic across
all languages, no language suffix. No visual, behavioural or request change.
2026-10-28 21:07:19 +00:00
oliver ea97e65416 feat(blog): publish "How to Install Odoo Modules Using Git"
New post at blog/posts/how-to-install-odoo-modules-using-git.html
(2026-10-28, area "deep dive"), body pasted verbatim from the boss's
supplied block (7 h2, two figures in place). Chrome copied from the
newest post (odoo-community-is-going-online-on-odoo4projects.html:
main.blog-post / span.badge / div.post-meta / img.post-image /
div.post-body / a.back-link), style block trimmed to the rules this
page uses plus the ol/figure/figcaption rules its body needs.

Additive wiring: og:image + twitter:card, post-image after post-meta
(alt = h1), BlogPosting JSON-LD with dateModified.

blog/index.json gets the entry first (newest-first, key order
id,date,area,headline,teaser,link,image) by text splice - 15 -> 16
posts; sitemap.xml one new 0.6 blog url - 35 -> 36 <loc>; llms.txt one
new line at the top of the post list.
2026-10-28 10:21:32 +00:00
oliver 972453747b Merge fix/en-faq-version-chain-parity: EN JSON-LD FAQ version-chain parity 2026-10-27 19:16:50 +00:00
oliver 141bf20c03 fix(seo): mirror the visible version chain (14 → 15 → … → 20) into the EN FAQPage JSON-LD
The visible FAQ answer used arrows while the structured-data copy spelled the
chain out with 'to', so acceptedAnswer.text was not verbatim-present on the
page. FAQ parity check now reports 8/8 on EN/DE/ES.
2026-10-27 19:16:50 +00:00
oliver b9a730942f Merge feat/i18n-localise-dir-links: localise extensionless directory links in DE/ES 2026-10-27 19:12:50 +00:00
oliver 12704a5618 fix(i18n): localise extensionless directory links in the DE/ES pages
build-i18n.py's rebase_paths() only re-pointed a root-absolute page link when it
contained ".html", so extensionless directory links stayed on the EN route even
when the language had its own copy (`/odoo-erp-automation-bootcamp/` on all four
DE and ES pages, and `/` on the DE/ES bootcamp pages). Same guard as the .html
branch: localise only when <lang>/<path>/index.html exists.

Re-applied the rebasing to the 8 already-built DE/ES pages (work/i18n/
relocalise-links.py) - a full re-transform is not safe for them because the
switcher-slot/hero rework means repo pages are not raw transform output. 18 refs
in 8 files. The DE/ES homepages were the stale case: their body links were built
before support.html/odoo-hosting-2027.html existed in that language and were
never revisited.

check-links.py now flags an EN-route page link whose language has its own copy:
0 such links on all 10 DE/ES pages after the rebuild. test-build.py 107 passed;
verify-html.py 0 problems.
2026-10-27 19:12:47 +00:00
oliver 268b2645e2 Merge feat/i18n-upgrade-de-es: publish DE + ES Community Upgrade pages 2026-10-27 19:07:29 +00:00
oliver a84ee5e983 i18n(upgrade): publish DE + ES ODOO Community Upgrade pages (/de/, /es/), sitemap + llms.txt
Copy-only mirrors of odoo-community-upgrade.html built by translator against the
post-R1-R5 English (EN af27098a, commit 2fe0c31), rendered through work/i18n/build-i18n.py:
<html lang>, canonical, 4-way hreflang cluster (en-US/de/es/x-default), og:url,
/static/lang.js and 15 rebased refs. No EN page change.

- sitemap.xml: 33 -> 35 <loc>, both new pages at priority 0.9
- llms.txt ## Languages: DE + ES lists now name /<lang>/odoo-community-upgrade.html
- checks: check-links.py 0 broken, verify-html.py 0 problems (tag balance, JSON-LD,
  sitemap XML), JSON-LD FAQPage answers verbatim in the visible FAQ 8/8 per page
2026-10-27 19:07:29 +00:00
oliver 68c26e9725 Merge feat/icp-upgrade-changes: ICP review R1-R5 on the Community Upgrade page 2026-10-27 19:03:06 +00:00
oliver 2fe0c31e2b copy(upgrade): apply the 5 ICP-required changes to /odoo-community-upgrade.html
Retrospective ICP 1 review (kanban t_03b62410) found the EN page made a
non-technical owner-operator hesitate: the offer sat behind four blocks of
shell commands, the hero ended on "a developer", one hero line carried an
untraced claim, there was no route to a number, the FAQ printed the
OpenUpgrade data-loss warning against our own fresh-database service, and
the "restaurant meal" simile was unitless.

R1 move "The ODOO4projects way" above the process and the commands; swap the
   two band classes so the page still alternates; keep the offer's code cards
   legible on the dark band; reword the §5 intro and §6 opening sentence.
R2 hero subhead reworded, dropping the untraced "costs you your history".
R3 "See the plans" route added inside §6, with the honest "not priced on that
   page" clause. No price, no plan hero, no Offer node.
R4 FAQ "What happens to my history…" answer rewritten (JSON-LD acceptedAnswer
   kept verbatim-equal to the visible text).
R5 "restaurant meal" clause deleted.

Band-aware text colours added for the elements the class swap re-parented
(process list on light, technical section and its notes on dark, the §6 link).
No other content changed: H1, CTAs, code blocks (all 4 byte-identical),
Sweat Equity, the 8 FAQs and the JSON-LD shape are untouched.
2026-10-27 19:03:06 +00:00
oliver 3c602d97be fix(seo): legal.html canonical, host-case normalisation, BlogPosting x15, blog body domain typo
Four follow-up defects found beyond the 2026-10-27 SEO audit (no copy changes):

1. legal.html canonical was https://ODOO4projects.com/legal — uppercase host AND a
   path that 404s. Now https://odoo4projects.com/legal.html. The file's og:url keeps
   its path /legal but its host is lowercased (path fix awaiting a decision).
2. The no-"4" domain typo in reader-visible <pre><code> body text of
   blog/posts/{guide-migrate-enterprise,speed-run-deploy,my-first-post}.html:
   odooprojects.com -> odoo4projects.com. Domain string only, no other wording.
3. Lowercase host in every machine-read value: the robots.txt Sitemap line, the
   homepage + de/ + es/ Organization JSON-LD url / contactPoint.url / offers[].url,
   legal.html og:url, and the four absolute self-URL hrefs in blog posts,
   odoo/support.html and email/trial-confirmation.html. Display text untouched
   (support@ODOO4projects.com stays as written).
4. One BlogPosting per blog post (15), every value taken from the page itself:
   headline = its <h1>, datePublished = its visible post-meta date, url = its own
   canonical, author/publisher = the Organization the site already publishes,
   image = its og:image where one exists (omitted on the 10 posts that have none).

Empire ">950.00", FAQPage on support.html, the blog-chrome change and the bootcamp
date conflict are untouched — decisions pending with the user.
2026-10-27 18:54:28 +00:00
webmaster 28f04e13fe fix(seo): repair the 10 blog canonicals, sitemap.xml, blog/index.json and llms.txt
From seo/out/site-seo-ai-search-audit-2026-10-27.md (§6 items 1, 2, 3a, 5).

- canonical: 10 blog posts declared https://odooprojects.com/... — a live parked
  third-party domain — as their canonical. Now self-referencing on
  https://odoo4projects.com/blog/posts/<slug>.html (1 line each, nothing else).
- sitemap.xml: 27 -> 33 URLs. Added the 6 live pages that were missing
  (support.html, legal.html, community-vs-enterprise-cost, 6-tips,
  odoocommunity-agents, odoo-20-is-live); corrected 13 lastmod values to the
  real last content commit (homepage was 4 months stale); /de/ and /es/
  priority 1.0 -> 0.7 so a translation does not outrank its original.
- blog/index.json: 7 -> 15 posts. The 8 orphan posts are now listed, so every
  post is reachable from the homepage grid.
- llms.txt: removed the link to /blog/ (that URL returns 403) and added a
  "## Blog posts" section listing all 15 posts with date and summary.

Not changed on purpose: FAQPage on support.html, the homepage "price": ">950.00",
the bootcamp start-date conflict, and the blog post chrome (15 files).
2026-10-27 18:48:06 +00:00
webmaster 695f42a04f feat(site): publish /odoo-community-upgrade.html (EN Odoo Community Upgrade page)
New EN landing page for the head term "ODOO Community Upgrade": hero, what an
upgrade is, the 10-step published process, a developer-labelled technical section
with four sourced command blocks and their substitution notes, the ODOO4projects
migration service (new database on our servers), the self-hosting cost honesty
section, an 8-question FAQ and a final CTA. House CI only, page-scoped CSS, no
new blocking resources.

- CTAs are plain links to the real flows: /support.html#contact (opens the
  migration ticket) and /index.html#pricing. No basket POST and no product id:
  no price is published for the migration service, so wiring a buy would invent one.
- JSON-LD: WebPage + Service + FAQPage (8 questions), no Offer node.
- sitemap.xml: new URL added; llms.txt: page listed under Key pages.
- support.html: the "older version" FAQ answer now links the new page so it is not orphaned.

Copy: copywriter/out/odoo-community-upgrade-page-copy-2026-10-27.md. The 7
NOT PUBLISHED gaps (G1-G7) are not in the build.
2026-10-27 18:43:33 +00:00
oliver 0715b59c34 feat(site): publish /australia.html — managed Odoo hosting in Australia (Sydney)
New flat landing page for Australian buyers, built from the approved Phase 2
copy with the five buyer-lens changes (R1-R5) applied. English only, no hreflang.

- australia.html: hero, five sections, four-plan pricing table (On the Rise
  heroed), 7-question FAQ, final CTA band; house CI (midnight/brass/cream,
  Marcellus + Inter), page-scoped CSS only.
- Buy CTAs are native POST forms to the live checkout with Australia (Sydney)
  pre-selected (basket product_id 4, verified against the homepage card).
- images/city-sydney.webp: city-sydney.jpg resized 6720x2240 -> 1920x640,
  9.8 MB -> 131 KB.
- index.html: the Sydney server card now links to the new page.
- sitemap.xml + llms.txt: page registered.

Evidence: verify-html.py PROBLEMS 0, verify-australia-page.py PROBLEMS 0,
JSON-LD parses, impeccable detect run (findings recorded).
2026-10-27 18:21:31 +00:00
oliver 0195038bd7 Update the ODOO Community blog post to the live copy
The post carried the planned/September copy ("scheduled to go online on the
06.10.2026"). Body replaced verbatim with the supplied live copy (1379 bytes,
2 h2, 221 words), post-meta -> October 27, 2026 · News, meta/og description
refreshed, title/canonical/chrome/og:image unchanged.

- blog/index.json: the existing entry moved to first, date 2026-10-27,
  teaser = first 120 chars of the new first paragraph (text splice).
- sitemap.xml: one new <url> as the first 0.6 blog entry (24 -> 25 <loc>).
- work/verify-html.py: page added to FILES (in webmaster/work, not in repo).
2026-10-27 09:03:49 +00:00
oliver 3e913d68cc Remove the trial MCP endpoint line from /odooityourself.html
The user reversed the earlier 'publish it' decision: the trial endpoint
paragraph (and its now-dead .ai-endpoint CSS rules) come off the AI
section. The 30-day trial line in 'Some other information' stays.

- HTML: <p class="ai-endpoint"> removed (was the AI section's last para)
- CSS: .ai-endpoint, .ai-endpoint a, .ai-endpoint a:focus-visible deleted
  (the focus-visible selector dropped from its group; group otherwise intact)
- grep ai-endpoint 0, mcp/trial 0, competitor grep 0
- verify-html.py PROBLEMS: 0; impeccable detect 10 (no new finding)
2026-10-26 19:03:58 +00:00
oliver 4da2f1c435 Remove the hero CTA from /odooityourself.html
The user asked to drop the 'Start a free trial' button from the hero.
The hero now ends with the supporting paragraph; the now-dead
.andrew-actions rule (its only consumer) goes with it. The 30-day trial
line in 'Some other information' is untouched.

Diff: 8 deletions, one file. verify-html.py PROBLEMS: 0; competitor
grep 0; impeccable detect 11 -> 10 (the removed finding was the CTA
button's low-contrast), no new findings.
2026-10-26 18:59:38 +00:00
oliver 6658f3e0a7 Move the Andrew briefing page to /odooityourself.html
git mv for-andrew/index.html odooityourself.html (history kept) and drop the
now-empty for-andrew/ directory, so the page serves at the flat root URL
https://odoo4projects.com/odooityourself.html with no directory redirect.

Update every reference to the old path: canonical, og:url and the WebPage
JSON-LD url in the page; the sitemap.xml <loc> (replaced, lastmod 2026-10-25,
still 24 entries); and the llms.txt key-page line. Copy, CSS, assets and all
other pages are untouched.

/for-andrew/ was never announced or indexed, so it is deliberately left as a
404 — no redirect added.
2026-10-26 18:40:56 +00:00
oliver 6f4a6a46b6 Landing page: partner briefing for Andrew at /for-andrew/
Six-section briefing page (hero vision, 2x3 feature grid, AI/MCP section
with art-director's CI SVG + mobile variant, management console with the
real screenshot, pricing with Empire quoted and no number, some other
information with the demo checklist). Zero competitor mentions.

Reuses the existing bootcamp hero assets; adds /images/andrew/ SVGs,
sitemap + llms.txt entries.
2026-10-26 18:36:34 +00:00
oliver 66ed209632 Footer "Useful Links": four items on the six DE/ES pages (DE/ES follow-up to 31c02b1)
The translated pages now carry the same four footer items as the three English pages:
ODOO Bootcamp -> /odoo-erp-automation-bootcamp/, ODOO Hosting in 2027 (DE) / ODOO Hosting en
2027 (ES), Support/Soporte, Rechtliches/Aviso legal. Deleted: Startseite/Inicio,
Datenschutz/Privacidad, AGB/Terminos, Kontakt/Contactenos.

Rebuilt with work/i18n/build-i18n.py from the translator's six files (work/i18n/I18N-BUILD-PLAN.md
section 5), then: place-hero-slot.py for de|es/index.html, place-slot.py for the two 2027 pages,
insert-hero-i18n.py for the two bootcamp pages (the hero CSS is language-neutral chrome held
outside the translated source). Nothing else changed: git diff 31c02b1 over these six files is
the footer list and nothing else - bootcamp hero, three buy forms (product_id 12), 465.00,
selector and hreflang clusters untouched.

Checked: verify-html.py PROBLEMS: 0; node --check static/lang.js OK; verify-footer-useful-links-de-es.py
PROBLEMS: 0; test-build.py 88/88; test-lang.js 31/31; check-links.py BROKEN/MISPLACED: 0;
impeccable detector identical finding set on all six pages (0 changed lines).
2026-10-26 15:55:12 +00:00
oliver 31c02b1a06 Footer "Useful Links": Bootcamp + ODOO Hosting in 2027, drop the four
The list becomes the same four items in all three English pages:
ODOO Bootcamp -> /odoo-erp-automation-bootcamp/ (new, first),
ODOO Hosting in 2027 -> the existing comparison page (renamed from
"Odoo hosting 2027", added to the homepage which lacked it),
Support, Legal. Home / Privacy / Terms / Contact us removed.

Content-only edit inside the existing <ul>; each page keeps its own
href style. No CSS, no markup pattern change, no other footer column
touched. de/ and es/ untouched (translator owns those in parallel).

Checks: verify-html.py PROBLEMS 0; work/verify-footer-useful-links.py
PROBLEMS 0; impeccable detect finding set identical to HEAD (87
anti-patterns / 100 advisories, all pre-existing); browser check at
1280px and 375px on all three pages: 4 items, no overlap, no
horizontal overflow.
2026-10-26 15:47:14 +00:00
oliver 0bc4dc05d7 Bootcamp hero: two-zone scrim so the photo actually reads (EN/DE/ES)
The uniform .72 -> .55 scrim composited the whole hero band to luma ~37 and the
right zone to ~35, against a flat midnight of 25.4: a dark photo made darker.
The scrim is now two zones on the same photo:

  .78  0%-88%   (copy zone: kicker, H1, value line, the four facts, the CTA)
  ramp 88%-94%
  .25  94%-100% (the lit skyline, no copy over it)

.78 is the smallest flat alpha that holds every text block over its floor
(body 4.5:1, large 3.0:1) at 1920/1440/1024/390 in EN, DE and ES - measured on
the rendered page, not modelled. 88% is where the ramp has to start: the longest
translated fact line (DE, 1024px) reaches 89.3% of the hero.

Measured before -> after (full-range mean luma of the rendered band):
  whole band     37.3 / 36.8 / 37.6 / 37.3  ->  33.8 / 33.6 / 34.1 / 34.0
  right 88-100%  34.8 / 35.9 / 35.5 / 38.4  ->  38.7 / 40.2 / 39.4 / 43.4
  plateau 94-100%                          ->  41.4 / 44.2 / 42.7 / 46.9
  (= 1.63x-1.91x the flat-midnight 25.4, was 1.37x-1.51x)
Worst text block: 4.87:1 (was 3.13:1). No copy, buy form, JSON-LD, selector,
hreflang or price touched: de/ and es/ differ ONLY by this inserted hero block.
2026-10-25 11:39:40 +00:00
oliver 718059c7e1 Bootcamp hero: London night aerial behind the header copy
The user asked for a photo in the header of /odoo-erp-automation-bootcamp/.
Adds our own London night aerial (art-director's chosen cut, measured) as the
page-scoped .bc-hero background, under a midnight gradient scrim
(rgba(13,27,46,.72) -> .55, inside CI §5's band) and over the --midnight base.

- desktop: bootcamp-hero-desktop-1920.webp, cover, background-position 50% 25%
- <=640px: bootcamp-hero-mobile-900.webp, background-position 50% 50%
- the global .hero::after 50% wash is switched off on this page only, so the
  scrim above is the one that was measured

No copy, buy form, JSON-LD, language selector or hreflang change. One CSS block,
two images, nothing else. verify-html.py PROBLEMS: 0; impeccable detect finding
set identical to HEAD; check-links 0. Worst p05 over rendered type 5.64:1.
2026-10-25 10:42:46 +00:00
oliver 36c629852f Bootcamp DE/ES: instructor reads 'Oliver - The OC Guy - Arnold' (+ alternateName)
Rebuilt de|es/odoo-erp-automation-bootcamp/index.html from the translator's
updated files with work/i18n/build-i18n.py (same recipe as 89bb7b7: lang,
canonical, the four hreflang links, og:url, the top-bar selector kept as-is).

- 2 occurrences per file: the facts-list <dd> and the "Your instructor"
  <strong> now read "Oliver - The OC Guy - Arnold, Technical Lead bei/de
  ODOO4projects" (the user's alter ego, typed hyphen form).
- Both JSON-LD instructor Person nodes gain alternateName "The OC Guy"
  (the translator mirrored the EN page e5e4f5b; name stays Oliver Arnold).
- Buy forms untouched: three POST forms, product_id 12, clear=1, price 465.00
  in five places per page.
- git diff --stat e5e4f5b = these two files only (+10/-6).
2026-10-25 10:23:20 +00:00
oliver e5e4f5b016 Bootcamp: instructor reads 'Oliver - The OC Guy - Arnold' (facts list + section lead)
The user's instruction: use 'Oliver - The OC Guy - Arnold' (his alter ego
'The OC Guy'). Rendered with the typed hyphen form in the two places the name
is shown - the facts-list <dd> and the 'Your instructor' <strong>. Bio
paragraphs, <title>, meta description and FAQ text untouched.

JSON-LD: both Course/CourseInstance instructor Person nodes keep
name 'Oliver Arnold' (legal name) and gain alternateName 'The OC Guy'.
2026-10-25 10:16:24 +00:00
oliver 89bb7b7cba i18n: publish the bootcamp page in DE + ES, cluster the EN page, price 465.00
- add de|es/odoo-erp-automation-bootcamp/index.html (build-i18n.py from the
  translator's files; canonical + hreflang cluster + top-bar selector)
- EN bootcamp page gains the four hreflang alternates (was asymmetric)
- price 790 -> 465.00 across all three pages (JSON-LD offers.price, the three
  buy-button labels, the bc-price sentence); the three buy forms stay
  byte-identical apart from the label language
- sitemap.xml: +/de/ and /es/odoo-erp-automation-bootcamp/; llms.txt: Languages
  section names the new pages
2026-10-24 22:38:21 +00:00
oliver ca9a5b47cf Bootcamp page: instructor dd carries the full title (Oliver Arnold, Technical Lead at ODOO4projects) 2026-10-24 22:33:09 +00:00
oliver 7784a46b7d Bootcamp page: instructor dd says 'Oliver Arnold' (drop ', sole instructor') 2026-10-24 22:30:20 +00:00
oliver 24e542f4ab Bootcamp page: CTAs say 'Buy for 790 USD' and post the basket natively
The three CTAs (hero, mid-page, §7) were <a class="btn-buy"> that only worked
through JavaScript. They are now native <form method="post" target="_blank">
elements posting basket=[{"product_id":12,"qty":1}] + clear=1 to
https://20.odoo4projects.com/shop/post_basket, so the buy works with JavaScript
disabled; the button keeps the brass styling and the same size classes.

static/buy.js no longer builds a form on click. It is now pure progressive
enhancement: a capture-phase submit listener appends the utm_source/medium/
campaign hidden inputs from the cookies and lets the native submit proceed.

One page-scoped declaration keeps the button height at 55px: a <button> takes
line-height:normal from the UA font shorthand where the <a>s inherited the body
line-height (measured 49.19px vs 54.78px without it).
2026-10-24 22:26:40 +00:00
oliver f0c6284bda i18n DE: republish odoo-hosting-2027.html and support.html with the trimmed em-dashes
Rebuild the two German phase-2 pages from translator/out/de/ with the standard
build recipe (lang, canonical, four hreflang links, top-bar language selector):
em-dashes cut in the German copy (odoo-hosting-2027 30 -> 5 body em-dashes,
support 8 -> 6 body) so the DE pages no longer exceed the EN source. Punctuation
only, no re-translation. ES and EN pages unchanged.

impeccable detect: finding profile unchanged except the [em-dash-overuse]
advisory on de/odoo-hosting-2027.html, which is resolved.
2026-10-24 22:08:49 +00:00
oliver 45a3cc5398 Bootcamp page: Reserve your seat now buys the bootcamp (product_id 12)
The three Reserve-your-seat CTAs posted to /support.html#contact. They now
run the same checkout path as the main page's Buy Now: a new page-local
static/buy.js mirrors script.js buyNow() (POST basket to
20.odoo4projects.com/shop/post_basket, clear=1, UTM cookies appended) and
binds .btn-buy via one delegated click handler. CTAs become
.btn-buy[data-id=12]; label unchanged. script.js and the homepage untouched.

The Price-and-booking section keeps a second, smaller link to
/support.html#contact so readers who have questions still have a fallback.
2026-10-24 22:03:38 +00:00
oliver b69e4ceaed i18n phase 2: publish DE + ES for odoo-hosting-2027.html and support.html
Four new pages, built from the verified translator output with work/i18n/build-i18n.py,
plus the same hreflang cluster and top-bar language selector on the two English pages.
Same recipe as the homepage pilot (main 937dbd4 / 06beab4); nothing else touched.

- de|es/odoo-hosting-2027.html, de|es/support.html: per-language canonical, the full
  hreflang cluster (en-US, de, es, x-default -> EN), /static/lang.js, and the switcher
  slot placed in the page's own top bar (.cmp-topbar on the 2027 page, .blog-header on
  support.html) with the per-shape CSS hook from I18N-BUILD-PLAN.md §3.
- odoo-hosting-2027.html, support.html: same cluster, same selector, so the cluster is
  symmetric (asymmetric hreflang is discarded by Google). support.html's canonical and
  og:url were still on the capitalised ODOO4projects.com host; the build normalises them
  to the lowercase form the rest of the site and sitemap.xml use.
- Internal links: the build's rebase step now also localises a root-absolute page link
  (/support.html#contact in the translator's 2027 pages) once that page exists in the
  language. /de/support.html, /de/odoo-hosting-2027.html, /de/, /de/#pricing and
  /de/#trialCard are local; /legal.html stays on the EN route because the legal pages
  are not translated (lawyer review pending).
- sitemap.xml: +4 URLs, lastmod 2026-10-24, priority reused from the EN entry (2027 -> 0.9,
  support.html -> 0.6 fallback, it has no EN entry). 17 -> 21 <loc>, no duplicates.
- llms.txt: the ## Languages section now names the mirrored pages.

Checks: verify-html.py PROBLEMS: 0; node --check static/lang.js OK; test-lang.js 31/31;
test-build.py 64/64 (was 43; +21 for the four built pages and the root-absolute rule);
check-links.py on the four new pages BROKEN/MISPLACED: 0.
2026-10-24 21:56:08 +00:00
oliver 0721804aab Language selector: move it into the visible top bar on every page that loads lang.js
The EN | DE | ES switcher existed but rendered into the footer slot, so a
visitor had to scroll to the bottom of the page to find it (measured live:
y=5582 on /, y=5498 on /odoo-erp-automation-bootcamp/). The user asked for a
selector a visitor can actually see.

- index.html, de/index.html, es/index.html: the slot is now the first child of
  .hero .container, right-aligned in flow above the kicker. In flow, not a
  fixed pill, so it cannot collide with the absolute .hero-notice.
- odoo-erp-automation-bootcamp/index.html: the slot is now the last child of
  .bc-topbar .container, right of the nav links, behind a hairline brass
  divider; .bc-topbar-links gets margin-left:auto so the brand stays left.
- One [data-lang-switcher] per page; the footer slot is removed everywhere.
- Styling follows the CI: Inter 12px / .06em / uppercase codes (the existing
  .lang-switch rules), active language in --brass on these midnight surfaces,
  the other two in the surrounding text colour. CSS-only, in each page's
  inline <style>; lang.js is untouched, so its redirect behaviour is unchanged.
- The rules are recorded in work/i18n/I18N-BUILD-PLAN.md §3 for the phase-2
  pages (de|es/odoo-hosting-2027.html, de|es/support.html).
2026-10-24 21:51:08 +00:00
oliver 7b2d241330 Bootcamp page: remove the internal 'Note on the count' paragraph
The paragraph explained the 12-to-10 lesson merge — internal reasoning
about the old page, with no place on a sales page. The ten-lesson <ol>
and the section layout are unchanged.
2026-10-24 21:45:37 +00:00
oliver acae3bdbd9 Bootcamp: correct the session schedule (first 22 Jan 2026, last 26 Mar 2026, 18:00-19:00 Central Time) 2026-10-24 21:42:57 +00:00
oliver fa654dc8d7 Bootcamp page: publish the price, USD 790
The user confirmed the price (USD 790) and the term (Q1 2026, already
correct). Replaces the 'Price and booking' placeholder sentence with the
price statement and drops the TODO(olchi) comment that marked it. Adds an
Offer (price 790, USD, Paid) to the Course node so the price is
machine-readable; the FAQPage node is unchanged.
2026-10-24 21:36:52 +00:00
oliver 0f5fb95b12 Publish the Odoo Bootcamp page at /odoo-erp-automation-bootcamp/ (fixes the ranking 404)
New directory page built from the copywriter's reviewed copy (webmaster/out copy:
/root/workspace/copywriter/out/2026-10-24-bootcamp-page-copy.md), with the four
placeholders resolved: Thursdays 16:00-17:00 (UTC-3), first session Thursday
8 January 2026 (ten sessions, last 12 March 2026), no price printed (price is
confirmed on registration, offers omitted from JSON-LD), booking CTA is
/support.html#contact.

- odoo-erp-automation-bootcamp/index.html: standalone landing page in the CI
  (midnight/brass/cream, Marcellus+Inter, page-scoped CSS, non-blocking
  style.css, no third-party JS), 8 H2 sections from the copy, Course + FAQPage
  JSON-LD, footer from index.html with the language-switcher slot.
- sitemap.xml: 16 -> 17 <loc> entries (lastmod 2026-10-24, priority 0.9).
- llms.txt: one line for the bootcamp under Key pages.

Verified: verify-html.py PROBLEMS 0 (FILES extended with the new page),
node --check script.js OK, no console errors at 1280/375, no horizontal
overflow at 375.
2026-10-24 21:33:25 +00:00
oliver 06beab403d lang.js: remember the language a switcher click picked
The switcher links were plain anchors: clicking one navigated but stored nothing, so
the auto-detect on the EN homepage bounced the visitor straight back. A de-DE browser
on /de/ that clicked EN landed on / and was replaced back to /de/ — the 'an explicit
choice always wins' promise in the plan and in llms.txt was only true for ?lang=.

A click now calls remember() with the link's own hreflang, so the choice is stored in
localStorage + the o4p_lang cookie and survives the next session. Selector tests
27 -> 31 (switcher click stores EN, sets the cookie, stores DE, chosen EN survives a
new session).
2026-10-24 21:25:33 +00:00
oliver 937dbd4dbf Publish German and Spanish homepage (/de/, /es/) with hreflang cluster and language switcher
Homepage pilot of the website i18n project. Adds the translated homepage for DE and
ES, the shared selector at /static/lang.js, and the hreflang cluster on all three
language versions (EN included, or the cluster is asymmetric and ignored).

- de/index.html, es/index.html: translator output plus the i18n build (html lang,
  self-referencing canonical, hreflang cluster, lang.js tag, switcher slot in the footer).
- index.html: same cluster + lang.js tag + switcher slot; canonical and og:url
  normalised to the lowercase host.
- static/lang.js: the tested selector (client-side language choice, auto-detect on the
  EN homepage only, once per session; a stored choice or ?lang= always wins).
- sitemap.xml: /de/ and /es/ (priority 1.0, lastmod 2026-10-24).
- llms.txt: new '## Languages' section.

Two gaps in the build recipe were closed while building: a mirrored page cannot use
root-relative source paths (style.css, images/* would resolve to /de/style.css -> 404),
so the build now re-points assets at the site root and keeps page links on the EN route
until the language page exists; and og:url is now this page's own URL instead of the
EN one inherited from the source. Not built yet: support.html, odoo-hosting-2027.html,
the blog, the bootcamp page, the legal pages.
2026-10-24 21:22:13 +00:00
oliver 2c7d9a393e Add Plausible analytics snippet to odoo-hosting-2027.html <head>
Reuses the exact snippet shipped on index.html in 6bb529a, inserted
verbatim as the last thing in <head> (before </head>). Diff is this
file only; the ld+json @graph block is byte-identical.
2026-10-24 16:39:51 +00:00
oliver 6bb529a06a Add Plausible analytics snippet to homepage <head>
User-supplied, private self-hosted Plausible instance. Snippet inserted verbatim (unmodified,
byte-for-byte) as the last thing in <head> of index.html only, immediately before </head>.
No other page touched; no CSP exists on the site so no policy change needed.

Checks: verify-html.py PROBLEMS 0; node --check script.js OK; tracker script HTTP 200
application/javascript.
2026-10-24 13:29:28 +00:00
oliver 62d9d76bde Add supplied post images to two posts and to the blog overview cards
- blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html: in-post image
  much.png + og:image
- blog/posts/track-the-oca-modules-you-actually-use.html: in-post image
  oca_module_status.png + og:image
- blog/index.json: optional "image" key on those two entries only (text splice)
- script.js: renderBlog() draws .blog-thumb only when the entry carries an image
- style.css: .blog-thumb rule
- sitemap.xml: lastmod 2026-10-24 for the invoice-migration post

Built by profile webmaster (run 20261024_094206_5c4f28, verified PROBLEMS: 0 /
node --check OK); committed by olchi after that run died on an OpenRouter 402.
2026-10-24 09:46:13 +00:00
oliver 7b9db81e82 Publish blog post: Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day 2026-10-24 08:57:30 +00:00
oliver 76e5645585 Publish blog post: This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP 2026-10-23 09:25:02 +00:00
oliver 61a9dd96d0 feat(legal): add Video Credits block with 10 Pixabay attributions
Add a Video Credits legal-card after Image Credits and before Trademark
Notice, carrying the 10 user-supplied Pixabay video attributions verbatim
(hrefs, utm params and the intentional /de// double slash preserved).
Rows use the existing .credit-row pattern; .video-credits mirrors
.image-credits in the page's inline <style>. Links carry target=_blank
rel=noopener to match the Image Credits convention. Meta description now
lists image and video credits.
2026-10-22 19:06:55 +00:00
oliver 488419155b fix(pricing): state the same domain count per plan on the homepage
The homepage cards gave no domain count to Side Hustle or On the Rise and
gave three to Powerhouse, while the in-app plan page (odoo/upsell.html) and
the published terms.html both say one domain for Side Hustle and three for
On the Rise and Powerhouse. Cards now read 1 / 3 / 3; PRODUCT.md and
llms.txt carry the same counts so no future page has to guess.
2026-10-22 16:12:40 +00:00
oliver 55d1ffd800 chore(site): drop dead coupon code and stale product-spec facts
script.js: delete applyCoupon(). Its only caller was the coupon button deleted above,
so the function was unreachable dead code that still carried the removed 'Coupon FREE
TRIAL applied - 1 month free' promise in a publicly served file. It would also have
thrown on the two DOM ids that no longer exist.

PRODUCT.md: this file is served publicly and still advertised $19.40/mo, $36.25/mo,
$49.60/mo, the FREE TRIAL coupon, 'yearly billing saves roughly 8-10%', a 'Satisfied
or reimbursed' guarantee and 'redundant slots'. Corrected to the yearly list prices
the site publishes and to the decisions above.
2026-10-21 23:05:23 +00:00
oliver dd27e820f5 feat(legal): add Privacy Policy and Terms of Service pages
Two new root-level pages, assembled from legal.html so they inherit the existing
head, fonts, style block and .legal-* cards. The trial email's /legal/privacy and
/legal/terms links 404 on the live site and are repointed here.

Both are factual drafts built from product facts (data held, the six regions, Stripe,
cancel-anytime, backup slots) and are NOT lawyer-authored. Decision 12 marks them for
legal review; they must not be treated as final before that review.
2026-10-21 23:05:23 +00:00
oliver 93511e893d fix(site): correct prices, drop every discount claim and repair trial copy
Applies the 16 findings the user answered in projects/active/odoo-hosting-2027-landing/
decisions-2026-10-21-user.md, using the wording from
copywriter/out/site-fix-wording-2026-10-21.md.

index.html: Powerhouse 535 -> 595 in the card and in the JSON-LD Offer; delete the
three Save 8%/9%/10% badges and the empty badge div on the Empire card; replace the
'Save 15% with yearly billing' line and the coupon message text (ids kept - script.js
reads them); delete the FREE TRIAL coupon input block; qualify the checkout line as
'Card required to buy, not to start'; fix 'redundant slots' to the real rotating-slot
model; drop the 'coupon codes for startups and NGOs' promise; add Privacy and Terms to
the footer.

email/trial-confirmation.html: stop promising backups, domain mapping and SSL on the
trial (the trial has none); state what the trial is not; copyright 2024 -> 2026;
repoint Privacy/Terms from the 404 /legal/privacy and /legal/terms to the new pages.

support.html: state that custom and OCA modules install from On the Rise up and that
Side Hustle has no module installation.

odoo/upsell.html: '4 weeks free' -> '30 days free'.

blog: the backup speed-run no longer sends readers to a non-existent hosting
dashboard; my-first-post loses the 30-day refund promise and the dashboard domain
step; community-vs-enterprise-cost quotes $214/year instead of $19.40/month;
odoocommunity-agents drops 'per-seat licensing' from the body and both meta
descriptions.

sitemap.xml: add /privacy.html and /terms.html.
llms.txt: publish the Powerhouse price and list the two new pages.

Evidence: every old string verified gone and every new string present in the working
tree; 12 HTML files tag-balanced; JSON-LD and sitemap XML valid.
2026-10-21 23:05:22 +00:00
oliver e25e4c64fa a11y(landing): lift the 'not supported' / flag chips above the 11px legibility floor
The cmp-not-us and cmp-flag pills rendered at 0.62rem (9.92px), below the
11px floor for functional text. 0.69rem = 11.04px. Detector finding cleared.
2026-10-21 22:23:15 +00:00
oliver 0f7da0b68b perf(landing): load style.css non-blocking on odoo-hosting-2027
Match the pattern index.html already uses (media=print + onload swap,
noscript fallback) so the new page adds no render-blocking stylesheet.
Page-scoped critical CSS stays inline.
2026-10-21 22:22:27 +00:00
oliver db919fc8c2 feat(landing): add Odoo Hosting 2027 comparison page
New page odoo-hosting-2027.html (feature + lifetime-cost comparison tables,
Odoo Online exclusion, Enterprise growth path, JSON-LD). Links it from the
homepage pricing CTA, adds it to sitemap.xml, adds llms.txt for AI-SEO.
2026-10-21 22:20:45 +00:00
oliver a54dc22bd1 copy(footer): say "AI Agents and N8N automations" in the About-us blurb
Updates the homepage footer tagline to name AI Agents and N8N
automations explicitly. Markup-preserving: existing <strong> emphasis
on "stability" and "power" is unchanged; no structural, style or
layout changes.
2026-10-20 13:09:31 +00:00
oliver ca89d8e7b7 confirm 2026-10-17 17:10:09 -03:00
oliver 29127d4025 chat fixes 2026-10-17 10:50:45 -03:00
oliver b4e0faa62e UTM 2026-10-17 10:40:05 -03:00
oliver 575e3efece Update upsell.html 2026-10-17 09:39:08 -03:00
oliver 62f92769a1 Update upsell.html 2026-10-17 09:30:55 -03:00
oliver 3637094896 url 2026-10-16 08:42:42 -03:00
oliver 609f9d64bf new produt id 2026-10-16 08:39:01 -03:00
oliver 1ab6c47df6 Update index.html 2026-10-16 08:29:29 -03:00
Reef 354799b9ca fix: repair contact flow and buy flow targets
- Buy Now product IDs aligned to the Odoo shop (54/55/56), matching odoo/upsell.html
- support.html contact form: rewire from dead ODOO4projects.com/website/form endpoint to n8n CRM webhook; remove /web/csrf_token prefetch; show success only on res.ok (previously always showed 'submitted' even when nothing was delivered)
- /contactus links (footer nav, Schema contactPoint, order widget fallback, trial email) retargeted to support.html#contact; canonical/og:url corrected to /support.html
- Custom Quote and footer contact handlers hardened with res.ok checks
- buyNow basket target verified: 20.odoo4projects.com/shop/post_basket (200)
2026-10-12 15:41:11 +00:00
oliver 04d39157b8 Buy Area 2026-10-08 17:28:26 -03:00
oliver 5cc0c06a11 Fix modal close + color 2026-10-08 16:29:57 -03:00
ODOO4projects Web Developer b003c221ce fix: Custom Quote modal text visibility and close button
- Dark text (#171c26) for all form fields in modal on ivory background
- Explicit colors for labels, inputs, placeholders
- Close button (X) now visible with midnight background
2026-10-08 18:52:55 +00:00
ODOO4projects Web Developer 79f2a71d49 feat: rename Rates & SUITES to Order & Pricing, add Custom Quote modal
- Change section header to 'Order & Pricing'
- Add 'Get Custom Quote' button that opens modal with name, email, requirements fields
- Requirements field has placeholder: 'Describe your requirements (how many users? onsite, cloud? how many workers?)'
- Submit to https://n8n.odoo4projects.com/webhook/ODOO4projects/crm with UTM tracking
- Empire 'Get Custom Quote' button now opens modal instead of Order Widget
- Add CSS for modal overlay, form styling, and mobile responsiveness
2026-10-08 17:39:08 +00:00
Reef 729289ef71 Publish blog post: 6 Tips to Leverage the Latest Odoo Management App Update 2026-10-08 15:50:04 +00:00
ODOO4projects Web Developer 06ed942f8b fix: correct trial location preselection after city-only values
- options now use city values (saopaulo) instead of full hostnames
- preselect logic extracts city from bestServer.host before matching
2026-10-06 22:48:35 +00:00
ODOO4projects Web Developer 3d1473a2d5 feat: add agent-skills JSON to homepage for free trial provisioning
- includes spin_up_free_trial skill with MCP server reference
- defines six server locations (Manchester, Sydney, Mumbai, São Paulo, Meppel, Boston)
- provides workflow steps and clear instructions for conversational agents
2026-10-06 22:46:11 +00:00
Reef e926f850f7 Publish blog post: Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups 2026-10-06 22:06:05 +00:00
ODOO4projects Web Developer eb142d1aa6 fix: location values now return city name only (saopaulo instead of api.saopaulo.odoo4projects.com) 2026-10-05 20:37:28 +00:00
ODOO4projects Web Developer 4d9becd159 feat: spinning-up widget for ?message=spinning_up URL param 2026-10-05 20:32:13 +00:00
ODOO4projects Web Developer 5f4c75e94f feat: store UTM params in cookies, inject into webhook payloads 2026-10-05 20:30:30 +00:00
ODOO4projects Web Developer d83d960543 email: professional HTML template for new trial signup confirmation 2026-10-05 20:01:52 +00:00
ODOO4projects Web Developer 9751bda35c copywriter: FAQ growth path & pricing outcome-based language 2026-10-05 19:57:16 +00:00
ODOO4projects Web Developer 3e899391d7 fix: change trial webhook to n8n.odoo4projects.com/webhook/ODOO4projects/trial 2026-10-05 19:18:51 +00:00
68 changed files with 20690 additions and 304 deletions

No files matched your search

+7 -7
View File
@@ -22,15 +22,15 @@ Enterprise-grade Odoo Community hosting without the enterprise price tag. Commun
## Operating Context
- Static site (index.html, support.html, legal.html, blog/) deployed via git push to git.odoo4projects.com; auto-deploys on every change.
- Order flow: inline order widget on the homepage opens Stripe checkout; coupon FREE TRIAL = 1 month free; yearly billing saves roughly 8-10%; "Satisfied or reimbursed" guarantee; server location chosen at checkout (US, Brazil, India, Australia, Netherlands, UK).
- Support: AI support bot (agent.js from static.odoo4projects.com) plus human team; email support@odoo4projects.com; /contactus route.
- Static site (index.html, support.html, legal.html, privacy.html, terms.html, blog/) deployed via git push to git.odoo4projects.com; auto-deploys on every change.
- Order flow: inline order widget on the homepage opens Stripe checkout; plans are billed yearly with no setup fee; cancel at any time; server location chosen at checkout (US, Brazil, India, Australia, Netherlands, UK).
- Support: AI support bot (agent.js from static.odoo4projects.com) plus human team; email support@odoo4projects.com; contact form on support.html#contact.
- Blog with guides and news (10 posts); homepage renders it with search and pagination.
## Capabilities and Constraints
- Plans: Side Hustle $19.40/mo, On the Rise $36.25/mo (Git modules), Powerhouse $49.60/mo (2 workers, 2GB HDD, 3 domains), Empire $80+/mo (service on the customer's own server, contact to order).
- Features: automatic daily backups (FIFO rotation, redundant slots), free SSL on every domain, Git-based module deployment (Quick Git one-click), full management via ODOO Settings Panel, worker scaling, daily security audits with automated patching, continuous performance monitoring, 6 regions.
- Plans (list prices, per year, USD): Side Hustle $214 (1 domain), On the Rise $395 (Git modules, 3 domains), Powerhouse $595 (2 workers, 2GB HDD, 3 domains), Empire >$950 (service on the customer's own server, contact to order).
- Features: automatic daily backups (rotating slots, first-in-first-out: one on Side Hustle, four on On the Rise and Powerhouse), free SSL on every domain, Git-based module deployment (Quick Git one-click), full management via ODOO Settings Panel, worker scaling, daily security audits with automated patching, continuous performance monitoring, 6 regions.
- Enterprise-ready on Powerhouse and above; customer brings their own license.
- ODOO4projects LLC; founding date 2020; partner: OD8N.
- Constraint: this site remains a pure Odoo hosting seller. The PM Suite (Odoo-based project management + accounting tool for independent project managers, sold without Odoo branding) is a separate product on its own landing page and is not marketed on this site.
@@ -47,7 +47,7 @@ Enterprise-grade Odoo Community hosting without the enterprise price tag. Commun
- 7 named customer/partner sites with logos in the trust bar (see Brand Commitments).
- 10 blog posts: Community vs Enterprise cost breakdown, AI agents with Community, enterprise migration guide, custom module how-to, deploy and backup speed runs, platform update, official partner news.
- Plan names, prices, coupons, guarantees as listed above (from homepage code).
- Plan names, prices and guarantees as listed above (from homepage code).
- No invented testimonials beyond plan quotes; no case studies on site.
## Product Principles
@@ -60,4 +60,4 @@ Enterprise-grade Odoo Community hosting without the enterprise price tag. Commun
## Accessibility & Inclusion
No product-specific accessibility requirement has been established; standard web best practices apply.
No product-specific accessibility requirement has been established; standard web best practices apply.
+783
View File
@@ -0,0 +1,783 @@
<!doctype html>
<html lang="en-AU">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Managed Odoo Hosting in Australia — Sydney | ODOO4projects</title>
<meta
name="description"
content="Managed Odoo Community hosting for Australian businesses, on our servers in Sydney. Stock, orders and invoices in one system. Four plans, from $214 a year."
/>
<link rel="canonical" href="https://odoo4projects.com/australia.html" />
<meta property="og:title" content="Managed Odoo Hosting in Australia — Sydney" />
<meta
property="og:description"
content="Managed Odoo Community hosting on our servers in Sydney. Stock, orders and invoices in one system. No setup fee. Cancel at any time."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/australia.html" />
<meta property="og:image" content="https://odoo4projects.com/images/hero/sydney.webp" />
<meta name="twitter:card" content="summary_large_image" />
<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>
/* ---- Australia landing page (page-scoped; additive) ---- */
.cmp-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) */
.cmp-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.cmp-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.cmp-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.cmp-brand span {
color: var(--brass);
}
.cmp-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.cmp-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar-links a:hover {
color: var(--brass);
}
.cmp-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.cmp-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar .lang-switch a:hover,
.cmp-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.cmp-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero — same midnight lounge as the rest of the site, with our own Sydney photo
behind the copy (opacity + the site's own .hero::after gradient keep it legible). */
.cmp-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.cmp-hero .container {
position: relative;
z-index: 1;
}
.cmp-hero h1 span {
color: var(--brass);
}
.cmp-hero .hero-sub {
max-width: 660px;
}
.au-hero-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.25;
filter: brightness(1.15) saturate(1.1);
}
.cmp-lead {
font-size: 1.1rem;
color: var(--ink-soft);
max-width: 760px;
line-height: 1.75;
margin: 0 auto 1.5rem;
}
.section-light .section-title,
.section-light .section-kicker {
text-align: center;
}
.au-body {
max-width: 760px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .au-body {
color: rgba(255, 255, 255, 0.78);
}
.au-body p:last-child {
margin-bottom: 0;
}
.au-pull {
max-width: 760px;
margin: 2rem auto 0;
padding-top: 1.25rem;
border-top: 1px solid var(--line-brass);
font-family: Marcellus, Georgia, serif;
font-size: 1.05rem;
color: var(--ink);
text-align: center;
}
.au-figure {
margin: 2rem auto 0;
max-width: 960px;
}
.au-figure img {
display: block;
width: 100%;
height: auto;
border-radius: var(--radius-lg);
border: 1px solid var(--line-brass);
}
/* Pricing */
.cmp-table-wrap {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
border-radius: var(--radius-lg);
border: 1px solid var(--line-brass);
background: rgba(255, 255, 255, 0.03);
margin-top: 2rem;
}
.cmp-table {
width: 100%;
border-collapse: collapse;
min-width: 860px;
}
.cmp-table th,
.cmp-table td {
padding: 0.7rem 0.9rem;
font-size: 0.85rem;
text-align: left;
vertical-align: top;
border-bottom: 1px solid rgba(201, 162, 39, 0.1);
}
.cmp-table thead th {
font-family: Marcellus, Georgia, serif;
font-size: 0.82rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--brass);
background: rgba(13, 27, 46, 0.55);
border-bottom: 1px solid var(--line-brass);
white-space: normal;
line-height: 1.3;
}
.cmp-table tbody th {
font-family: Inter, sans-serif;
font-weight: 600;
font-size: 0.82rem;
color: #fff;
background: rgba(255, 255, 255, 0.02);
}
.cmp-table td {
color: rgba(255, 255, 255, 0.78);
line-height: 1.5;
}
.cmp-table tbody tr:hover td,
.cmp-table tbody tr:hover th {
background: rgba(201, 162, 39, 0.06);
}
.cmp-table tbody tr:last-child th,
.cmp-table tbody tr:last-child td {
border-bottom: none;
}
.cmp-table .is-us {
background: rgba(201, 162, 39, 0.09);
}
.cmp-table .is-us strong {
color: #fff;
}
.cmp-table td strong {
font-family: Marcellus, Georgia, serif;
font-weight: 400;
font-size: 1rem;
color: var(--brass-bright);
}
.au-tag {
display: inline-block;
margin-left: 0.4rem;
font-family: Inter, sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.1em;
text-transform: uppercase;
color: var(--brass-bright);
border: 1px solid rgba(201, 162, 39, 0.45);
border-radius: var(--radius-pill);
padding: 0.15rem 0.55rem;
vertical-align: middle;
}
.au-pricing-note {
text-align: center;
font-size: 0.85rem;
color: rgba(255, 255, 255, 0.6);
margin: 1.25rem auto 0;
max-width: 760px;
}
.au-callout {
text-align: center;
font-family: Marcellus, Georgia, serif;
font-size: 1rem;
color: var(--brass-bright);
margin: 1.25rem auto 0;
}
/* Buy CTAs are native basket <form>s with a <button>; keep the anchor height
(a <button> takes `line-height: normal` from the UA font shorthand). */
form[action$="/shop/post_basket"] .btn {
line-height: inherit;
}
/* FAQ */
.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],
.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 .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
}
/* Final CTA band */
.cmp-cta {
text-align: center;
}
.cmp-cta .cmp-lead {
color: rgba(255, 255, 255, 0.72);
}
.cmp-cta-actions {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 0.5rem;
}
.cmp-cta-actions .btn {
align-self: center;
}
/* Focus states on every CTA */
.btn:focus-visible,
.cmp-topbar-links a:focus-visible,
.cmp-note a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
@media (max-width: 768px) {
.cmp-hero {
padding: 3rem 0 2.5rem;
}
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Managed Odoo Hosting in Australia — On the Rise",
"description": "Managed Odoo Community hosting for Australian businesses, on our servers in Sydney. Stock, orders and invoices in one system. Four plans, from $214 a year.",
"offers": {
"@type": "Offer",
"name": "On the Rise",
"price": "395.00",
"priceCurrency": "USD",
"url": "https://odoo4projects.com/australia.html#pricing"
}
}
</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="cmp-topbar">
<div class="container">
<a class="cmp-brand" href="index.html">ODOO4<span>projects</span></a>
<nav class="cmp-topbar-links" aria-label="Page links">
<a href="#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 cmp-hero">
<div class="hero-bg">
<img
class="au-hero-img"
src="images/hero/sydney.webp"
alt="Sydney Harbour at dusk — the city where we run our Australian servers"
width="1920"
height="768"
fetchpriority="high"
decoding="async"
/>
</div>
<div class="container">
<p class="hero-kicker">Managed Odoo Community Hosting — Australia</p>
<h1>Managed Odoo Hosting in <span>Australia</span></h1>
<p class="hero-sub">
Your business gets an ERP that runs — we keep the server. Stock, orders, invoices and who owes you
money in one system, hosted on our own servers in Sydney, Australia. No setup fee. Cancel at any time.
</p>
<div class="hero-actions">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":4,"qty":1,"info":"Australia"}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Get On the Rise — $395 a year</button>
</form>
<a href="odoo-hosting-2027.html" class="btn btn-outline btn-lg">Compare every way to host Odoo</a>
</div>
</div>
</section>
<!-- Community edition -->
<section class="section-light">
<div class="container">
<p class="section-kicker">What you are actually buying</p>
<h2 class="section-title">Community edition, hosted for you</h2>
<div class="au-body">
<p>
Your stock, your orders, your invoices, your customers, your sales and your accounting — all in one
system. Odoo Community is the free, open-source version of Odoo, and nobody charges you a licence
for it. We host it on our own servers, run it, patch it and back it up, so the only thing you touch
is the business inside it.
</p>
<p>
You could install Odoo Community on a server yourself. Many people do, for the first month. Then the
certificate expires, the disk fills up, an update breaks something at 9pm on a Tuesday, and the
evenings you were going to spend on the business go into a machine instead. That job does not have
to exist. We keep the server. You keep the business.
</p>
<p>
Every plan runs Odoo Community, and every plan includes the whole application set — not a cut-down
version. Adding your own apps is a plan choice, not a hidden extra: from On the Rise upwards you add
custom and third-party apps, a one-click install or ask us. Side Hustle is the smaller plan, and it
does not include module installation.
</p>
</div>
<p class="au-pull">We do not sell Odoo. We sell a business that runs.</p>
</div>
</section>
<!-- Pricing -->
<section class="section-dark" id="pricing">
<div class="container">
<p class="section-kicker">Order &amp; pricing</p>
<h2 class="section-title">What Odoo hosting costs in Australia</h2>
<div class="au-body">
<p>
Four plans, one price each, one bill a year. The Sydney region does not cost more than any other
region we run — an Australian business pays the same as everyone else.
</p>
<p>
Prices are in US dollars and billed yearly. Tax is added at checkout, and the charge is made in US
dollars — an Australian card is converted by the bank that issued it, so the amount on your statement
moves with the exchange rate. There is no setup fee and no per-user charge, because Odoo Community
has no per-user licence. You pay by Stripe, and you can cancel at any time.
</p>
<p>
On the Rise is the plan we recommend for a trading or service business: it carries the modules and the
more-than-one-domain setup a real business needs, and it is the one to pick when you are not sure.
</p>
</div>
<p class="au-pricing-note">Every plan is live in about five minutes.</p>
<div class="cmp-table-wrap">
<table class="cmp-table">
<caption class="cmp-sr-only">
ODOO4projects plans, billed yearly in US dollars, with tax added at checkout
</caption>
<thead>
<tr>
<th scope="col">Plan</th>
<th scope="col">Price (USD / year)</th>
<th scope="col">What you get</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Side Hustle</th>
<td><strong>$ 214.00</strong></td>
<td>Automatic backups — no remembering · 1 domain &amp; SSL cert</td>
</tr>
<tr class="is-us">
<th scope="row">On the Rise<span class="au-tag">Recommended</span></th>
<td><strong>$ 395.00</strong></td>
<td>Automatic backups — no remembering · 3 domains &amp; SSL certs · custom and third-party apps — one-click or ask us</td>
</tr>
<tr>
<th scope="row">Powerhouse</th>
<td><strong>$ 595.00</strong></td>
<td>Automatic backups — no remembering · 3 domains &amp; SSL certs · custom and third-party apps — one-click or ask us · 2 workers for reliability</td>
</tr>
<tr>
<th scope="row">Empire</th>
<td><strong>From $ 950.00 — custom quote</strong></td>
<td>For businesses that already run their own server: we run and manage the Odoo service on it · all modules &amp; features · unlimited customisation · priority support &amp; dedicated onboarding</td>
</tr>
</tbody>
</table>
</div>
<p class="au-pricing-note">No setup fee. Stripe payment. Cancel at any time.</p>
<p class="au-pricing-note">
Support is the same on every plan: a support bot for the quick fixes and a human team for everything
else.
</p>
<p class="au-callout">On the Rise — $ 395.00 / year. Billed yearly. No setup fee.</p>
<p class="au-pricing-note">
Prices are in US dollars and tax is added at checkout. Every price on this page is the same as every
other region we host in.
</p>
</div>
</section>
<!-- Running in Sydney -->
<section class="section-light" id="sydney">
<div class="container">
<p class="section-kicker">Our own servers, in Australia</p>
<h2 class="section-title">Running in Sydney</h2>
<div class="au-body">
<p>
We host in Sydney. When you set up your system you choose <strong>Australia (Sydney)</strong> as your
server location, and your system runs on our servers in Australia, not in Europe or the United States.
</p>
<p>
It is the same product as every other region: the same four plans, the same backups, the same
certificates, the same upgrades. Choosing Sydney changes where your system lives, and nothing else
about the deal.
</p>
<p>
If your business is in Perth, Melbourne, Brisbane or anywhere else in the country, this is still your
region. Your team works in the same system wherever they are.
</p>
</div>
<figure class="au-figure">
<img
src="images/city-sydney.webp"
alt="Sydney city skyline"
width="1920"
height="640"
loading="lazy"
decoding="async"
/>
</figure>
</div>
</section>
<!-- odoo.sh comparison -->
<section class="section-dark" id="comparison">
<div class="container">
<p class="section-kicker">Odoo's own hosting, side by side</p>
<h2 class="section-title">Odoo.sh, or managed hosting?</h2>
<div class="au-body">
<p>
odoo.sh is Odoo's own hosting product. It runs Odoo Enterprise on Odoo's platform, and it is built
for a developer workflow — you connect a repository and deploy your changes by pushing a branch. If
your business has a developer on staff and you want Odoo Enterprise, odoo.sh is a legitimate answer,
and we are not going to talk you out of it.
</p>
<p>
We are the other shape of the same idea. We run Odoo <strong>Community</strong> for you, as a managed
service: one flat price a year, no per-user licence, and no repository for you to maintain. Your apps
go in from On the Rise upwards — a one-click install, or ask us — and when you want a new Odoo
version, that is a support ticket rather than a project.
</p>
<p>
The short version: if you want to be the developer, use odoo.sh. If you want the system and not the
job, this page is for you.
</p>
<p>
If you want the line-by-line comparison — including what a self-managed server really costs once your
own hours are counted — it is on our comparison page.
</p>
<p>
<a href="odoo-hosting-2027.html">Compare every way to host Odoo in 2027 &rarr;</a>
</p>
</div>
</div>
</section>
<!-- Australia-wide -->
<section class="section-light">
<div class="container">
<p class="section-kicker">One business to call</p>
<h2 class="section-title">Australia-wide, on our own servers</h2>
<div class="au-body">
<p>
We are the hosting provider, so there is no one in the middle. Your system runs on our infrastructure
in our cloud, and we are the people who answer when something needs doing — one business to call, one
price a year, no project, no consultant by the day.
</p>
<p>
We run six regions around the world, with Sydney for Australia. An Australian business gets a server
in Australia, and the same managed service every other region gets: backups already running, your
certificate issued, your apps installed, your system looked after.
</p>
<p>
You put your own customers, products and stock in during your first week. From then on it is your
system, your data — and if you ever leave, it comes out with you.
</p>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-dark" id="faq">
<div class="container">
<p class="section-kicker">Straight answers</p>
<h2 class="section-title">Questions the price raises</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Where is my data actually stored?</summary>
<div class="cmp-a">
<p>
On our servers in Sydney, Australia. When you choose Australia (Sydney) as your server location,
your system runs there. That is the whole claim we make — we host in Sydney, and we are not going
to dress it up with compliance badges we do not hold.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">How much does Odoo hosting cost in Australia?</summary>
<div class="cmp-a">
<p>
Four plans, all billed yearly in US dollars with tax added at checkout: Side Hustle $ 214.00, On
the Rise $ 395.00, Powerhouse $ 595.00, and Empire from $ 950.00 on a custom quote. No setup fee,
no per-user licence, cancel at any time. The Australian region costs the same as every other
region.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do the backups run automatically?</summary>
<div class="cmp-a">
<p>
Yes — backups run on a schedule without you setting anything up. The number of slots depends on
your plan: one on Side Hustle, four on On the Rise and Powerhouse. Be aware of how they work: the
slots rotate first-in, first-out, so the oldest backup is overwritten when the newest one arrives,
and more slots cost extra. If you need longer history, ask us before you buy, not after.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">How is this different from odoo.sh?</summary>
<div class="cmp-a">
<p>
odoo.sh is Odoo's own hosting, running Odoo Enterprise for a developer workflow — you deploy by
pushing code, and an Odoo Enterprise licence per user sits on top of the hosting. We run Odoo
Community for you as a managed service, at one flat price a year with no per-user licence. If you
have a developer and you want Enterprise, odoo.sh is a fair choice. If you want the business
system without the developer job, we are the simpler one.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Can I add my own apps, or have something built for me?</summary>
<div class="cmp-a">
<p>
Yes. Odoo's own apps are all there on every plan, and from On the Rise upwards you can add custom
and third-party apps — a one-click install, or ask us. Side Hustle does not include module
installation. Empire is the other end of it: for a business that already runs its own server, we
run and manage the Odoo service on it — all modules, unlimited customisation, priority support
and dedicated onboarding.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What if I outgrow my plan?</summary>
<div class="cmp-a">
<p>
You move up without a data migration and without downtime. Upgrade from your Odoo settings and
your instance stays live with your data in place — Side Hustle to On the Rise, or all the way to
Empire.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do you have Australian support hours, or an Australian office?</summary>
<div class="cmp-a">
<p>
No separate Australian support desk is published, and we do not claim an Australian office or
local staff — we would rather say that plainly than imply something we cannot back. What we do
have is the server in Sydney on our own infrastructure, and on every plan the same support: a
support bot for the quick fixes and a human team for everything else. If something is wrong with
your system, you open a ticket and we look at it.
</p>
</div>
</details>
</div>
</div>
</section>
<!-- Final CTA band -->
<section class="section-dark cmp-cta" id="start">
<div class="container">
<p class="cmp-lead">Pick a plan, choose Sydney, and your system is live in about five minutes.</p>
<div class="cmp-cta-actions">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":4,"qty":1,"info":"Australia"}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Get On the Rise — $395 a year</button>
</form>
<a href="odoo-hosting-2027.html" class="btn btn-outline btn-lg">Compare every way to host Odoo</a>
</div>
</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="cmp-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="cmp-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>
</body>
</html>
+119 -3
View File
@@ -1,13 +1,65 @@
{
"posts": [
{
"id": "oca-paraguay-internationalization-hackathon",
"date": "2026-10-29",
"area": "news",
"headline": "ODOO4projects Supports the OCA Paraguay Internationalization Hackathon",
"teaser": "Two online days to push Odoo's Paraguayan localisation forward — and we are supporting them.",
"link": "blog/posts/oca-paraguay-internationalization-hackathon.html",
"image": "https://image.office.odoo4projects.com/img/py_hackathon.png"
},
{
"id": "how-to-install-odoo-modules-using-git",
"date": "2026-10-28",
"area": "deep dive",
"headline": "How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console",
"teaser": "Every business is slightly different, which is why a system that only does the standard thing is only ever half a system",
"link": "blog/posts/how-to-install-odoo-modules-using-git.html",
"image": "https://image.office.odoo4projects.com/img/screenshot_git.png"
},
{
"id": "odoo-community-is-going-online-on-odoo4projects",
"date": "2026-09-28",
"date": "2026-10-27",
"area": "news",
"headline": "ODOO Community Is Going Online on ODOO4projects",
"teaser": "ODOO Community is scheduled to go online on the 06.10.2026. Alongside that step, the team behind ODOO4projects is workin",
"teaser": "ODOO Community is online. Behind that switch we spent the last weeks upgrading our server modules, so every ODOO4project",
"link": "blog/posts/odoo-community-is-going-online-on-odoo4projects.html"
},
{
"id": "track-the-oca-modules-you-actually-use",
"date": "2026-10-24",
"area": "tips",
"headline": "Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day",
"teaser": "Every new Odoo release starts the same routine. You install the latest version, open a browser, and begin clicking throu",
"link": "blog/posts/track-the-oca-modules-you-actually-use.html",
"image": "https://image.office.odoo4projects.com/img/oca_module_status.png"
},
{
"id": "odoo-19-to-20-invoice-migration-with-n8n-and-mcp",
"date": "2026-10-23",
"area": "tips",
"headline": "This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP",
"teaser": "Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on invoice",
"link": "blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html",
"image": "https://image.office.odoo4projects.com/img/much.png"
},
{
"id": "6-tips-to-leverage-the-latest-odoo-management-app-update",
"date": "2026-10-08",
"area": "news",
"headline": "6 Tips to Leverage the Latest Odoo Management App Update",
"teaser": "We've just rolled out a major update to the management app preinstalled on your ODOO4project service. Along with a fresh",
"link": "blog/posts/6-tips-to-leverage-the-latest-odoo-management-app-update.html"
},
{
"id": "odoo-20-is-live-on-our-servers-with-an-mcp-server-and-free-backups",
"date": "2026-10-06",
"area": "news",
"headline": "Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups",
"teaser": "Two weeks. That is how long it took us to bring up Odoo 20 on our servers, with all of the new features that come with i",
"link": "blog/posts/odoo-20-is-live-on-our-servers-with-an-mcp-server-and-free-backups.html"
},
{
"id": "community-vs-enterprise-cost",
"date": "2026-06-27",
@@ -21,8 +73,72 @@
"date": "2026-06-24",
"area": "news",
"headline": "Why ODOO Community is Perfect for Working with AI Agents",
"teaser": "ODOO Community's per-seat licensing model allows each AI agent to have its own access rights without additional costs - a game changer for automation.",
"teaser": "Odoo Community carries no licensing fees, so each AI agent can have its own user account and access rights without additional cost - a game changer for automation.",
"link": "blog/posts/odoocommunity-agents.html"
},
{
"id": "news-platform-update",
"date": "2026-06-24",
"area": "news",
"headline": "Platform Update: New Dashboard, Faster Backups & Smarter Monitoring",
"teaser": "We've rolled out a major platform update with a redesigned dashboard, incremental backups, and AI-powered uptime monitoring.",
"link": "blog/posts/news-platform-update.html"
},
{
"id": "guide-migrate-enterprise",
"date": "2026-06-20",
"area": "guide",
"headline": "How to Migrate from Odoo Community to Enterprise Without Downtime",
"teaser": "A step-by-step guide to migrating your Odoo CE instance to Enterprise edition with zero downtime and full data integrity.",
"link": "blog/posts/guide-migrate-enterprise.html"
},
{
"id": "howto-custom-module",
"date": "2026-06-17",
"area": "howto",
"headline": "Install Custom Odoo Modules via Git – A Practical How-To",
"teaser": "Learn how to install and manage custom Odoo modules directly from Git repositories on your ODOO4projects instance.",
"link": "blog/posts/howto-custom-module.html"
},
{
"id": "news-official-partner",
"date": "2026-06-14",
"area": "news",
"headline": "ODOO4projects Becomes an Official Odoo Ready Partner",
"teaser": "We're thrilled to announce our official partnership with Odoo SA, bringing enterprise-grade hosting to even more businesses.",
"link": "blog/posts/news-official-partner.html"
},
{
"id": "speed-run-backup",
"date": "2026-06-10",
"area": "speed-run",
"headline": "Set Up Automated Backups in Under 2 Minutes",
"teaser": "Protect your Odoo data in moments. This speed-run walks you through enabling automated daily backups with one click.",
"link": "blog/posts/speed-run-backup.html"
},
{
"id": "howto-ai-automation",
"date": "2026-06-06",
"area": "howto",
"headline": "Build AI-Powered Workflows with Odoo & n8n",
"teaser": "Connect Odoo to AI services and automate repetitive tasks using n8n workflows. A hands-on guide for busy operators.",
"link": "blog/posts/howto-ai-automation.html"
},
{
"id": "speed-run-deploy",
"date": "2026-06-02",
"area": "speed-run",
"headline": "Deploy Your First Odoo Instance in 5 Minutes",
"teaser": "From zero to live Odoo instance in under five minutes. Follow this speed-run and see your business apps running instantly.",
"link": "blog/posts/speed-run-deploy.html"
},
{
"id": "my-first-post",
"date": "2026-05-28",
"area": "guide",
"headline": "Getting Started with Odoo Hosting – What You Need to Know",
"teaser": "New to Odoo hosting? This guide covers everything from choosing a plan to configuring your first domain and SSL.",
"link": "blog/posts/my-first-post.html"
}
]
}
@@ -0,0 +1,102 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>6 Tips to Leverage the Latest Odoo Management App Update | ODOO4projects</title>
<meta name="description" content="We've just rolled out a major update to the management app preinstalled on your ODOO4project service. Along with a fresh new look, we've added several powe" />
<link rel="canonical" href="https://odoo4projects.com/blog/posts/6-tips-to-leverage-the-latest-odoo-management-app-update.html" />
<meta property="og:title" content="6 Tips to Leverage the Latest Odoo Management App Update" />
<meta property="og:description" content="We've just rolled out a major update to the management app preinstalled on your ODOO4project service. Along with a fresh new look, we've added several powe" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/20_4server.png" />
<meta name="twitter:card" content="summary_large_image" />
<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 href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" />
<style>
body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
.blog-post h1 { font-family: 'Marcellus', Georgia, serif; font-size: 2.4rem; font-weight: 400; margin: 0 0 0.5rem; color: #0d1b2e; }
.blog-post .post-meta { font-family: Inter, sans-serif; font-size: 0.82rem; color: rgba(23,28,38,0.6); margin-bottom: 2rem; }
.blog-post .post-meta .badge { display: inline-block; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.15em; text-transform: uppercase; color: #c9a227; margin-right: 0.75rem; }
.blog-post .post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.blog-post p { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; }
.blog-post h2 { font-family: 'Marcellus', Georgia, serif; font-size: 1.6rem; font-weight: 400; margin: 2rem 0 0.75rem; color: #0d1b2e; }
.blog-post h3 { font-family: 'Marcellus', Georgia, serif; font-size: 1.25rem; font-weight: 400; margin: 1.5rem 0 0.5rem; color: #0d1b2e; }
.blog-post ul, .blog-post ol { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
.blog-post li { margin-bottom: 0.3rem; }
.blog-post a { color: #8a6f1f; text-decoration: underline; }
.blog-post strong { font-weight: 600; }
.blog-post blockquote { border-left: 3px solid #c9a227; padding-left: 1rem; margin-left: 0; color: rgba(23,28,38,0.7); font-style: italic; }
.back-link { display: inline-block; margin-top: 2rem; font-family: 'Marcellus', Georgia, serif; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.04em; color: #c9a227; text-decoration: none; }
.back-link:hover { text-decoration: underline; }
@media (max-width: 600px) { .blog-post h1 { font-size: 1.7rem; } .blog-post { padding: 2rem 1rem 4rem; } }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "6 Tips to Leverage the Latest Odoo Management App Update",
"datePublished": "2026-10-08",
"url": "https://odoo4projects.com/blog/posts/6-tips-to-leverage-the-latest-odoo-management-app-update.html",
"image": "https://image.office.odoo4projects.com/img/20_4server.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<main class="blog-post">
<span class="badge">news</span>
<h1>6 Tips to Leverage the Latest Odoo Management App Update</h1>
<div class="post-meta">Oct 08, 2026</div>
<img src="https://image.office.odoo4projects.com/img/20_4server.png" alt="6 Tips to Leverage the Latest Odoo Management App Update" class="post-image" loading="lazy" />
<div class="post-body">
<p>We've just rolled out a major update to the management app preinstalled on your ODOO4project service. Along with a fresh new look, we've added several powerful features to make managing your Odoo hosting easier. Here are six practical tips to help you get the most out of them.</p>
<h3>1. Automate hosting tasks with the new MCP server</h3>
<p>The new MCP server lets your agent control your Odoo hosting directly. You can restart the server, upload modules, add or check domains, manage backups, and read logfiles—all without manual intervention. <strong>Tip:</strong> Configure your agent to handle routine maintenance so you can focus on development.</p>
<h3>2. Download and archive logfiles for easier troubleshooting</h3>
<p>You can now download and archive logfiles directly from the app. <strong>Tip:</strong> When debugging an issue, download the relevant logfile to analyze it locally. Archive older logs regularly to keep your system organized and reduce clutter.</p>
<h3>3. Take advantage of the free backup schema</h3>
<p>We've added a <a href="../../index.html#pricing">free backup schema</a> for everyone to improve data security. <strong>Tip:</strong> Make sure backups are scheduled and test restoring from a backup occasionally to ensure your data is safe.</p>
<h3>4. Explore the improved AI server management backend</h3>
<p>The AI server management backend has been upgraded. <strong>Tip:</strong> Spend a few minutes navigating the new interface—you'll find streamlined workflows that make server management more intuitive.</p>
<h3>5. Install modules faster with improved GIT support</h3>
<p>Module installation via GIT has been improved. <strong>Tip:</strong> Use GIT to install or update modules more efficiently, especially when you need to manage versions or deploy across multiple environments.</p>
<h3>6. Get instant help from the AI support bot</h3>
<p>Our <a href="../../support.html">AI support bot</a> has also been improved. <strong>Tip:</strong> When you run into a question, ask the bot first—it's a quick way to get answers without leaving your workflow.</p>
<p>These updates are designed to save you time and give you more control over your Odoo hosting. Ready to try them out? <a href="https://odoo4projects.com">Start your free trial on ODOO4projects.com</a>.</p>
</div>
<a href="../../index.html#blog" class="back-link">&larr; Back to the Blog</a>
</main>
</body>
</html>
+35 -3
View File
@@ -10,7 +10,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/community-vs-enterprise-cost.html"
href="https://odoo4projects.com/blog/posts/community-vs-enterprise-cost.html"
/>
<meta
property="og:title"
@@ -103,6 +103,35 @@
.post-footer a { color: var(--primary); text-decoration: none; }
.post-footer a:hover { text-decoration: underline; }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Odoo Community vs. Enterprise: The Real Cost Breakdown (2026)",
"datePublished": "2026-06-27",
"url": "https://odoo4projects.com/blog/posts/community-vs-enterprise-cost.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -274,13 +303,16 @@
</li>
</ol>
<p>
Until then, Community + quality hosting is the financially smarter choice.
Until then, Community + <a href="../../odoo-hosting-2027.html">quality hosting</a> is the financially smarter choice.
</p>
<p>
When that moment arrives, we take the upgrade on ourselves — what changes, and how we do it for you, is set out on <a href="../../odoo-community-upgrade.html">our Odoo Community upgrade page</a>.
</p>
<div class="cta-box">
<h3>Start with Community, Upgrade When Ready</h3>
<p>
ODOO4projects plans start at $19.40/month — enterprise-grade hosting
ODOO4projects plans start at $214/year — enterprise-grade hosting
for your Odoo Community instance. No lock-in, no per-user fees.
</p>
<a href="../../index.html#pricing" class="btn btn-primary">See Plans</a>
+32 -3
View File
@@ -13,7 +13,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/guide-migrate-enterprise.html"
href="https://odoo4projects.com/blog/posts/guide-migrate-enterprise.html"
/>
<meta
property="og:title"
@@ -172,6 +172,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "How to Migrate from Odoo Community to Enterprise Without Downtime",
"datePublished": "2026-06-20",
"url": "https://odoo4projects.com/blog/posts/guide-migrate-enterprise.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -197,7 +226,7 @@
<ul>
<li>An active Odoo Enterprise subscription key</li>
<li>A full database backup of your CE instance</li>
<li>Your ODOO4projects Powerhouse plan (or higher)</li>
<li>Your ODOO4projects <a href="../../index.html#pricing">Powerhouse plan</a> (or higher)</li>
</ul>
<div class="pro-tip">
<strong>Pro Tip:</strong> Always take a backup before
@@ -217,7 +246,7 @@
the Odoo database management screen. All your data,
workflows, and customizations will be preserved.
</p>
<pre><code>1. Navigate to: https://your-instance.odooprojects.com/web/database/manager
<pre><code>1. Navigate to: https://your-instance.odoo4projects.com/web/database/manager
2. Click "Restore Database"
3. Select your backup file
4. Confirm and wait for completion</code></pre>
@@ -0,0 +1,187 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console | ODOO4projects</title>
<meta name="description" content="Every business is slightly different, which is why a system that only does the standard thing is only ever half a system. Odoo ships with a broad set of apps -" />
<link rel="canonical" href="https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html" />
<meta property="og:title" content="How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console" />
<meta property="og:description" content="Every business is slightly different, which is why a system that only does the standard thing is only ever half a system. Odoo ships with a broad set of apps -" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/screenshot_git.png" />
<meta name="twitter:card" content="summary_large_image" />
<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 href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" />
<style>
body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
.blog-post h1 { font-family: 'Marcellus', Georgia, serif; font-size: 2.4rem; font-weight: 400; margin: 0 0 0.5rem; color: #0d1b2e; }
.blog-post .post-meta { font-family: Inter, sans-serif; font-size: 0.82rem; color: rgba(23,28,38,0.6); margin-bottom: 2rem; }
.blog-post .post-meta .badge { display: inline-block; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.15em; text-transform: uppercase; color: #c9a227; margin-right: 0.75rem; }
.blog-post .post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.blog-post p { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; }
.blog-post h2 { font-family: 'Marcellus', Georgia, serif; font-size: 1.6rem; font-weight: 400; margin: 2rem 0 0.75rem; color: #0d1b2e; }
.blog-post ul, .blog-post ol { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
.blog-post li { margin-bottom: 0.3rem; }
.blog-post a { color: #8a6f1f; text-decoration: underline; }
.blog-post strong { font-weight: 600; }
.blog-post figure { margin: 2rem 0; }
.blog-post figure img { width: 100%; border-radius: 0.75rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.blog-post figcaption { font-family: Inter, sans-serif; font-size: 0.85rem; line-height: 1.6; color: rgba(23,28,38,0.6); margin-top: 0.6rem; }
.back-link { display: inline-block; margin-top: 2rem; font-family: 'Marcellus', Georgia, serif; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.04em; color: #c9a227; text-decoration: none; }
.back-link:hover { text-decoration: underline; }
@media (max-width: 600px) { .blog-post h1 { font-size: 1.7rem; } .blog-post { padding: 2rem 1rem 4rem; } }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console",
"datePublished": "2026-10-28",
"dateModified": "2026-10-28",
"url": "https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html",
"image": "https://image.office.odoo4projects.com/img/screenshot_git.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<main class="blog-post">
<span class="badge">deep dive</span>
<h1>How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console</h1>
<div class="post-meta">October 28, 2026 &middot; Deep Dive</div>
<img src="https://image.office.odoo4projects.com/img/screenshot_git.png" alt="How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console" class="post-image" loading="lazy" />
<div class="post-body">
<p>Every business is slightly different, which is why a system that only does the standard thing is only ever half a system. Odoo ships with a broad set of apps - sales, invoicing, stock, purchasing, projects, website - and on top of that it lets you add <strong>modules</strong>: focused pieces of function that one business needed and someone wrote down properly. Installing a module is the moment your system stops being shipped defaults and starts being yours.</p>
<p>This is the long version of that operation: what a module actually is, where to find a good one, and the two routes into a live instance on our servers - <strong>Quick Git</strong> and <strong>Git</strong>. Read it once and the phrase "just install the module" stops being a mystery.</p>
<h2>1. What an app or a module is - and where to find one</h2>
<p>A module (the words "app" and "module" get used interchangeably, and nobody is being sloppy when they do) is a business capability that has been packaged so the system can pick it up. A stock reservation method, a localisation for your country's tax rules, a dashboard for one department - each of those is a module somewhere.</p>
<p>There are two places worth looking, and they are not equivalent:</p>
<ul>
<li><strong>apps.odoo.com</strong> - the official app store. Largest catalogue, most commercial publishers, and a mixture of quality that ranges from excellent to abandoned.</li>
<li><strong>apps.odoo-community.org</strong> - the Odoo Community Association's own index. Smaller, curated, and built by the people who write Odoo for a living.</li>
</ul>
<p>Search on what the business needs to <em>do</em>, not on what you think the feature is called. "Reserve stock for a customer order" finds better things than "stock module" does.</p>
<h2>2. What you are actually downloading - quality, version, and a folder of files</h2>
<p><strong>A module is a folder of files.</strong> That is the whole secret. It holds a manifest that names it, Python and XML that describe what it does, and whatever assets it needs. Your instance reads that folder. There is no installer in the classic sense, no setup wizard that writes into the operating system - which is exactly why the two routes below are both, essentially, "get the folder in front of the server and tell the server to look again".</p>
<p>Two things decide whether a module is worth your time:</p>
<ol>
<li><strong>Provider quality.</strong> The app store marks modules and providers with quality indicators, and the reviews on the card are worth reading before the description. The best of the lot are the <strong>OCA modules</strong> - they are made with ❤️ by the community association, peer-reviewed, and maintained against new Odoo versions by people who have no incentive to sell you anything.</li>
<li><strong>Version match.</strong> A module is written for one Odoo version. It needs to match the version of <em>your</em> instance. A module built for a different version is not "probably fine" - it is the single most common reason a module misbehaves after installation, and no amount of restarting fixes it.</li>
</ol>
<p><strong>What you get when you download.</strong> Downloading a module gives you a <strong>zip file</strong>, and inside that zip you will often find several <strong>sub-modules, each in its own separate folder</strong>. That detail matters later: the system looks for modules at a certain depth, and a zip that has been unpacked one folder too deep is the second most common reason a module never appears.</p>
<p>Both routes below are described in detail, because they solve the same problem for two different kinds of user.</p>
<h2>3. Two ways to install: Git, or Quick Git</h2>
<p><strong>With Git</strong> you are the professional who wants the full workflow: your own repository per instance, your own keys, your own history, push and pull as you develop.</p>
<p><strong>With Quick Git</strong> you just want the thing working: you upload your zip file and our servers handle all the git work behind it. Same destination, far less to learn.</p>
<p>Pick by who you are. If you are going to develop against the instance, use Git. If you bought a module, got a zip, and want it live this afternoon, Quick Git is the shorter road.</p>
<h2>4. Upload the module: Quick Git</h2>
<p>Everything happens inside your Odoo, in the console we run for you:</p>
<ol>
<li>Go to <strong>settings -&gt; 4server -&gt; GIT/MCP</strong> in your ODOO.</li>
<li>Click on the button <strong>Import Module</strong> and select your ZIP file.</li>
<li>Confirm the upload.</li>
<li>After the upload is confirmed, <strong>restart the server</strong> - and then do the <strong>Update Module List</strong> dance (section 6). Both steps, in that order.</li>
</ol>
<figure>
<img src="https://image.office.odoo4projects.com/img/screenshot_quick_git.png" alt="Settings -&gt; 4server -&gt; GIT/MCP, with the Import Module dialog open: choose the Module .ZIP file, then click Import.">
<figcaption>Quick Git: Settings → 4server → GIT/MCP, then <strong>Import Module</strong> and pick your ZIP.</figcaption>
</figure>
<p>That is the whole procedure. The server unpacks the zip, puts the sub-modules where they belong, and commits them so the change is part of the instance's history rather than a loose file sitting on a disk somewhere.</p>
<h2>5. Upload the module: Git</h2>
<p>For professionals we use Git. Every ODOO instance on our server has its own git repository - one instance, one repo - so your customisations are versioned, reviewable, and portable rather than living in a folder nobody remembers creating.</p>
<p>Setting it up, in order:</p>
<ol>
<li><strong>Create an SSH key.</strong> On your console, create one if you do not already have one:</li>
</ol>
<p><code>ssh-keygen</code></p>
<ol start="2">
<li><strong>Copy the PUBLIC part of that key</strong> - the public part, never the private one - into your ODOO instance, in the field labelled <strong>SSH Public Key</strong>.</li>
<li><strong>Pro tip:</strong> you can add several keys, so you can develop with your team. One key per person, added the same way.</li>
<li><strong>Reboot the server to activate the key.</strong> The key does not count until the reboot has happened.</li>
<li><strong>Clone the repository to your PC.</strong> Use the clone URL and paste it into your command line, so the git repository gets cloned on your machine.</li>
<li><strong>Add your modules and push.</strong> You can install all your custom modules into the <code>custom/</code> folder and push it. Done.</li>
</ol>
<figure>
<img src="https://image.office.odoo4projects.com/img/screenshot_git.png" alt="The GIT/MCP tab: Clone URL, Git Pull and Import Module buttons, the SSH public key field with a pasted ssh-ed25519 key, and the warning that key changes take effect after you save and restart the server.">
<figcaption>The Git route: your <strong>Clone URL</strong>, the <strong>SSH public key</strong> field, and the reminder that a key change needs a save and a restart.</figcaption>
</figure>
<p>From then on, a module in the repository is a module on the server: push, restart, update the module list, and the new function is there.</p>
<h2>6. Troubleshooting, and the Update Module List dance</h2>
<p>When a new module is installed, you need to tell ODOO there is something new. It does not go looking by itself. This is the step people skip, and it is the reason a perfectly installed module "does not work".</p>
<ol>
<li>Go to <strong>Settings</strong>, scroll all the way down, and click on <strong>Activate Developer Mode</strong>.</li>
<li>Go to <strong>Apps</strong> and click on the new menu item <strong>Update APP List</strong>.</li>
<li>Your new modules should be visible - perhaps you need to delete the filter <strong>APPS</strong> by clicking on the X.</li>
</ol>
<p>That last line is the trap. The Apps screen comes with a filter applied, so a module that is installed, matched to the right version, and sitting exactly where it should be can still be invisible - hidden by a filter, not by a problem. Remove the filter and look again before you conclude anything is wrong.</p>
<p>If a module is still not there after you have restarted the server <em>and</em> updated the app list: check the version match first, then check whether the zip unpacked into a folder inside a folder. Those two account for most cases, and both are fixed by getting the folder to the right depth - by uploading the zip again through Quick Git, or by pushing the correctly nested folder through Git.</p>
<h2>7. What this means for the person who owns the business</h2>
<p>You do not have to enjoy any of this. The point of <a href="../../odoo-hosting-2027.html">running your system as a service</a> is that the boring half - the repository, the keys, the restart, the version match - is somebody else's job. Add a capability when the business needs it, not when a project plan says so: a module goes in, the menu item appears, and your team uses it the same day.</p>
<p>If a console is not where you want to spend your afternoon, that is not a gap in your abilities. It is a job that should never have been yours in the first place.</p>
</div>
<a href="../../index.html#blog" class="back-link">&larr; Back to the Blog</a>
</main>
</body>
</html>
+33 -4
View File
@@ -12,7 +12,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/howto-ai-automation.html"
href="https://odoo4projects.com/blog/posts/howto-ai-automation.html"
/>
<meta
property="og:title"
@@ -159,6 +159,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Build AI-Powered Workflows with Odoo & n8n",
"datePublished": "2026-06-06",
"url": "https://odoo4projects.com/blog/posts/howto-ai-automation.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="blog-post-container">
@@ -188,7 +217,7 @@
</ul>
<h2>Example: AI-Powered Lead Scoring</h2>
<p>
Create an n8n workflow that triggers whenever a new lead
Create an <a href="../../odoo-n8n-masterclass/">n8n workflow</a> that triggers whenever a new lead
is created in Odoo CRM. The workflow sends the lead data
to an AI model for scoring and enrichment, then updates
the lead record with the results.
@@ -206,8 +235,8 @@
</div>
<h2>Deploy in Minutes</h2>
<p>
With ODOO4projects, you can deploy n8n alongside your
Odoo instance with a single click. No complex networking
With ODOO4projects, you can <a href="../../odoo-hosting-2027.html">deploy n8n alongside your
Odoo instance</a> with a single click. No complex networking
or security configuration needed &mdash; everything is
pre-configured.
</p>
+32 -3
View File
@@ -13,7 +13,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/howto-custom-module.html"
href="https://odoo4projects.com/blog/posts/howto-custom-module.html"
/>
<meta
property="og:title"
@@ -183,6 +183,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Install Custom Odoo Modules via Git – A Practical How-To",
"datePublished": "2026-06-17",
"url": "https://odoo4projects.com/blog/posts/howto-custom-module.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -198,8 +227,8 @@
<div class="post-content">
<p>
One of the most powerful features of Odoo is its modular
architecture. With ODOO4projects' On the Rise plan and
above, you can install custom modules directly from Git
architecture. With ODOO4projects' <a href="../../index.html#pricing">On the Rise plan and
above</a>, you can install custom modules directly from Git
repositories. Here's how.
</p>
<h2>Step 1: Connect Your Git Repository</h2>
+46 -12
View File
@@ -13,7 +13,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/my-first-post.html"
href="https://odoo4projects.com/blog/posts/my-first-post.html"
/>
<meta
property="og:title"
@@ -183,6 +183,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Getting Started with Odoo Hosting – What You Need to Know",
"datePublished": "2026-05-28",
"url": "https://odoo4projects.com/blog/posts/my-first-post.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -205,8 +234,8 @@
</p>
<h2>Step 1: Choose Your Plan</h2>
<p>
At ODOO4projects we offer four plans designed to grow
with you. If you're just getting started,
At ODOO4projects we offer <a href="../../index.html#pricing">four plans designed to grow
with you</a>. If you're just getting started,
<strong>Side Hustle</strong> gives you a fully
functional Odoo CE instance with 1 backup slot and
domain mapping. As your needs grow, you can upgrade to
@@ -216,8 +245,7 @@
</p>
<div class="pro-tip">
<strong>Pro Tip:</strong> All plans include instant
setup. If you're not satisfied within 30 days, we'll
refund you &mdash; no questions asked.
setup. You can cancel at any time.
</div>
<h2>Step 2: Deploy Your Instance</h2>
<p>
@@ -227,21 +255,27 @@
From there, you can access the Odoo backend and start
configuring your apps.
</p>
<pre><code>Your instance URL: https://yourcompany.odooprojects.com
<pre><code>Your instance URL: https://yourcompany.odoo4projects.com
Admin credentials: sent via email</code></pre>
<h2>Step 3: Map Your Domain</h2>
<p>
Want to use your own domain? Navigate to your account
dashboard and enter your domain name. We'll provide you
with the DNS records to configure. Once your DNS
propagates, we automatically issue a free SSL
certificate via Let's Encrypt.
Want to use your own domain? Point the A record at your
server's IP address at your domain provider, then
restart the server so it picks up the new domain. Then
add the domain inside Odoo under
<strong>Settings &rarr; 4 Server &rarr; Domains</strong>.
Once the DNS propagates, we issue a free SSL certificate
via Let's Encrypt.
</p>
<p>
Domain mapping is not available on the free trial. It is
included from Side Hustle up.
</p>
<h2>Step 4: Start Building</h2>
<p>
With your instance live and your domain mapped, you're
ready to install apps, configure users, and customize
your workflows. Need help? Our support team is just a
your workflows. Need help? Our <a href="../../support.html">support team</a> is just a
message away.
</p>
<div class="cta-box">
+31 -2
View File
@@ -12,7 +12,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/news-official-partner.html"
href="https://odoo4projects.com/blog/posts/news-official-partner.html"
/>
<meta
property="og:title"
@@ -165,6 +165,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "ODOO4projects Becomes an Official Odoo Ready Partner",
"datePublished": "2026-06-14",
"url": "https://odoo4projects.com/blog/posts/news-official-partner.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -184,7 +213,7 @@
</p>
<p>
This certification reflects our commitment to providing
best-in-class hosting infrastructure, expert consulting,
best-in-class <a href="../../odoo-hosting-2027.html">hosting infrastructure</a>, expert consulting,
and exceptional support for Odoo users worldwide.
</p>
<h2>What This Means for You</h2>
+32 -3
View File
@@ -13,7 +13,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/news-platform-update.html"
href="https://odoo4projects.com/blog/posts/news-platform-update.html"
/>
<meta
property="og:title"
@@ -166,6 +166,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Platform Update: New Dashboard, Faster Backups & Smarter Monitoring",
"datePublished": "2026-06-24",
"url": "https://odoo4projects.com/blog/posts/news-platform-update.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -187,7 +216,7 @@
<p>
Your control panel has been completely rebuilt for speed
and clarity. Key metrics &mdash; instance status,
resource usage, backup history &mdash; are now front and
resource usage, <a href="../../support.html">backup history</a> &mdash; are now front and
center. The new dashboard loads 3x faster and works
seamlessly on mobile.
</p>
@@ -207,7 +236,7 @@
</div>
<h2>AI-Powered Monitoring</h2>
<p>
Our new monitoring system uses machine learning to
Our new <a href="../../odoo-hosting-2027.html">monitoring system</a> uses machine learning to
detect anomalies in your instance's performance before
they become problems. You'll receive proactive alerts
with suggested remediation steps.
@@ -0,0 +1,97 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ODOO4projects Supports the OCA Paraguay Internationalization Hackathon | ODOO4projects</title>
<meta name="description" content="Two online days to push Odoo's Paraguayan localisation forward — and we are supporting them." />
<link rel="canonical" href="https://odoo4projects.com/blog/posts/oca-paraguay-internationalization-hackathon.html" />
<meta property="og:title" content="ODOO4projects Supports the OCA Paraguay Internationalization Hackathon" />
<meta property="og:description" content="Two online days to push Odoo's Paraguayan localisation forward — and we are supporting them." />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/py_hackathon.png" />
<meta name="twitter:card" content="summary_large_image" />
<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 href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" />
<style>
body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
.blog-post h1 { font-family: 'Marcellus', Georgia, serif; font-size: 2.4rem; font-weight: 400; margin: 0 0 0.5rem; color: #0d1b2e; }
.blog-post .post-meta { font-family: Inter, sans-serif; font-size: 0.82rem; color: rgba(23,28,38,0.6); margin-bottom: 2rem; }
.blog-post .post-meta .badge { display: inline-block; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.15em; text-transform: uppercase; color: #c9a227; margin-right: 0.75rem; }
.blog-post .post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.blog-post p { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; }
.blog-post h2 { font-family: 'Marcellus', Georgia, serif; font-size: 1.6rem; font-weight: 400; margin: 2rem 0 0.75rem; color: #0d1b2e; }
.blog-post ul { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
.blog-post li { margin-bottom: 0.3rem; }
.blog-post a { color: #8a6f1f; text-decoration: underline; }
.blog-post strong { font-weight: 600; }
.back-link { display: inline-block; margin-top: 2rem; font-family: 'Marcellus', Georgia, serif; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.04em; color: #c9a227; text-decoration: none; }
.back-link:hover { text-decoration: underline; }
@media (max-width: 600px) { .blog-post h1 { font-size: 1.7rem; } .blog-post { padding: 2rem 1rem 4rem; } }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "ODOO4projects Supports the OCA Paraguay Internationalization Hackathon",
"datePublished": "2026-10-29",
"dateModified": "2026-10-29",
"url": "https://odoo4projects.com/blog/posts/oca-paraguay-internationalization-hackathon.html",
"image": "https://image.office.odoo4projects.com/img/py_hackathon.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<main class="blog-post">
<span class="badge">news</span>
<h1>ODOO4projects Supports the OCA Paraguay Internationalization Hackathon</h1>
<div class="post-meta">October 29, 2026 &middot; News</div>
<img src="https://image.office.odoo4projects.com/img/py_hackathon.png" alt="ODOO4projects Supports the OCA Paraguay Internationalization Hackathon" class="post-image" loading="lazy" />
<div class="post-body">
<p>Two online days to push Odoo's Paraguayan localisation forward — and we are supporting them.</p>
<p>The OCA Paraguay community is running an <strong>Internationalization Hackathon</strong> on <strong>12 and 14 November 2026</strong>. It is online, it is free, and it is open to every level: you can develop, test, document or translate.</p>
<h2>What the two days are for</h2>
<ul>
<li><strong>Updating modules to Odoo 19 and 20</strong> — consolidating the 19.0 branch and moving toward the newest versions.</li>
<li><strong>New features</strong> the Paraguayan community needs in day-to-day work.</li>
<li><strong>Testing and documentation</strong> — coverage and clear guides, so more people adopt Odoo here.</li>
</ul>
<h2>Why we support it</h2>
<p>Localisation is the part of open source no vendor ships for you: the chart of accounts, the taxes, electronic invoicing, the labels in your own language. It exists because a community maintains it. <a href="../../odoo-hosting-2027.html">We run Odoo Community hosting</a>, so a stronger Paraguayan localisation is our customers' business — and ours.</p>
<p>Sign up at <strong>oca-py.org</strong>: your name, your GitHub user and how you can contribute. Open to all levels.</p>
</div>
<a href="../../index.html#blog" class="back-link">&larr; Back to the Blog</a>
</main>
</body>
</html>
@@ -0,0 +1,178 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP | ODOO4projects</title>
<meta
name="description"
content="Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on invoice"
/>
<link
rel="canonical"
href="https://odoo4projects.com/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html"
/>
<meta
property="og:title"
content="This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP"
/>
<meta
property="og:description"
content="Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on invoice"
/>
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/much.png" />
<meta name="twitter:card" content="summary_large_image" />
<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
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="../../style.css" />
<style>
:root {
--primary: #714b67;
--dark: #212529;
--border: #e5e3e0;
--radius: 0.6rem;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: Inter, sans-serif;
font-size: 1rem;
line-height: 1.7;
background: #fff;
color: #212529;
}
.container { width: 80%; max-width: 800px; margin: 0 auto; padding: 0 20px; }
@media (max-width: 768px) { .container { width: 100%; } }
.blog-header { padding: 2rem 0; border-bottom: 1px solid var(--border); }
.blog-header a { color: var(--primary); text-decoration: none; font-size: 0.85rem; }
.blog-header a:hover { text-decoration: underline; }
.post-title {
font-family: "Inter Tight", sans-serif;
font-size: clamp(1.5rem, 3vw, 2.2rem);
font-weight: 700; margin: 1.5rem 0 0.5rem; color: var(--dark);
}
.post-meta { color: rgba(33,37,41,0.5); font-size: 0.85rem; margin-bottom: 2rem; }
.post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.post-content h2 {
font-family: "Inter Tight", sans-serif;
font-size: 1.3rem; margin-top: 2rem; color: var(--dark);
}
.post-content p { margin: 1rem 0; color: rgba(33,37,41,0.7); line-height: 1.7; }
.post-content ul, .post-content ol { padding-left: 1.5rem; }
.post-content li { margin: 0.5rem 0; color: rgba(33,37,41,0.7); }
.post-content a { color: var(--primary); }
.post-footer { padding: 2rem 0; border-top: 1px solid var(--border); margin-top: 2rem; }
.post-footer a { color: var(--primary); text-decoration: none; }
.post-footer a:hover { text-decoration: underline; }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP",
"datePublished": "2026-10-23",
"url": "https://odoo4projects.com/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html",
"image": "https://image.office.odoo4projects.com/img/much.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
<div class="blog-header">
<a href="../../index.html#blog">&larr; Back to Blog</a>
</div>
<article>
<h1 class="post-title">This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP</h1>
<div class="post-meta">October 23, 2026 &middot; Tips</div>
<img src="https://image.office.odoo4projects.com/img/much.png"
alt="This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP"
class="post-image" loading="lazy" />
<div class="post-content">
<p>Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on invoice forty. I moved mine <a href="../../odoo-community-upgrade.html">from Odoo 19 to Odoo 20</a> with an <a href="../../odoo-n8n-masterclass/">n8n workflow</a> and the ODOO MCP from much ( available at the APP store for free) pointed at the new system, and the setup is simpler than it sounds: the old invoice goes in as context, the tool writes it into the new Odoo, and the agent handles the mapping in between.</p>
<p>What decides whether this works or turns into a mess is not the automation itself. It is the order of operations and the rules you give the agent.</p>
<h2>Create contacts and products first</h2>
<p>Before a single invoice moves, the contacts and the products need to exist in Odoo 20. I did that the classical Export / Import way</p>
<h2>Three rules for every invoice</h2>
<ol>
<li><strong>Invoice date and number must stay identical.</strong> The imported invoice is not a new document. If the number or the date shifts, your books stop lining up with the old system.</li>
<li><strong>Search for the existing contact and map it.</strong> The agent looks the customer up in Odoo 20 and links it to the invoice with the new ID.</li>
<li><strong>Search for the existing product and map it.</strong> The same logic applies to the product lines.</li>
</ol>
<p>And one hard constraint on top: <strong>do not create a contact or a product</strong>. If something is missing, the import should fail loudly instead of quietly filling your database with near-duplicates.</p>
<h2>The prompt that does the work</h2>
<p>The instructions I hand the agent are short and blunt:</p>
<ul>
<li>Import the invoice from Odoo 19 into Odoo 20.</li>
<li>The old invoice is in this prompt, so use the much MCP tool to write it to the new Odoo.</li>
<li>Invoice date and number must be the same.</li>
<li>The contact already exists, so search for it in the new Odoo and map accordingly.</li>
<li>The product already exists, so search for it in the new Odoo and map accordingly.</li>
<li>Do not create a contact or a product.</li>
</ul>
<p>Nothing about formatting, nothing about rewriting descriptions. The fewer decisions the agent has to make, the more predictable the result.</p>
<h2>Check the result, then go again</h2>
<ul>
<li>Does the invoice number match the source exactly?</li>
<li>Is the invoice date unchanged?</li>
<li>Is it attached to the right contact?</li>
<li>Are the product lines pointing at products that already exist in Odoo 20?</li>
</ul>
<p>Run one invoice, verify it, then let the workflow loose on the rest.</p>
<h2>Why this approach holds up</h2>
<p>Moving invoices between two Odoo systems is really a matching problem. The old system holds the documents, the new one holds the records those documents need to point at. n8n provides the workflow, the MCP tool gives the agent hands inside Odoo 20, and the rules stop it from guessing. Contacts and products first, dates and numbers untouched, lookups instead of creations: that combination is what made the migration boring, which is exactly what you want from an accounting import.</p>
<p>If you are planning the same move, start with the contacts and the products in Odoo 20. Get those right, and the rest of the migration is mostly bookkeeping.</p>
</div>
</article>
<div class="post-footer">
<a href="../../index.html#blog">&larr; Back to all posts</a>
</div>
</div>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
@@ -0,0 +1,82 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups | ODOO4projects</title>
<meta name="description" content="Two weeks. That is how long it took us to bring up Odoo 20 on our servers, with all of the new features that come with it. It is live now.But the version u" />
<link rel="canonical" href="https://odoo4projects.com/blog/posts/odoo-20-is-live-on-our-servers-with-an-mcp-server-and-free-backups.html" />
<meta property="og:title" content="Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups" />
<meta property="og:description" content="Two weeks. That is how long it took us to bring up Odoo 20 on our servers, with all of the new features that come with it. It is live now.But the version u" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/ODOO_20_chatter.png" />
<meta name="twitter:card" content="summary_large_image" />
<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 href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap" rel="stylesheet" />
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="../../style.css" />
<style>
body { background: #0d1b2e; }
.blog-post { max-width: 720px; margin: 0 auto; padding: 3rem 1.5rem 6rem; color: #171c26; background: #faf7f1; min-height: 100vh; }
.blog-post h1 { font-family: 'Marcellus', Georgia, serif; font-size: 2.4rem; font-weight: 400; margin: 0 0 0.5rem; color: #0d1b2e; }
.blog-post .post-meta { font-family: Inter, sans-serif; font-size: 0.82rem; color: rgba(23,28,38,0.6); margin-bottom: 2rem; }
.blog-post .post-meta .badge { display: inline-block; font-size: 0.68rem; font-weight: 600; letter-spacing: 0.15em; text-transform: uppercase; color: #c9a227; margin-right: 0.75rem; }
.blog-post .post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.blog-post p { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; }
.blog-post h2 { font-family: 'Marcellus', Georgia, serif; font-size: 1.6rem; font-weight: 400; margin: 2rem 0 0.75rem; color: #0d1b2e; }
.blog-post h3 { font-family: 'Marcellus', Georgia, serif; font-size: 1.25rem; font-weight: 400; margin: 1.5rem 0 0.5rem; color: #0d1b2e; }
.blog-post ul, .blog-post ol { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
.blog-post li { margin-bottom: 0.3rem; }
.blog-post a { color: #8a6f1f; text-decoration: underline; }
.blog-post strong { font-weight: 600; }
.blog-post blockquote { border-left: 3px solid #c9a227; padding-left: 1rem; margin-left: 0; color: rgba(23,28,38,0.7); font-style: italic; }
.back-link { display: inline-block; margin-top: 2rem; font-family: 'Marcellus', Georgia, serif; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.04em; color: #c9a227; text-decoration: none; }
.back-link:hover { text-decoration: underline; }
@media (max-width: 600px) { .blog-post h1 { font-size: 1.7rem; } .blog-post { padding: 2rem 1rem 4rem; } }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups",
"datePublished": "2026-10-06",
"url": "https://odoo4projects.com/blog/posts/odoo-20-is-live-on-our-servers-with-an-mcp-server-and-free-backups.html",
"image": "https://image.office.odoo4projects.com/img/ODOO_20_chatter.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<main class="blog-post">
<span class="badge">News</span>
<h1>Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups</h1>
<div class="post-meta">Oct 06, 2026</div>
<img src="https://image.office.odoo4projects.com/img/ODOO_20_chatter.png" alt="Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups" class="post-image" loading="lazy" />
<div class="post-body">
<p>Two weeks. That is how long it took us to bring up Odoo 20 on our servers, with all of the new features that come with it. It is live now.</p><p>But the version upgrade is not the whole story. Alongside it, we shipped a set of updates to our <a href="../../odoo-hosting-2027.html">management console</a> — the place where you manage your Odoo hosting from inside Odoo itself.</p><h2>An MCP Server for Your Agent</h2><p>The biggest addition is an MCP server that lets your agent control your Odoo hosting directly. That means an agent can:</p><ul><li>Restart the server</li><li>Upload modules</li><li>Add and check domains</li><li>Manage your backups</li><li>Read the logfiles</li></ul><p>Instead of clicking through menus to handle routine hosting tasks, you can hand them to an agent and stay focused on your actual work.</p><h2>Logfiles You Can Keep</h2><p>Logfiles can now be downloaded and archived. When something needs investigating, you can pull the logs and hold on to them, rather than scrolling through a live view and hoping the relevant lines are still there by the time you look.</p><h2>Free Backups for Everyone</h2><p>We also added a free backup scheme for every customer. Backups are the least glamorous part of hosting and the one you miss most when they are gone. Having a baseline in place for everyone meaningfully improves data security across the board.</p><h2>Better AI Server Management</h2><p>Finally, we improved our AI server management backend — the layer that connects the agent-facing tools to the underlying hosting infrastructure. It is now more capable and better suited to the way these tools are actually used.</p><h2>What It Adds Up To</h2><p>Odoo 20 running on our servers, a console that manages your Odoo from within Odoo, an MCP server that opens hosting tasks up to your agent, downloadable and archivable logfiles, a free backup scheme, and a stronger AI management backend. All of it is available now.</p><p>Take a look at our homepage and <a href="../../index.html#pricing">sign up for a trial</a> to see how it works in practice.</p>
</div>
<a href="../../index.html#blog" class="back-link">&larr; Back to the Blog</a>
</main>
</body>
</html>
@@ -4,10 +4,10 @@
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ODOO Community Is Going Online on ODOO4projects | ODOO4projects</title>
<meta name="description" content="ODOO Community is scheduled to go online on the 06.10.2026. Alongside that step, the team behind ODOO4projects is working hard on upgrading its server modu" />
<meta name="description" content="ODOO Community is online. Behind that switch we spent the last weeks upgrading our server modules, so every ODOO4projects instance now runs on Odoo 20 — same se" />
<link rel="canonical" href="https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html" />
<meta property="og:title" content="ODOO Community Is Going Online on ODOO4projects" />
<meta property="og:description" content="ODOO Community is scheduled to go online on the 06.10.2026. Alongside that step, the team behind ODOO4projects is working hard on upgrading its server modu" />
<meta property="og:description" content="ODOO Community is online. Behind that switch we spent the last weeks upgrading our server modules, so every ODOO4projects instance now runs on Odoo 20 — same se" />
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/ODOO_20_chatter.png" />
<meta name="twitter:card" content="summary_large_image" />
@@ -26,55 +26,70 @@
.blog-post .post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.blog-post p { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; }
.blog-post h2 { font-family: 'Marcellus', Georgia, serif; font-size: 1.6rem; font-weight: 400; margin: 2rem 0 0.75rem; color: #0d1b2e; }
.blog-post h3 { font-family: 'Marcellus', Georgia, serif; font-size: 1.25rem; font-weight: 400; margin: 1.5rem 0 0.5rem; color: #0d1b2e; }
.blog-post ul, .blog-post ol { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
.blog-post ul { font-family: Inter, sans-serif; font-size: 1rem; line-height: 1.7; margin-bottom: 1.2rem; padding-left: 1.5rem; }
.blog-post li { margin-bottom: 0.3rem; }
.blog-post a { color: #8a6f1f; text-decoration: underline; }
.blog-post strong { font-weight: 600; }
.blog-post blockquote { border-left: 3px solid #c9a227; padding-left: 1rem; margin-left: 0; color: rgba(23,28,38,0.7); font-style: italic; }
.back-link { display: inline-block; margin-top: 2rem; font-family: 'Marcellus', Georgia, serif; font-size: 0.9rem; text-transform: uppercase; letter-spacing: 0.04em; color: #c9a227; text-decoration: none; }
.back-link:hover { text-decoration: underline; }
@media (max-width: 600px) { .blog-post h1 { font-size: 1.7rem; } .blog-post { padding: 2rem 1rem 4rem; } }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "ODOO Community Is Going Online on ODOO4projects",
"datePublished": "2026-10-27",
"url": "https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html",
"image": "https://image.office.odoo4projects.com/img/ODOO_20_chatter.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<main class="blog-post">
<span class="badge">news</span>
<h1>ODOO Community Is Going Online on ODOO4projects</h1>
<div class="post-meta">Sep 28, 2026</div>
<div class="post-meta">October 27, 2026 &middot; News</div>
<img src="https://image.office.odoo4projects.com/img/ODOO_20_chatter.png" alt="ODOO Community Is Going Online on ODOO4projects" class="post-image" loading="lazy" />
<div class="post-body">
<p>ODOO Community is scheduled to go online on the&nbsp; 06.10.2026. Alongside that step, the team behind ODOO4projects is working hard on upgrading its server modules, with the goal of delivering the best possible ODOO4projects service on Odoo 20.</p>
<p>ODOO Community is online. Behind that switch we spent the last weeks upgrading our server modules, so every ODOO4projects instance now runs on Odoo 20 — same service, newer engine.</p>
<p>It is an upgrade cycle with more than one headline. Here is what is planned.</p>
<p>Two things moved at once: the platform moved forward, and the parts of Odoo we work with every day moved with it. Here is what we found worth showing.</p>
<h2>An MCP server that lets your coding agent run your instance</h2>
<p>The most interesting piece of this update is an MCP server designed to hand everyday instance management to your coding agent. Instead of switching between tools and dashboards, the agent would be able to handle the routine work directly.</p>
<p>The planned capabilities include:</p>
<h2>What caught our eye in Odoo 20</h2>
<ul>
<li><strong>Reading logfiles</strong> — so problems can be spotted and investigated without digging through them manually.</li>
<li><strong>Restarting your ODOO</strong> — a frequent, mundane task that no longer needs to interrupt your flow.</li>
<li><strong>Pushing new modules</strong> — deploying new functionality as part of the same workflow.</li>
<li><strong>Recurring revenues in CRM</strong> — subscription-style revenue sits next to the pipeline instead of in a spreadsheet beside it.</li>
<li><strong>Click and collect for eCommerce</strong> — customers buy online and pick up locally, which is how a lot of small businesses actually sell.</li>
<li><strong>llms.txt — welcome ChatGPT to your site</strong> — the same idea we use for our own AI-SEO: your site describes itself to AI assistants in a file they can read.</li>
<li><strong>A cleaner website builder</strong> — continued cleanup and a new widget for the site editor.</li>
</ul>
<p>In short: less clicking around, more letting your agent do the operational heavy lifting while you focus on the work that actually moves your project forward.</p>
<h2>The console gets the attention next</h2>
<h2>Analytics with AI on the backend</h2>
<p>We are not done. The next round of work lands in the <a href="../../odoo-hosting-2027.html">management console</a> — and the MCP server that lets your agent restart a server, read the logfiles or install a module is only one part of it. If you run an instance day to day, that is the area to watch.</p>
<p>The second major improvement is on the analytics side. AI is being added to the backend to make the numbers more useful — not just more numerous.</p>
<p>The aim is to surface better, more actionable tips for running your ODOO, so the data you already have starts pointing at concrete improvements instead of leaving you to interpret dashboards on your own.</p>
<h2>What this means for you</h2>
<p>Three things are being prepared at once: a community that is online, server modules upgraded for Odoo 20, and a service layer that leans on AI — both for hands-on instance management through the MCP server and for the insights you get from your analytics.</p>
<p>Details, timing, and the exact shape of each feature will follow as the work progresses. Until then, the direction is clear: a more capable ODOO4projects, built on Odoo 20, and far more automated for the people running it day to day.</p>
<p>Stay tuned so you do not miss the go live — and follow <strong>#ODOO4projects</strong> to keep up with every update as it lands.</p>
<p>Stay tuned: we publish what lands, when it lands.</p>
</div>
<a href="../../index.html#blog" class="back-link">&larr; Back to the Blog</a>
</main>
+40 -10
View File
@@ -8,11 +8,11 @@
</title>
<meta
name="description"
content="ODOO Community's per-seat licensing model allows each AI agent to have its own access rights without additional costs - a game changer for automation."
content="Odoo Community carries no licensing fees, so each AI agent can have its own user account and access rights without additional cost - a game changer for automation."
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/odoocommunity-agents.html"
href="https://odoo4projects.com/blog/posts/odoocommunity-agents.html"
/>
<meta
property="og:title"
@@ -20,7 +20,7 @@
/>
<meta
property="og:description"
content="ODOO Community's per-seat licensing model allows each AI agent to have its own access rights without additional costs - a game changer for automation."
content="Odoo Community carries no licensing fees, so each AI agent can have its own user account and access rights without additional cost - a game changer for automation."
/>
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary_large_image" />
@@ -142,6 +142,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Why ODOO Community is Perfect for Working with AI Agents",
"datePublished": "2026-06-24",
"url": "https://odoo4projects.com/blog/posts/odoocommunity-agents.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container" style="width:80%; max-width:800px; margin:0 auto; padding:0 20px;">
@@ -158,10 +187,11 @@
AI agents are transforming how businesses operate, and
ODOO Community Edition is uniquely positioned to harness
this revolution. Unlike Enterprise, which requires per-user
licenses that scale costs linearly, Community Edition's
per-seat licensing model allows each AI agent to have its
own access rights <strong>without additional costs</strong>
&mdash; a genuine game changer for automation.
licenses that scale costs linearly, Community Edition
carries no licensing fees at all, so each AI agent can have
its own user account and access rights
<strong>without additional costs</strong> &mdash; a
genuine game changer for automation.
</p>
<h2>The Licensing Advantage</h2>
@@ -201,7 +231,7 @@
ODOO Community's robust access control lists (ACLs),
record rules, and security groups let you define
exactly what each agent can see and do. Combined with
the per-seat model, you can have:
granular user accounts, you can have:
</p>
<ul>
<li>
@@ -231,7 +261,7 @@
build agentic workflows.
</p>
<p>
Combined with N8N automation workflows and custom
Combined with <a href="../../odoo-n8n-masterclass/">N8N automation workflows</a> and custom
modules hosted on ODOO4projects, you can create
sophisticated pipelines where AI agents coordinate
across multiple ODOO apps, external services, and
@@ -241,7 +271,7 @@
<h2>Why Host with ODOO4projects?</h2>
<p>
Running AI agents alongside ODOO requires reliable,
scalable infrastructure. Our hosting platform offers:
scalable infrastructure. Our <a href="../../odoo-hosting-2027.html">hosting platform</a> offers:
</p>
<ul>
<li>
+61 -19
View File
@@ -12,7 +12,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/speed-run-backup.html"
href="https://odoo4projects.com/blog/posts/speed-run-backup.html"
/>
<meta
property="og:title"
@@ -150,6 +150,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Set Up Automated Backups in Under 2 Minutes",
"datePublished": "2026-06-10",
"url": "https://odoo4projects.com/blog/posts/speed-run-backup.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -164,42 +193,55 @@
<div class="post-content">
<p>
Data loss is every business owner's nightmare. With
ODOO4projects, you can set up automated daily backups in
under two minutes. Here's the speed-run.
ODOO4projects, backups are already running before you
look — here's how to check them in under two minutes.
</p>
<h2>Step 1: Open Your Dashboard</h2>
<h2>Step 1: Open Your Odoo</h2>
<p>
Log in to your ODOO4projects account and navigate to the
<strong>Backups</strong> tab.
Log in to your Odoo instance — the same login you always
use. There is no separate hosting dashboard to open.
Backups run as a scheduled action inside Odoo, and you
manage them there.
</p>
<h2>Step 2: Enable Automated Backups</h2>
<h2>Step 2: Check the Backup Job</h2>
<p>
Click the toggle to enable automated backups. Choose
your preferred time window and retention period (7, 14,
or 30 days).
Backups are already running for you. To see or adjust
the schedule, turn on Development Mode in Odoo and open
the scheduled action that runs the backup job. You can
review it, adjust it, or trigger it by hand.
</p>
<pre><code>Dashboard &gt; Backups &gt; Enable Automated Backups
Recommended: Daily at 02:00 UTC, 14-day retention</code></pre>
<pre><code>Odoo &gt; Settings &gt; Development Mode (on)
Odoo &gt; Settings &gt; Technical &gt; Scheduled Actions &gt; backup job</code></pre>
<h2>Step 3: You're Done</h2>
<p>
That's it. Your data is now backed up automatically
every day. You can also trigger manual backups anytime
from the same screen.
That's it. Your data is backed up on the schedule, and
you can trigger a backup by hand any time from the same
screen.
</p>
<div class="pro-tip">
<strong>Pro Tip:</strong> For critical data, enable the
30-day retention option and set up a weekly manual
backup before major customizations or upgrades.
<strong>Pro Tip:</strong> Your <a href="../../index.html#pricing">plan</a> decides how many
backups you keep. Side Hustle keeps one, On the Rise and
Powerhouse keep four. When the slots are full the oldest
backup is overwritten and permanently deleted, so before
a major change, download a copy of the database you want
to keep.
</div>
<div class="cta-box">
<h3>Protect Your Business Data</h3>
<p>
All ODOO4projects plans include automated backups.
Every paid plan includes automated backups — one
slot on Side Hustle, four on On the Rise and
Powerhouse. The free trial has none.
</p>
<a href="../../index.html#pricing" class="btn btn-primary"
>Choose a Plan</a
>
</div>
<p>
A backup is the safety net for a single change. When the change is bigger than one
module, a version upgrade or a migration, a staging environment is worth it. Read
<a href="../../odoo-staging-environment/">what a staging environment is, and why you probably do not need one</a>.
</p>
</div>
</article>
<div class="post-footer">
+33 -4
View File
@@ -12,7 +12,7 @@
/>
<link
rel="canonical"
href="https://odooprojects.com/blog/posts/speed-run-deploy.html"
href="https://odoo4projects.com/blog/posts/speed-run-deploy.html"
/>
<meta
property="og:title"
@@ -171,6 +171,35 @@
text-decoration: underline;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Deploy Your First Odoo Instance in 5 Minutes",
"datePublished": "2026-06-02",
"url": "https://odoo4projects.com/blog/posts/speed-run-deploy.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
@@ -184,8 +213,8 @@
<div class="post-meta">June 2, 2026 &middot; Speed Run</div>
<div class="post-content">
<p>
Ready to see Odoo in action? Deploying your first
instance on ODOO4projects takes less time than brewing
Ready to see Odoo in action? <a href="../../odoo-hosting-2027.html">Deploying your first
instance on ODOO4projects</a> takes less time than brewing
your morning coffee. Here's the speed-run.
</p>
<h2>Step 1: Choose a Plan</h2>
@@ -206,7 +235,7 @@
Within 60 seconds, you'll receive your instance URL and
admin credentials. Click the link and log in.
</p>
<pre><code>Instance ready at: https://your-company.odooprojects.com
<pre><code>Instance ready at: https://your-company.odoo4projects.com
User: admin
Password: (check your email)</code></pre>
<h2>Step 4: Start Building</h2>
@@ -0,0 +1,168 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day | ODOO4projects</title>
<meta
name="description"
content="Every new Odoo release starts the same routine. You install the latest version, open a browser, and begin clicking throu"
/>
<link
rel="canonical"
href="https://odoo4projects.com/blog/posts/track-the-oca-modules-you-actually-use.html"
/>
<meta
property="og:title"
content="Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day"
/>
<meta
property="og:description"
content="Every new Odoo release starts the same routine. You install the latest version, open a browser, and begin clicking throu"
/>
<meta property="og:type" content="article" />
<meta property="og:image" content="https://image.office.odoo4projects.com/img/oca_module_status.png" />
<meta name="twitter:card" content="summary_large_image" />
<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
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="../../style.css" />
<style>
:root {
--primary: #714b67;
--dark: #212529;
--border: #e5e3e0;
--radius: 0.6rem;
}
* { box-sizing: border-box; }
body {
margin: 0;
font-family: Inter, sans-serif;
font-size: 1rem;
line-height: 1.7;
background: #fff;
color: #212529;
}
.container { width: 80%; max-width: 800px; margin: 0 auto; padding: 0 20px; }
@media (max-width: 768px) { .container { width: 100%; } }
.blog-header { padding: 2rem 0; border-bottom: 1px solid var(--border); }
.blog-header a { color: var(--primary); text-decoration: none; font-size: 0.85rem; }
.blog-header a:hover { text-decoration: underline; }
.post-title {
font-family: "Inter Tight", sans-serif;
font-size: clamp(1.5rem, 3vw, 2.2rem);
font-weight: 700; margin: 1.5rem 0 0.5rem; color: var(--dark);
}
.post-meta { color: rgba(33,37,41,0.5); font-size: 0.85rem; margin-bottom: 2rem; }
.post-image { width: 100%; border-radius: 0.75rem; margin-bottom: 2rem; box-shadow: 0 2px 8px rgba(13,27,46,0.08); }
.post-content h2 {
font-family: "Inter Tight", sans-serif;
font-size: 1.3rem; margin-top: 2rem; color: var(--dark);
}
.post-content p { margin: 1rem 0; color: rgba(33,37,41,0.7); line-height: 1.7; }
.post-content ul, .post-content ol { padding-left: 1.5rem; }
.post-content li { margin: 0.5rem 0; color: rgba(33,37,41,0.7); }
.post-content a { color: var(--primary); }
.post-footer { padding: 2rem 0; border-top: 1px solid var(--border); margin-top: 2rem; }
.post-footer a { color: var(--primary); text-decoration: none; }
.post-footer a:hover { text-decoration: underline; }
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day",
"datePublished": "2026-10-24",
"url": "https://odoo4projects.com/blog/posts/track-the-oca-modules-you-actually-use.html",
"image": "https://image.office.odoo4projects.com/img/oca_module_status.png",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</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>
</head>
<body>
<div class="container">
<div class="blog-header">
<a href="../../index.html#blog">&larr; Back to Blog</a>
</div>
<article>
<h1 class="post-title">Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day</h1>
<div class="post-meta">October 24, 2026 &middot; Tips</div>
<img src="https://image.office.odoo4projects.com/img/oca_module_status.png"
alt="Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day"
class="post-image" loading="lazy" />
<div class="post-content">
<p>Every new Odoo release starts the same routine. You install the latest version, open a browser, and begin clicking through your favourite OCA repositories to find out which modules have been ported — and which ones you will have to live without for a while.</p>
<p>We do the same thing. So we automated it. Our <a href="../../index.html#ocaModules">homepage</a> now carries a live table of the OCA modules we rely on most, checked and updated by our robots on a daily basis.</p>
<h2>Why a tracker is worth having</h2>
<p>OCA porting work happens at its own pace. Maintainers volunteer their time, and a module that is solid on one version can sit unported on the next for weeks or months. Checking manually means guessing, and guessing during an <a href="../../odoo-community-upgrade.html">upgrade project</a> is expensive — you plan around a module that is not ready, or you delay a migration that was actually fine to start.</p>
<p>A tracker turns that guesswork into a glance. That is the whole point.</p>
<h2>What we are tracking right now</h2>
<p>The current list covers the modules we reach for most often, across utilities, accounting and field service:</p>
<ul>
<li><strong>Mail Tracker</strong> — Utilities</li>
<li><strong>Account Reconciliation</strong> — Accounting</li>
<li><strong>Account Statements</strong> — Accounting</li>
<li><strong>Currency Rate Update</strong> — Accounting</li>
<li><strong>Enable Accounting</strong> — Accounting</li>
<li><strong>Base</strong> — Field Service</li>
</ul>
<p>Each row shows the module's area plus its status on 19.0 and 20.0. At the time of writing, every module on the list is ready for 19.0, while 20.0 is still marked as pending across the board. That dash is simply the honest answer, and it flips the moment the port lands.</p>
<h2>How to get the most out of it</h2>
<ol>
<li><strong>Check it before you commit to an upgrade plan.</strong> If the module your operations depend on is not ported yet, you want to know that in the planning phase, not the week before go-live.</li>
<li><strong>Use it as a shortlist, not a verdict.</strong> The tracker tells you what is available. It does not tell you whether a module fits your data model or your processes — that part is still your call.</li>
<li><strong>Revisit it rather than bookmarking it once.</strong> Because the table refreshes daily, the useful habit is a quick check whenever you are scoping work on a new version.</li>
<li><strong>Watch the gap between versions.</strong> A module that is green on 19.0 and pending on 20.0 tells you exactly where to plan extra time.</li>
</ol>
<h2>Missing something you cannot work without</h2>
<p>The list is ours, but it does not have to stay that way. If there is an OCA module you check every single release — a localisation, an accounting edge case, a field service helper — tell us and we will add it to the tracker so it gets checked alongside the rest.</p>
<p>You can find the live table on <a href="https://odoo4projects.com">ODOO4projects.com</a>, or leave your favourite OCA module in the comments and we will take it from there.</p>
</div>
</article>
<div class="post-footer">
<a href="../../index.html#blog">&larr; Back to all posts</a>
</div>
</div>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
+677
View File
@@ -0,0 +1,677 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Odoo in 5 Minuten einsatzbereit mit vollständig verwaltetem Hosting. Automatische Backups, SSL, Git-basierte Module und 6 Standorte weltweit." />
<title>ODOO4projects | Odoo in 5 Minuten einsatzbereit — vollständig verwaltetes Hosting</title>
<link rel="canonical" href="https://odoo4projects.com/de/" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/" />
<meta property="og:title" content="ODOO4projects | Odoo in 5 Minuten einsatzbereit — vollständig verwaltetes Hosting" />
<meta property="og:description" content="Odoo in 5 Minuten einsatzbereit mit vollständig verwaltetem Hosting. Automatische Backups, SSL und Git-basierte Modulverwaltung." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/de/" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="/images/favicon.ico" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"description": "Odoo-Hosting mit vollständig verwalteter Infrastruktur. In 5 Minuten einsatzbereit — mit automatischen Backups, SSL und Git-basierten Modulen.",
"foundingDate": "2020",
"contactPoint": { "@type": "ContactPoint", "contactType": "customer support", "url": "https://odoo4projects.com/support.html#contact" },
"sameAs": ["https://www.linkedin.com/company/odoo4projects/"],
"offers": [
{ "@type": "Offer", "name": "Side Hustle", "price": "214.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "On the Rise", "price": "395.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "Powerhouse", "price": "595.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "Empire", "price": ">950.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" }
]
}
</script>
<script type="application/json" id="agent-skills">
{
"skills": [
{
"name": "spin_up_free_trial",
"description": "Spin up a free trial of ODOO4projects.",
"when_to_use": [
"User wants to create an ODOO4projects free trial",
"User asks to spin up or provision a trial",
"User asks to try ODOO4projects"
],
"offer": {
"type": "free_trial",
"available": true
},
"mcp": {
"server": "https://n8n.odoo4projects.com/mcp/trial"
},
"server_locations": [
{
"name": "Manchester",
"id": "manchester"
},
{
"name": "Sydney",
"id": "sydney"
},
{
"name": "Mumbai",
"id": "mumbai"
},
{
"name": "São Paulo",
"id": "sao-paulo"
},
{
"name": "Meppel",
"id": "meppel"
},
{
"name": "Boston",
"id": "boston"
}
],
"workflow": [
"Use the ODOO4projects trial MCP server to create the free trial.",
"If the user specifies a server location, use that location.",
"If no server location is specified, ask the user which available location they prefer.",
"After signup, the user will receive a confirmation email.",
"The user must confirm the trial using the confirmation email.",
"After the trial is confirmed, the user will receive their ODOO4projects credentials."
],
"instruction": "When the user requests a free trial, use the ODOO4projects trial MCP server to provision it. Do not claim that the trial is fully activated until the required email confirmation has been completed. Explain that the user will receive a confirmation email after signup and, once confirmed, will receive their credentials."
}
]
}
</script>
<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="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Marcellus&display=swap" />
<link rel="preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Marcellus&display=swap" media="print" onload="this.media='all'" />
<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'" />
<style>
/* critical: Grand Hotel Business Lounge */
*{box-sizing:border-box}
body{margin:0;font-family:Inter,'Segoe UI',sans-serif;font-size:1rem;line-height:1.6;color:var(--ink);background:var(--cream)}
h1,h2,h3,h4{font-family:Marcellus,'Georgia',serif;font-weight:400;line-height:1.15;margin-top:0;margin-bottom:.5rem}
h1{font-size:clamp(2rem,5vw,3.6rem)}h2{font-size:clamp(1.6rem,3.2vw,2.4rem)}h3{font-size:clamp(1.1rem,2vw,1.4rem)}
p{margin-top:0;margin-bottom:1rem}a{color:var(--brass-deep);text-decoration:none}a:hover{color:var(--brass)}img{max-width:100%;height:auto;vertical-align:middle}
@font-face{font-family:'Font Awesome 6 Brands';font-display:swap}@font-face{font-family:'Font Awesome 6 Free';font-display:swap}
:root{--midnight:#0d1b2e;--midnight-2:#12233c;--midnight-3:#162a45;--brass:#c9a227;--brass-bright:#ddb84a;--brass-deep:#8a6f1f;--cream:#f4f0e8;--cream-2:#ece6da;--ivory:#faf7f1;--ink:#171c26;--ink-soft:rgba(23,28,38,.6);--ink-faint:rgba(23,28,38,.38);--line:rgba(23,28,38,.09);--line-brass:rgba(201,162,39,.25);--success:#1e7a46;--radius:.5rem;--radius-lg:1rem;--radius-pill:2rem;--shadow-rest:0 2px 8px rgba(13,27,46,.08);--shadow-hover:0 12px 30px rgba(13,27,46,.16);--shadow-brass:0 8px 20px rgba(201,162,39,.25)}
.container{width:86%;padding:0 1.25rem;margin:0 auto;max-width:1200px}
.btn{display:inline-block;padding:.7rem 2rem;font-family:Marcellus,Georgia,serif;font-size:.9rem;letter-spacing:.04em;text-transform:uppercase;border:1px solid transparent;border-radius:var(--radius);cursor:pointer;text-decoration:none;transition:all .25s}
.btn-brass{background:var(--brass);color:var(--midnight);border-color:var(--brass)}.btn-brass:hover{background:var(--brass-bright);border-color:var(--brass-bright);transform:translateY(-1px);box-shadow:var(--shadow-brass)}
.btn-outline{background:transparent;color:var(--cream);border-color:var(--line-brass)}.btn-outline:hover{border-color:var(--brass);color:var(--brass);background:rgba(201,162,39,.08)}
.btn-lg{padding:.85rem 2.5rem;font-size:1rem}
.hero{background:var(--midnight);padding:4rem 0 0;position:relative;overflow:hidden;min-height:85vh;display:flex;flex-direction:column}
.hero::after{content:'';position:absolute;inset:0;background:linear-gradient(135deg,var(--midnight) 50%,rgba(13,27,46,.4) 100%);opacity:.5;z-index:0}
.hero-bg{position:absolute;inset:0;z-index:0;overflow:hidden}.hero-bg-slide{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:.25;filter:brightness(1.15)saturate(1.1)}
.hero .container{position:relative;z-index:1;flex:1;display:flex;flex-direction:column;justify-content:center}
/* Language selector — top-right of the hero's own top area (page has no site header). CI §1/§2:
brass marks the active language, body colour for the other two; lang.js owns the markup. */
.hero .lang-switch-slot{display:flex;justify-content:flex-end;margin-bottom:1rem}
.hero .lang-switch{color:rgba(255,255,255,.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}
.hero-kicker{font-family:Inter,sans-serif;font-size:.72rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--brass);margin-bottom:.75rem}
.hero h1{color:#fff;max-width:700px;margin-bottom:1rem;font-weight:400}.hero h1 span{color:var(--brass)}
.hero-sub{font-size:1.05rem;color:rgba(255,255,255,.7);max-width:560px;line-height:1.7;margin-bottom:1.5rem}
.hero-stats{display:flex;gap:1.5rem;margin-bottom:2rem;flex-wrap:wrap}.hero-stat{display:flex;align-items:center;gap:.4rem;color:rgba(255,255,255,.65);font-size:.85rem}.hero-stat i{color:var(--brass);font-size:.75rem}
.hero-actions{display:flex;gap:1rem;flex-wrap:wrap;margin-bottom:2rem}
.hero-notice{position:absolute;top:1.25rem;right:1.25rem;z-index:3;display:flex;align-items:center;gap:.55rem;max-width:min(360px,calc(100% - 2rem));padding:.6rem .85rem .6rem 1rem;background:#f5c542;color:var(--midnight);border:1px solid rgba(13,27,46,.14);border-radius:var(--radius);box-shadow:0 8px 24px rgba(13,27,46,.3);font-family:Inter,sans-serif;font-size:.82rem;line-height:1.4;animation:heroNoticeIn .4s cubic-bezier(.16,1,.3,1)}
.hero-notice[hidden]{display:none}
.hero-notice i{color:var(--midnight);font-size:.9rem;flex-shrink:0}
.hero-notice-text{flex:1;min-width:0;overflow-wrap:anywhere}
.hero-notice-close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;border-radius:50%;background:rgba(13,27,46,.12);color:var(--midnight);font-size:1rem;line-height:1;cursor:pointer;transition:background .2s}
.hero-notice-close:hover{background:rgba(13,27,46,.24)}
@keyframes heroNoticeIn{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.server-banner{background:var(--midnight);padding:2rem 0 1.5rem;border-top:1px solid var(--line-brass);border-bottom:1px solid var(--line-brass);position:relative;overflow:hidden}
.server-banner::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 60% 80% at 50% 100%,rgba(201,162,39,.06) 0%,transparent 70%);pointer-events:none}
.server-banner-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem;flex-wrap:wrap;gap:.5rem}
.server-banner-kicker{font-family:Marcellus,Georgia,serif;font-size:1rem;letter-spacing:.08em;text-transform:uppercase;color:var(--brass)}
.server-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:.75rem}
.server-card{background:rgba(255,255,255,.035);border:1px solid rgba(201,162,39,.12);border-radius:var(--radius);padding:1rem .75rem;text-align:center;transition:all .4s cubic-bezier(.16,1,.3,1);position:relative}
.server-card:hover{background:rgba(255,255,255,.06);border-color:rgba(201,162,39,.25)}
.server-card .server-city{font-family:Marcellus,Georgia,serif;font-size:1.05rem;color:#fff;margin-bottom:.15rem}
.server-card .server-region{font-family:Inter,sans-serif;font-size:.68rem;color:rgba(255,255,255,.45);text-transform:uppercase;letter-spacing:.06em}
.server-card.server-best{background:rgba(201,162,39,.1);border-color:var(--brass);box-shadow:0 0 25px rgba(201,162,39,.15),inset 0 0 25px rgba(201,162,39,.04);transform:translateY(-3px)}
.server-card.server-best .server-city{color:var(--brass-bright)}
.hero-city-label{position:absolute;bottom:2rem;right:2rem;background:rgba(13,27,46,.88);border:1px solid var(--line-brass);border-radius:var(--radius);padding:.7rem 1.25rem;color:rgba(255,255,255,.8);font-family:Marcellus,Georgia,serif;font-size:.9rem;z-index:2;transform:translateX(150%);white-space:nowrap;backdrop-filter:blur(6px);pointer-events:none}
.hero-city-label strong{color:var(--brass-bright);font-weight:400}
.section-light{background:var(--cream);padding:3.5rem 0}.section-dark{background:var(--midnight);padding:3.5rem 0}.section-dark h2{color:#fff}
.section-kicker{font-family:Inter,sans-serif;font-size:.68rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--brass);margin-bottom:.5rem;text-align:center}
.section-title{text-align:center;margin-bottom:2rem;color:var(--ink)}.section-dark .section-title{color:#fff}
.pricing-server-row{display:flex;align-items:center;justify-content:center;gap:.75rem;margin-bottom:1.5rem;flex-wrap:wrap}
.pricing-server-row label{font-family:Inter,sans-serif;font-size:.82rem;color:var(--brass);text-transform:uppercase;letter-spacing:.08em}
.pricing-server-select{padding:.5rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.08);color:#fff;font-family:Inter,sans-serif;font-size:.85rem;outline:none;cursor:pointer;min-width:180px}
.pricing-server-select option{background:var(--midnight);color:#fff}
@media(max-width:992px){.server-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:768px){.hero{min-height:auto;padding:3rem 0 0}.hero.has-hero-notice{padding-top:4.75rem}.hero-actions{flex-direction:column}.hero-actions .btn{width:100%;text-align:center}.hero-stats{gap:.75rem}.hero-city-label{bottom:1rem;right:1rem;font-size:.78rem;padding:.5rem .9rem}.hero-notice{top:.75rem;left:.75rem;right:.75rem;max-width:none;font-size:.78rem}}
@media(max-width:576px){.server-grid{grid-template-columns:repeat(2,1fr)}.server-banner-header{flex-direction:column;align-items:flex-start}}
.status-dot{width:7px;height:7px;border-radius:50%;background:var(--brass);display:inline-block;animation:statusPulse 1.2s ease-in-out infinite}
@keyframes statusPulse{0%,100%{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}
.biz-wizard{padding:4rem 0;background:var(--midnight);text-align:center;position:relative;overflow:hidden}
.biz-wizard::after{content:'';position:absolute;inset:0;background:url('/images/city-amsterdam.jpg') center/cover no-repeat;opacity:.04;z-index:0}
.biz-wizard .container{position:relative;z-index:1;max-width:700px}
.biz-wizard h2{font-size:clamp(1.6rem,3.2vw,2.4rem);color:#fff;margin-bottom:.75rem}
.biz-sub{font-size:1rem;color:rgba(255,255,255,.6);max-width:520px;margin:0 auto 2rem;line-height:1.7}
.biz-form{text-align:left}.biz-field{margin-bottom:1.25rem}
.biz-field label{display:block;font-family:Marcellus,Georgia,serif;font-size:.95rem;color:#fff;margin-bottom:.4rem;font-weight:400}
.biz-field textarea{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#fff;font-family:Inter,sans-serif;font-size:.88rem;line-height:1.6;min-height:90px;outline:none;transition:border-color .2s,background .2s;resize:vertical}
.biz-field input[type="email"]{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#fff;font-family:Inter,sans-serif;font-size:.88rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.biz-field input[type="email"]:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.biz-field input[type="email"]::placeholder{color:rgba(255,255,255,.3)}
.biz-field textarea:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.biz-field textarea::placeholder{color:rgba(255,255,255,.3)}
.biz-form .btn-lg{margin-top:.5rem;width:100%}
.biz-checkbox-group{display:flex;flex-direction:column;gap:.6rem;margin-bottom:1rem}
.biz-checkbox{display:flex;align-items:center;gap:.6rem;font-family:Inter,sans-serif;font-size:.85rem;color:rgba(255,255,255,.75);cursor:pointer;user-select:none;transition:color .2s}
.biz-checkbox:hover{color:#fff}
.biz-checkbox input[type="checkbox"]{width:1.05rem;height:1.05rem;accent-color:var(--brass);cursor:pointer;flex-shrink:0}
.biz-success{margin-top:1.5rem}.biz-success i{font-size:2.5rem;color:var(--success);margin-bottom:.75rem}
.biz-success h3{color:#fff;margin-bottom:.5rem}.biz-success p{color:rgba(255,255,255,.65);font-size:.95rem;max-width:480px;margin:0 auto 1.25rem;line-height:1.7}
/* OCA Modules */
.oca-section{padding:3.5rem 0;overflow-x:hidden}
.oca-search-wrap{max-width:400px;margin:0 auto 1.5rem}
.oca-search{width:100%;padding:.7rem 1rem;border-radius:var(--radius-pill);border:1px solid var(--line-brass);background:rgba(255,255,255,.06);color:#fff;font-family:Inter,sans-serif;font-size:.85rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.oca-search:focus{border-color:var(--brass);background:rgba(255,255,255,.1)}
.oca-search::placeholder{color:rgba(255,255,255,.3)}
.oca-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--radius-lg);border:1px solid var(--line-brass);background:rgba(255,255,255,.03)}
.oca-table{width:100%;border-collapse:collapse;min-width:500px}
.oca-table th{padding:.75rem 1rem;text-align:left;font-family:Marcellus,Georgia,serif;font-size:.85rem;letter-spacing:.06em;text-transform:uppercase;color:var(--brass);border-bottom:1px solid var(--line-brass);background:rgba(13,27,46,.5);white-space:nowrap}
.oca-table th:last-child{width:48px;text-align:center}
.oca-table td{padding:.65rem 1rem;font-size:.85rem;color:rgba(255,255,255,.8);border-bottom:1px solid rgba(201,162,39,.08);vertical-align:middle}
.oca-table tbody tr:hover{background:rgba(201,162,39,.06)}
.oca-table tbody tr:last-child td{border-bottom:none}
.oca-check{color:var(--success);font-size:1rem}
.oca-cross{color:rgba(255,255,255,.2);font-size:1rem}
.oca-icon-link{color:var(--brass);font-size:1.1rem;cursor:pointer;transition:color .2s,transform .2s;display:inline-block}
.oca-icon-link:hover{color:var(--brass-bright);transform:scale(1.2)}
.oca-empty{text-align:center;padding:2rem;color:rgba(255,255,255,.4);font-style:italic;display:none}
.oca-loading{text-align:center;padding:2rem;color:rgba(255,255,255,.4);font-size:.88rem}
/* Custom Quote Modal */
.ow-sub{font-size:.95rem;color:var(--midnight);margin-bottom:1.5rem}
.ow-panel input[type="text"],.ow-panel textarea{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#171c26;font-family:Inter,sans-serif;font-size:.88rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.ow-panel input[type="text"]:focus,.ow-panel textarea:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.ow-panel textarea{min-height:100px;resize:vertical}
.ow-panel textarea::placeholder{color:rgba(23,28,38,.3)}
.ow-panel input[type="email"]::placeholder{color:rgba(23,28,38,.3)}
.ow-close{background:var(--midnight);border:1px solid var(--line);color:#fff;font-size:2rem;cursor:pointer;line-height:1;position:absolute;right:1rem;top:1rem;transition:color .2s,background .2s;border-radius:var(--radius);width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center}
.ow-close:hover{color:var(--brass);background:var(--midnight-2)}
/* Custom Quote Modal overrides for biz-field inside ow-panel */
#customQuoteModal .biz-field label{color:#171c26}
#customQuoteModal .biz-field textarea{color:#171c26}
#customQuoteModal .biz-field textarea::placeholder{color:rgba(23,28,38,.3)}
#customQuoteModal .biz-field input[type="email"]{color:#171c26}
#customQuoteModal .biz-field input[type="email"]::placeholder{color:rgba(23,28,38,.3)}
#customQuoteModal .biz-field input[type="text"]{color:#171c26}
#customQuoteModal .biz-field input[type="text"]::placeholder{color:rgba(23,28,38,.3)}
/* Success message sits on the light modal panel, so it needs dark text (the global .biz-success rules target the dark wizard section) */
#customQuoteModal .biz-success h3{color:var(--midnight)}
#customQuoteModal .biz-success p{color:var(--midnight)}
@media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}}
</style>
<link rel="stylesheet" href="/style.css" media="print" onload="this.media='all'" />
<noscript><link rel="stylesheet" href="/style.css" /></noscript>
<!-- 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>
<!--
THESIS: The homepage as a global business lounge concierge desk — midnight blue, brass, marble, city placards for the six regions. The category default (hero + feature grid + pricing grid) is reframed as hospitality: the visitor checks in, reads the rate card, and books a suite.
OWN-WORLD: Midnight blue (#0d1b2e) ground, brass (#c9a227) for every accent and CTA, cream (#f4f0e8) for light surfaces. Marcellus serif for display, Inter for body. Six city photos (Amsterdam, Boston, London, Mumbai, São Paulo, Sydney) as circular placards. Hairline brass rules. Concierge-card features.
STORY: The visitor understands: "I can deploy Odoo in 5 minutes, globally, without DevOps. This is enterprise-grade, but the concierge handles everything." They believe it from the city photos (real regions), the partner logos, the brass CTA, and the "No setup fee. Stripe Payment. Cancel at any time" footer.
FIRST VIEWPORT: Midnight hero with faint Amsterdam skyline. Brass kicker "FULLY MANAGED ODOO COMMUNITY HOSTING". Large serif h1 "Deploy Odoo in 5 Minutes — Fully Managed Hosting". Stats row with brass checks. Brass CTA button "See Plans & Pricing" + ghost "How It Works". Bottom: six city placards (photo + name + region) in a horizontal strip.
FORM: The Grand Hotel Business Lounge (model-pick, user-chosen). Seed key: 7db4dced.
FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review, the verdict, and DESIGN.md.
-->
<!-- Hero -->
<section class="hero">
<div class="hero-notice" id="heroConfirmNotice" role="status" aria-live="polite" hidden>
<i class="fas fa-check-circle" aria-hidden="true"></i>
<span class="hero-notice-text"></span>
<button type="button" class="hero-notice-close" aria-label="Benachrichtigung schließen">&times;</button>
</div>
<div class="container">
<div data-lang-switcher class="lang-switch-slot"></div>
<div class="hero-kicker">Vollständig verwaltetes Odoo Community Hosting</div>
<h1>Odoo in <span>5 Minuten</span> einsatzbereit — vollständig verwaltetes Hosting</h1>
<p class="hero-sub">Starten Sie Ihr System in Minuten — Backups laufen automatisch, Ihre Web-Adresse ist mit SSL gesichert, Module installieren wir auf Wunsch dazu. Kein Techniker nötig.</p>
<div class="hero-stats">
<span class="hero-stat"><i class="fas fa-check-circle"></i> 6 Standorte weltweit</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> In 5 Min. einsatzbereit</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> KI-Support inklusive</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> Backups sofort</span>
</div>
<div class="hero-actions">
<a href="#pricing" class="btn btn-brass">Pläne &amp; Preise ansehen &rarr;</a>
<a href="/de/support.html" class="btn btn-outline">So funktioniert es</a>
</div>
</div>
</section>
<!-- Spinning Up Widget (shown when ?message=spinning_up) -->
<section class="spinning-up" id="spinningUp" style="display:none;">
<div class="container">
<div class="spinning-card">
<i class="fas fa-cog fa-spin"></i>
<h3>Ihre Odoo-Instanz wird eingerichtet</h3>
<p>Wir richten Ihren Odoo Community V20 Server ein. Das dauert in der Regel 2-5 Minuten.</p>
<p class="spinning-note">Sobald alles bereit ist, erhalten Sie eine E-Mail mit Ihren Zugangsdaten.</p>
</div>
</div>
</section>
<!-- Server Status Banner -->
<section class="server-banner" id="serverBanner">
<div class="container">
<div class="server-banner-header">
<span class="server-banner-kicker">Unsere Serverstandorte</span>
</div>
<div class="server-grid">
<div class="server-card"><div class="server-city">Amsterdam</div><div class="server-region">Niederlande</div></div>
<div class="server-card"><div class="server-city">Boston</div><div class="server-region">Vereinigte Staaten</div></div>
<div class="server-card"><div class="server-city">Manchester</div><div class="server-region">Vereinigtes Königreich</div></div>
<div class="server-card"><div class="server-city">Mumbai</div><div class="server-region">Indien</div></div>
<div class="server-card"><div class="server-city">S&atilde;o Paulo</div><div class="server-region">Brasilien</div></div>
<div class="server-card"><div class="server-city">Sydney</div><div class="server-region">Australien</div></div>
</div>
</div>
</section>
<!-- Trust Bar -->
<section class="trust-bar">
<div class="container">
<p class="trust-label">Unternehmen weltweit vertrauen uns</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="Ihr Unternehmen" /><span>Ihr Unternehmen</span></a>
</div>
</div>
</div>
</section>
<!-- Features -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Alles, was Sie brauchen — nichts, was Sie nicht brauchen</h2>
<div class="features-grid">
<div class="feature-card">
<i class="fas fa-rocket"></i>
<h3>In 5 Minuten einsatzbereit</h3>
<p>Kein DevOps-Team nötig. Plan wählen, Region auswählen — Ihr System läuft in Minuten.</p>
</div>
<div class="feature-card">
<i class="fas fa-shield-alt"></i>
<h3>Automatische Backups &amp; SSL</h3>
<p>Backups laufen nach Zeitplan in wechselnden Sicherungspunkten — einer bei Side Hustle, vier bei On the Rise und Powerhouse. Kostenlose SSL-Zertifikate für jede Domain — immer sicher.</p>
</div>
<div class="feature-card">
<i class="fas fa-cubes"></i>
<h3>Verwaltung direkt in Odoo</h3>
<p>Die Zentrale für Ihr gesamtes Geschäft. Keine mehreren Konten nötig — verwalten Sie Anwendungen, Benutzer und Module über eine einzige Benutzeroberfläche.</p>
</div>
<div class="feature-card">
<i class="fas fa-code-branch"></i>
<h3>Modul-Bereitstellung über Git</h3>
<p>Eigene Module per Git hochladen oder Quick Git mit einem Klick nutzen. Kein FTP, kein Aufwand.</p>
</div>
<div class="feature-card">
<i class="fas fa-headset"></i>
<h3>Support-Bot &amp; persönlicher Support</h3>
<p>KI-Support-Bot für schnelle Lösungen. Unser Team für alles andere. Ihre UUID ist Ihr Schlüssel.</p>
</div>
<div class="feature-card-trial" id="trialCard">
<h3>Kostenlos testen</h3>
<p>Starten Sie Ihre 30-tägige Testphase. Keine Kreditkarte nötig.</p>
<form class="trial-form" id="trialForm">
<input type="email" id="trialEmail" placeholder="Ihre E-Mail-Adresse" required />
<select id="trialLocation"></select>
<button type="submit" class="btn btn-brass">Senden</button>
</form>
<div class="trial-success" id="trialSuccess">&#10003; Prüfen Sie Ihr Postfach, um Ihre E-Mail-Adresse zu bestätigen.</div>
</div>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-dark" id="faq">
<div class="container">
<h2 class="section-title">Häufige Fragen</h2>
<div class="faq-grid">
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Was, wenn mein Plan nicht mehr ausreicht?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Wachsen Sie von Side Hustle bis Empire — ohne Datenmigration und ohne Ausfallzeit. Upgraden Sie direkt in den Odoo-Einstellungen: Ihre Instanz bleibt aktiv, Ihre Daten kommen mit.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Kann ich es anpassen?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Ja. On the Rise und höher unterstützen Git-basierte Module. Installieren Sie eigene Anwendungen, entwickeln Sie selbst oder nutzen Sie Quick GIT für die Installation mit einem Klick.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Wie schnell kann ich loslegen?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>In fünf Minuten. Plan wählen, Region auswählen — Ihre Odoo-Instanz läuft. Keine Einrichtungsgebühr. Zahlung über Stripe. Jederzeit kündbar.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Kann ich Odoo Enterprise betreiben?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Powerhouse und Empire sind Enterprise-bereit. Bringen Sie Ihre Lizenz mit — die Infrastruktur stellen wir.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Was kann Odoo Community?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Lager, Buchhaltung, CRM, Vertrieb, Fertigung, Personal — alles in einem System. Kostenlos und vollständig Open Source.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Gibt es ein Partnerprogramm?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Nein. Wettbewerbsfähige Preise für unsere gemeinsamen Kunden liegen in unserem eigenen Interesse.</p></div>
</div>
</div>
<a href="/de/support.html" class="faq-link">Alle Fragen &rarr;</a>
</div>
</section>
<!-- Pricing -->
<section class="section-dark" id="pricing">
<div class="container">
<p class="section-kicker">Tarife & Preise</p>
<h2 class="section-title">Ihr Plan, Ihr Zeitpunkt: jederzeit upgraden</h2>
<div class="pricing-server-row">
<label for="pricingServerLocation">Serverstandort</label>
<select id="pricingServerLocation" class="pricing-server-select"></select>
<label for="pricingOdooVersion">Odoo-Version</label>
<select id="pricingOdooVersion" class="pricing-server-select">
<option value="19.0">19.0 — jede Menge unterstützte OCA-Module</option>
<option value="20.0" selected>20.0 — das Neueste</option>
</select>
</div>
<div class="pricing-grid">
<!-- Side Hustle -->
<div class="pcard">
<div class="pcard-body">
<h3>Side Hustle</h3>
Side Hustle — für den Start
<div class="price">
<strong>$ 214.00</strong>
<small class="price-period">/ Jahr</small>
</div>
<p class="desc">"ODOO Standard .. das ist alles, was mein Unternehmen braucht"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="6">Jetzt kaufen</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Odoo CE in 5 Minuten starten</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatische Backups — kein Merken nötig</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 1 Domain & SSL-Zertifikat</li>
</ul>
</div>
<div class="pcard-foot">Keine Einrichtungsgebühr. Zahlung über Stripe<br />Jederzeit kündbar</div>
</div>
<!-- On the Rise -->
<div class="pcard featured">
<div class="pcard-body">
<h3>On the Rise</h3>
<div class="price">
<strong>$ 395.00</strong>
<small class="price-period">/ Jahr</small>
</div>
<p class="desc">"Ich brauche ein paar Module und professionelle Berichte"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="4">Jetzt kaufen</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Odoo CE in 5 Minuten starten</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatische Backups — kein Merken nötig</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 Domains & SSL-Zertifikate</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Eigene Module über Git/QuickGIT installieren</li>
</ul>
</div>
<div class="pcard-foot">Keine Einrichtungsgebühr. Zahlung über Stripe<br />Jederzeit kündbar</div>
</div>
<!-- Powerhouse -->
<div class="pcard">
<div class="pcard-body">
<h3>Powerhouse</h3>
<div class="price">
<strong>$ 595.00</strong>
<small class="price-period">/ Jahr</small>
</div>
<p class="desc">"ODOO Enterprise ist ein Muss!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="5">Jetzt kaufen</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Odoo CE in 5 Minuten starten</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatische Backups — kein Merken nötig</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 Domains & SSL-Zertifikate</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Eigene Module über Git/QuickGIT installieren</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 2 Worker für mehr Zuverlässigkeit</li>
</ul>
</div>
<div class="pcard-foot">Keine Einrichtungsgebühr. Zahlung über Stripe<br />Jederzeit kündbar</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">/ Jahr</small>
</div>
<p class="desc">"Mein Haus! Mein Pferd! Mein Server!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-empire">Individuelles Angebot anfordern</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Unser Service auf Ihrem Server</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Alle Module & Funktionen</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Unbegrenzte Anpassung</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Priority-Support & persönliches Onboarding</li>
</ul>
</div>
</div>
</div>
<p class="pricing-cta-note">Geld sparen, weniger Verwaltung</p>
<p class="pricing-cta-note"><a href="/de/odoo-hosting-2027.html"><strong>Alle Wege vergleichen, Odoo 2027 zu hosten &rarr;</strong></a></p>
</div>
</section>
<!-- Order Widget -->
<div id="orderWidgetOverlay" class="ow-overlay" onclick="if(event.target===this)closeOrderWidget()">
<div id="orderPanelBuy" class="ow-panel" style="display:none">
<button class="ow-close" onclick="closeOrderWidget()">&times;</button>
<div class="ow-content">
<h2 class="ow-title" id="orderPlanTitle">On the Rise</h2>
<p class="ow-price">
<span class="ow-price-amount" id="orderPlanPrice">$ 395.00</span> <span id="orderPlanPeriod">/ Jahr</span>
<span class="ow-price-tax" id="orderPlanTax">+ MwSt.</span>
</p>
<p class="ow-coupon-msg" id="orderCouponMsg">Fragen vor dem Kauf? Fragen Sie den Assistenten auf dieser Seite.</p>
<p class="ow-yearly-save" id="orderYearlySave">Jährliche Abrechnung. Keine Einrichtungsgebühr.</p>
<label class="ow-field-label" for="orderServerLocation">Serverstandort</label>
<select id="orderServerLocation" class="ow-select">
<option value="USA">Vereinigte Staaten (Boston)</option>
<option value="Brazil">Brasilien (S&atilde;o Paulo)</option>
<option value="India">Indien (Mumbai)</option>
<option value="Australia">Australien (Sydney)</option>
<option value="Netherlands">Niederlande (Amsterdam)</option>
<option value="UK">Vereinigtes Königreich (London)</option>
</select>
<a id="orderBuyBtn" href="/de/support.html#contact" class="btn btn-brass ow-buy">Weiter zu Stripe &rarr;</a>
<p class="ow-note">&#128274; Sichere Stripe-Zahlung &middot; Karte für den Kauf erforderlich, nicht für den Start.</p>
</div>
</div>
</div>
<!-- Custom Quote Modal -->
<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">Individuelles Angebot anfordern</h2>
<p class="ow-sub">Beschreiben Sie uns Ihren Bedarf — wir erstellen Ihnen ein passendes Angebot.</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="Ihr vollständiger Name" required />
</div>
<div class="biz-field">
<label for="cqEmail">E-Mail</label>
<input type="email" id="cqEmail" placeholder="your@email.com" required />
</div>
<div class="biz-field">
<label for="cqRequirements">Ihre Anforderungen</label>
<textarea id="cqRequirements" placeholder="Beschreiben Sie Ihre Anforderungen (wie viele Benutzer? vor Ort oder in der Cloud? wie viele Worker?)" required></textarea>
</div>
<button type="submit" class="btn btn-brass btn-lg">Anfrage senden</button>
</form>
<div class="biz-success" id="customQuoteSuccess" style="display:none">
<i class="fas fa-check-circle"></i>
<h3>Anfrage erhalten</h3>
<p>Wir prüfen Ihre Anforderungen und melden uns in Kürze.</p>
</div>
</div>
</div>
</div>
<!-- Blog -->
<section class="blog-section blog-section-light" id="blog">
<div class="container">
<p class="section-kicker">Aus der Redaktion</p>
<h2 class="section-title">Neueste Beiträge</h2>
<div class="blog-search-wrap">
<input type="text" class="blog-search" id="blogSearch" placeholder="Beiträge durchsuchen …" />
</div>
<div class="blog-grid" id="blogGrid"></div>
<div class="blog-pagination" id="blogPagination"></div>
</div>
</section>
<!-- OCA Modules Status -->
<section class="section-dark oca-section" id="ocaModules">
<div class="container">
<p class="section-kicker">OCA-Module</p>
<h2 class="section-title">Unsere besten OCA-Module</h2>
<div class="oca-search-wrap">
<input type="text" class="oca-search" id="ocaSearch" placeholder="Module durchsuchen …" />
</div>
<div class="oca-table-wrap">
<table class="oca-table" id="ocaTable">
<thead>
<tr>
<th>Modul</th>
<th>Bereich</th>
<th>19.0</th>
<th>20.0</th>
<th></th>
</tr>
</thead>
<tbody id="ocaTbody"></tbody>
</table>
</div>
<div class="oca-empty" id="ocaEmpty">Keine Module entsprechen Ihrer Suche.</div>
<div class="oca-loading" id="ocaLoading">Module werden geladen …</div>
</div>
</section>
<!-- Business Wizard -->
<section class="biz-wizard">
<div class="container">
<p class="section-kicker">Für Ihr Unternehmen</p>
<h2>Ihr persönlicher Odoo-Projektplan</h2>
<p class="biz-sub">Erzählen Sie uns von Ihrem Unternehmen. Die KI erstellt einen individuellen Projektplan mit empfohlenen Modulen, Zeitplan und Roadmap. Den Bericht senden wir Ihnen in Minuten.</p>
<form class="biz-form" id="bizForm">
<div class="biz-field">
<label for="bizDescription">Beschreibung Ihres Unternehmens</label>
<textarea id="bizDescription" placeholder="Beschreiben Sie Ihr Unternehmen — Branche, Größe, aktuelle Software, Teamstruktur …" required></textarea>
</div>
<div class="biz-field">
<label for="bizGoals">Meine Ziele</label>
<textarea id="bizGoals" placeholder="Was möchten Sie mit Odoo erreichen? Vertrieb automatisieren, Lager verwalten, Finanzberichte, CRM …" required></textarea>
</div>
<div class="biz-field">
<label for="bizChallenges">Aktuelle Herausforderungen</label>
<textarea id="bizChallenges" placeholder="Welche Probleme haben Sie? Manuelle Prozesse, Datensilos, Wachstumsschmerzen, fehlende Transparenz …" required></textarea>
</div>
<div class="biz-field">
<label for="bizEmail">Ihre E-Mail</label>
<input type="email" id="bizEmail" placeholder="your@email.com" required />
</div>
<div class="biz-checkbox-group">
<label class="biz-checkbox"><input type="checkbox" id="bizHasHomepage" /> Ich habe bereits eine Website</label>
<label class="biz-checkbox"><input type="checkbox" id="bizUsesOdoo" /> Ich nutze bereits Odoo</label>
<label class="biz-checkbox"><input type="checkbox" id="bizHasDeveloper" /> Ich habe bereits einen Entwickler für Module</label>
</div>
<button type="submit" class="btn btn-brass btn-lg" id="bizSubmitBtn">Meinen Projektplan erstellen &rarr;</button>
</form>
<div class="biz-success" id="bizSuccess" style="display:none">
<i class="fas fa-check-circle"></i>
<h3>Ihr Projektplan wird erstellt</h3>
<p>Sobald er fertig ist, senden wir Ihnen den Bericht per E-Mail. Die KI-Erstellung dauert in der Regel 1-2 Minuten.</p>
</div>
</div>
</section>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="fgrid">
<div>
<h4>Nützliche Links</h4>
<ul>
<li><a href="/de/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/de/odoo-hosting-2027.html">ODOO Hosting in 2027</a></li>
<li><a href="/de/support.html">Support</a></li>
<li><a href="/legal.html">Rechtliches</a></li>
</ul>
</div>
<div>
<h4>Partner</h4>
<div class="partner-list">
<a href="https://oc-guy.com" target="_blank" rel="noopener" class="partner-item"><i class="fas fa-handshake"></i> OC Guy</a>
<a href="https://oca-py.org" target="_blank" rel="noopener" class="partner-item"><i class="fas fa-handshake"></i> OCA Paraguay</a>
<a href="https://OD8N.com" target="_blank" rel="noopener" class="partner-item"><i class="fas fa-handshake"></i> OD8N</a>
</div>
</div>
<div class="fcol-desc">
<h4>Über uns</h4>
<p>Wir bauen clevere, skalierbare Geschäftslösungen: die <strong>Stabilität</strong> von Odoo ERP trifft auf die <strong>Kraft</strong> von KI-Agenten und N8N-Automatisierungen.</p>
<p>Von schlanken Vertriebsprozessen bis zum globalen Rollout: Unser <strong>schlanker, umweltfreundlicher</strong> Ansatz senkt Kosten, steigert die Effizienz und lässt Unternehmen ohne Grenzen wachsen.</p>
</div>
<div>
<h4>Folgen Sie uns</h4>
<div class="social">
<a href="https://www.linkedin.com/company/odoo4projects/" target="_blank" aria-label="LinkedIn"><i class="fab fa-linkedin-in"></i></a>
<a href="https://www.youtube.com/@ODOO4projects" target="_blank" aria-label="YouTube"><i class="fab fa-youtube"></i></a>
</div>
<form class="footer-contact-form" id="footerContactForm">
<input type="email" id="footerContactEmail" placeholder="Ihre E-Mail-Adresse" required />
<div class="footer-textarea-wrap">
<textarea id="footerContactText" placeholder="Ihre Nachricht …" required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Nachricht senden"><i class="fas fa-paper-plane"></i></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 src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="/script.js"></script>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
+887
View File
@@ -0,0 +1,887 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Community Upgrade — für Sie übernommen | ODOO4projects</title>
<meta
name="description"
content="Ein Odoo Community Upgrade erklärt: Was sich ändert, was bricht, die konkreten Befehle und wie wir Ihre Datenbank auf unsere Server migrieren."
/>
<link rel="canonical" href="https://odoo4projects.com/de/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/odoo-community-upgrade.html" />
<meta property="og:title" content="Odoo Community Upgrade — für Sie übernommen" />
<meta
property="og:description"
content="Was sich bei einem Odoo Community Upgrade ändert, die konkreten Befehle für Entwickler und wie wir Ihre Datenbank auf unsere Server migrieren."
/>
<meta property="og:type" content="article" />
<meta property="og:url" content="https://odoo4projects.com/de/odoo-community-upgrade.html" />
<meta property="og:image" content="https://odoo4projects.com/images/hero/amsterdam.webp" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Odoo Community Upgrade — für Sie übernommen" />
<meta
name="twitter:description"
content="Was sich bei einem Odoo Community Upgrade ändert, die konkreten Befehle für Entwickler und wie wir Ihre Datenbank auf unsere Server migrieren."
/>
<meta name="twitter:image" content="https://odoo4projects.com/images/hero/amsterdam.webp" />
<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 Community Upgrade page (page-scoped; additive) ---- */
.oc-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) */
.cmp-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.cmp-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.cmp-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.cmp-brand span {
color: var(--brass);
}
.cmp-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.cmp-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar-links a:hover {
color: var(--brass);
}
.cmp-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.cmp-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar .lang-switch a:hover,
.cmp-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.cmp-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero — the same midnight lounge as the rest of the site, with our own
Amsterdam photo behind the copy. */
.oc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.oc-hero .container {
position: relative;
z-index: 1;
}
.oc-hero h1 span {
color: var(--brass);
}
.oc-hero .hero-sub {
max-width: 700px;
}
.oc-hero-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.25;
filter: brightness(1.15) saturate(1.1);
}
.oc-body {
max-width: 760px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .oc-body {
color: rgba(255, 255, 255, 0.78);
}
.oc-body p:last-child {
margin-bottom: 0;
}
.oc-body strong {
color: var(--ink);
}
.section-dark .oc-body strong {
color: #fff;
}
.oc-pull {
max-width: 760px;
margin: 2rem auto 0;
padding-top: 1.25rem;
border-top: 1px solid var(--line-brass);
font-family: Marcellus, Georgia, serif;
font-size: 1.05rem;
color: var(--ink);
text-align: center;
}
.section-dark .oc-pull {
color: var(--brass-bright);
}
/* Numbered process list */
.oc-steps {
max-width: 820px;
margin: 0 auto;
padding: 0;
list-style: none;
counter-reset: oc-step;
}
.oc-steps li {
position: relative;
counter-increment: oc-step;
padding: 0 0 1.4rem 3.2rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.7;
border-left: 1px solid rgba(201, 162, 39, 0.25);
margin-left: 1rem;
}
.oc-steps li::before {
content: counter(oc-step);
position: absolute;
left: -1.05rem;
top: -0.15rem;
width: 2.1rem;
height: 2.1rem;
display: flex;
align-items: center;
justify-content: center;
font-family: Marcellus, Georgia, serif;
font-size: 1rem;
color: var(--midnight);
background: var(--brass);
border-radius: 50%;
}
.oc-steps li strong {
color: #fff;
font-weight: 600;
}
.oc-steps li:last-child {
padding-bottom: 0;
}
/* Technical section: code cards + substitution notes */
.oc-code {
background: var(--midnight);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1rem 1.15rem;
margin: 1.1rem 0 0;
overflow-x: auto;
box-shadow: var(--shadow-rest);
}
.section-dark .oc-code {
background: var(--midnight-2);
}
/* R1 moved the process list onto a light band and the technical section onto a
dark one, so their text colours have to follow the band, not their old parent. */
.section-light .oc-steps li {
color: var(--ink-soft);
}
.section-light .oc-steps li strong {
color: var(--ink);
}
.section-dark .oc-sub h3 {
color: var(--cream);
}
.section-dark .oc-sub > p,
.section-dark .oc-note {
color: rgba(255, 255, 255, 0.78);
}
.section-dark .oc-note strong {
color: #fff;
}
/* R3 puts the "See the plans" link inside the dark offer band. */
.section-dark .oc-body a {
color: var(--brass-bright);
}
.oc-code code {
display: block;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-size: 0.8rem;
line-height: 1.7;
color: #ece6da;
white-space: pre;
tab-size: 2;
}
.oc-note {
margin: 0.9rem 0 0;
padding: 0.15rem 0 0.15rem 1rem;
border-left: 2px solid var(--brass);
font-size: 0.9rem;
color: var(--ink-soft);
line-height: 1.7;
}
.oc-note p:last-child {
margin-bottom: 0;
}
.oc-sub {
margin-top: 2.25rem;
}
.oc-sub h3 {
color: var(--ink);
margin-bottom: 0.35rem;
}
.oc-sub > p {
color: var(--ink-soft);
line-height: 1.75;
}
/* FAQ */
.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],
.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 .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
}
/* Final CTA band */
.cmp-cta {
text-align: center;
}
.cmp-cta .oc-lead {
font-size: 1.1rem;
color: rgba(255, 255, 255, 0.72);
max-width: 700px;
margin: 0 auto 1.5rem;
line-height: 1.7;
}
.cmp-cta-actions {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 0.5rem;
}
.cmp-cta-actions .btn {
align-self: center;
}
/* Focus states on every CTA */
.btn:focus-visible,
.cmp-topbar-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
@media (max-width: 768px) {
.oc-hero {
padding: 3rem 0 2.5rem;
}
.oc-steps li {
padding-left: 2.6rem;
}
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://odoo4projects.com/odoo-community-upgrade.html#webpage",
"url": "https://odoo4projects.com/odoo-community-upgrade.html",
"name": "Odoo Community Upgrade — für Sie übernommen",
"description": "Ein Odoo Community Upgrade erklärt: Was sich ändert, was bricht, die konkreten Befehle und wie wir Ihre Datenbank auf unsere Server migrieren.",
"inLanguage": "de",
"isPartOf": { "@id": "https://odoo4projects.com/#organization" }
},
{
"@type": "Service",
"name": "Migration der Odoo-Community-Datenbank auf das Hosting von ODOO4projects",
"provider": { "@id": "https://odoo4projects.com/#organization" },
"url": "https://odoo4projects.com/odoo-community-upgrade.html"
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Ist ein Upgrade dasselbe wie ein Update?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nein. Ein Update bringt Ihnen die neueste Fassung der Software, die Sie bereits einsetzen. Ein Upgrade bringt Ihre Datenbank auf eine neue Hauptversion (18 auf 19 oder 19 auf 20) und wandelt die Daten selbst um. Es geht nur in eine Richtung: einen unterstützten Weg zurück gibt es nicht, und es ist keine Lizenzänderung, kein Editionswechsel und kein Hosting-Wechsel."
}
},
{
"@type": "Question",
"name": "Können wir direkt von Odoo 14 auf Odoo 20 upgraden?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nein. Es geht immer nur eine Hauptversion auf einmal: 14 auf 15 auf 16 auf 17 auf 18 auf 19 auf 20. Eine Version zu überspringen ist kein unterstützter Weg. Unser eigener Migrationsservice dokumentiert Unterstützung für Datenbanken auf Odoo 17, 18 und 19, nur Hauptreleases, keine Patch-Releases; ältere Datenbanken brauchen zuerst eine Kompatibilitätsprüfung, die mit einem Support-Ticket beginnt."
}
},
{
"@type": "Question",
"name": "Was passiert mit meiner Historie: Rechnungen, Zahlungen, Anhänge?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Das ist die richtige Frage, und die ehrliche Antwort lautet: Es hängt vom Weg ab. Der OpenUpgrade-Weg — eine Versionsmigration auf Ihrem eigenen Server — nimmt die Datenbank mit und erhält die Historie und die Verknüpfungen zwischen den Datensätzen. Die OpenUpgrade-Dokumentation warnt, dass der andere Weg, Dokumente in ein neues System zu verschieben, nur einen Teil Ihrer Daten rettet und die Historie und die Verknüpfungen zwischen den Datensätzen verliert, zum Beispiel die Rechnungen je Kunde. Unser Service baut Ihnen eine neue Datenbank und bringt Ihre Daten hinein; unser Weg ist also der, nach dem Sie fragen sollten: Bitten Sie uns vor Ihrer Freigabe, genau aufzulisten, welche Datensätze in der neuen Datenbank sein werden und welche nicht. Wir möchten lieber, dass Sie sie stellen, als dass Sie sie annehmen."
}
},
{
"@type": "Question",
"name": "Funktionieren meine individuellen Module weiterhin?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nicht von allein. Ein Modul, das für Ihr Geschäft geschrieben wurde, braucht seinen Code auf der Zielversion, und Umbenennungen, die sonst Daten kosten würden, brauchen eigene Migrationsskripte. Die Odoo-Dokumentation ist hier deutlich: Ein Upgrade ist blockiert, bis es eine Version Ihrer individuellen Module für die Zielversion gibt. Module, die mit Odoo ausgeliefert werden, und Module der Community-Vereinigung bringen ihre eigenen Migrationsskripte mit; Ihre nicht, und die muss jemand schreiben."
}
},
{
"@type": "Question",
"name": "Was kostet es, und wie lange dauert es?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Für den Upgrade-Service veröffentlichen wir weder Preis noch Dauer, und wir erfinden hier auch keine. Was wir veröffentlichen, ist der Anfang: Sie eröffnen ein Support-Ticket, wir prüfen Ihre Datenbank auf Kompatibilität und melden uns bei Ihnen. Wenn Sie es gegen die Eigenleistung abwägen, ist der ehrliche Vergleich nicht die Servermiete, sondern Ihre eigenen Stunden, die auf keiner Rechnung auftauchen."
}
},
{
"@type": "Question",
"name": "Brauche ich einen Entwickler?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Um die Befehle im technischen Abschnitt auszuführen, ja; oder jemanden, der sich im Terminal mit PostgreSQL auskennt. Damit wir es übernehmen, nein: Genau das ist der Sinn des Service. Sie senden die Datenbank, wir bauen das neue System auf unserer Infrastruktur, und Sie erhalten die Zugangsdaten."
}
},
{
"@type": "Question",
"name": "Kann ich das System mit der neuen Version ansehen, bevor es live geht?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Ja, und das sollten Sie. Wer die Arbeit macht, migriert zuerst eine Kopie; das ist die erste Regel des ganzen Prozesses, in der Odoo-Dokumentation wie im OpenUpgrade-Projekt. Und die migrierte Kopie ist das, was Sie prüfen, bevor mit dem System, auf dem Ihr Geschäft läuft, irgendetwas passiert. Unser Service folgt demselben Prinzip: Wir bauen das neue System auf unseren eigenen Servern, und Sie vergleichen es mit dem alten."
}
},
{
"@type": "Question",
"name": "Wir sind woanders gehostet. Können Sie uns trotzdem upgraden?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Ja, genau dafür ist unser Migrationsservice da. Sie eröffnen ein Support-Ticket, wir senden Ihnen ein sicheres Formular zum Hochladen Ihrer Datenbank, richten Ihnen einen neuen Server auf unserer Infrastruktur ein und stellen die Zugangsdaten bereit. Datenbanken auf Odoo 17, 18 und 19, nur Hauptreleases; ältere nach einer Kompatibilitätsprüfung."
}
}
]
}
]
}
</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="cmp-topbar">
<div class="container">
<a class="cmp-brand" href="/de/">ODOO4<span>projects</span></a>
<nav class="cmp-topbar-links" aria-label="Seitenlinks">
<a href="/de/#pricing">Tarife &amp; Preise</a>
<a href="/de/support.html">Support</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero oc-hero">
<div class="hero-bg">
<img
class="oc-hero-img"
src="/images/hero/amsterdam.webp"
alt="Amsterdam in der Abenddämmerung — eine der sechs Regionen, in denen unsere Server laufen"
width="1920"
height="768"
fetchpriority="high"
decoding="async"
/>
</div>
<div class="container">
<p class="hero-kicker">ODOO COMMUNITY UPGRADE</p>
<h1><span>Odoo Community Upgrade</span>: Was sich ändert und wie wir es für Sie übernehmen</h1>
<p class="hero-sub">
Der Sprung auf eine neue Odoo-Hauptversion ist kein Update: Er ist eine Umwandlung Ihrer Datenbank in nur eine Richtung, und nichts, was Sie falsch machen wollen. Hier steht, wie wir das für Sie übernehmen — ein neues System auf unseren eigenen Servern, Ihr bestehendes bleibt unberührt, während wir arbeiten — und darunter die konkreten Befehle, die ein Entwickler ausführen würde.
</p>
<div class="hero-actions">
<a href="/de/support.html#contact" class="btn btn-brass btn-lg">Ticket eröffnen: Sagen Sie uns, welche Version Sie nutzen</a>
<a href="/de/#pricing" class="btn btn-outline btn-lg">Tarife ansehen</a>
</div>
</div>
</section>
<!-- What an upgrade is -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Der Unterschied, auf den es ankommt</p>
<h2 class="section-title">Was ein Odoo Community Upgrade wirklich ist</h2>
<div class="oc-body">
<p>
Odoo benutzt zwei Wörter, die gleich klingen und es nicht sind. Ein <strong>Update</strong> bringt Ihnen die neueste Fassung der Software, die Sie bereits einsetzen. Ein <strong>Upgrade</strong> bringt Ihre Datenbank auf eine neue Hauptversion (18 auf 19 oder 19 auf 20) und wandelt die Daten selbst um. Es geht nur in eine Richtung: einen unterstützten Weg zurück gibt es nicht, und es ist keine Lizenzänderung, kein Wechsel der Edition und kein Wechsel des Hosting-Anbieters.
</p>
<p>Drei Dinge sollten Sie wissen, bevor jemand Ihr System anfasst.</p>
<p>
<strong>Es geht immer nur eine Hauptversion auf einmal.</strong> Ein Sprung von 17 auf 20 sind drei Migrationen, nicht eine: 17 → 18, 18 → 19, 19 → 20. Eine Version zu überspringen ist im gesamten Odoo-Ökosystem kein unterstützter Weg.
</p>
<p>
<strong>Er wird an einer Kopie gemacht, nie an der laufenden Datenbank.</strong> Alle, die darüber geschrieben haben (die eigene Dokumentation von Odoo, das OpenUpgrade-Projekt der OCA und jeder Praktiker, den wir gesehen haben), beginnen mit einem Backup und arbeiten an einer Zweitkopie. Sie erfahren, was kaputtgegangen ist, an der Kopie und nicht vor Ihren Kunden.
</p>
<p>
<strong>Ihre eigenen Anpassungen sind der Teil, der Arbeit macht.</strong> Ein Modul, das für Ihr Geschäft gebaut wurde, zieht nicht von selbst mit: Sein Code muss auf die Zielversion gebracht werden, und Umbenennungen, die sonst Daten kosten würden, brauchen eigene Migrationsskripte. Die Odoo-Dokumentation sagt es unverblümt: Ein Upgrade ist blockiert, bis es Ihre individuellen Module für die Zielversion gibt.
</p>
<p>
Und dann der Weg selbst. Odoo verkauft einen Upgrade-Pfad für Enterprise; für Odoo Community ist die Open-Source-Antwort das OpenUpgrade-Projekt der OCA. Die OpenUpgrade-Dokumentation stellt fest, dass die Odoo Community Edition Migrationen zwischen Hauptversionen nicht unterstützt, und hält fest, dass OpenUpgrade die Lösung ist, die der Gründer von Odoo selbst dafür empfiehlt. Es ist ein echtes Projekt, gepflegt von der Community-Vereinigung, und es ist der Weg, den ein Entwickler auf einer Community-Datenbank nutzt.
</p>
</div>
</div>
</section>
<!-- Our way -->
<section class="section-dark" id="our-way">
<div class="container">
<p class="section-kicker">Der Weg von ODOO4projects</p>
<h2 class="section-title">Der Weg von ODOO4projects: eine neue Datenbank, und wir erledigen die Arbeit</h2>
<div class="oc-body">
<p>
Nichts davon müssen Sie selbst tun. Wenn Ihr Geschäft auf Odoo Community läuft und Sie die Version wechseln wollen, ohne jemanden einzustellen, der die Reihenfolge auf dieser Seite abarbeitet, machen wir stattdessen Folgendes.
</p>
<p>
Sie eröffnen ein Support-Ticket und sagen uns, was Sie haben. Wir sehen uns zuerst Ihre Datenbank an (ihre Version, ihre Anpassungen, ob wir sie überhaupt bewegen können) und sagen Ihnen, was wir finden. Dann senden wir Ihnen einen Link zu einem sicheren Formular, über das Sie Ihre Datenbank hochladen. Sobald wir sie haben, richten wir Ihnen einen neuen Server auf unserer eigenen Infrastruktur ein und übergeben Ihnen die Zugangsdaten. Ihr bestehendes System läuft die ganze Zeit weiter, weil wir es nicht anfassen: Wir arbeiten an der Datenbank, die Sie uns gesendet haben, und an dem neuen Server, den wir gebaut haben.
</p>
<p>
Wenn Sie lieber erst eine Zahl sehen möchten: Welchen Tarif Sie brauchen, hängt von den Modulen ab, die Sie nutzen, und die Tarife finden Sie hier — <a href="/de/#pricing">Tarife ansehen</a>. Das Upgrade selbst ist auf dieser Seite nicht bepreist; wir melden uns bei Ihnen, nachdem wir Ihre Datenbank angesehen haben.
</p>
<p>
Genau dieser letzte Punkt ist der ganze Grund für diesen Weg. Bei unserem Service migrieren Sie nicht abends nach Ladenschluss Ihre laufende Datenbank. Sie sehen sich ein zweites System an, in einer neuen Version, mit Ihren Daten darin, und können beide vergleichen, bevor Sie irgendetwas entscheiden.
</p>
<p>
Unser Migrationsservice dokumentiert Unterstützung für Datenbanken auf Odoo 17, 18 und 19, nur Hauptreleases; Patch-Releases wie 18.1 oder 17.2 werden nirgends in unserem Service unterstützt. Ist Ihre Datenbank älter als 17, helfen wir Ihnen trotzdem, sie auf ein unterstütztes Release zu bringen, aber erst nach einer Prüfung auf Kompatibilität. Neue Instanzen auf unseren Servern können auf Odoo 19 oder Odoo 20 angelegt werden. Wenn Sie gezielt auf 20 wollen, sagen Sie es im Ticket: Die Version, zu der Sie gehen, zählt mehr als die, auf der Sie sind.
</p>
<p>
Auf der KI-Seite ist hier ein Fall, den wir tatsächlich veröffentlicht haben. Rechnungen von Hand von einer Odoo-Instanz in eine andere zu kopieren ist langsam und leicht falsch, also haben wir es stattdessen mit einem Workflow gemacht: Datensätze aus einem Odoo-19-System in ein neues Odoo-20-System geschrieben, angetrieben von einem Automatisierungs-Workflow und einem MCP-Server, der auf das neue System zeigt. Drei Regeln machten es sicher (Rechnungsnummer und Datum ändern sich nie, der Kontakt wird nachgeschlagen statt geraten, das Produkt wird nachgeschlagen statt geraten) und eine harte Vorgabe: Fehlt ein Kontakt oder ein Produkt, bricht der Lauf laut ab, statt einen Fast-Doppelgänger anzulegen. Bevor wir es auf den Rest losließen, haben wir eine Rechnung von Anfang bis Ende geprüft: Nummer, Datum, Kontakt, Positionen.
</p>
<p>
Eines verwischen wir nicht, denn es ist der Unterschied zwischen uns und einem Verkäufer. Der MCP-Server, den wir in unserer eigenen Verwaltungskonsole mitliefern, macht Hosting-Operationen. Er startet einen Server neu, lädt ein Modul hoch, fügt eine Domain hinzu oder prüft sie, verwaltet Backups und liest eine Logdatei; das ist die veröffentlichte Liste, und sie ist eine echte Erleichterung, wenn Sie einen KI-Assistenten nutzen. Er ist keine Datenmigrations-Engine, und wir beschreiben ihn auch nicht als eine. Die Importarbeit oben wurde mit einem Automatisierungs-Workflow und einem MCP von Drittanbietern erledigt; die KI machte den mühsamen Teil und wurde von einem Menschen geprüft, genau wie es sein soll.
</p>
<p>
Und die ehrliche Grenze, in den Worten des Projekts, das sich damit am besten auskennt. Die OpenUpgrade-Dokumentation nennt die Export-und-Import-Alternative und benennt ihren Preis klar: Sie retten nur einen Teil Ihrer Daten, und insbesondere erhalten Sie nicht die Historie und die Verknüpfungen zwischen den Datensätzen, zum Beispiel die Rechnungen je Kunde. Das ist das Risiko jedes Weges, der Dokumente in ein neues System verschiebt, und deshalb stellen Sie uns, wenn Sie diesen Weg mit uns gehen, vor Ihrer Freigabe eine Frage: Welche Datensätze werden in der neuen Datenbank sein und welche nicht? Wir möchten lieber, dass Sie sie stellen, als dass Sie sie annehmen.
</p>
</div>
</div>
</section>
<!-- Process -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Der dokumentierte Weg</p>
<h2 class="section-title">Der Upgrade-Prozess, Schritt für Schritt</h2>
<div class="oc-body">
<p>
Das ist die Reihenfolge, auf die sich die Odoo-Dokumentation, das OpenUpgrade-Projekt und die aufgezeichneten Workshops einig sind. Nichts davon ist unseres und nichts davon ist geheim: Es ist der dokumentierte Weg, in der Reihenfolge, in der er gegangen wird.
</p>
</div>
<ol class="oc-steps">
<li>
<strong>Sichern Sie die Datenbank und wissen Sie, wo der Filestore liegt.</strong> Vor allem anderen. Die Dokumentation des OpenUpgrade-Projekts sagt, dass Sie unbedingt ein Backup der laufenden Datenbank machen müssen, und jeder Praktiker macht das zuerst.
</li>
<li>
<strong>Arbeiten Sie an einer Kopie.</strong> Spielen Sie das Backup in eine Testdatenbank ein und migrieren Sie diese. Ihr laufendes System bleibt unberührt, bis die Kopie funktioniert.
</li>
<li>
<strong>Richten Sie zuerst die Zielversion ein.</strong> Installieren Sie das neuere Odoo und legen Sie den OpenUpgrade-Code für die Zielversion in dessen Add-ons-Pfad, neben die Module, die Sie bereits nutzen.
</li>
<li>
<strong>Portieren Sie Ihre individuellen Module.</strong> Bringen Sie ihren Code auf die neue Version, bevor die Migration läuft.
</li>
<li>
<strong>Führen Sie die Migration an der Kopie aus.</strong> Ein Modul nach dem anderen, in Abhängigkeitsreihenfolge; jedes führt erst sein Pre-Skript aus, dann lädt es, dann sein Post-Skript.
</li>
<li>
<strong>Rechnen Sie damit, sie mehr als einmal auszuführen.</strong> Das ist iterativ. Im aufgezeichneten Workshop ist die Umgebung (Repositories, Branches, die Modulliste) der Teil, der Zeit kostet; der Migrationslauf selbst ist schnell, sobald die Umgebung steht. Sie setzen zurück und laufen erneut, bis das Log sauber ist.
</li>
<li>
<strong>Schließen Sie mit einem einfachen Update ab.</strong> Das Update noch einmal ohne die Migrationsparameter auszuführen, hebt den Zustand „inkompatibel“ auf und lässt die Datenbank nutzbar zurück.
</li>
<li>
<strong>Testen Sie anhand der Daten, nicht anhand der Versionsnummer.</strong> Öffnen Sie die migrierte Kopie und prüfen Sie, was zählt: einen Kunden, ein Produkt, einen Auftrag, eine Rechnung, eine Zahlung. So überprüfen die Praktiker es am Bildschirm.
</li>
<li>
<strong>Räumen Sie danach auf.</strong> Veraltete Tabellen, Spalten und Views, die eine Migration zurücklässt, kosten Leistung; deshalb werden sie entfernt, wenn das System eine Zeit lang läuft und niemand ein Problem gemeldet hat.
</li>
<li>
<strong>Dann geht es in den Produktivbetrieb.</strong> Spielen Sie die migrierte Datenbank dort ein, wo sie hingehört, oder lassen Sie das Upgrade zu einem Zeitpunkt Ihrer Wahl auf der Produktivdatenbank laufen.
</li>
</ol>
<p class="oc-pull">
So sieht es ehrlich aus: Die Vorbereitung ist der lange Teil, die Migration selbst der kurze, und die Kopie ist das, was Sie kaputtmachen dürfen.
</p>
</div>
</section>
<!-- Technical section -->
<section class="section-dark" id="commands">
<div class="container">
<p class="section-kicker">Für Ihre Entwickler</p>
<h2 class="section-title">Für Ihre Entwickler: die konkreten Befehle</h2>
<div class="oc-body">
<p>
Wenn Sie Odoo Community selbst betreiben und das lieber im Haus erledigen möchten, statt es uns zu überlassen, sind das die Befehle. Sie sind aus der jeweiligen Dokumentation übernommen, und bei jedem steht, was Sie einsetzen müssen und wovor die Quelle warnt. Nichts davon haben wir gegen Ihre Datenbank ausgeführt, und kein von uns veröffentlichter Befehl läuft auf unseren eigenen Servern: Unser Service beginnt mit einem Support-Ticket, nicht mit einem Terminal.
</p>
</div>
<div class="oc-sub">
<h3>Odoos Upgrade-Plattform</h3>
<p>
Odoo dokumentiert eine Upgrade-Plattform, die für On-Premise-Installationen über die Kommandozeile funktioniert. Die Odoo-Dokumentation stellt fest, dass die Migrationsskripte, die sie ausführt, nicht Open Source sind und zu Enterprise gehören; die Plattform selbst aber bringt eine selbst gehostete Datenbank auf die neue Version.
</p>
<pre class="oc-code"><code># upgraded TEST database
python &lt;(curl -s https://upgrade.odoo.com/upgrade) test -d &lt;your db name&gt; -t &lt;target version&gt;
# production upgrade
python &lt;(curl -s https://upgrade.odoo.com/upgrade) production -d &lt;your db name&gt; -t &lt;target version&gt;
# general help
python &lt;(curl -s https://upgrade.odoo.com/upgrade) --help</code></pre>
<div class="oc-note">
<p>
<strong>Ersetzen:</strong> <code>&lt;your db name&gt;</code> ist die Datenbank auf der Maschine, auf der Sie den Befehl ausführen, und <code>&lt;target version&gt;</code> ist die Version, zu der Sie wechseln — 17.0, 18.0 oder 19.0, entsprechend dem Versionsauswahlfeld auf unserer eigenen Tarifseite.
</p>
<p>
Was die Odoo-Dokumentation neben diesen drei Zeilen verlangt, weil davon abhängt, ob sie funktionieren: Das Skript braucht die üblichen Linux-Befehle auf der Maschine; der Systembenutzer, der es ausführt, braucht Zugriff auf Ihre PostgreSQL-Datenbank (die übliche PostgreSQL-Client-Umgebung, etwa <code>.pgpass</code>); und die Maschine muss die Upgrade-Plattform auf TCP 443 und auf einem Port im Bereich 32768-60999 erreichen, ein Firewall kann also eine Ausnahme brauchen. Die Kopie, die Sie hochladen, wird ohne Filestore übermittelt, deshalb muss der Produktiv-Filestore in die aktualisierte Datenbank zusammengeführt werden, bevor Sie sie testen. Der Download enthält <code>dump.sql</code> und einen Filestore-Ordner, und nur wer das Upgrade angefordert hat, kann das Ergebnis herunterladen.
</p>
</div>
</div>
<div class="oc-sub">
<h3>Der Community-Weg: OCA OpenUpgrade</h3>
<pre class="oc-code"><code># 1. OpenUpgrade for the TARGET version (the branch is the target major version)
git clone --depth 1 --branch &lt;TARGET&gt;.0 https://github.com/OCA/OpenUpgrade.git
# 2. helper library — the line the OpenUpgrade docs use
pip install "git+https://github.com/OCA/openupgradelib.git@master#egg=openupgradelib"
# 3. put the clone on the add-ons path of the &lt;TARGET&gt; Odoo config
# addons_path = &lt;your own addons&gt;,&lt;/abs/path&gt;/OpenUpgrade
# 4. migrate the copy of the database
&lt;odoo-bin&gt; -c /etc/odoo/&lt;TARGET&gt;.conf \
-d &lt;DB&gt; \
--upgrade-path=/abs/path/OpenUpgrade/openupgrade_scripts/scripts \
-u all --stop-after-init \
--load=base,web,openupgrade_framework
# 5. finish: a plain update, no migration parameters
&lt;odoo-bin&gt; -c /etc/odoo/&lt;TARGET&gt;.conf -d &lt;DB&gt; -u all --stop-after-init</code></pre>
<div class="oc-note">
<p>
<strong>Vier Dinge ersetzen:</strong> <code>&lt;TARGET&gt;</code> ist die Ziel-Hauptversion (17, 18 oder 19 — nicht die Version, von der Sie kommen); <code>&lt;DB&gt;</code> ist die Kopie, die Sie migrieren, nie die laufende Datenbank; <code>&lt;odoo-bin&gt;</code> ist die Binärdatei der Zielversion, und wie sie heißt, hängt davon ab, wie Sie Odoo installiert haben (<code>odoo-bin</code>, <code>odoo</code> oder das Docker-Äquivalent); und beide absoluten Pfade sind Ihre eigenen — der Add-ons-Pfad und der Ort des OpenUpgrade-Klons.
</p>
<p>
Zwei Details aus der eigenen Dokumentation des Projekts, die man mitnehmen sollte: Der <code>openupgrade_framework</code>-Teil dieses Befehls ist eine Reihe von Patches, die unter anderem verhindern, dass Odoo die Spalten und Tabellen von Feldern löscht, die es nicht mehr gibt — einer der Wege, auf denen eine Migration Daten verliert. Und die Umgebungsvariable <code>OPENUPGRADE_USE_DEMO=yes</code> behält die Demodaten in der migrierten Datenbank, wenn Sie sie wollen.
</p>
</div>
</div>
<div class="oc-sub">
<h3>Ihre individuellen Module</h3>
<pre class="oc-code"><code># Odoo's own code-rewrite command (it runs the scripts in odoo/upgrade_code)
&lt;odoo-bin&gt; upgrade_code --from &lt;FROM&gt; --to &lt;TO&gt; --dry-run</code></pre>
<div class="oc-note">
<p>
<strong>Ersetzen Sie</strong> <code>&lt;FROM&gt;</code> und <code>&lt;TO&gt;</code> durch die beiden Hauptversionen (zum Beispiel 18 und 19). Führen Sie es zuerst mit <code>--dry-run</code> aus. Die eigene Befehlsreferenz von Odoo nennt diesen Befehl ein „Best-Effort“-Werkzeug und warnt, dass er „keine Silberkugeln“ ist: Er schreibt um, was er kann, und hinterlässt Ihnen eine Liste dessen, was ein Mensch noch ändern muss. Das Gegenstück der OpenUpgrade-Community für Modulcode ist <code>odoo-module-migrator</code>, das INFO für automatische Änderungen, WARNING für prüfenswerte Dinge und ERROR für Dinge protokolliert, die gar nicht funktionieren. Beide Werkzeuge berichten; keines denkt.
</p>
</div>
</div>
<div class="oc-sub">
<h3>Backups und der Filestore</h3>
<pre class="oc-code"><code># stop the service while you work (packaged install; the Odoo docs show this pattern)
sudo service odoo&lt;TARGET&gt; stop
# database dump (PostgreSQL's own tool)
sudo -u postgres pg_dump -Fc -d &lt;DB&gt; -f /path/backup/&lt;DB&gt;.dump
# restore a dump into a fresh database
sudo -u postgres createdb -O &lt;DB_OWNER&gt; &lt;DB_NEW&gt;
sudo -u postgres pg_restore -d &lt;DB_NEW&gt; /path/backup/&lt;DB&gt;.dump
# the filestore lives under Odoo's data directory:
# default on Unix: $XDG_DATA_HOME or ~/.local/share/Odoo or /var/lib/Odoo
# filestore path: &lt;data_dir&gt;/filestore/&lt;DB&gt;</code></pre>
<div class="oc-note">
<p>
<strong>Ersetzen Sie</strong> die Datenbanknamen, den Eigentümer, den Backup-Pfad und das Filestore-Datenverzeichnis durch Ihre eigenen; der Filestore enthält die Anhänge und Dokumente, auf die Ihre Datensätze zeigen, und eine Datenbank, die ohne ihn wiederhergestellt wird, ist eine Datenbank mit fehlenden Dateien. Das sind die dokumentierten Verfahren von PostgreSQL und Odoo, nicht unsere: Wir veröffentlichen keinen Befehl, der auf unseren eigenen Servern läuft, weil unser Service mit einem Ticket beginnt.
</p>
</div>
</div>
</div>
</section>
<!-- Self-hosting cost -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Eigenleistung</p>
<h2 class="section-title">Was Eigenleistung wirklich kostet</h2>
<div class="oc-body">
<p>
Ein gemieteter Server ist billig. Das ist die kleinste Zahl in dieser Entscheidung. Odoo Community selbst ist kostenlos: Eine Lizenz pro Benutzer werden Sie auf diesem Weg nirgends finden, weil Community keine hat.
</p>
<p>
Was in dieser Zahl nicht steckt, ist der Mensch. Ein Upgrade auf Ihrem eigenen Server heißt: Jemand installiert die neue Version, bringt den Migrationscode auf den richtigen Pfad, portiert die Module, die Ihr Geschäft tatsächlich nutzt, lässt die Migration laufen, bis das Log nicht mehr meckert, prüft, ob Kunden, Aufträge und Rechnungen noch da sind, räumt auf, was die Migration hinterlassen hat, und macht das Ganze dann zu einem passenden Zeitpunkt noch einmal auf der Produktivdatenbank. Die Odoo-Dokumentation sagt, das Update erledigt am besten die Person, die Odoo ursprünglich eingerichtet hat. Auf einem gemieteten Server sind das Sie oder jemand, den Sie pro Stunde bezahlen, und keine dieser Zeilen steht auf der Rechnung. Das ist die Hälfte der Rechnung, die niemand ausdruckt, und die Hälfte, die in Ihren Abenden landet.
</p>
<p>
Wir werden Ihre Stunden nicht beziffern, weil wir sie nicht gemessen haben und eine Marketingzahl schlechter wäre als keine. Was wir sagen, ist der Teil, bei dem es nicht wirklich ums Geld geht: Während Sie diese Arbeit machen, machen Sie nicht die Arbeit, für die man Sie bezahlt, und wenn die Migration falsch ist, erfahren Sie es von einem Kunden.
</p>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-dark" id="faq">
<div class="container">
<p class="section-kicker">Klare Antworten</p>
<h2 class="section-title">Fragen zum Upgrade</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Ist ein Upgrade dasselbe wie ein Update?</summary>
<div class="cmp-a">
<p>
Nein. Ein Update bringt Ihnen die neueste Fassung der Software, die Sie bereits einsetzen. Ein Upgrade bringt Ihre Datenbank auf eine neue Hauptversion (18 auf 19 oder 19 auf 20) und wandelt die Daten selbst um. Es geht nur in eine Richtung: einen unterstützten Weg zurück gibt es nicht, und es ist keine Lizenzänderung, kein Editionswechsel und kein Hosting-Wechsel.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Können wir direkt von Odoo 14 auf Odoo 20 upgraden?</summary>
<div class="cmp-a">
<p>
Nein. Es geht immer nur eine Hauptversion auf einmal: 14 auf 15 auf 16 auf 17 auf 18 auf 19 auf 20. Eine Version zu überspringen ist kein unterstützter Weg. Unser eigener Migrationsservice dokumentiert Unterstützung für Datenbanken auf Odoo 17, 18 und 19, nur Hauptreleases, keine Patch-Releases; ältere Datenbanken brauchen zuerst eine Kompatibilitätsprüfung, die mit einem Support-Ticket beginnt.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Was passiert mit meiner Historie: Rechnungen, Zahlungen, Anhänge?</summary>
<div class="cmp-a">
<p>
Das ist die richtige Frage, und die ehrliche Antwort lautet: Es hängt vom Weg ab. Der OpenUpgrade-Weg — eine Versionsmigration auf Ihrem eigenen Server — nimmt die Datenbank mit und erhält die Historie und die Verknüpfungen zwischen den Datensätzen. Die OpenUpgrade-Dokumentation warnt, dass der andere Weg, Dokumente in ein neues System zu verschieben, nur einen Teil Ihrer Daten rettet und die Historie und die Verknüpfungen zwischen den Datensätzen verliert, zum Beispiel die Rechnungen je Kunde. Unser Service baut Ihnen eine neue Datenbank und bringt Ihre Daten hinein; unser Weg ist also der, nach dem Sie fragen sollten: Bitten Sie uns vor Ihrer Freigabe, genau aufzulisten, welche Datensätze in der neuen Datenbank sein werden und welche nicht. Wir möchten lieber, dass Sie sie stellen, als dass Sie sie annehmen.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Funktionieren meine individuellen Module weiterhin?</summary>
<div class="cmp-a">
<p>
Nicht von allein. Ein Modul, das für Ihr Geschäft geschrieben wurde, braucht seinen Code auf der Zielversion, und Umbenennungen, die sonst Daten kosten würden, brauchen eigene Migrationsskripte. Die Odoo-Dokumentation ist hier deutlich: Ein Upgrade ist blockiert, bis es eine Version Ihrer individuellen Module für die Zielversion gibt. Module, die mit Odoo ausgeliefert werden, und Module der Community-Vereinigung bringen ihre eigenen Migrationsskripte mit; Ihre nicht, und die muss jemand schreiben.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Was kostet es, und wie lange dauert es?</summary>
<div class="cmp-a">
<p>
Für den Upgrade-Service veröffentlichen wir weder Preis noch Dauer, und wir erfinden hier auch keine. Was wir veröffentlichen, ist der Anfang: Sie eröffnen ein Support-Ticket, wir prüfen Ihre Datenbank auf Kompatibilität und melden uns bei Ihnen. Wenn Sie es gegen die Eigenleistung abwägen, ist der ehrliche Vergleich nicht die Servermiete, sondern Ihre eigenen Stunden, die auf keiner Rechnung auftauchen.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Brauche ich einen Entwickler?</summary>
<div class="cmp-a">
<p>
Um die Befehle im technischen Abschnitt auszuführen, ja; oder jemanden, der sich im Terminal mit PostgreSQL auskennt. Damit wir es übernehmen, nein: Genau das ist der Sinn des Service. Sie senden die Datenbank, wir bauen das neue System auf unserer Infrastruktur, und Sie erhalten die Zugangsdaten.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Kann ich das System mit der neuen Version ansehen, bevor es live geht?</summary>
<div class="cmp-a">
<p>
Ja, und das sollten Sie. Wer die Arbeit macht, migriert zuerst eine Kopie; das ist die erste Regel des ganzen Prozesses, in der Odoo-Dokumentation wie im OpenUpgrade-Projekt. Und die migrierte Kopie ist das, was Sie prüfen, bevor mit dem System, auf dem Ihr Geschäft läuft, irgendetwas passiert. Unser Service folgt demselben Prinzip: Wir bauen das neue System auf unseren eigenen Servern, und Sie vergleichen es mit dem alten.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Wir sind woanders gehostet. Können Sie uns trotzdem upgraden?</summary>
<div class="cmp-a">
<p>
Ja, genau dafür ist unser Migrationsservice da. Sie eröffnen ein Support-Ticket, wir senden Ihnen ein sicheres Formular zum Hochladen Ihrer Datenbank, richten Ihnen einen neuen Server auf unserer Infrastruktur ein und stellen die Zugangsdaten bereit. Datenbanken auf Odoo 17, 18 und 19, nur Hauptreleases; ältere nach einer Kompatibilitätsprüfung.
</p>
</div>
</details>
</div>
</div>
</section>
<!-- Final CTA band -->
<section class="section-dark cmp-cta" id="start">
<div class="container">
<p class="oc-lead">
Sie eröffnen ein Support-Ticket, wir prüfen Ihre Datenbank auf Kompatibilität und melden uns bei Ihnen.
</p>
<div class="cmp-cta-actions">
<a href="/de/support.html#contact" class="btn btn-brass btn-lg">Ticket eröffnen: Sagen Sie uns, welche Version Sie nutzen</a>
<a href="/de/#pricing" class="btn btn-outline btn-lg">Tarife ansehen</a>
</div>
</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>Nützliche Links</h4>
<ul>
<li><a href="/de/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/de/odoo-hosting-2027.html">ODOO Hosting in 2027</a></li>
<li><a href="/de/support.html">Support</a></li>
<li><a href="/legal.html">Rechtliches</a></li>
</ul>
</div>
<div>
<h4>Partner</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>Über uns</h4>
<p>Wir bauen clevere, skalierbare Geschäftslösungen: die <strong>Stabilität</strong> von Odoo ERP trifft auf die <strong>Kraft</strong> von KI-Agenten und N8N-Automatisierungen.</p>
<p>Von schlanken Vertriebsprozessen bis zum globalen Rollout: Unser <strong>schlanker, umweltfreundlicher</strong> Ansatz senkt Kosten, steigert die Effizienz und lässt Unternehmen ohne Grenzen wachsen.</p>
</div>
<div>
<h4>Folgen Sie uns</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="oc-sr-only" for="footerContactEmail">Ihre E-Mail-Adresse</label>
<input type="email" id="footerContactEmail" name="email" placeholder="Ihre E-Mail-Adresse" required />
<div class="footer-textarea-wrap">
<label class="oc-sr-only" for="footerContactText">Ihre Nachricht</label>
<textarea id="footerContactText" name="message" placeholder="Ihre Nachricht …" required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Nachricht senden"><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>
</body>
</html>
+883
View File
@@ -0,0 +1,883 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Bootcamp: Von null zu einem laufenden ERP in 3 Monaten</title>
<meta
name="description"
content="Zehn Live-Sessions an Donnerstagen mit Oliver Arnold, Technical Lead bei ODOO4projects. Bauen Sie ein einsatzbereites ERP für Ihr Unternehmen: Angebote, Rechnungen, Lager."
/>
<link rel="canonical" href="https://odoo4projects.com/de/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<meta property="og:title" content="Odoo Bootcamp: Von null zu einem laufenden ERP in 3 Monaten" />
<meta
property="og:description"
content="Zehn Live-Sessions an Donnerstagen mit Oliver Arnold, Technical Lead bei ODOO4projects. Bauen Sie ein einsatzbereites ERP für Ihr Unternehmen: Angebote, Rechnungen, Lager."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/de/odoo-erp-automation-bootcamp/" />
<meta name="twitter:card" content="summary" />
<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 ERP Automation Bootcamp landing page (page-scoped; additive) ---- */
.bc-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) */
.bc-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.bc-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.bc-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.bc-brand span {
color: var(--brass);
}
.bc-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
}
.bc-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.bc-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. */
.bc-topbar-links {
margin-left: auto;
}
.bc-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.bc-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.bc-topbar .lang-switch a:hover,
.bc-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.bc-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.bc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
/* Real London night aerial (our own photo, CI §5) behind the header copy.
TWO-ZONE scrim (2026-10-25): the copy zone — kicker, H1, value line, the four
facts, the CTA — holds a .78 midnight scrim, then the scrim falls off hard to
.25 so the lit skyline on the right actually reads: at the right edge the photo
is composited through a quarter-strength scrim instead of a uniform .55-.72, so
the lit skyline reads at ~1.6x the flat-midnight luma instead of ~1.4x.
Stops: .78 0%-88%, ramp 88%-94%, .25 94%-100%.
.78 is the smallest flat alpha that holds every text block over its floor
(body 4.5:1, large 3.0:1) at all four widths in all three languages, and 88%
is where the ramp has to start: the longest fact line (DE, 1024px) reaches
89.3% of the hero, and clear of 88% the copy sits on the flat scrim. The tail of
that one DE line rides the top of the ramp at .70+, measured. Numbers:
handoffs/2026-10-24-webmaster-to-olchi-bootcamp-page-published.md ("Amendment 6").
The old single ramp was .72 -> .55 across the full width and composited the right
zone to luma ~35 against a flat midnight of 25.4. */
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-desktop-1920.webp");
background-size: cover;
background-position: 50% 25%;
background-repeat: no-repeat;
}
/* The global .hero::after is a second, 50%-opacity midnight wash for the homepage's
flat hero; with the photo + gradient scrim above the copy it only dulls the shot,
so it is switched off on this page. One page-scoped rule, no global CSS touched. */
.bc-hero::after {
content: none;
}
@media (max-width: 640px) {
/* Portrait crop for narrow viewports: legible cut of the same photo. Same scrim
stops as the desktop rule — the ramp at 88% clears every language's copy, whose
longest mobile fact line ends at 87.7% of the hero. */
.bc-hero {
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-mobile-900.webp");
background-position: 50% 50%;
}
}
/* wrapped hero-stat labels keep their tick on the first line */
.bc-hero .hero-stat {
align-items: flex-start;
}
.bc-hero .hero-stat i {
line-height: 1.6;
}
.bc-lead {
font-size: 1.05rem;
color: rgba(23, 28, 38, 0.78);
max-width: 720px;
margin: 0 auto 1rem;
line-height: 1.75;
}
.section-dark .bc-lead,
.bc-lead.on-dark {
color: rgba(255, 255, 255, 0.72);
}
.bc-subline {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
color: var(--midnight);
text-align: center;
max-width: 720px;
margin: 1.75rem auto 1.25rem;
letter-spacing: 0.02em;
}
.bc-action {
text-align: center;
margin-top: 0.5rem;
}
/* The three CTAs are native basket <form>s with a <button> (they were <a>s).
A <button> takes `line-height: normal` from the UA font shorthand while
the <a>s inherited the body line-height, which would make the button
5.6px shorter. Match the anchors' height: one declaration, no new look. */
form[action$="/shop/post_basket"] .btn {
line-height: inherit;
}
/* Grids — auto-fit so no breakpoint is needed */
.bc-list {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
/* Lesson tiles (light canvas) */
.bc-lessons {
list-style: none;
counter-reset: bc-lesson;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-lessons li {
counter-increment: bc-lesson;
position: relative;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.4rem 1.4rem 1.4rem 3.4rem;
transition: box-shadow 0.25s, transform 0.25s;
}
.bc-lessons li:hover {
box-shadow: var(--shadow-hover);
transform: translateY(-3px);
}
.bc-lessons li::before {
content: counter(bc-lesson);
position: absolute;
left: 1.15rem;
top: 1.3rem;
font-family: Marcellus, Georgia, serif;
font-size: 1.5rem;
color: var(--brass-deep);
line-height: 1;
}
.bc-lessons h3 {
font-size: 1rem;
font-weight: 400;
color: var(--midnight);
margin-bottom: 0.35rem;
}
.bc-lessons p {
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.6;
margin: 0;
}
/* Cards on midnight */
.bc-cards {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-cards li {
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1.35rem 1.4rem;
}
.bc-cards h3 {
font-size: 1rem;
color: #fff;
margin-bottom: 0.45rem;
}
.bc-cards p {
font-size: 0.86rem;
color: rgba(255, 255, 255, 0.72);
line-height: 1.65;
margin: 0;
}
.bc-note {
max-width: 720px;
margin: 1.5rem auto 0;
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.65;
}
.bc-note.on-dark {
color: rgba(255, 255, 255, 0.6);
}
.bc-note strong {
color: var(--midnight);
}
.bc-note.on-dark strong {
color: #fff;
}
/* Schedule */
.bc-schedule {
max-width: 720px;
margin: 0 auto;
display: grid;
grid-template-columns: minmax(9rem, auto) 1fr;
gap: 0.55rem 1.25rem;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.5rem 1.75rem;
}
.bc-schedule dt {
font-family: Marcellus, Georgia, serif;
font-size: 0.92rem;
color: var(--brass-deep);
}
.bc-schedule dd {
margin: 0;
font-size: 0.9rem;
color: var(--ink);
line-height: 1.55;
}
/* Price line */
.bc-price {
font-family: Marcellus, Georgia, serif;
font-size: 1.3rem;
color: var(--midnight);
text-align: center;
margin: 0 auto 1rem;
}
/* Related links */
.bc-related {
list-style: none;
padding: 0;
margin: 2rem auto 0;
max-width: 720px;
display: grid;
gap: 0.5rem;
}
.bc-related li {
position: relative;
padding-left: 1.4rem;
font-size: 0.88rem;
}
.bc-related li::before {
content: "";
position: absolute;
left: 0.25rem;
top: 0.55rem;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--brass);
}
.bc-related a {
color: var(--midnight);
text-decoration: underline;
text-decoration-color: var(--brass);
text-underline-offset: 2px;
}
.bc-related a:hover {
text-decoration-color: var(--brass-deep);
text-decoration-thickness: 2px;
}
/* FAQ (native details/summary — no JS) */
.bc-faq-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
max-width: 1000px;
margin: 0 auto;
align-items: start;
}
.bc-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;
}
.bc-faq[open],
.bc-faq:hover {
box-shadow: var(--shadow-hover);
}
.bc-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);
}
.bc-faq summary::-webkit-details-marker {
display: none;
}
.bc-faq summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
}
.bc-faq[open] summary::after {
content: "\2212";
}
.bc-faq summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.bc-faq .bc-a {
font-size: 0.87rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.7;
padding-bottom: 1rem;
}
.bc-faq .bc-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.bc-faq-grid {
grid-template-columns: 1fr;
}
.bc-schedule {
grid-template-columns: 1fr;
gap: 0.15rem 0;
padding: 1.25rem 1.35rem;
}
.bc-schedule dd {
margin-bottom: 0.7rem;
}
}
/* Focus states */
.btn:focus-visible,
.bc-topbar-links a:focus-visible,
.bc-related a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Course",
"name": "ODOO ERP Automation Bootcamp",
"description": "Ein Live-Bootcamp mit zehn Sitzungen, das ein kleines Unternehmen von null zu einem laufenden ERP führt. Bringen Sie Ihre Produkte, Angebote, Rechnungen, Bestände und Zahlungen in einem System auf einem gehosteten Live-System zusammen, ohne Programmieren und ohne eigenen Server.",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/",
"provider": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"alternateName": "The OC Guy",
"jobTitle": "Technical Lead",
"worksFor": {
"@type": "Organization",
"name": "ODOO4projects"
}
},
"inLanguage": "de",
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"courseWorkload": "PT1H",
"maximumAttendeeCapacity": 6,
"startDate": "2027-01-21",
"endDate": "2027-03-25",
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"alternateName": "The OC Guy"
},
"courseSchedule": {
"@type": "Schedule",
"repeatFrequency": "P1W",
"repeatCount": 10,
"byDay": "https://schema.org/Thursday",
"startTime": "18:00-06:00",
"duration": "PT1H"
}
},
"offers": {
"@type": "Offer",
"price": "465.00",
"priceCurrency": "USD",
"category": "Paid",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/"
}
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Brauche ich technische Kenntnisse?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nein. Die Sitzungen setzen kein ERP-Wissen und keine Programmierkenntnisse voraus. Sie arbeiten mit Ihren eigenen Daten, statt einer leeren Demo zu folgen."
}
},
{
"@type": "Question",
"name": "Was, wenn ich eine Sitzung verpasse?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Die Sitzungen sind live und bauen aufeinander auf, nehmen Sie also teil, wenn Sie können. Wenn Sie eine verpassen, holen Sie im Alumni-Chat und im offenen Workshop der letzten Sitzung wieder auf."
}
},
{
"@type": "Question",
"name": "Ist das Hosting nach dem Kurs enthalten?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Ja, ein Jahr lang, im Programm enthalten. Danach wechselt Ihr System auf einen unserer normalen Hosting-Tarife, zum Preis, der auf unserer Website steht."
}
},
{
"@type": "Question",
"name": "Was muss ich installieren?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nichts zu installieren und nichts selbst zu betreiben. Ein Computer und ein Browser genügen, das laufende System stellen wir. n8n, das in Lektion 9 zum Einsatz kommt, ist ein kostenloses Konto im kostenlosen Tarif von n8n."
}
},
{
"@type": "Question",
"name": "Ist das ein Kurs über Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Es ist ein Kurs darüber, wie Ihr Geschäft läuft. Odoo ist der Motor unter dem System, das Sie aufbauen; die zehn Lektionen drehen sich um Ihr Lager, Ihre Rechnungen, Ihre Kunden und die Stunden, die Sie zurückbekommen."
}
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="bc-topbar">
<div class="container">
<a class="bc-brand" href="/de/">ODOO4<span>projects</span></a>
<nav class="bc-topbar-links" aria-label="Seitenlinks">
<a href="/de/#pricing">Pläne &amp; Preise</a>
<a href="/de/support.html">Support</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero bc-hero">
<div class="container">
<p class="hero-kicker">Q1 2027 &middot; 10 LIVE-SESSIONS &middot; OLIVER ARNOLD</p>
<h1>ODOO ERP Automation Bootcamp</h1>
<p class="hero-sub">
Kein Programmieren. Kein Server, den Sie einrichten müssen. Wenn Sie Ihr Geschäft mit einer Tabelle steuern, schaffen Sie das auch.
</p>
<div class="hero-stats">
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> 10 Live-Sessions, je eine Stunde</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Donnerstags 18:00&ndash;19:00 US-Zentralzeit</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Start am Donnerstag, 21. Januar 2027</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Ein Jahr Odoo Community Edition inklusive</span>
</div>
<div class="hero-actions">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Für 465.00 USD kaufen</button>
</form>
</div>
</div>
</section>
<!-- From zero to a running ERP -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Von null zum laufenden ERP</h2>
<p class="bc-lead">
In zehn Sitzungen an Donnerstagen über drei Monate bauen Sie ein funktionierendes Geschäftssystem für Ihr eigenes Unternehmen: Ihre Produkte, Ihre Kunden, Ihre Angebote, Ihre Rechnungen, Ihr Lager. Sie arbeiten an einem laufenden System, nicht an Folien, und starten schon in der ersten Sitzung statt nach einer langen Vorbereitung.
</p>
<p class="bc-lead">
Am Ende haben Sie ein ERP, das Sie wirklich nutzen, und das Urteilsvermögen, es selbst weiterzubetreiben.
</p>
<p class="bc-subline">Drei Monate. Zehn Stunden Unterricht. Ein System, das Ihr Unternehmen steuert.</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Für 465.00 USD kaufen</button>
</form>
</div>
</div>
</section>
<!-- Who this is for -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Für wen das gedacht ist</h2>
<p class="bc-lead">
Das ist für Inhaber oder Betreiber eines kleinen Unternehmens, die nie Systemadministrator werden wollten. Sie verwalten Lager, Aufträge, Rechnungen und Kunden, und heute steckt das meiste davon in einer Tabelle, einer Chatgruppe und im Kopf von einer Person.
</p>
<p class="bc-lead">
Sie brauchen keinen technischen Hintergrund. Die Sitzungen setzen kein ERP-Wissen und keine Programmierkenntnisse voraus.
</p>
<p class="bc-lead">
Es ist nichts für Sie, wenn Sie Odoo bereits selbst administrieren oder einen Entwicklerkurs über Module und eigenen Code suchen. In den zehn Lektionen geht es um Ihr laufendes Geschäft, nicht um die Software darunter.
</p>
</div>
</section>
<!-- The ten lessons -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Was Sie aufbauen: die zehn Lektionen</h2>
<p class="bc-lead">
Zehn Sitzungen, zehn Ergebnisse. Jede Lektion endet mit etwas, das in Ihrem eigenen System funktioniert, nicht mit Notizen zum Abheften.
</p>
<ol class="bc-lessons">
<li>
<h3>Die erste Konfiguration.</h3>
<p>Sie gehen mit Ihrem eigenen Unternehmen im System raus: Produkte, Kunden, Währung und Steuern. Damit ist jede Zahl danach echt und keine Demo.</p>
</li>
<li>
<h3>Vertrieb: Angebote, Aufträge und Rechnungen.</h3>
<p>Sie gehen mit einem Ablauf von Angebot bis Rechnung raus, der aus einer Kundenanfrage eine versandfertige Rechnung macht.</p>
</li>
<li>
<h3>Ihre Website aufbauen.</h3>
<p>Sie gehen mit einer veröffentlichten Seite unter Ihrer eigenen Webadresse raus, auf der Sie ein Produkt zeigen und darüber Anfragen annehmen.</p>
</li>
<li>
<h3>CRM.</h3>
<p>Sie gehen mit jedem Interessenten in einer Liste raus, samt Phase, damit eine Chance nicht mehr in einem Chatverlauf verschwindet.</p>
</li>
<li>
<h3>Projektmanagement.</h3>
<p>Sie gehen mit der verkauften Arbeit als Aufgaben mit Fristen raus, damit Sie sehen, was sich verspätet, bevor der Kunde es Ihnen sagt.</p>
</li>
<li>
<h3>Anpassungen und externe Dienstleister.</h3>
<p>Sie gehen mit dem Wissen raus, was Sie selbst ändern können und wofür sich ein Dienstleister lohnt, damit Sie keinen Entwickler für etwas bezahlen, das eine Einstellung schon erledigt.</p>
</li>
<li>
<h3>Integrationen und Online-Zahlung.</h3>
<p>Sie können danach online Zahlungen annehmen und Ihre Produkte dort anbieten, wo die Leute ohnehin einkaufen. Damit kommen Aufträge an, ohne dass Sie ihnen nachlaufen.</p>
</li>
<li>
<h3>Lager und Bestandsverwaltung.</h3>
<p>Sie gehen mit einem Bestand raus, der zum Regal passt, damit Sie nicht mehr verkaufen, was Sie nicht haben.</p>
</li>
<li>
<h3>n8n und KI für Ihr Unternehmen.</h3>
<p>Sie gehen mit einem System raus, das mit Ihren bestehenden Werkzeugen verbunden ist und eine wiederkehrende Aufgabe selbst erledigt.</p>
</li>
<li>
<h3>Online-Marketing und der offene Workshop.</h3>
<p>Sie gehen mit einer Methode raus, Ihre eigene Kundenliste in Wiederholungskäufe zu verwandeln, und mit einer letzten Sitzung, in der wir reparieren, was in Ihrer Konfiguration noch hakt.</p>
</li>
</ol>
</div>
</section>
<!-- What is included -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Was enthalten ist</h2>
<ul class="bc-cards">
<li>
<h3>Ein Jahr Odoo Community Edition auf unserer Plattform gehostet.</h3>
<p>Ihr System läuft, um Server, Backups und Zertifikat kümmern wir uns.</p>
</li>
<li>
<h3>Ein laufendes System ab der ersten Sitzung.</h3>
<p>Sie arbeiten ab dem ersten Tag mit Ihren eigenen Daten, nicht in einer leeren Demo.</p>
</li>
<li>
<h3>Die Alumni-Community.</h3>
<p>Ein privater Chat, um Fragen zu stellen, Vorlagen zu tauschen und Konfigurationen zu vergleichen, lange nachdem die zehn Sitzungen vorbei sind.</p>
</li>
<li>
<h3>Eine Expertenprüfung Ihrer Konfiguration.</h3>
<p>Oliver sieht sich an, was Sie aufgebaut haben, und sagt Ihnen, was zu verbessern ist.</p>
</li>
</ul>
<p class="bc-note on-dark">
<strong>Zu n8n, in klaren Worten:</strong> in den Sitzungen mit den Werkzeugen kommt n8n zum Einsatz, und Sie nutzen n8n über dessen eigenen kostenlosen Tarif. Der kostenlose Tarif ist nicht Teil dieses Preises und nicht im Programm enthalten. Alles andere oben ist enthalten.
</p>
</div>
</section>
<!-- The schedule -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Der Zeitplan</h2>
<p class="bc-lead">
Zehn Live-Sessions. Je eine Stunde, jede Woche zur gleichen Zeit, insgesamt zehn Stunden Unterricht.
</p>
<dl class="bc-schedule">
<dt>Sitzungen</dt>
<dd>10, jeden Donnerstag von 18:00&ndash;19:00 US-Zentralzeit</dd>
<dt>Zeitraum</dt>
<dd>Q1 2027</dd>
<dt>Erste Sitzung</dt>
<dd>Donnerstag, 21. Januar 2027</dd>
<dt>Letzte Sitzung</dt>
<dd>Donnerstag, 25. März 2027</dd>
<dt>Termine</dt>
<dd>21. Januar &middot; 28. Januar &middot; 4. Februar &middot; 11. Februar &middot; 18. Februar &middot; 25. Februar &middot; 4. März &middot; 11. März &middot; 18. März &middot; 25. März 2027</dd>
<dt>Dauer</dt>
<dd>1 Stunde pro Sitzung, insgesamt 10 Stunden</dd>
<dt>Ort</dt>
<dd>Live und online</dd>
<dt>Gruppengröße</dt>
<dd>Begrenzt auf 6 Teilnehmer</dd>
<dt>Trainer</dt>
<dd>Oliver - The OC Guy - Arnold, Technical Lead bei ODOO4projects</dd>
</dl>
<p class="bc-note">
Die US-Zentralzeit liegt bis zum 14. März auf UTC&minus;6 und danach auf UTC&minus;5; Kalendereinladungen enthalten die richtige Ortszeit.
</p>
</div>
</section>
<!-- Your instructor -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Ihr Trainer</h2>
<p class="bc-lead">
<strong>Oliver - The OC Guy - Arnold, Technical Lead bei ODOO4projects.</strong>
</p>
<p class="bc-lead">
Oliver baut seit mehr als 25 Jahren Software, die zuverlässig weiterlaufen muss, und ist der leitende Architekt der Plattform, auf der dieses Bootcamp läuft. Er unterrichtet, indem er das echte System vor Sie stellt und es gemeinsam mit Ihnen repariert, Sitzung für Sitzung.
</p>
<p class="bc-lead">
Er ist der einzige Trainer in diesem Programm. Sie haben jeden Donnerstag zehn Wochen lang dieselbe Person, und deshalb ist die letzte Sitzung ein offener Workshop und keine Übergabe an jemand anderen.
</p>
</div>
</section>
<!-- Price and booking -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Preis und Buchung</h2>
<p class="bc-price">Das Programm kostet USD 465.00 für alle zehn Sitzungen.</p>
<p class="bc-note"><strong>Begrenzt auf 6 Teilnehmer</strong> — die Gruppe ist klein, damit der Trainer sich Ihre eigene Konfiguration ansehen kann.</p>
<p class="bc-lead">
Umfasst das komplette Programm: zehn Live-Sessions, ein Jahr gehostetes Odoo Community Edition, die Alumni-Community und die Expertenprüfung.
</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Für 465.00 USD kaufen</button>
</form>
</div>
<ul class="bc-related">
<li><a href="/de/support.html#contact">Fragen vor der Buchung? Sprechen Sie zuerst mit uns</a></li>
<li><a href="/de/odoo-hosting-2027.html">Wie das Hosting nach Ihrem Jahr bei uns aussieht</a></li>
<li><a href="/de/support.html">Was unser Support abdeckt und was nicht</a></li>
<li><a href="/blog/posts/community-vs-enterprise-cost.html">Was Community im Vergleich zu Enterprise kostet</a></li>
</ul>
</div>
</section>
<!-- FAQ -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Fragen, die zuerst kommen</h2>
<div class="bc-faq-grid">
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Brauche ich technische Kenntnisse?</summary>
<div class="bc-a">
<p>Nein. Die Sitzungen setzen kein ERP-Wissen und keine Programmierkenntnisse voraus. Sie arbeiten mit Ihren eigenen Daten, statt einer leeren Demo zu folgen.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Was, wenn ich eine Sitzung verpasse?</summary>
<div class="bc-a">
<p>Die Sitzungen sind live und bauen aufeinander auf, nehmen Sie also teil, wenn Sie können. Wenn Sie eine verpassen, holen Sie im Alumni-Chat und im offenen Workshop der letzten Sitzung wieder auf.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Ist das Hosting nach dem Kurs enthalten?</summary>
<div class="bc-a">
<p>Ja, ein Jahr lang, im Programm enthalten. Danach wechselt Ihr System auf einen unserer normalen Hosting-Tarife, zum Preis, der auf unserer Website steht.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Was muss ich installieren?</summary>
<div class="bc-a">
<p>Nichts zu installieren und nichts selbst zu betreiben. Ein Computer und ein Browser genügen, das laufende System stellen wir. n8n, das in Lektion 9 zum Einsatz kommt, ist ein kostenloses Konto im kostenlosen Tarif von n8n.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Ist das ein Kurs über Odoo?</summary>
<div class="bc-a">
<p>Es ist ein Kurs darüber, wie Ihr Geschäft läuft. Odoo ist der Motor unter dem System, das Sie aufbauen; die zehn Lektionen drehen sich um Ihr Lager, Ihre Rechnungen, Ihre Kunden und die Stunden, die Sie zurückbekommen.</p>
</div>
</details>
</div>
</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>Nützliche Links</h4>
<ul>
<li><a href="/de/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/de/odoo-hosting-2027.html">ODOO Hosting in 2027</a></li>
<li><a href="/de/support.html">Support</a></li>
<li><a href="/legal.html">Rechtliches</a></li>
</ul>
</div>
<div>
<h4>Partner</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>Über uns</h4>
<p>Wir bauen clevere, skalierbare Geschäftslösungen: die <strong>Stabilität</strong> von Odoo ERP trifft auf die <strong>Kraft</strong> von KI-Agenten und N8N-Automatisierungen.</p>
<p>Von schlanken Vertriebsprozessen bis zum globalen Rollout: Unser <strong>schlanker, umweltfreundlicher</strong> Ansatz senkt Kosten, steigert die Effizienz und lässt Unternehmen ohne Grenzen wachsen.</p>
</div>
<div>
<h4>Folgen Sie uns</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="bc-sr-only" for="footerContactEmail">Ihre E-Mail-Adresse</label>
<input type="email" id="footerContactEmail" name="email" placeholder="Ihre E-Mail-Adresse" required />
<div class="footer-textarea-wrap">
<label class="bc-sr-only" for="footerContactText">Ihre Nachricht</label>
<textarea id="footerContactText" name="message" placeholder="Ihre Nachricht …" required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Nachricht senden"><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 defer src="/static/buy.js"></script>
<script defer src="/static/lang.js"></script>
</body>
</html>
File diff suppressed because it is too large. Load diff
+587
View File
@@ -0,0 +1,587 @@
<!doctype html>
<html lang="de">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="Support und FAQ zum Hosting von ODOO4projects. Hilfe zu Ihrer Odoo-Instanz, Modulen, Backups, Domains und mehr."
/>
<title>Support | ODOO4projects</title>
<link rel="canonical" href="https://odoo4projects.com/de/support.html" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/support.html" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/support.html" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/support.html" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/support.html" />
<meta property="og:title" content="Support | ODOO4projects" />
<meta property="og:description" content="Support und FAQ zum Hosting von ODOO4projects." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/de/support.html" />
<meta name="twitter:card" content="summary_large_image" />
<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;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="/style.css" />
<style>
/* Language selector — the page's top row: the back-link stays left, the selector travels right.
Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */
.blog-header {
display: flex;
align-items: center;
}
.blog-header > a {
margin-right: auto;
}
.blog-header .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
/* ---- Support Hero ---- */
.support-hero {
padding: 4rem 0 2.5rem;
text-align: center;
background: var(--light);
border-bottom: 1px solid var(--border);
}
.support-hero h1 {
font-size: clamp(1.8rem, 3.2vw, 2.8rem);
color: var(--dark);
}
.support-hero p {
max-width: 680px;
margin: 0 auto;
color: rgba(33, 37, 41, 0.7);
font-size: 1rem;
line-height: 1.7;
}
.support-hero strong {
color: var(--primary);
}
/* ---- FAQ Section ---- */
.faq-section {
padding: 3rem 0 4rem;
}
.faq-section h2 {
text-align: center;
margin-bottom: 2rem;
color: var(--dark);
}
.faq-tabs {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
justify-content: center;
margin-bottom: 2rem;
}
.faq-tab-btn {
padding: 0.55rem 1.1rem;
border-radius: var(--radius);
border: 1px solid var(--border);
background: #fff;
cursor: pointer;
font-family: "Inter Tight", sans-serif;
font-size: 0.82rem;
font-weight: 500;
color: #212529;
transition: all 0.2s;
line-height: 1.3;
}
.faq-tab-btn small {
display: block;
font-size: 0.7rem;
font-weight: 400;
color: rgba(33, 37, 41, 0.5);
margin-top: 0.1rem;
}
.faq-tab-btn:hover {
border-color: var(--primary);
color: var(--primary);
}
.faq-tab-btn.active {
background: linear-gradient(135deg, rgba(113,75,103,0.08), rgba(113,75,103,0.03));
border-color: var(--primary);
color: var(--primary);
font-weight: 600;
}
.faq-tab-btn.active small {
color: rgba(113, 75, 103, 0.6);
}
.faq-panel {
display: none;
max-width: 720px;
margin: 0 auto;
}
.faq-panel.active {
display: block;
}
.faq-item {
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 0.6rem;
overflow: hidden;
background: #fff;
}
.faq-question {
width: 100%;
background: none;
border: none;
padding: 0.9rem 1.1rem;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
color: var(--dark);
font-family: "Inter Tight", sans-serif;
font-size: 0.88rem;
font-weight: 500;
text-align: left;
transition: background 0.2s;
gap: 1rem;
}
.faq-question:hover {
background: var(--light);
}
.faq-question .faq-icon {
flex-shrink: 0;
font-size: 0.7rem;
color: var(--primary);
transition: transform 0.3s;
}
.faq-question.open .faq-icon {
transform: rotate(180deg);
}
.faq-answer {
display: none;
padding: 0 1.1rem 0.9rem;
color: rgba(33, 37, 41, 0.7);
font-size: 0.88rem;
line-height: 1.7;
}
.faq-answer.open {
display: block;
}
.faq-answer ul {
margin: 0.5rem 0;
padding-left: 1.25rem;
}
.faq-answer li {
margin: 0.3rem 0;
}
.faq-answer a {
color: var(--primary);
text-decoration: underline;
}
.faq-answer strong {
color: var(--dark);
}
/* ---- Contact Section ---- */
.contact-section {
padding: 3rem 0 4rem;
background: var(--light);
border-top: 1px solid var(--border);
}
.contact-section h2 {
text-align: center;
margin-bottom: 2rem;
color: var(--dark);
}
.contact-form {
max-width: 580px;
margin: 0 auto;
background: #fff;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 2rem;
}
.form-group {
margin-bottom: 1.1rem;
}
.form-group label {
display: block;
color: rgba(33, 37, 41, 0.6);
font-size: 0.82rem;
font-weight: 500;
margin-bottom: 0.3rem;
}
.form-group label .required {
color: #dc3545;
}
.form-group input,
.form-group textarea {
width: 100%;
padding: 0.65rem 0.85rem;
background: #fff;
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--dark);
font-family: Inter, sans-serif;
font-size: 0.88rem;
transition: border-color 0.2s;
box-sizing: border-box;
}
.form-group input:focus,
.form-group textarea:focus {
outline: none;
border-color: var(--primary);
}
.form-group textarea {
min-height: 90px;
resize: vertical;
}
.contact-form .btn {
width: 100%;
padding: 0.7rem;
}
.form-success {
display: none;
background: #d4edda;
border: 1px solid #c3e6cb;
border-radius: var(--radius);
padding: 0.8rem 1rem;
text-align: center;
color: #155724;
margin-top: 1rem;
font-size: 0.88rem;
}
.form-success.visible {
display: block;
}
@media (max-width: 768px) {
.support-hero { padding: 2.5rem 0 1.5rem; }
.faq-tab-btn { padding: 0.4rem 0.8rem; font-size: 0.75rem; }
.contact-form { padding: 1.25rem; }
}
</style>
<!-- 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>
<div class="container">
<div class="blog-header">
<a href="/de/">&larr; Zurück zur Startseite</a>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="support-hero">
<div class="container">
<h1>Support und FAQ</h1>
<p>
Für die schnellste Hilfe lesen Sie bitte zuerst unsere <strong>FAQ</strong> — unser Support-Bot
hilft bei schnellen Lösungen wie <strong>git pull</strong> oder Neustarts — oder senden Sie
einfach ein <strong>Ticket</strong> an unser Support-Team.
</p>
</div>
</section>
<!-- FAQ -->
<section class="faq-section" id="faq">
<div class="container">
<h2>FAQ</h2>
<div class="faq-tabs" id="faqTabs">
<button class="faq-tab-btn active" data-tab="first-steps">
Erste Schritte
<small>Worum es bei unserem Service geht</small>
</button>
<button class="faq-tab-btn" data-tab="advanced">
Fortgeschrittene
<small>Module installieren, Backup einrichten</small>
</button>
<button class="faq-tab-btn" data-tab="trouble">
Fehlerbehebung
<small>Der Service ist nicht erreichbar</small>
</button>
<button class="faq-tab-btn" data-tab="commercial">
Kommerzielles
<small>Alle Informationen zu unseren Services</small>
</button>
<button class="faq-tab-btn" data-tab="migrate">
Datenbank mitbringen
<small>Von einem anderen Anbieter umziehen</small>
</button>
</div>
<!-- First Steps -->
<div class="faq-panel active" id="panel-first-steps">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Mein Odoo wirkt leer. Was kann ich damit machen?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Wir liefern eine unveränderte Odoo-Installation: Ihr Odoo ist leer, aber vollständig bereit. <strong>Sie passen es an</strong> mit den Apps, die Ihr Unternehmen braucht. Gehen Sie dazu ins Menü Apps, sehen Sie sich die verfügbaren Apps an und klicken Sie auf Installieren. Jede App erscheint nach der Installation in Ihrem Hauptmenü und ist einsatzbereit.</p>
<p>Hier einige Beispiele für verschiedene Unternehmenstypen:</p>
<ul>
<li><strong>Fertigungsbetrieb</strong>: Installieren Sie die Apps Fertigung und Lager/Logistik.</li>
<li><strong>Onlineshop</strong>: Installieren Sie die Apps Website, eCommerce und Verkauf.</li>
<li><strong>Dienstleister</strong>: Installieren Sie die Apps Projekt und Zeiterfassung.</li>
<li><strong>Einzelhandel</strong>: Installieren Sie die Apps Point of Sale (POS) und Lager.</li>
<li><strong>Buchhaltungsbüro</strong>: Installieren Sie die Apps Buchhaltung und Rechnungsstellung.</li>
<li><strong>Marketingagentur</strong>: Installieren Sie die Apps CRM, Marketing und E-Mail-Marketing.</li>
<li><strong>Eventagentur</strong>: Installieren Sie die Apps Veranstaltungen und Website.</li>
</ul>
<p>Unabhängig von Ihrer Branche wählen Sie die Apps, die zu Ihrem Bedarf passen, und bauen Ihr Odoo-System Schritt für Schritt auf.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie installiere ich eine neue App?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Öffnen Sie das Menü Apps, suchen Sie die gewünschte App und klicken Sie auf Installieren. Das deckt jede App ab, die mit Odoo Community geliefert wird, und funktioniert in jedem Plan.</p>
<p>Apps, die nicht zu Odoo Community gehören — eigene Module und Module von <a href="https://odoo-community.org/" target="_blank" rel="noopener">odoo-community.org</a> — installieren wir für Sie per Git oder mit unserem Quick Git per Klick. Eigene und OCA-Module installieren Sie ab On the Rise. Bei Side Hustle gibt es keine Modulinstallation.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie richte ich meinen E-Mail-Server zum Versand von Nachrichten aus Odoo ein?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Um E-Mails aus Odoo zu versenden, müssen Sie einen Ausgehenden E-Mail-Server einrichten. Gehen Sie zu Einstellungen &rarr; Technisch &rarr; E-Mail &rarr; Ausgehende E-Mail-Server und geben Sie Ihre Serverdaten ein, etwa SMTP-Server, Port, Benutzername und Passwort. Die SMTP-Serverdaten erhalten Sie von Ihrem Domain- oder E-Mail-Anbieter. Prüfen Sie nach der Eingabe die Verbindung, um sicherzustellen, dass sie funktioniert.</p>
<p>Wenn Sie auch E-Mails in Odoo empfangen möchten, richten Sie im selben Menü Eingehende E-Mail-Server ein, mit den IMAP/POP3-Daten Ihres Anbieters.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie ändere ich meinen Anmeldenamen oder mein Passwort?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Bevor Sie etwas ändern, sollten Sie <strong>Ihren ausgehenden E-Mail-Server einrichten</strong>, damit Benachrichtigungen und das Zurücksetzen von Passwörtern korrekt funktionieren.</p>
<p>Ihr Anmeldename ist die E-Mail-Adresse, die mit Ihrem Konto verknüpft ist. Um ihn zu ändern, gehen Sie zu Einstellungen &rarr; Benutzer &amp; Unternehmen &rarr; Benutzer, wählen Sie Ihren Benutzer und ändern Sie das Feld E-Mail. Nach der Änderung melden Sie sich mit der neuen E-Mail-Adresse und Ihrem bestehenden Passwort an. Um Ihr Passwort zu ändern, gehen Sie zu denselben Benutzereinstellungen und klicken Sie auf Passwort ändern oder nutzen Sie den Link „Passwort vergessen“ auf der Anmeldeseite, um es per E-Mail zurückzusetzen.</p>
</div>
</div>
</div>
<!-- Advanced Users -->
<div class="faq-panel" id="panel-advanced">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Bekomme ich SSH-Zugriff auf meinen Service?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Nein — der SSH-Zugriff ist auf Git-Operationen beschränkt. Alle anderen Verwaltungs- und Konfigurationsoptionen finden Sie in unserem Odoo-Modul Einstellungen.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie stelle ich die Häufigkeit meiner Backups ein?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Der Backup-Job läuft als geplante Aktion innerhalb von Odoo und sichert Ihre Daten regelmäßig. Zugriff auf diesen Job und seine Verwaltung haben Sie nur, wenn der Entwicklermodus aktiv ist. Dann sehen Sie technische Einstellungen und geplante Aktionen, die in der Standardoberfläche sonst verborgen sind. So können Sie Backups prüfen, anpassen oder bei Bedarf auslösen.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie lange werden Backups gespeichert?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Wir speichern Backups in Sicherungspunkten (Backup-Slots), die erhalten bleiben, bis sie überschrieben werden. Verwaltet werden sie in einer FIFO-Warteschlange (first in, first out). Ein überschriebenes Backup wird endgültig gelöscht. Brauchen Sie mehr Backups, können Sie Ihren Vertrag upgraden und zusätzliche Plätze buchen.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie leite ich meine Domain auf mein Odoo?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Um Ihre Domain auf Odoo zu leiten, aktualisieren Sie zuerst den A-Record bei Ihrem Domain-Anbieter, sodass er auf die IP-Adresse unseres Servers zeigt. Die A-Record-Einstellungen finden Sie im Kundenbereich Ihres Registrars unter den DNS-Einstellungen. Nach der Änderung muss der Server neu gestartet werden, um die neue Domain zu erkennen.</p>
<p>Fügen Sie danach Ihre Domain in Odoo hinzu: Einstellungen &rarr; 4 Server &rarr; Domains, und tragen Sie jede Domain in eine eigene Zeile ein. Sehen Sie in Ihrem Vertrag nach, wie viele Domain-Weiterleitungen enthalten sind.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie kann ich Odoo Enterprise installieren?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Um Odoo Enterprise zu installieren, müssen Sie zuerst eine separate Lizenz bei Odoo erwerben. Unser vorbereitetes Git-Repository enthält bereits einen Enterprise-Ordner, in den Sie die Enterprise-Addons legen; installiert werden sie dann per Git.</p>
</div>
</div>
</div>
<!-- Trouble Shooting -->
<div class="faq-panel" id="panel-trouble">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Nach einem git check in startet mein Server nicht mehr oder zeigt Fehler 500</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Wenn Sie ein neues Modul auf den Server gepusht haben und es den Start des Service verhindert, machen Sie Ihre Änderungen zuerst in Git rückgängig und pushen Sie die korrigierte Version zurück auf den Server. Öffnen Sie dann den Support-Chat — Sie brauchen Ihre UUID (aus der Bestätigungs-E-Mail). Sagen Sie unserem Chatbot, er soll git pull ausführen und den Server neu starten; anschließend erhalten Sie eine Bestätigungs-E-Mail. Nach der Bestätigung bringen wir Ihre Odoo-Instanz wieder online.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Warum zeigt meine Domain „Unknown Certificate“ oder „Bad Gateway“ an?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Das passiert meist, weil der Server nach dem Weiterleiten Ihrer Domain auf unseren Service nicht neu gestartet wurde. Starten Sie Ihren Server einfach neu — sobald er wieder online ist, erzeugt Odoo das passende SSL-Zertifikat für Ihre Domain. Bleibt der Fehler bestehen, reichen Sie bitte ein Support-Ticket ein.</p>
</div>
</div>
</div>
<!-- Commercial -->
<div class="faq-panel" id="panel-commercial">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Ist die Odoo Enterprise License enthalten?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Nein, die Odoo Enterprise License muss separat erworben werden.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie kann ich meinen Service upgraden?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Sie können Ihren Service direkt in Odoo upgraden: Einstellungen &rarr; 4 Server &rarr; Upgrade. Dort können Sie in einen höheren Plan wechseln oder einzelne Funktionen dazubuchen, etwa zusätzliche Backup-Slots oder weitere Domain-Weiterleitungen.</p>
</div>
</div>
</div>
<!-- Bring your Database -->
<div class="faq-panel" id="panel-migrate">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Wie kann ich meine Odoo-Datenbank von einem anderen Anbieter umziehen?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Um Ihre Datenbank zu unserem Service umzuziehen, reichen Sie bitte ein Support-Ticket ein und geben Sie an, dass Sie umziehen möchten. Unser Team sendet Ihnen dann einen Link zu einem sicheren Formular, über das Sie Ihre Datenbank hochladen können. Nach Eingang richten wir einen neuen Server nach Ihren Anforderungen ein und übermitteln Ihnen die Zugangsdaten.</p>
<p>Patch-Releases (z. B. 18.1 oder 17.2) unterstützen wir nicht — nur die Hauptreleases (18.0, 17.0, 19.0). Unser Migrationsservice unterstützt derzeit Datenbanken auf Basis von Odoo 17, 18 und 19.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Kann ich meine Odoo-Datenbank von einer älteren Version aktualisieren, z. B. 14 &rarr; 19?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Ja, wir helfen Ihnen, Ihre Datenbank von älteren Versionen auf ein unterstütztes Release (17, 18 oder 19) zu bringen, allerdings erst, nachdem wir Ihre Datenbank auf Kompatibilität geprüft haben. Reichen Sie dazu ein Support-Ticket ein.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Contact -->
<section class="contact-section" id="contact">
<div class="container">
<h2>Noch Fragen? Kontaktieren Sie unseren Support.</h2>
<form class="contact-form" id="supportForm">
<div class="form-group">
<label>Ihr Name <span class="required">*</span></label>
<input type="text" id="contactName" name="contact_name" required placeholder="Ihr Name" />
</div>
<div class="form-group">
<label>Ihre E-Mail <span class="required">*</span></label>
<input type="email" id="contactEmail" name="email_from" required placeholder="Ihre E-Mail" />
</div>
<div class="form-group">
<label>UUID</label>
<input type="text" id="contactUuid" name="UUID" placeholder="Fügen Sie hier Ihre ODOO4projects-UUID ein" />
</div>
<div class="form-group">
<label>Betreff <span class="required">*</span></label>
<input type="text" id="contactSubject" name="name" required placeholder="Betreff" />
</div>
<div class="form-group">
<label>Ihre Frage <span class="required">*</span></label>
<textarea id="contactQuestion" name="description" required placeholder="Beschreiben Sie Ihr Problem oder Ihre Frage im Detail …"></textarea>
</div>
<button type="submit" class="btn btn-primary">Senden</button>
<div class="form-success" id="formSuccess">
<i class="fas fa-check-circle"></i> Danke! Ihr Ticket wurde übermittelt.
</div>
</form>
</div>
</section>
<script>
document.querySelectorAll(".faq-question").forEach(function (btn) {
btn.addEventListener("click", function () {
var answer = this.nextElementSibling;
var isOpen = answer.classList.contains("open");
document.querySelectorAll(".faq-answer.open, .faq-question.open").forEach(function (el) {
el.classList.remove("open");
});
if (!isOpen) { answer.classList.add("open"); this.classList.add("open"); }
});
});
document.querySelectorAll(".faq-tab-btn").forEach(function (tab) {
tab.addEventListener("click", function () {
document.querySelectorAll(".faq-tab-btn, .faq-panel").forEach(function (el) {
el.classList.remove("active");
});
this.classList.add("active");
var panel = document.getElementById("panel-" + this.getAttribute("data-tab"));
if (panel) panel.classList.add("active");
});
});
var form = document.getElementById("supportForm");
var submitBtn = form.querySelector(".btn");
var successDiv = document.getElementById("formSuccess");
form.addEventListener("submit", function (e) {
e.preventDefault();
var name = document.getElementById("contactName").value.trim();
var email = document.getElementById("contactEmail").value.trim();
var uuid = document.getElementById("contactUuid").value.trim();
var subject = document.getElementById("contactSubject").value.trim();
var question = document.getElementById("contactQuestion").value.trim();
if (!name || !email || !subject || !question) { alert("Please fill in all required fields."); return; }
submitBtn.disabled = true;
submitBtn.textContent = "Submitting...";
var payload = { name: name, email: email, subject: subject, requirements: question, area: "support" };
if (uuid) payload.uuid = uuid;
fetch("https://n8n.odoo4projects.com/webhook/ODOO4projects/crm", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
}).then(function (r) {
if (!r.ok) throw new Error("bad status " + r.status);
submitBtn.style.display = "none";
successDiv.classList.add("visible");
}).catch(function () {
submitBtn.disabled = false;
submitBtn.textContent = "Submit";
alert("Could not submit. Please try again.");
});
});
</script>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
+214
View File
@@ -0,0 +1,214 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Confirm your email to get your Odoo instance</title>
<style>
* { box-sizing: border-box; }
body {
margin: 0;
padding: 0;
background: #f4f0e8;
font-family: Inter, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
line-height: 1.6;
color: #0d1b2e;
}
table { width: 100%; border-collapse: collapse; }
.container {
max-width: 600px;
margin: 0 auto;
background: #fff;
border-radius: 8px;
overflow: hidden;
box-shadow: 0 2px 8px rgba(0,0,0,0.08);
}
.header {
background: #0d1b2e;
color: #fff;
padding: 32px 24px;
text-align: center;
}
.brand {
font-family: Marcellus, serif;
font-size: 28px;
font-weight: 700;
letter-spacing: -0.5px;
margin: 0;
}
.content { padding: 32px 24px; }
h1 {
font-family: Marcellus, serif;
font-size: 26px;
margin: 0 0 16px 0;
color: #0d1b2e;
}
p { margin: 0 0 16px 0; color: #162a45; }
.highlight {
background: rgba(201,162,39,0.08);
padding: 12px 16px;
border-radius: 6px;
border-left: 3px solid #c9a227;
margin: 16px 0;
}
.cta {
display: inline-block;
background: #c9a227;
color: #fff;
padding: 14px 28px;
text-decoration: none;
border-radius: 6px;
font-weight: 600;
margin: 24px 0;
font-size: 16px;
}
.cta:hover { background: #b38f22; }
.steps { margin: 24px 0; }
.step {
display: flex;
align-items: flex-start;
margin-bottom: 16px;
}
.step-number {
background: #0d1b2e;
color: #fff;
width: 28px;
height: 28px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
font-weight: 700;
margin-right: 12px;
flex-shrink: 0;
}
.step-content { flex: 1; }
.step h3 { margin: 0 0 4px 0; font-size: 16px; color: #0d1b2e; }
.step p { margin: 0; font-size: 14px; color: #162a45; }
.footer {
background: #f4f0e8;
padding: 24px;
border-top: 1px solid #e8e2d4;
font-size: 13px;
color: #162a45;
}
.footer p { margin: 0 0 8px 0; }
.footer a { color: #c9a227; text-decoration: underline; }
.support {
margin-top: 24px;
padding: 16px;
background: rgba(13,27,46,0.05);
border-radius: 6px;
text-align: center;
}
.support a { color: #0d1b2e; font-weight: 600; text-decoration: none; }
.support a:hover { text-decoration: underline; }
.unsubscribe { margin-top: 8px; color: #6b7b8c; }
.unsubscribe a { color: #6b7b8c; text-decoration: underline; }
@media (max-width: 600px) {
.container { border-radius: 0; }
.header { padding: 24px 16px; }
.content { padding: 24px 16px; }
h1 { font-size: 22px; }
.cta { padding: 12px 20px; font-size: 15px; }
}
</style>
</head>
<body>
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td align="center">
<table class="container" cellpadding="0" cellspacing="0" border="0">
<!-- Header -->
<tr>
<td class="header">
<h1 class="brand">ODOO4projects</h1>
<p style="font-size: 14px; margin-top: 8px; opacity: 0.85;">Odoo Community Managed Hosting</p>
</td>
</tr>
<!-- Main Content -->
<tr>
<td class="content">
<h1>Confirm your email to get your Odoo instance</h1>
<p>Thanks for signing up for the 30-day free trial of Odoo Community V20 hosting.</p>
<p>Your Odoo instance is waiting to be launched. Confirm your email address and we'll spin it up immediately.</p>
<!-- Confirmation CTA -->
<center>
<a class="cta" href="https://odoo4projects.com/trial/confirm?token=USER_TOKEN">Confirm Email</a>
</center>
<div class="highlight">
<strong>What happens next:</strong> We'll email your login credentials once your instance is ready.
</div>
<!-- Steps -->
<div class="steps">
<div class="step">
<div class="step-number">1</div>
<div class="step-content">
<h3>Confirm email</h3>
<p>Click the button above to verify your address and start your Odoo V20 instance.</p>
</div>
</div>
<div class="step">
<div class="step-number">2</div>
<div class="step-content">
<h3>Instance spins up</h3>
<p>We provision your Odoo Community V20 server automatically. Usually takes 2-5 minutes.</p>
</div>
</div>
<div class="step">
<div class="step-number">3</div>
<div class="step-content">
<h3>Login credentials</h3>
<p>We email your URL, username, and temporary password. You can change them right away.</p>
</div>
</div>
</div>
<p><strong>What you get in this trial:</strong></p>
<ul>
<li>An Odoo Community V20 instance, provisioned in a few minutes</li>
<li>Every app that ships with Odoo Community</li>
<li>Login credentials by email — one login, inside your Odoo</li>
</ul>
<p><strong>What the trial does not include:</strong></p>
<ul>
<li>Backups — the trial has none. Paid plans include them.</li>
<li>Domain mapping — your own domain needs a paid plan.</li>
<li>Module installation — custom and OCA modules install from On the Rise up.</li>
</ul>
<p>No credit card to start. You only need a card when you buy a plan.</p>
<div class="support">
<p>Questions? Reply to this email or contact us directly:</p>
<p><a href="mailto:support@odoo4projects.com">support@odoo4projects.com</a></p>
</div>
</td>
</tr>
<!-- Footer -->
<tr>
<td class="footer">
<p><strong>ODOO4projects</strong> — Smart, scalable business solutions</p>
<p>
<a href="https://odoo4projects.com/privacy.html">Privacy</a> &bull;
<a href="https://odoo4projects.com/terms.html">Terms</a> &bull;
<a href="https://odoo4projects.com/support.html#contact">Contact</a>
</p>
<p class="unsubscribe">
<a href="https://odoo4projects.com/unsubscribe?token=USER_TOKEN">Unsubscribe</a> from these emails
</p>
<p style="margin-top: 8px; opacity: 0.7;">&copy; 2026 ODOO4projects LLC. All rights reserved.</p>
</td>
</tr>
</table>
</td>
</tr>
</table>
</body>
</html>
+677
View File
@@ -0,0 +1,677 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Ponga Odoo en marcha en 5 minutos con hosting totalmente gestionado. Copias de seguridad automáticas, SSL, módulos vía Git y 6 ubicaciones globales." />
<title>ODOO4projects | Odoo en 5 minutos — hosting gestionado</title>
<link rel="canonical" href="https://odoo4projects.com/es/" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/" />
<meta property="og:title" content="ODOO4projects | Odoo en 5 minutos — hosting gestionado" />
<meta property="og:description" content="Ponga Odoo en marcha en 5 minutos con hosting totalmente gestionado. Copias de seguridad automáticas, SSL y gestión de módulos vía Git." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/es/" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="/images/favicon.ico" />
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"description": "Hosting de Odoo con infraestructura totalmente gestionada. En marcha en 5 minutos con copias de seguridad automáticas, SSL y módulos vía Git.",
"foundingDate": "2020",
"contactPoint": { "@type": "ContactPoint", "contactType": "customer support", "url": "https://odoo4projects.com/support.html#contact" },
"sameAs": ["https://www.linkedin.com/company/odoo4projects/"],
"offers": [
{ "@type": "Offer", "name": "Side Hustle", "price": "214.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "On the Rise", "price": "395.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "Powerhouse", "price": "595.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "Empire", "price": ">950.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" }
]
}
</script>
<script type="application/json" id="agent-skills">
{
"skills": [
{
"name": "spin_up_free_trial",
"description": "Spin up a free trial of ODOO4projects.",
"when_to_use": [
"User wants to create an ODOO4projects free trial",
"User asks to spin up or provision a trial",
"User asks to try ODOO4projects"
],
"offer": {
"type": "free_trial",
"available": true
},
"mcp": {
"server": "https://n8n.odoo4projects.com/mcp/trial"
},
"server_locations": [
{
"name": "Manchester",
"id": "manchester"
},
{
"name": "Sydney",
"id": "sydney"
},
{
"name": "Mumbai",
"id": "mumbai"
},
{
"name": "São Paulo",
"id": "sao-paulo"
},
{
"name": "Meppel",
"id": "meppel"
},
{
"name": "Boston",
"id": "boston"
}
],
"workflow": [
"Use the ODOO4projects trial MCP server to create the free trial.",
"If the user specifies a server location, use that location.",
"If no server location is specified, ask the user which available location they prefer.",
"After signup, the user will receive a confirmation email.",
"The user must confirm the trial using the confirmation email.",
"After the trial is confirmed, the user will receive their ODOO4projects credentials."
],
"instruction": "When the user requests a free trial, use the ODOO4projects trial MCP server to provision it. Do not claim that the trial is fully activated until the required email confirmation has been completed. Explain that the user will receive a confirmation email after signup and, once confirmed, will receive their credentials."
}
]
}
</script>
<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="preload" as="style" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Marcellus&display=swap" />
<link rel="preload" as="style" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css" />
<link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Marcellus&display=swap" media="print" onload="this.media='all'" />
<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'" />
<style>
/* critical: Grand Hotel Business Lounge */
*{box-sizing:border-box}
body{margin:0;font-family:Inter,'Segoe UI',sans-serif;font-size:1rem;line-height:1.6;color:var(--ink);background:var(--cream)}
h1,h2,h3,h4{font-family:Marcellus,'Georgia',serif;font-weight:400;line-height:1.15;margin-top:0;margin-bottom:.5rem}
h1{font-size:clamp(2rem,5vw,3.6rem)}h2{font-size:clamp(1.6rem,3.2vw,2.4rem)}h3{font-size:clamp(1.1rem,2vw,1.4rem)}
p{margin-top:0;margin-bottom:1rem}a{color:var(--brass-deep);text-decoration:none}a:hover{color:var(--brass)}img{max-width:100%;height:auto;vertical-align:middle}
@font-face{font-family:'Font Awesome 6 Brands';font-display:swap}@font-face{font-family:'Font Awesome 6 Free';font-display:swap}
:root{--midnight:#0d1b2e;--midnight-2:#12233c;--midnight-3:#162a45;--brass:#c9a227;--brass-bright:#ddb84a;--brass-deep:#8a6f1f;--cream:#f4f0e8;--cream-2:#ece6da;--ivory:#faf7f1;--ink:#171c26;--ink-soft:rgba(23,28,38,.6);--ink-faint:rgba(23,28,38,.38);--line:rgba(23,28,38,.09);--line-brass:rgba(201,162,39,.25);--success:#1e7a46;--radius:.5rem;--radius-lg:1rem;--radius-pill:2rem;--shadow-rest:0 2px 8px rgba(13,27,46,.08);--shadow-hover:0 12px 30px rgba(13,27,46,.16);--shadow-brass:0 8px 20px rgba(201,162,39,.25)}
.container{width:86%;padding:0 1.25rem;margin:0 auto;max-width:1200px}
.btn{display:inline-block;padding:.7rem 2rem;font-family:Marcellus,Georgia,serif;font-size:.9rem;letter-spacing:.04em;text-transform:uppercase;border:1px solid transparent;border-radius:var(--radius);cursor:pointer;text-decoration:none;transition:all .25s}
.btn-brass{background:var(--brass);color:var(--midnight);border-color:var(--brass)}.btn-brass:hover{background:var(--brass-bright);border-color:var(--brass-bright);transform:translateY(-1px);box-shadow:var(--shadow-brass)}
.btn-outline{background:transparent;color:var(--cream);border-color:var(--line-brass)}.btn-outline:hover{border-color:var(--brass);color:var(--brass);background:rgba(201,162,39,.08)}
.btn-lg{padding:.85rem 2.5rem;font-size:1rem}
.hero{background:var(--midnight);padding:4rem 0 0;position:relative;overflow:hidden;min-height:85vh;display:flex;flex-direction:column}
.hero::after{content:'';position:absolute;inset:0;background:linear-gradient(135deg,var(--midnight) 50%,rgba(13,27,46,.4) 100%);opacity:.5;z-index:0}
.hero-bg{position:absolute;inset:0;z-index:0;overflow:hidden}.hero-bg-slide{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:.25;filter:brightness(1.15)saturate(1.1)}
.hero .container{position:relative;z-index:1;flex:1;display:flex;flex-direction:column;justify-content:center}
/* Language selector — top-right of the hero's own top area (page has no site header). CI §1/§2:
brass marks the active language, body colour for the other two; lang.js owns the markup. */
.hero .lang-switch-slot{display:flex;justify-content:flex-end;margin-bottom:1rem}
.hero .lang-switch{color:rgba(255,255,255,.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}
.hero-kicker{font-family:Inter,sans-serif;font-size:.72rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--brass);margin-bottom:.75rem}
.hero h1{color:#fff;max-width:700px;margin-bottom:1rem;font-weight:400}.hero h1 span{color:var(--brass)}
.hero-sub{font-size:1.05rem;color:rgba(255,255,255,.7);max-width:560px;line-height:1.7;margin-bottom:1.5rem}
.hero-stats{display:flex;gap:1.5rem;margin-bottom:2rem;flex-wrap:wrap}.hero-stat{display:flex;align-items:center;gap:.4rem;color:rgba(255,255,255,.65);font-size:.85rem}.hero-stat i{color:var(--brass);font-size:.75rem}
.hero-actions{display:flex;gap:1rem;flex-wrap:wrap;margin-bottom:2rem}
.hero-notice{position:absolute;top:1.25rem;right:1.25rem;z-index:3;display:flex;align-items:center;gap:.55rem;max-width:min(360px,calc(100% - 2rem));padding:.6rem .85rem .6rem 1rem;background:#f5c542;color:var(--midnight);border:1px solid rgba(13,27,46,.14);border-radius:var(--radius);box-shadow:0 8px 24px rgba(13,27,46,.3);font-family:Inter,sans-serif;font-size:.82rem;line-height:1.4;animation:heroNoticeIn .4s cubic-bezier(.16,1,.3,1)}
.hero-notice[hidden]{display:none}
.hero-notice i{color:var(--midnight);font-size:.9rem;flex-shrink:0}
.hero-notice-text{flex:1;min-width:0;overflow-wrap:anywhere}
.hero-notice-close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;border-radius:50%;background:rgba(13,27,46,.12);color:var(--midnight);font-size:1rem;line-height:1;cursor:pointer;transition:background .2s}
.hero-notice-close:hover{background:rgba(13,27,46,.24)}
@keyframes heroNoticeIn{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.server-banner{background:var(--midnight);padding:2rem 0 1.5rem;border-top:1px solid var(--line-brass);border-bottom:1px solid var(--line-brass);position:relative;overflow:hidden}
.server-banner::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 60% 80% at 50% 100%,rgba(201,162,39,.06) 0%,transparent 70%);pointer-events:none}
.server-banner-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem;flex-wrap:wrap;gap:.5rem}
.server-banner-kicker{font-family:Marcellus,Georgia,serif;font-size:1rem;letter-spacing:.08em;text-transform:uppercase;color:var(--brass)}
.server-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:.75rem}
.server-card{background:rgba(255,255,255,.035);border:1px solid rgba(201,162,39,.12);border-radius:var(--radius);padding:1rem .75rem;text-align:center;transition:all .4s cubic-bezier(.16,1,.3,1);position:relative}
.server-card:hover{background:rgba(255,255,255,.06);border-color:rgba(201,162,39,.25)}
.server-card .server-city{font-family:Marcellus,Georgia,serif;font-size:1.05rem;color:#fff;margin-bottom:.15rem}
.server-card .server-region{font-family:Inter,sans-serif;font-size:.68rem;color:rgba(255,255,255,.45);text-transform:uppercase;letter-spacing:.06em}
.server-card.server-best{background:rgba(201,162,39,.1);border-color:var(--brass);box-shadow:0 0 25px rgba(201,162,39,.15),inset 0 0 25px rgba(201,162,39,.04);transform:translateY(-3px)}
.server-card.server-best .server-city{color:var(--brass-bright)}
.hero-city-label{position:absolute;bottom:2rem;right:2rem;background:rgba(13,27,46,.88);border:1px solid var(--line-brass);border-radius:var(--radius);padding:.7rem 1.25rem;color:rgba(255,255,255,.8);font-family:Marcellus,Georgia,serif;font-size:.9rem;z-index:2;transform:translateX(150%);white-space:nowrap;backdrop-filter:blur(6px);pointer-events:none}
.hero-city-label strong{color:var(--brass-bright);font-weight:400}
.section-light{background:var(--cream);padding:3.5rem 0}.section-dark{background:var(--midnight);padding:3.5rem 0}.section-dark h2{color:#fff}
.section-kicker{font-family:Inter,sans-serif;font-size:.68rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--brass);margin-bottom:.5rem;text-align:center}
.section-title{text-align:center;margin-bottom:2rem;color:var(--ink)}.section-dark .section-title{color:#fff}
.pricing-server-row{display:flex;align-items:center;justify-content:center;gap:.75rem;margin-bottom:1.5rem;flex-wrap:wrap}
.pricing-server-row label{font-family:Inter,sans-serif;font-size:.82rem;color:var(--brass);text-transform:uppercase;letter-spacing:.08em}
.pricing-server-select{padding:.5rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.08);color:#fff;font-family:Inter,sans-serif;font-size:.85rem;outline:none;cursor:pointer;min-width:180px}
.pricing-server-select option{background:var(--midnight);color:#fff}
@media(max-width:992px){.server-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:768px){.hero{min-height:auto;padding:3rem 0 0}.hero.has-hero-notice{padding-top:4.75rem}.hero-actions{flex-direction:column}.hero-actions .btn{width:100%;text-align:center}.hero-stats{gap:.75rem}.hero-city-label{bottom:1rem;right:1rem;font-size:.78rem;padding:.5rem .9rem}.hero-notice{top:.75rem;left:.75rem;right:.75rem;max-width:none;font-size:.78rem}}
@media(max-width:576px){.server-grid{grid-template-columns:repeat(2,1fr)}.server-banner-header{flex-direction:column;align-items:flex-start}}
.status-dot{width:7px;height:7px;border-radius:50%;background:var(--brass);display:inline-block;animation:statusPulse 1.2s ease-in-out infinite}
@keyframes statusPulse{0%,100%{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}
.biz-wizard{padding:4rem 0;background:var(--midnight);text-align:center;position:relative;overflow:hidden}
.biz-wizard::after{content:'';position:absolute;inset:0;background:url('/images/city-amsterdam.jpg') center/cover no-repeat;opacity:.04;z-index:0}
.biz-wizard .container{position:relative;z-index:1;max-width:700px}
.biz-wizard h2{font-size:clamp(1.6rem,3.2vw,2.4rem);color:#fff;margin-bottom:.75rem}
.biz-sub{font-size:1rem;color:rgba(255,255,255,.6);max-width:520px;margin:0 auto 2rem;line-height:1.7}
.biz-form{text-align:left}.biz-field{margin-bottom:1.25rem}
.biz-field label{display:block;font-family:Marcellus,Georgia,serif;font-size:.95rem;color:#fff;margin-bottom:.4rem;font-weight:400}
.biz-field textarea{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#fff;font-family:Inter,sans-serif;font-size:.88rem;line-height:1.6;min-height:90px;outline:none;transition:border-color .2s,background .2s;resize:vertical}
.biz-field input[type="email"]{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#fff;font-family:Inter,sans-serif;font-size:.88rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.biz-field input[type="email"]:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.biz-field input[type="email"]::placeholder{color:rgba(255,255,255,.3)}
.biz-field textarea:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.biz-field textarea::placeholder{color:rgba(255,255,255,.3)}
.biz-form .btn-lg{margin-top:.5rem;width:100%}
.biz-checkbox-group{display:flex;flex-direction:column;gap:.6rem;margin-bottom:1rem}
.biz-checkbox{display:flex;align-items:center;gap:.6rem;font-family:Inter,sans-serif;font-size:.85rem;color:rgba(255,255,255,.75);cursor:pointer;user-select:none;transition:color .2s}
.biz-checkbox:hover{color:#fff}
.biz-checkbox input[type="checkbox"]{width:1.05rem;height:1.05rem;accent-color:var(--brass);cursor:pointer;flex-shrink:0}
.biz-success{margin-top:1.5rem}.biz-success i{font-size:2.5rem;color:var(--success);margin-bottom:.75rem}
.biz-success h3{color:#fff;margin-bottom:.5rem}.biz-success p{color:rgba(255,255,255,.65);font-size:.95rem;max-width:480px;margin:0 auto 1.25rem;line-height:1.7}
/* OCA Modules */
.oca-section{padding:3.5rem 0;overflow-x:hidden}
.oca-search-wrap{max-width:400px;margin:0 auto 1.5rem}
.oca-search{width:100%;padding:.7rem 1rem;border-radius:var(--radius-pill);border:1px solid var(--line-brass);background:rgba(255,255,255,.06);color:#fff;font-family:Inter,sans-serif;font-size:.85rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.oca-search:focus{border-color:var(--brass);background:rgba(255,255,255,.1)}
.oca-search::placeholder{color:rgba(255,255,255,.3)}
.oca-table-wrap{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:var(--radius-lg);border:1px solid var(--line-brass);background:rgba(255,255,255,.03)}
.oca-table{width:100%;border-collapse:collapse;min-width:500px}
.oca-table th{padding:.75rem 1rem;text-align:left;font-family:Marcellus,Georgia,serif;font-size:.85rem;letter-spacing:.06em;text-transform:uppercase;color:var(--brass);border-bottom:1px solid var(--line-brass);background:rgba(13,27,46,.5);white-space:nowrap}
.oca-table th:last-child{width:48px;text-align:center}
.oca-table td{padding:.65rem 1rem;font-size:.85rem;color:rgba(255,255,255,.8);border-bottom:1px solid rgba(201,162,39,.08);vertical-align:middle}
.oca-table tbody tr:hover{background:rgba(201,162,39,.06)}
.oca-table tbody tr:last-child td{border-bottom:none}
.oca-check{color:var(--success);font-size:1rem}
.oca-cross{color:rgba(255,255,255,.2);font-size:1rem}
.oca-icon-link{color:var(--brass);font-size:1.1rem;cursor:pointer;transition:color .2s,transform .2s;display:inline-block}
.oca-icon-link:hover{color:var(--brass-bright);transform:scale(1.2)}
.oca-empty{text-align:center;padding:2rem;color:rgba(255,255,255,.4);font-style:italic;display:none}
.oca-loading{text-align:center;padding:2rem;color:rgba(255,255,255,.4);font-size:.88rem}
/* Custom Quote Modal */
.ow-sub{font-size:.95rem;color:var(--midnight);margin-bottom:1.5rem}
.ow-panel input[type="text"],.ow-panel textarea{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#171c26;font-family:Inter,sans-serif;font-size:.88rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.ow-panel input[type="text"]:focus,.ow-panel textarea:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.ow-panel textarea{min-height:100px;resize:vertical}
.ow-panel textarea::placeholder{color:rgba(23,28,38,.3)}
.ow-panel input[type="email"]::placeholder{color:rgba(23,28,38,.3)}
.ow-close{background:var(--midnight);border:1px solid var(--line);color:#fff;font-size:2rem;cursor:pointer;line-height:1;position:absolute;right:1rem;top:1rem;transition:color .2s,background .2s;border-radius:var(--radius);width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center}
.ow-close:hover{color:var(--brass);background:var(--midnight-2)}
/* Custom Quote Modal overrides for biz-field inside ow-panel */
#customQuoteModal .biz-field label{color:#171c26}
#customQuoteModal .biz-field textarea{color:#171c26}
#customQuoteModal .biz-field textarea::placeholder{color:rgba(23,28,38,.3)}
#customQuoteModal .biz-field input[type="email"]{color:#171c26}
#customQuoteModal .biz-field input[type="email"]::placeholder{color:rgba(23,28,38,.3)}
#customQuoteModal .biz-field input[type="text"]{color:#171c26}
#customQuoteModal .biz-field input[type="text"]::placeholder{color:rgba(23,28,38,.3)}
/* Success message sits on the light modal panel, so it needs dark text (the global .biz-success rules target the dark wizard section) */
#customQuoteModal .biz-success h3{color:var(--midnight)}
#customQuoteModal .biz-success p{color:var(--midnight)}
@media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}}
</style>
<link rel="stylesheet" href="/style.css" media="print" onload="this.media='all'" />
<noscript><link rel="stylesheet" href="/style.css" /></noscript>
<!-- 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>
<!--
THESIS: The homepage as a global business lounge concierge desk — midnight blue, brass, marble, city placards for the six regions. The category default (hero + feature grid + pricing grid) is reframed as hospitality: the visitor checks in, reads the rate card, and books a suite.
OWN-WORLD: Midnight blue (#0d1b2e) ground, brass (#c9a227) for every accent and CTA, cream (#f4f0e8) for light surfaces. Marcellus serif for display, Inter for body. Six city photos (Amsterdam, Boston, London, Mumbai, São Paulo, Sydney) as circular placards. Hairline brass rules. Concierge-card features.
STORY: The visitor understands: "I can deploy Odoo in 5 minutes, globally, without DevOps. This is enterprise-grade, but the concierge handles everything." They believe it from the city photos (real regions), the partner logos, the brass CTA, and the "No setup fee. Stripe Payment. Cancel at any time" footer.
FIRST VIEWPORT: Midnight hero with faint Amsterdam skyline. Brass kicker "FULLY MANAGED ODOO COMMUNITY HOSTING". Large serif h1 "Deploy Odoo in 5 Minutes — Fully Managed Hosting". Stats row with brass checks. Brass CTA button "See Plans & Pricing" + ghost "How It Works". Bottom: six city placards (photo + name + region) in a horizontal strip.
FORM: The Grand Hotel Business Lounge (model-pick, user-chosen). Seed key: 7db4dced.
FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review, the verdict, and DESIGN.md.
-->
<!-- Hero -->
<section class="hero">
<div class="hero-notice" id="heroConfirmNotice" role="status" aria-live="polite" hidden>
<i class="fas fa-check-circle" aria-hidden="true"></i>
<span class="hero-notice-text"></span>
<button type="button" class="hero-notice-close" aria-label="Cerrar notificación">&times;</button>
</div>
<div class="container">
<div data-lang-switcher class="lang-switch-slot"></div>
<div class="hero-kicker">Hosting de Odoo Community totalmente gestionado</div>
<h1>Odoo en marcha en <span>5 minutos</span> — hosting gestionado</h1>
<p class="hero-sub">Ponga su sistema en marcha en minutos: las copias de seguridad se ejecutan solas, su dirección web va con SSL y los módulos los instalamos nosotros. Sin informáticos.</p>
<div class="hero-stats">
<span class="hero-stat"><i class="fas fa-check-circle"></i> 6 ubicaciones globales</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> Listo en 5 min</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> Soporte con IA incluido</span>
<span class="hero-stat"><i class="fas fa-check-circle"></i> Copias de seguridad al instante</span>
</div>
<div class="hero-actions">
<a href="#pricing" class="btn btn-brass">Ver planes y precios &rarr;</a>
<a href="/es/support.html" class="btn btn-outline">Cómo funciona</a>
</div>
</div>
</section>
<!-- Spinning Up Widget (shown when ?message=spinning_up) -->
<section class="spinning-up" id="spinningUp" style="display:none;">
<div class="container">
<div class="spinning-card">
<i class="fas fa-cog fa-spin"></i>
<h3>Preparando su instancia de Odoo</h3>
<p>Estamos preparando su servidor de Odoo Community V20. Normalmente tarda 2-5 minutos.</p>
<p class="spinning-note">En cuanto esté listo, recibirá un correo con sus credenciales de acceso.</p>
</div>
</div>
</section>
<!-- Server Status Banner -->
<section class="server-banner" id="serverBanner">
<div class="container">
<div class="server-banner-header">
<span class="server-banner-kicker">Nuestras ubicaciones de servidor</span>
</div>
<div class="server-grid">
<div class="server-card"><div class="server-city">Amsterdam</div><div class="server-region">Países Bajos</div></div>
<div class="server-card"><div class="server-city">Boston</div><div class="server-region">Estados Unidos</div></div>
<div class="server-card"><div class="server-city">Manchester</div><div class="server-region">Reino Unido</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">Brasil</div></div>
<div class="server-card"><div class="server-city">Sydney</div><div class="server-region">Australia</div></div>
</div>
</div>
</section>
<!-- Trust Bar -->
<section class="trust-bar">
<div class="container">
<p class="trust-label">Empresas de todo el mundo confían en nosotros</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="Su empresa" /><span>Su empresa</span></a>
</div>
</div>
</div>
</section>
<!-- Features -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Todo lo que necesita, nada que no necesite</h2>
<div class="features-grid">
<div class="feature-card">
<i class="fas fa-rocket"></i>
<h3>En marcha en 5 minutos</h3>
<p>Sin necesidad de equipo DevOps. Elija un plan, escoja su región y su sistema estará listo en minutos.</p>
</div>
<div class="feature-card">
<i class="fas fa-shield-alt"></i>
<h3>Copias de seguridad automáticas y SSL</h3>
<p>Las copias de seguridad se ejecutan según un calendario y van rotando: una en Side Hustle, cuatro en On the Rise y Powerhouse. Certificados SSL gratuitos en cada dominio, siempre seguros.</p>
</div>
<div class="feature-card">
<i class="fas fa-cubes"></i>
<h3>Gestión dentro de Odoo</h3>
<p>El punto único para todo su negocio. Sin necesidad de varias cuentas: gestione sus aplicaciones, usuarios y módulos desde un solo panel.</p>
</div>
<div class="feature-card">
<i class="fas fa-code-branch"></i>
<h3>Despliegue de módulos vía Git</h3>
<p>Suba módulos personalizados vía Git o use Quick Git con un clic. Sin FTP, sin complicaciones.</p>
</div>
<div class="feature-card">
<i class="fas fa-headset"></i>
<h3>Bot de soporte y soporte humano</h3>
<p>Bot de soporte con IA para soluciones inmediatas. Equipo humano para todo lo demás. Su UUID es su llave.</p>
</div>
<div class="feature-card-trial" id="trialCard">
<h3>Prueba gratuita</h3>
<p>Empiece su prueba gratuita de 30 días. Sin tarjeta de crédito.</p>
<form class="trial-form" id="trialForm">
<input type="email" id="trialEmail" placeholder="Su dirección de correo" required />
<select id="trialLocation"></select>
<button type="submit" class="btn btn-brass">Enviar</button>
</form>
<div class="trial-success" id="trialSuccess">&#10003; Revise su bandeja de entrada para confirmar su correo.</div>
</div>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-dark" id="faq">
<div class="container">
<h2 class="section-title">Preguntas frecuentes</h2>
<div class="faq-grid">
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>¿Y si mi plan se me queda corto?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Crezca de Side Hustle a Empire sin migrar datos ni perder disponibilidad. Cambie de plan en los ajustes de Odoo: su instancia sigue activa y sus datos vienen con usted.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>¿Puedo personalizarlo?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Sí. On the Rise y los planes superiores admiten módulos vía Git. Instale aplicaciones personalizadas, desarrolle las suyas o use Quick GIT para instalarlas con un clic.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>¿En cuánto tiempo puedo empezar?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Cinco minutos. Elija un plan, escoja su región y su instancia de Odoo estará activa. Sin cuota de alta. Pago con Stripe. Cancele cuando quiera.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>¿Puedo usar Odoo Enterprise?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Powerhouse y Empire están listos para Enterprise. Traiga su licencia; nosotros ponemos la infraestructura.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>¿Odoo Community? ¿Qué puede hacer?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Inventario, contabilidad, CRM, ventas, fabricación, RR. HH.: todo en un solo sistema. Gratuito y totalmente de código abierto.</p></div>
</div>
<div class="faq-card plausible-event-name=FAQ" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>¿Tienen un programa de afiliados?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>No. Creemos que unos precios competitivos para nuestros clientes compartidos están en nuestro propio interés.</p></div>
</div>
</div>
<a href="/es/support.html" class="faq-link">Todas las preguntas &rarr;</a>
</div>
</section>
<!-- Pricing -->
<section class="section-dark" id="pricing">
<div class="container">
<p class="section-kicker">Planes y precios</p>
<h2 class="section-title">Su plan, su ritmo: cambie de plan cuando quiera</h2>
<div class="pricing-server-row">
<label for="pricingServerLocation">Ubicación del servidor</label>
<select id="pricingServerLocation" class="pricing-server-select"></select>
<label for="pricingOdooVersion">Versión de Odoo</label>
<select id="pricingOdooVersion" class="pricing-server-select">
<option value="19.0">19.0 — gran cantidad de módulos OCA compatibles</option>
<option value="20.0" selected>20.0 — lo más nuevo</option>
</select>
</div>
<div class="pricing-grid">
<!-- Side Hustle -->
<div class="pcard">
<div class="pcard-body">
<h3>Side Hustle</h3>
Side Hustle — para empezar
<div class="price">
<strong>$ 214.00</strong>
<small class="price-period">/ año</small>
</div>
<p class="desc">"ODOO Estándar... es todo lo que mi negocio necesita"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="6">Comprar ahora</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Lance Odoo CE en 5 minutos</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Copias automáticas, sin acordarse</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 1 dominio y certificado SSL</li>
</ul>
</div>
<div class="pcard-foot">Sin cuota de alta. Pago con Stripe<br />Cancele cuando quiera</div>
</div>
<!-- On the Rise -->
<div class="pcard featured">
<div class="pcard-body">
<h3>On the Rise</h3>
<div class="price">
<strong>$ 395.00</strong>
<small class="price-period">/ año</small>
</div>
<p class="desc">"Necesito algunos módulos e informes profesionales"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="4">Comprar ahora</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Lance Odoo CE en 5 minutos</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Copias automáticas, sin acordarse</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 dominios y certificados SSL</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Instale módulos personalizados vía Git/QuickGIT</li>
</ul>
</div>
<div class="pcard-foot">Sin cuota de alta. Pago con Stripe<br />Cancele cuando quiera</div>
</div>
<!-- Powerhouse -->
<div class="pcard">
<div class="pcard-body">
<h3>Powerhouse</h3>
<div class="price">
<strong>$ 595.00</strong>
<small class="price-period">/ año</small>
</div>
<p class="desc">"¡ODOO Enterprise es imprescindible!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="5">Comprar ahora</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Lance Odoo CE en 5 minutos</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Copias automáticas, sin acordarse</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 dominios y certificados SSL</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Instale módulos personalizados vía Git/QuickGIT</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 2 workers para mayor fiabilidad</li>
</ul>
</div>
<div class="pcard-foot">Sin cuota de alta. Pago con Stripe<br />Cancele cuando quiera</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">/ año</small>
</div>
<p class="desc">"¡Mi casa! ¡Mi caballo! ¡Mi servidor!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-empire">Solicitar presupuesto</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Nuestro servicio en su servidor</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Todos los módulos y funciones</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Personalización ilimitada</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Soporte prioritario y onboarding dedicado</li>
</ul>
</div>
</div>
</div>
<p class="pricing-cta-note">Ahorre dinero, menos administración</p>
<p class="pricing-cta-note"><a href="/es/odoo-hosting-2027.html"><strong>Compare todas las formas de alojar Odoo en 2027 &rarr;</strong></a></p>
</div>
</section>
<!-- Order Widget -->
<div id="orderWidgetOverlay" class="ow-overlay" onclick="if(event.target===this)closeOrderWidget()">
<div id="orderPanelBuy" class="ow-panel" style="display:none">
<button class="ow-close" onclick="closeOrderWidget()">&times;</button>
<div class="ow-content">
<h2 class="ow-title" id="orderPlanTitle">On the Rise</h2>
<p class="ow-price">
<span class="ow-price-amount" id="orderPlanPrice">$ 395.00</span> <span id="orderPlanPeriod">/ año</span>
<span class="ow-price-tax" id="orderPlanTax">+ impuestos</span>
</p>
<p class="ow-coupon-msg" id="orderCouponMsg">¿Dudas antes de comprar? Pregunte al asistente en esta página.</p>
<p class="ow-yearly-save" id="orderYearlySave">Facturación anual. Sin cuota de alta.</p>
<label class="ow-field-label" for="orderServerLocation">Ubicación del servidor</label>
<select id="orderServerLocation" class="ow-select">
<option value="USA">Estados Unidos (Boston)</option>
<option value="Brazil">Brasil (S&atilde;o Paulo)</option>
<option value="India">India (Mumbai)</option>
<option value="Australia">Australia (Sydney)</option>
<option value="Netherlands">Países Bajos (Amsterdam)</option>
<option value="UK">Reino Unido (London)</option>
</select>
<a id="orderBuyBtn" href="/es/support.html#contact" class="btn btn-brass ow-buy">Continuar a Stripe &rarr;</a>
<p class="ow-note">&#128274; Pago seguro con Stripe &middot; Se requiere tarjeta para comprar, no para empezar.</p>
</div>
</div>
</div>
<!-- Custom Quote Modal -->
<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">Solicitar presupuesto</h2>
<p class="ow-sub">Cuéntenos qué necesita y le prepararemos una oferta a medida.</p>
<form id="customQuoteForm" class="biz-form" style="text-align:left">
<div class="biz-field">
<label for="cqName">Nombre</label>
<input type="text" id="cqName" placeholder="Su nombre completo" required />
</div>
<div class="biz-field">
<label for="cqEmail">Correo electrónico</label>
<input type="email" id="cqEmail" placeholder="your@email.com" required />
</div>
<div class="biz-field">
<label for="cqRequirements">Sus requisitos</label>
<textarea id="cqRequirements" placeholder="Describa sus requisitos (¿cuántos usuarios? ¿en local o en la nube? ¿cuántos workers?)" required></textarea>
</div>
<button type="submit" class="btn btn-brass btn-lg">Enviar solicitud</button>
</form>
<div class="biz-success" id="customQuoteSuccess" style="display:none">
<i class="fas fa-check-circle"></i>
<h3>Solicitud recibida</h3>
<p>Revisaremos sus requisitos y le responderemos en breve.</p>
</div>
</div>
</div>
</div>
<!-- Blog -->
<section class="blog-section blog-section-light" id="blog">
<div class="container">
<p class="section-kicker">Desde la redacción</p>
<h2 class="section-title">Lo último del blog</h2>
<div class="blog-search-wrap">
<input type="text" class="blog-search" id="blogSearch" placeholder="Buscar entradas..." />
</div>
<div class="blog-grid" id="blogGrid"></div>
<div class="blog-pagination" id="blogPagination"></div>
</div>
</section>
<!-- OCA Modules Status -->
<section class="section-dark oca-section" id="ocaModules">
<div class="container">
<p class="section-kicker">Módulos OCA</p>
<h2 class="section-title">Nuestros módulos OCA destacados</h2>
<div class="oca-search-wrap">
<input type="text" class="oca-search" id="ocaSearch" placeholder="Buscar módulos..." />
</div>
<div class="oca-table-wrap">
<table class="oca-table" id="ocaTable">
<thead>
<tr>
<th>Módulo</th>
<th>Área</th>
<th>19.0</th>
<th>20.0</th>
<th></th>
</tr>
</thead>
<tbody id="ocaTbody"></tbody>
</table>
</div>
<div class="oca-empty" id="ocaEmpty">Ningún módulo coincide con su búsqueda.</div>
<div class="oca-loading" id="ocaLoading">Cargando módulos...</div>
</div>
</section>
<!-- Business Wizard -->
<section class="biz-wizard">
<div class="container">
<p class="section-kicker">Para su negocio</p>
<h2>Su plan de proyecto Odoo personalizado</h2>
<p class="biz-sub">Cuéntenos sobre su negocio. La IA prepara un plan de proyecto a medida con módulos recomendados, plazos y hoja de ruta. Le enviaremos el informe en unos minutos.</p>
<form class="biz-form" id="bizForm">
<div class="biz-field">
<label for="bizDescription">Descripción del negocio</label>
<textarea id="bizDescription" placeholder="Describa su negocio: sector, tamaño, software actual, estructura del equipo..." required></textarea>
</div>
<div class="biz-field">
<label for="bizGoals">Mis objetivos</label>
<textarea id="bizGoals" placeholder="¿Qué quiere conseguir con Odoo? Automatizar ventas, gestionar inventario, informes financieros, CRM..." required></textarea>
</div>
<div class="biz-field">
<label for="bizChallenges">Retos actuales</label>
<textarea id="bizChallenges" placeholder="¿Qué problemas tiene? Procesos manuales, datos aislados, problemas de crecimiento, falta de visibilidad..." required></textarea>
</div>
<div class="biz-field">
<label for="bizEmail">Su correo electrónico</label>
<input type="email" id="bizEmail" placeholder="your@email.com" required />
</div>
<div class="biz-checkbox-group">
<label class="biz-checkbox"><input type="checkbox" id="bizHasHomepage" /> Ya tengo una página web</label>
<label class="biz-checkbox"><input type="checkbox" id="bizUsesOdoo" /> Ya uso Odoo</label>
<label class="biz-checkbox"><input type="checkbox" id="bizHasDeveloper" /> Ya tengo un desarrollador para módulos</label>
</div>
<button type="submit" class="btn btn-brass btn-lg" id="bizSubmitBtn">Generar mi plan de proyecto &rarr;</button>
</form>
<div class="biz-success" id="bizSuccess" style="display:none">
<i class="fas fa-check-circle"></i>
<h3>Su plan de proyecto se está preparando</h3>
<p>Le enviaremos el informe por correo en cuanto esté listo. La generación con IA suele tardar 1-2 minutos.</p>
</div>
</div>
</section>
<!-- Footer -->
<footer class="footer">
<div class="container">
<div class="fgrid">
<div>
<h4>Enlaces útiles</h4>
<ul>
<li><a href="/es/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/es/odoo-hosting-2027.html">ODOO Hosting en 2027</a></li>
<li><a href="/es/support.html">Soporte</a></li>
<li><a href="/legal.html">Aviso legal</a></li>
</ul>
</div>
<div>
<h4>Socios</h4>
<div class="partner-list">
<a href="https://oc-guy.com" target="_blank" rel="noopener" class="partner-item"><i class="fas fa-handshake"></i> OC Guy</a>
<a href="https://oca-py.org" target="_blank" rel="noopener" class="partner-item"><i class="fas fa-handshake"></i> OCA Paraguay</a>
<a href="https://OD8N.com" target="_blank" rel="noopener" class="partner-item"><i class="fas fa-handshake"></i> OD8N</a>
</div>
</div>
<div class="fcol-desc">
<h4>Sobre nosotros</h4>
<p>Creamos soluciones de negocio inteligentes y escalables combinando la <strong>estabilidad</strong> de Odoo ERP con la <strong>potencia</strong> de los agentes de IA y las automatizaciones N8N.</p>
<p>Desde unas ventas ágiles hasta despliegues globales, nuestro enfoque <strong>lean y ecológico</strong> ayuda a las empresas a reducir costes, ganar eficiencia y crecer sin límites.</p>
</div>
<div>
<h4>Síganos</h4>
<div class="social">
<a href="https://www.linkedin.com/company/odoo4projects/" target="_blank" aria-label="LinkedIn"><i class="fab fa-linkedin-in"></i></a>
<a href="https://www.youtube.com/@ODOO4projects" target="_blank" aria-label="YouTube"><i class="fab fa-youtube"></i></a>
</div>
<form class="footer-contact-form" id="footerContactForm">
<input type="email" id="footerContactEmail" placeholder="Su dirección de correo" required />
<div class="footer-textarea-wrap">
<textarea id="footerContactText" placeholder="Su mensaje..." required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Enviar mensaje"><i class="fas fa-paper-plane"></i></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 src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
<script src="/script.js"></script>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
+887
View File
@@ -0,0 +1,887 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Community Upgrade — gestionado para usted | ODOO4projects</title>
<meta
name="description"
content="Un cambio de versión de Odoo Community explicado: qué cambia, qué se rompe, los comandos reales y cómo migramos su base de datos a nuestros servidores."
/>
<link rel="canonical" href="https://odoo4projects.com/es/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/odoo-community-upgrade.html" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/odoo-community-upgrade.html" />
<meta property="og:title" content="Odoo Community Upgrade — gestionado para usted" />
<meta
property="og:description"
content="Qué cambia en un cambio de versión de Odoo Community, los comandos reales para el desarrollador y cómo trasladamos su base de datos a nuestros servidores."
/>
<meta property="og:type" content="article" />
<meta property="og:url" content="https://odoo4projects.com/es/odoo-community-upgrade.html" />
<meta property="og:image" content="https://odoo4projects.com/images/hero/amsterdam.webp" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="Odoo Community Upgrade — gestionado para usted" />
<meta
name="twitter:description"
content="Qué cambia en un cambio de versión de Odoo Community, los comandos reales para el desarrollador y cómo trasladamos su base de datos a nuestros servidores."
/>
<meta name="twitter:image" content="https://odoo4projects.com/images/hero/amsterdam.webp" />
<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 Community Upgrade page (page-scoped; additive) ---- */
.oc-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) */
.cmp-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.cmp-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.cmp-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.cmp-brand span {
color: var(--brass);
}
.cmp-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.cmp-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar-links a:hover {
color: var(--brass);
}
.cmp-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.cmp-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar .lang-switch a:hover,
.cmp-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.cmp-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero — the same midnight lounge as the rest of the site, with our own
Amsterdam photo behind the copy. */
.oc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.oc-hero .container {
position: relative;
z-index: 1;
}
.oc-hero h1 span {
color: var(--brass);
}
.oc-hero .hero-sub {
max-width: 700px;
}
.oc-hero-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.25;
filter: brightness(1.15) saturate(1.1);
}
.oc-body {
max-width: 760px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .oc-body {
color: rgba(255, 255, 255, 0.78);
}
.oc-body p:last-child {
margin-bottom: 0;
}
.oc-body strong {
color: var(--ink);
}
.section-dark .oc-body strong {
color: #fff;
}
.oc-pull {
max-width: 760px;
margin: 2rem auto 0;
padding-top: 1.25rem;
border-top: 1px solid var(--line-brass);
font-family: Marcellus, Georgia, serif;
font-size: 1.05rem;
color: var(--ink);
text-align: center;
}
.section-dark .oc-pull {
color: var(--brass-bright);
}
/* Numbered process list */
.oc-steps {
max-width: 820px;
margin: 0 auto;
padding: 0;
list-style: none;
counter-reset: oc-step;
}
.oc-steps li {
position: relative;
counter-increment: oc-step;
padding: 0 0 1.4rem 3.2rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.7;
border-left: 1px solid rgba(201, 162, 39, 0.25);
margin-left: 1rem;
}
.oc-steps li::before {
content: counter(oc-step);
position: absolute;
left: -1.05rem;
top: -0.15rem;
width: 2.1rem;
height: 2.1rem;
display: flex;
align-items: center;
justify-content: center;
font-family: Marcellus, Georgia, serif;
font-size: 1rem;
color: var(--midnight);
background: var(--brass);
border-radius: 50%;
}
.oc-steps li strong {
color: #fff;
font-weight: 600;
}
.oc-steps li:last-child {
padding-bottom: 0;
}
/* Technical section: code cards + substitution notes */
.oc-code {
background: var(--midnight);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1rem 1.15rem;
margin: 1.1rem 0 0;
overflow-x: auto;
box-shadow: var(--shadow-rest);
}
.section-dark .oc-code {
background: var(--midnight-2);
}
/* R1 moved the process list onto a light band and the technical section onto a
dark one, so their text colours have to follow the band, not their old parent. */
.section-light .oc-steps li {
color: var(--ink-soft);
}
.section-light .oc-steps li strong {
color: var(--ink);
}
.section-dark .oc-sub h3 {
color: var(--cream);
}
.section-dark .oc-sub > p,
.section-dark .oc-note {
color: rgba(255, 255, 255, 0.78);
}
.section-dark .oc-note strong {
color: #fff;
}
/* R3 puts the "See the plans" link inside the dark offer band. */
.section-dark .oc-body a {
color: var(--brass-bright);
}
.oc-code code {
display: block;
font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, "Liberation Mono", monospace;
font-size: 0.8rem;
line-height: 1.7;
color: #ece6da;
white-space: pre;
tab-size: 2;
}
.oc-note {
margin: 0.9rem 0 0;
padding: 0.15rem 0 0.15rem 1rem;
border-left: 2px solid var(--brass);
font-size: 0.9rem;
color: var(--ink-soft);
line-height: 1.7;
}
.oc-note p:last-child {
margin-bottom: 0;
}
.oc-sub {
margin-top: 2.25rem;
}
.oc-sub h3 {
color: var(--ink);
margin-bottom: 0.35rem;
}
.oc-sub > p {
color: var(--ink-soft);
line-height: 1.75;
}
/* FAQ */
.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],
.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 .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
}
/* Final CTA band */
.cmp-cta {
text-align: center;
}
.cmp-cta .oc-lead {
font-size: 1.1rem;
color: rgba(255, 255, 255, 0.72);
max-width: 700px;
margin: 0 auto 1.5rem;
line-height: 1.7;
}
.cmp-cta-actions {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 0.5rem;
}
.cmp-cta-actions .btn {
align-self: center;
}
/* Focus states on every CTA */
.btn:focus-visible,
.cmp-topbar-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
@media (max-width: 768px) {
.oc-hero {
padding: 3rem 0 2.5rem;
}
.oc-steps li {
padding-left: 2.6rem;
}
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://odoo4projects.com/odoo-community-upgrade.html#webpage",
"url": "https://odoo4projects.com/odoo-community-upgrade.html",
"name": "Odoo Community Upgrade — gestionado para usted",
"description": "Un cambio de versión de Odoo Community explicado: qué cambia, qué se rompe, los comandos reales y cómo migramos su base de datos a nuestros servidores.",
"inLanguage": "es",
"isPartOf": { "@id": "https://odoo4projects.com/#organization" }
},
{
"@type": "Service",
"name": "Migración de la base de datos de Odoo Community al hosting de ODOO4projects",
"provider": { "@id": "https://odoo4projects.com/#organization" },
"url": "https://odoo4projects.com/odoo-community-upgrade.html"
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "¿Es lo mismo un cambio de versión que una actualización?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Una actualización le da la última revisión del software que ya utiliza. Un cambio de versión lleva su base de datos a una nueva versión mayor (18 a 19, o 19 a 20) y transforma los propios datos. Es en un solo sentido: no existe una vuelta atrás con soporte, y no es un cambio de licencia, ni de edición, ni de hosting."
}
},
{
"@type": "Question",
"name": "¿Podemos pasar directamente de Odoo 14 a Odoo 20?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Se hace una versión mayor a la vez: 14 a 15 a 16 a 17 a 18 a 19 a 20. Saltarse una versión no es un camino con soporte. Nuestro propio servicio de migración documenta soporte para bases de datos en Odoo 17, 18 y 19, solo versiones principales, sin versiones de parche; las bases más antiguas necesitan antes una revisión de compatibilidad, que empieza con una incidencia de soporte."
}
},
{
"@type": "Question",
"name": "¿Qué pasa con mi historial: las facturas, los pagos, los archivos adjuntos?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Esa es la pregunta correcta, y la respuesta honesta es que depende de la ruta. La ruta de OpenUpgrade — una migración de versión ejecutada en su propio servidor — lleva la base de datos consigo y conserva el historial y los enlaces entre registros. La documentación de OpenUpgrade advierte de que la otra ruta, trasladar documentos a un sistema nuevo, recupera solo parte de sus datos y pierde el historial y los enlaces entre registros, por ejemplo las facturas de cada cliente. Nuestro servicio le construye una base de datos nueva y traslada sus datos a ella, así que la nuestra es la ruta por la que preguntar: antes de aprobar nada, pídanos que enumeremos exactamente qué registros estarán en la nueva base de datos y cuáles no. Preferimos que la haga a que la dé por supuesta."
}
},
{
"@type": "Question",
"name": "¿Seguirán funcionando mis módulos personalizados?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No por sí solos. Un módulo escrito para su negocio tiene que llevar su código a la versión de destino, y los cambios de nombre que de otro modo perderían datos necesitan sus propios scripts de migración. La documentación de Odoo es tajante al respecto: un cambio de versión queda bloqueado hasta que exista una versión de sus módulos personalizados para la versión a la que se muda. Los módulos que vienen con Odoo y los de la asociación de la comunidad traen sus propios scripts de migración; los suyos no, y alguien tiene que escribirlos."
}
},
{
"@type": "Question",
"name": "¿Cuánto cuesta y cuánto tarda?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No publicamos ni precio ni duración para el servicio de cambio de versión, y no vamos a inventarnos ninguno aquí. Lo que sí publicamos es cómo empieza: usted abre una incidencia de soporte, revisamos la compatibilidad de su base de datos y le respondemos. Si lo compara con hacerlo usted mismo, la comparación honesta no es el alquiler del servidor, sino sus propias horas, que nunca aparecen en esa factura."
}
},
{
"@type": "Question",
"name": "¿Necesito un desarrollador?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Para ejecutar los comandos de la sección técnica, sí; o alguien que se maneje en una terminal con PostgreSQL. Para que lo hagamos nosotros, no: de eso se trata el servicio. Usted envía la base de datos, nosotros montamos el sistema nuevo en nuestra infraestructura y usted recibe las credenciales."
}
},
{
"@type": "Question",
"name": "¿Puedo ver el sistema con la nueva versión antes de ponerlo en producción?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sí, y debería hacerlo. Quien hace el trabajo migra primero una copia; esa es la primera regla de todo el proceso, tanto en la documentación de Odoo como en el proyecto OpenUpgrade. Y la copia migrada es lo que usted revisa antes de que le ocurra nada al sistema con el que funciona su negocio. Nuestro servicio sigue el mismo principio: montamos el sistema nuevo en nuestros propios servidores y usted lo compara con el antiguo."
}
},
{
"@type": "Question",
"name": "Estamos alojados en otro sitio. ¿Pueden cambiar de versión igualmente?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sí, exactamente para eso está nuestro servicio de migración. Usted abre una incidencia de soporte, le enviamos un formulario seguro para subir su base de datos, le montamos un servidor nuevo en nuestra infraestructura y le damos las credenciales. Bases de datos en Odoo 17, 18 y 19, solo versiones principales; las más antiguas, tras una revisión de compatibilidad."
}
}
]
}
]
}
</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="cmp-topbar">
<div class="container">
<a class="cmp-brand" href="/es/">ODOO4<span>projects</span></a>
<nav class="cmp-topbar-links" aria-label="Enlaces de la página">
<a href="/es/#pricing">Planes y precios</a>
<a href="/es/support.html">Soporte</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero oc-hero">
<div class="hero-bg">
<img
class="oc-hero-img"
src="/images/hero/amsterdam.webp"
alt="Ámsterdam al atardecer — una de las seis regiones en las que funcionan nuestros servidores"
width="1920"
height="768"
fetchpriority="high"
decoding="async"
/>
</div>
<div class="container">
<p class="hero-kicker">ODOO COMMUNITY UPGRADE</p>
<h1><span>Odoo Community Upgrade</span>: qué cambia y cómo lo hacemos por usted</h1>
<p class="hero-sub">
Subir a una nueva versión mayor de Odoo no es una actualización: es un cambio en un solo sentido de su base de datos, y no es algo que quiera hacer mal. Aquí está cómo lo hacemos por usted — un sistema nuevo en nuestros propios servidores, el actual intacto mientras trabajamos — y, debajo, los comandos exactos que ejecutaría un desarrollador.
</p>
<div class="hero-actions">
<a href="/es/support.html#contact" class="btn btn-brass btn-lg">Abra una incidencia: díganos qué versión utiliza</a>
<a href="/es/#pricing" class="btn btn-outline btn-lg">Ver los planes</a>
</div>
</div>
</section>
<!-- What an upgrade is -->
<section class="section-light">
<div class="container">
<p class="section-kicker">La diferencia que importa</p>
<h2 class="section-title">Qué es realmente un cambio de versión de Odoo Community</h2>
<div class="oc-body">
<p>
Odoo usa dos palabras que suenan igual y no lo son. Una <strong>actualización</strong> le da la última revisión del software que ya utiliza. Un <strong>cambio de versión</strong> lleva su base de datos a una nueva versión mayor (18 a 19, o 19 a 20) y transforma los propios datos. Es en un solo sentido: no existe una vuelta atrás con soporte, y no es un cambio de licencia, ni de edición, ni de proveedor de hosting.
</p>
<p>Hay tres cosas que conviene saber antes de que alguien toque su sistema.</p>
<p>
<strong>Se hace una versión mayor a la vez.</strong> Un salto de 17 a 20 son tres migraciones, no una: 17 → 18, 18 → 19, 19 → 20. Saltarse una versión no es un camino con soporte en ningún punto del ecosistema Odoo.
</p>
<p>
<strong>Se hace sobre una copia, nunca sobre la base de datos en producción.</strong> Todos los que han escrito sobre esto (la propia documentación de Odoo, el proyecto OpenUpgrade de la OCA y cada profesional que hemos visto) empiezan haciendo una copia de seguridad y trabajando sobre un duplicado. Lo que se rompe lo descubre en la copia, no delante de sus clientes.
</p>
<p>
<strong>Sus propias personalizaciones son la parte que da trabajo.</strong> Un módulo hecho para su negocio no se mueve solo: hay que llevar su código a la versión de destino, y los cambios de nombre que de otro modo perderían datos necesitan sus propios scripts de migración. La documentación de Odoo lo dice sin rodeos: un cambio de versión queda bloqueado hasta que exista una versión de sus módulos personalizados para la versión a la que se muda.
</p>
<p>
Y luego la ruta en sí. Odoo vende una ruta de actualización para Enterprise; para Odoo Community, la respuesta de código abierto es el proyecto OpenUpgrade de la OCA. La documentación de OpenUpgrade afirma que Odoo Community Edition no da soporte a migraciones entre versiones mayores y deja constancia de que OpenUpgrade es la solución que el propio fundador de Odoo recomienda para ello. Es un proyecto real, mantenido por la asociación de la comunidad, y es la ruta que usará un desarrollador sobre una base de datos Community.
</p>
</div>
</div>
</section>
<!-- Our way -->
<section class="section-dark" id="our-way">
<div class="container">
<p class="section-kicker">La forma de ODOO4projects</p>
<h2 class="section-title">La forma de ODOO4projects: una base de datos nueva, y el trabajo lo hacemos nosotros</h2>
<div class="oc-body">
<p>
No tiene que hacer nada de esto usted mismo. Si su negocio funciona con Odoo Community y quiere cambiar de versión sin contratar a alguien que recorra la secuencia de esta página, esto es lo que hacemos nosotros.
</p>
<p>
Usted abre una incidencia de soporte y nos cuenta qué tiene. Primero miramos su base de datos (su versión, sus personalizaciones, si es algo que podemos mover) y le decimos qué encontramos. Luego le enviamos un enlace a un formulario seguro donde sube su base de datos. Cuando la tenemos, le montamos un servidor nuevo en nuestra propia infraestructura y le entregamos las credenciales. Su sistema actual sigue funcionando todo el tiempo, porque no lo tocamos: trabajamos sobre la base de datos que nos envió y sobre el servidor nuevo que montamos.
</p>
<p>
Si prefiere ver antes una cifra: qué plan necesita depende de los módulos que use, y los planes están aquí — <a href="/es/#pricing">Ver los planes</a>. El cambio de versión en sí no tiene precio en esa página; le respondemos después de haber mirado su base de datos.
</p>
<p>
Ese último punto es toda la razón de hacerlo así. Con nuestro servicio no migra su base de datos en producción por la noche, después de cerrar. Está viendo un segundo sistema, en una versión nueva, con sus datos dentro, y puede comparar los dos antes de decidir nada.
</p>
<p>
Nuestro servicio de migración documenta soporte para bases de datos en Odoo 17, 18 y 19, solo versiones principales; las versiones de parche como 18.1 o 17.2 no tienen soporte en ningún punto de nuestro servicio. Si su base de datos es anterior a la 17, también podemos ayudarle a llevarla a una versión con soporte, pero solo tras revisarla para comprobar la compatibilidad. Las instancias nuevas en nuestros servidores pueden crearse en Odoo 19 u Odoo 20, así que si se muda a la 20 en concreto, dígalo en la incidencia: la versión a la que va importa más que la versión en la que está.
</p>
<p>
En el terreno de la IA, aquí hay un caso que hemos publicado de verdad. Copiar facturas a mano de una instancia de Odoo a otra es lento y fácil de hacer mal, así que lo hicimos con un flujo de trabajo: registros escritos desde un sistema Odoo 19 a un sistema Odoo 20 nuevo, impulsados por un flujo de automatización y un servidor MCP apuntando al sistema nuevo. Tres reglas lo hicieron seguro (el número y la fecha de la factura nunca cambian, el contacto se busca en lugar de suponerse, el producto se busca en lugar de suponerse) y una restricción firme: si falta un contacto o un producto, la ejecución falla de forma sonora en lugar de crear un casi duplicado. Antes de soltarlo sobre el resto, revisamos una factura de principio a fin: número, fecha, contacto y líneas de producto.
</p>
<p>
Hay algo que no vamos a difuminar, porque es la diferencia entre nosotros y un vendedor. El servidor MCP que incluimos dentro de nuestra propia consola de gestión hace operaciones de hosting. Reinicia un servidor, sube un módulo, añade o comprueba un dominio, gestiona copias de seguridad y lee un archivo de registro; esa es la lista publicada, y es una comodidad real si usa un asistente de IA. No es un motor de migración de datos y no lo describimos como tal. El trabajo de importación de arriba se hizo con un flujo de automatización y un MCP de terceros; la IA hacía la parte tediosa y un humano la revisaba, justo como debe ser.
</p>
<p>
Y el límite honesto, en palabras del proyecto que mejor lo conoce. La documentación de OpenUpgrade menciona la alternativa de exportar e importar y le pone precio sin rodeos: recupera solo parte de sus datos y, en particular, no obtiene el historial ni los enlaces entre registros, por ejemplo las facturas de cada cliente. Ese es el riesgo de cualquier ruta que traslade documentos a un sistema nuevo, y por eso, si toma esa ruta con nosotros, nos hace una pregunta antes de aprobar nada: qué registros estarán en la nueva base de datos y cuáles no. Preferimos que la haga a que la dé por supuesta.
</p>
</div>
</div>
</section>
<!-- Process -->
<section class="section-light">
<div class="container">
<p class="section-kicker">La ruta documentada</p>
<h2 class="section-title">El proceso de cambio de versión, paso a paso</h2>
<div class="oc-body">
<p>
Esta es la secuencia en la que coinciden la documentación de Odoo, el proyecto OpenUpgrade y los talleres grabados. Nada de esto es nuestro ni es secreto: es la ruta documentada, en el orden en que se hace.
</p>
</div>
<ol class="oc-steps">
<li>
<strong>Haga una copia de seguridad de la base de datos y sepa dónde está el filestore.</strong> Antes que nada. La documentación del proyecto OpenUpgrade dice que debe hacer sin falta una copia de la base de datos en producción, y todo profesional empieza por aquí.
</li>
<li>
<strong>Trabaje sobre una copia.</strong> Restaure la copia en una base de datos de prueba y migre esa. Su sistema en producción queda intacto hasta que la copia funcione.
</li>
<li>
<strong>Ponga en marcha primero la versión de destino.</strong> Instale el Odoo más reciente y coloque el código de OpenUpgrade para la versión de destino en su ruta de add-ons, junto a los módulos que ya utiliza.
</li>
<li>
<strong>Adapte sus módulos personalizados.</strong> Lleve su código a la nueva versión antes de que se ejecute la migración.
</li>
<li>
<strong>Ejecute la migración sobre la copia.</strong> Un módulo a la vez, en orden de dependencias; cada uno ejecuta su pre-script, luego carga y luego su post-script.
</li>
<li>
<strong>Cuente con ejecutarla más de una vez.</strong> Esto es iterativo. En el taller grabado, el entorno (repositorios, ramas, la lista de módulos) es la parte que lleva tiempo; la ejecución de la migración en sí es rápida una vez que existe el entorno, y usted reinicia y vuelve a ejecutar hasta que el registro esté limpio.
</li>
<li>
<strong>Termine con una actualización simple.</strong> Ejecutar la actualización una vez más sin los parámetros de migración es lo que elimina el estado "incompatible" y deja la base de datos utilizable.
</li>
<li>
<strong>Compruebe por los datos, no por el número de versión.</strong> Abra la copia migrada y revise lo que importa: un cliente, un producto, un pedido, una factura, un pago. Así lo verifican los profesionales en pantalla.
</li>
<li>
<strong>Limpie después.</strong> Las tablas, columnas y vistas obsoletas que deja una migración cuestan rendimiento, así que se eliminan una vez que el sistema lleva un tiempo en marcha y nadie ha reportado un problema.
</li>
<li>
<strong>Después, pase a producción.</strong> Restaure la base de datos migrada donde corresponda, o haga que el cambio de versión se ejecute sobre la base de datos en producción en el momento que usted elija.
</li>
</ol>
<p class="oc-pull">
Esa es su forma honesta: la preparación es la parte larga, la migración en sí es la corta, y la copia es lo que se le permite romper.
</p>
</div>
</section>
<!-- Technical section -->
<section class="section-dark" id="commands">
<div class="container">
<p class="section-kicker">Para su desarrollador</p>
<h2 class="section-title">Para su desarrollador: los comandos reales</h2>
<div class="oc-body">
<p>
Si gestiona Odoo Community usted mismo y prefiere hacerlo en casa en lugar de dejárnoslo, estos son los comandos. Están citados de la documentación de la que proceden, y cada uno indica qué debe sustituir y de qué advierte esa fuente. Nada de lo que sigue lo hemos ejecutado nosotros contra su base de datos, y ningún comando publicado por nosotros se ejecuta en nuestros servidores: nuestro servicio empieza con una incidencia de soporte, no con una terminal.
</p>
</div>
<div class="oc-sub">
<h3>La plataforma de cambio de versión de Odoo</h3>
<p>
Odoo documenta una plataforma de cambio de versión que funciona para instalaciones on-premise desde la línea de comandos. La documentación de Odoo indica que los scripts de migración que ejecuta no son de código abierto y vienen con Enterprise; pero la plataforma en sí sí lleva a una nueva versión una base de datos autoalojada.
</p>
<pre class="oc-code"><code># upgraded TEST database
python &lt;(curl -s https://upgrade.odoo.com/upgrade) test -d &lt;your db name&gt; -t &lt;target version&gt;
# production upgrade
python &lt;(curl -s https://upgrade.odoo.com/upgrade) production -d &lt;your db name&gt; -t &lt;target version&gt;
# general help
python &lt;(curl -s https://upgrade.odoo.com/upgrade) --help</code></pre>
<div class="oc-note">
<p>
<strong>Sustituya:</strong> <code>&lt;your db name&gt;</code> es la base de datos de la máquina desde la que ejecuta el comando, y <code>&lt;target version&gt;</code> es la versión a la que se muda — 17.0, 18.0 o 19.0, según el selector de versión de nuestra propia página de planes.
</p>
<p>
Lo que la documentación de Odoo exige junto a esas tres líneas, porque de ello depende que funcionen: el script necesita los comandos Linux habituales presentes en la máquina; el usuario del sistema que lo ejecuta necesita acceso a su base de datos PostgreSQL (el entorno de cliente PostgreSQL estándar, como <code>.pgpass</code>); y la máquina debe alcanzar la plataforma de cambio de versión en TCP 443 y en un puerto del rango 32768-60999, así que puede hacer falta una excepción en el cortafuegos. La copia que sube se envía sin filestore, así que hay que fusionar el filestore de producción en la base de datos actualizada antes de probarla. La descarga contiene <code>dump.sql</code> y una carpeta de filestore, y solo quien solicitó el cambio de versión puede descargar el resultado.
</p>
</div>
</div>
<div class="oc-sub">
<h3>La ruta Community: OCA OpenUpgrade</h3>
<pre class="oc-code"><code># 1. OpenUpgrade for the TARGET version (the branch is the target major version)
git clone --depth 1 --branch &lt;TARGET&gt;.0 https://github.com/OCA/OpenUpgrade.git
# 2. helper library — the line the OpenUpgrade docs use
pip install "git+https://github.com/OCA/openupgradelib.git@master#egg=openupgradelib"
# 3. put the clone on the add-ons path of the &lt;TARGET&gt; Odoo config
# addons_path = &lt;your own addons&gt;,&lt;/abs/path&gt;/OpenUpgrade
# 4. migrate the copy of the database
&lt;odoo-bin&gt; -c /etc/odoo/&lt;TARGET&gt;.conf \
-d &lt;DB&gt; \
--upgrade-path=/abs/path/OpenUpgrade/openupgrade_scripts/scripts \
-u all --stop-after-init \
--load=base,web,openupgrade_framework
# 5. finish: a plain update, no migration parameters
&lt;odoo-bin&gt; -c /etc/odoo/&lt;TARGET&gt;.conf -d &lt;DB&gt; -u all --stop-after-init</code></pre>
<div class="oc-note">
<p>
<strong>Sustituya cuatro cosas:</strong> <code>&lt;TARGET&gt;</code> es la versión mayor de destino (17, 18 o 19 — no la versión de la que viene); <code>&lt;DB&gt;</code> es la copia que migra, nunca la base de datos en producción; <code>&lt;odoo-bin&gt;</code> es el binario de la versión de destino, y cómo se llama depende de cómo instaló Odoo (<code>odoo-bin</code>, <code>odoo</code> o el equivalente de Docker); y ambas rutas absolutas son suyas — la ruta de add-ons y la ubicación del clon de OpenUpgrade.
</p>
<p>
Dos detalles que conviene llevarse de la documentación del propio proyecto: la parte <code>openupgrade_framework</code> de ese comando es un conjunto de parches que, entre otras cosas, impide que Odoo elimine las columnas y tablas de campos que ya no existen — una de las formas en que una migración pierde datos. Y la variable de entorno <code>OPENUPGRADE_USE_DEMO=yes</code> conserva los datos de demostración en la base de datos migrada cuando usted los quiere.
</p>
</div>
</div>
<div class="oc-sub">
<h3>Sus módulos personalizados</h3>
<pre class="oc-code"><code># Odoo's own code-rewrite command (it runs the scripts in odoo/upgrade_code)
&lt;odoo-bin&gt; upgrade_code --from &lt;FROM&gt; --to &lt;TO&gt; --dry-run</code></pre>
<div class="oc-note">
<p>
<strong>Sustituya</strong> <code>&lt;FROM&gt;</code> y <code>&lt;TO&gt;</code> por las dos versiones mayores (18 y 19, por ejemplo). Ejecútelo primero con <code>--dry-run</code>. La propia referencia de comandos de Odoo llama a este comando una herramienta de "mejor esfuerzo" y advierte de que "no son balas de plata": reescribe lo que puede y le deja una lista de lo que un humano todavía tiene que cambiar. El equivalente de la comunidad OpenUpgrade para el código de módulos es <code>odoo-module-migrator</code>, que registra INFO para los cambios automáticos, WARNING para lo que hay que revisar y ERROR para lo que no funcionará en absoluto. Ambas herramientas informan; ninguna piensa.
</p>
</div>
</div>
<div class="oc-sub">
<h3>Copias de seguridad y el filestore</h3>
<pre class="oc-code"><code># stop the service while you work (packaged install; the Odoo docs show this pattern)
sudo service odoo&lt;TARGET&gt; stop
# database dump (PostgreSQL's own tool)
sudo -u postgres pg_dump -Fc -d &lt;DB&gt; -f /path/backup/&lt;DB&gt;.dump
# restore a dump into a fresh database
sudo -u postgres createdb -O &lt;DB_OWNER&gt; &lt;DB_NEW&gt;
sudo -u postgres pg_restore -d &lt;DB_NEW&gt; /path/backup/&lt;DB&gt;.dump
# the filestore lives under Odoo's data directory:
# default on Unix: $XDG_DATA_HOME or ~/.local/share/Odoo or /var/lib/Odoo
# filestore path: &lt;data_dir&gt;/filestore/&lt;DB&gt;</code></pre>
<div class="oc-note">
<p>
<strong>Sustituya</strong> los nombres de las bases de datos, el propietario, la ruta de copia y el directorio de datos del filestore por los suyos; el filestore es lo que contiene los archivos adjuntos y documentos a los que apuntan sus registros, y una base de datos restaurada sin él es una base de datos a la que le faltan archivos. Son los procedimientos documentados de PostgreSQL y de Odoo, no los nuestros: no publicamos un comando que se ejecute en nuestros servidores, porque nuestro servicio empieza con una incidencia.
</p>
</div>
</div>
</div>
</section>
<!-- Self-hosting cost -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Trabajo propio</p>
<h2 class="section-title">Lo que de verdad cuesta hacerlo usted mismo</h2>
<div class="oc-body">
<p>
Un servidor alquilado es barato. Esa es la cifra más pequeña de esta decisión. Odoo Community en sí es gratis: no encontrará una licencia por usuario en ninguna parte de esta ruta, porque Community no la tiene.
</p>
<p>
Lo que no está en esa cifra es la persona. Un cambio de versión en su propio servidor significa que alguien instala la versión nueva, coloca el código de migración en la ruta correcta, adapta los módulos que su negocio usa de verdad, ejecuta la migración hasta que el registro deja de quejarse, comprueba que los clientes, los pedidos y las facturas siguen ahí, limpia lo que dejó la migración y luego lo repite en la base de datos en producción en un momento que le venga bien al negocio. La propia documentación de Odoo dice que la actualización la hace mejor quien instaló Odoo en su día. En un servidor alquilado, esa persona es usted o alguien a quien paga por horas, y ninguna de esas líneas aparece en la factura. Esa es la mitad de la cuenta que nadie imprime, y la mitad que acaba en sus noches.
</p>
<p>
No vamos a poner una cifra a sus horas, porque no las hemos medido y una cifra de marketing sería peor que ninguna. Lo que sí diremos es la parte que no va realmente de dinero: mientras hace ese trabajo, no hace el trabajo por el que le pagan, y si la migración está mal, se entera por un cliente.
</p>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-dark" id="faq">
<div class="container">
<p class="section-kicker">Respuestas claras</p>
<h2 class="section-title">Preguntas sobre el cambio de versión</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Es lo mismo un cambio de versión que una actualización?</summary>
<div class="cmp-a">
<p>
No. Una actualización le da la última revisión del software que ya utiliza. Un cambio de versión lleva su base de datos a una nueva versión mayor (18 a 19, o 19 a 20) y transforma los propios datos. Es en un solo sentido: no existe una vuelta atrás con soporte, y no es un cambio de licencia, ni de edición, ni de hosting.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Podemos pasar directamente de Odoo 14 a Odoo 20?</summary>
<div class="cmp-a">
<p>
No. Se hace una versión mayor a la vez: 14 a 15 a 16 a 17 a 18 a 19 a 20. Saltarse una versión no es un camino con soporte. Nuestro propio servicio de migración documenta soporte para bases de datos en Odoo 17, 18 y 19, solo versiones principales, sin versiones de parche; las bases más antiguas necesitan antes una revisión de compatibilidad, que empieza con una incidencia de soporte.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Qué pasa con mi historial: las facturas, los pagos, los archivos adjuntos?</summary>
<div class="cmp-a">
<p>
Esa es la pregunta correcta, y la respuesta honesta es que depende de la ruta. La ruta de OpenUpgrade — una migración de versión ejecutada en su propio servidor — lleva la base de datos consigo y conserva el historial y los enlaces entre registros. La documentación de OpenUpgrade advierte de que la otra ruta, trasladar documentos a un sistema nuevo, recupera solo parte de sus datos y pierde el historial y los enlaces entre registros, por ejemplo las facturas de cada cliente. Nuestro servicio le construye una base de datos nueva y traslada sus datos a ella, así que la nuestra es la ruta por la que preguntar: antes de aprobar nada, pídanos que enumeremos exactamente qué registros estarán en la nueva base de datos y cuáles no. Preferimos que la haga a que la dé por supuesta.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Seguirán funcionando mis módulos personalizados?</summary>
<div class="cmp-a">
<p>
No por sí solos. Un módulo escrito para su negocio tiene que llevar su código a la versión de destino, y los cambios de nombre que de otro modo perderían datos necesitan sus propios scripts de migración. La documentación de Odoo es tajante al respecto: un cambio de versión queda bloqueado hasta que exista una versión de sus módulos personalizados para la versión a la que se muda. Los módulos que vienen con Odoo y los de la asociación de la comunidad traen sus propios scripts de migración; los suyos no, y alguien tiene que escribirlos.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Cuánto cuesta y cuánto tarda?</summary>
<div class="cmp-a">
<p>
No publicamos ni precio ni duración para el servicio de cambio de versión, y no vamos a inventarnos ninguno aquí. Lo que sí publicamos es cómo empieza: usted abre una incidencia de soporte, revisamos la compatibilidad de su base de datos y le respondemos. Si lo compara con hacerlo usted mismo, la comparación honesta no es el alquiler del servidor, sino sus propias horas, que nunca aparecen en esa factura.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Necesito un desarrollador?</summary>
<div class="cmp-a">
<p>
Para ejecutar los comandos de la sección técnica, sí; o alguien que se maneje en una terminal con PostgreSQL. Para que lo hagamos nosotros, no: de eso se trata el servicio. Usted envía la base de datos, nosotros montamos el sistema nuevo en nuestra infraestructura y usted recibe las credenciales.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">¿Puedo ver el sistema con la nueva versión antes de ponerlo en producción?</summary>
<div class="cmp-a">
<p>
Sí, y debería hacerlo. Quien hace el trabajo migra primero una copia; esa es la primera regla de todo el proceso, tanto en la documentación de Odoo como en el proyecto OpenUpgrade. Y la copia migrada es lo que usted revisa antes de que le ocurra nada al sistema con el que funciona su negocio. Nuestro servicio sigue el mismo principio: montamos el sistema nuevo en nuestros propios servidores y usted lo compara con el antiguo.
</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Estamos alojados en otro sitio. ¿Pueden cambiar de versión igualmente?</summary>
<div class="cmp-a">
<p>
Sí, exactamente para eso está nuestro servicio de migración. Usted abre una incidencia de soporte, le enviamos un formulario seguro para subir su base de datos, le montamos un servidor nuevo en nuestra infraestructura y le damos las credenciales. Bases de datos en Odoo 17, 18 y 19, solo versiones principales; las más antiguas, tras una revisión de compatibilidad.
</p>
</div>
</details>
</div>
</div>
</section>
<!-- Final CTA band -->
<section class="section-dark cmp-cta" id="start">
<div class="container">
<p class="oc-lead">
Usted abre una incidencia de soporte, revisamos la compatibilidad de su base de datos y le respondemos.
</p>
<div class="cmp-cta-actions">
<a href="/es/support.html#contact" class="btn btn-brass btn-lg">Abra una incidencia: díganos qué versión utiliza</a>
<a href="/es/#pricing" class="btn btn-outline btn-lg">Ver los planes</a>
</div>
</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>Enlaces útiles</h4>
<ul>
<li><a href="/es/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/es/odoo-hosting-2027.html">ODOO Hosting en 2027</a></li>
<li><a href="/es/support.html">Soporte</a></li>
<li><a href="/legal.html">Aviso legal</a></li>
</ul>
</div>
<div>
<h4>Socios</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>Sobre nosotros</h4>
<p>Creamos soluciones de negocio inteligentes y escalables combinando la <strong>estabilidad</strong> de Odoo ERP con la <strong>potencia</strong> de los agentes de IA y las automatizaciones N8N.</p>
<p>Desde unas ventas ágiles hasta despliegues globales, nuestro enfoque <strong>lean y ecológico</strong> ayuda a las empresas a reducir costes, ganar eficiencia y crecer sin límites.</p>
</div>
<div>
<h4>Síganos</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="oc-sr-only" for="footerContactEmail">Su dirección de correo</label>
<input type="email" id="footerContactEmail" name="email" placeholder="Su dirección de correo" required />
<div class="footer-textarea-wrap">
<label class="oc-sr-only" for="footerContactText">Su mensaje</label>
<textarea id="footerContactText" name="message" placeholder="Su mensaje..." required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Enviar mensaje"><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>
</body>
</html>
+883
View File
@@ -0,0 +1,883 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Bootcamp de Odoo: de cero a un ERP en funcionamiento en 3 meses</title>
<meta
name="description"
content="Diez sesiones en directo los jueves con Oliver Arnold, Technical Lead de ODOO4projects. Construya un ERP operativo para su negocio: presupuestos, facturas, inventario."
/>
<link rel="canonical" href="https://odoo4projects.com/es/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<meta property="og:title" content="Bootcamp de Odoo: de cero a un ERP en funcionamiento en 3 meses" />
<meta
property="og:description"
content="Diez sesiones en directo los jueves con Oliver Arnold, Technical Lead de ODOO4projects. Construya un ERP operativo para su negocio: presupuestos, facturas, inventario."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/es/odoo-erp-automation-bootcamp/" />
<meta name="twitter:card" content="summary" />
<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 ERP Automation Bootcamp landing page (page-scoped; additive) ---- */
.bc-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) */
.bc-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.bc-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.bc-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.bc-brand span {
color: var(--brass);
}
.bc-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
}
.bc-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.bc-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. */
.bc-topbar-links {
margin-left: auto;
}
.bc-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.bc-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.bc-topbar .lang-switch a:hover,
.bc-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.bc-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.bc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
/* Real London night aerial (our own photo, CI §5) behind the header copy.
TWO-ZONE scrim (2026-10-25): the copy zone — kicker, H1, value line, the four
facts, the CTA — holds a .78 midnight scrim, then the scrim falls off hard to
.25 so the lit skyline on the right actually reads: at the right edge the photo
is composited through a quarter-strength scrim instead of a uniform .55-.72, so
the lit skyline reads at ~1.6x the flat-midnight luma instead of ~1.4x.
Stops: .78 0%-88%, ramp 88%-94%, .25 94%-100%.
.78 is the smallest flat alpha that holds every text block over its floor
(body 4.5:1, large 3.0:1) at all four widths in all three languages, and 88%
is where the ramp has to start: the longest fact line (DE, 1024px) reaches
89.3% of the hero, and clear of 88% the copy sits on the flat scrim. The tail of
that one DE line rides the top of the ramp at .70+, measured. Numbers:
handoffs/2026-10-24-webmaster-to-olchi-bootcamp-page-published.md ("Amendment 6").
The old single ramp was .72 -> .55 across the full width and composited the right
zone to luma ~35 against a flat midnight of 25.4. */
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-desktop-1920.webp");
background-size: cover;
background-position: 50% 25%;
background-repeat: no-repeat;
}
/* The global .hero::after is a second, 50%-opacity midnight wash for the homepage's
flat hero; with the photo + gradient scrim above the copy it only dulls the shot,
so it is switched off on this page. One page-scoped rule, no global CSS touched. */
.bc-hero::after {
content: none;
}
@media (max-width: 640px) {
/* Portrait crop for narrow viewports: legible cut of the same photo. Same scrim
stops as the desktop rule — the ramp at 88% clears every language's copy, whose
longest mobile fact line ends at 87.7% of the hero. */
.bc-hero {
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-mobile-900.webp");
background-position: 50% 50%;
}
}
/* wrapped hero-stat labels keep their tick on the first line */
.bc-hero .hero-stat {
align-items: flex-start;
}
.bc-hero .hero-stat i {
line-height: 1.6;
}
.bc-lead {
font-size: 1.05rem;
color: rgba(23, 28, 38, 0.78);
max-width: 720px;
margin: 0 auto 1rem;
line-height: 1.75;
}
.section-dark .bc-lead,
.bc-lead.on-dark {
color: rgba(255, 255, 255, 0.72);
}
.bc-subline {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
color: var(--midnight);
text-align: center;
max-width: 720px;
margin: 1.75rem auto 1.25rem;
letter-spacing: 0.02em;
}
.bc-action {
text-align: center;
margin-top: 0.5rem;
}
/* The three CTAs are native basket <form>s with a <button> (they were <a>s).
A <button> takes `line-height: normal` from the UA font shorthand while
the <a>s inherited the body line-height, which would make the button
5.6px shorter. Match the anchors' height: one declaration, no new look. */
form[action$="/shop/post_basket"] .btn {
line-height: inherit;
}
/* Grids — auto-fit so no breakpoint is needed */
.bc-list {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
/* Lesson tiles (light canvas) */
.bc-lessons {
list-style: none;
counter-reset: bc-lesson;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-lessons li {
counter-increment: bc-lesson;
position: relative;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.4rem 1.4rem 1.4rem 3.4rem;
transition: box-shadow 0.25s, transform 0.25s;
}
.bc-lessons li:hover {
box-shadow: var(--shadow-hover);
transform: translateY(-3px);
}
.bc-lessons li::before {
content: counter(bc-lesson);
position: absolute;
left: 1.15rem;
top: 1.3rem;
font-family: Marcellus, Georgia, serif;
font-size: 1.5rem;
color: var(--brass-deep);
line-height: 1;
}
.bc-lessons h3 {
font-size: 1rem;
font-weight: 400;
color: var(--midnight);
margin-bottom: 0.35rem;
}
.bc-lessons p {
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.6;
margin: 0;
}
/* Cards on midnight */
.bc-cards {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-cards li {
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1.35rem 1.4rem;
}
.bc-cards h3 {
font-size: 1rem;
color: #fff;
margin-bottom: 0.45rem;
}
.bc-cards p {
font-size: 0.86rem;
color: rgba(255, 255, 255, 0.72);
line-height: 1.65;
margin: 0;
}
.bc-note {
max-width: 720px;
margin: 1.5rem auto 0;
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.65;
}
.bc-note.on-dark {
color: rgba(255, 255, 255, 0.6);
}
.bc-note strong {
color: var(--midnight);
}
.bc-note.on-dark strong {
color: #fff;
}
/* Schedule */
.bc-schedule {
max-width: 720px;
margin: 0 auto;
display: grid;
grid-template-columns: minmax(9rem, auto) 1fr;
gap: 0.55rem 1.25rem;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.5rem 1.75rem;
}
.bc-schedule dt {
font-family: Marcellus, Georgia, serif;
font-size: 0.92rem;
color: var(--brass-deep);
}
.bc-schedule dd {
margin: 0;
font-size: 0.9rem;
color: var(--ink);
line-height: 1.55;
}
/* Price line */
.bc-price {
font-family: Marcellus, Georgia, serif;
font-size: 1.3rem;
color: var(--midnight);
text-align: center;
margin: 0 auto 1rem;
}
/* Related links */
.bc-related {
list-style: none;
padding: 0;
margin: 2rem auto 0;
max-width: 720px;
display: grid;
gap: 0.5rem;
}
.bc-related li {
position: relative;
padding-left: 1.4rem;
font-size: 0.88rem;
}
.bc-related li::before {
content: "";
position: absolute;
left: 0.25rem;
top: 0.55rem;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--brass);
}
.bc-related a {
color: var(--midnight);
text-decoration: underline;
text-decoration-color: var(--brass);
text-underline-offset: 2px;
}
.bc-related a:hover {
text-decoration-color: var(--brass-deep);
text-decoration-thickness: 2px;
}
/* FAQ (native details/summary — no JS) */
.bc-faq-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
max-width: 1000px;
margin: 0 auto;
align-items: start;
}
.bc-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;
}
.bc-faq[open],
.bc-faq:hover {
box-shadow: var(--shadow-hover);
}
.bc-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);
}
.bc-faq summary::-webkit-details-marker {
display: none;
}
.bc-faq summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
}
.bc-faq[open] summary::after {
content: "\2212";
}
.bc-faq summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.bc-faq .bc-a {
font-size: 0.87rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.7;
padding-bottom: 1rem;
}
.bc-faq .bc-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.bc-faq-grid {
grid-template-columns: 1fr;
}
.bc-schedule {
grid-template-columns: 1fr;
gap: 0.15rem 0;
padding: 1.25rem 1.35rem;
}
.bc-schedule dd {
margin-bottom: 0.7rem;
}
}
/* Focus states */
.btn:focus-visible,
.bc-topbar-links a:focus-visible,
.bc-related a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Course",
"name": "ODOO ERP Automation Bootcamp",
"description": "Un bootcamp en directo de diez sesiones que lleva a un negocio pequeño de cero a un ERP en funcionamiento. Reúna sus productos, presupuestos, facturas, existencias y pagos en un solo sistema sobre un entorno alojado en funcionamiento, sin programar y sin servidor propio.",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/",
"provider": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"alternateName": "The OC Guy",
"jobTitle": "Technical Lead",
"worksFor": {
"@type": "Organization",
"name": "ODOO4projects"
}
},
"inLanguage": "es",
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"courseWorkload": "PT1H",
"maximumAttendeeCapacity": 6,
"startDate": "2027-01-21",
"endDate": "2027-03-25",
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"alternateName": "The OC Guy"
},
"courseSchedule": {
"@type": "Schedule",
"repeatFrequency": "P1W",
"repeatCount": 10,
"byDay": "https://schema.org/Thursday",
"startTime": "18:00-06:00",
"duration": "PT1H"
}
},
"offers": {
"@type": "Offer",
"price": "465.00",
"priceCurrency": "USD",
"category": "Paid",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/"
}
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "¿Necesito conocimientos técnicos?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Las sesiones no exigen conocimientos de ERP ni de programación, y usted trabaja con sus propios datos en lugar de seguir una demostración vacía."
}
},
{
"@type": "Question",
"name": "¿Y si me pierdo una sesión?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Las sesiones son en directo y cada una se apoya en la anterior, así que asista siempre que pueda. Si se pierde una, el chat de antiguos alumnos y el taller abierto de la última sesión son el lugar para ponerse al día."
}
},
{
"@type": "Question",
"name": "¿El hosting está incluido después del curso?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Sí, durante un año, incluido en el programa. Pasado ese año, su sistema pasa a uno de nuestros planes de hosting habituales, al precio publicado en nuestro sitio."
}
},
{
"@type": "Question",
"name": "¿Qué necesito instalar?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No hay nada que instalar ni nada que ejecutar usted mismo. Bastan un ordenador y un navegador, el sistema en funcionamiento lo ponemos nosotros. n8n, que se usa en la lección 9, es una cuenta gratuita que usted abre con el propio plan gratuito de n8n."
}
},
{
"@type": "Question",
"name": "¿Es un curso sobre Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Es un curso sobre su negocio en marcha. Odoo es el motor que hay bajo el sistema que construye; las diez lecciones tratan de su inventario, sus facturas, sus clientes y las horas que esto le devuelve."
}
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="bc-topbar">
<div class="container">
<a class="bc-brand" href="/es/">ODOO4<span>projects</span></a>
<nav class="bc-topbar-links" aria-label="Enlaces de página">
<a href="/es/#pricing">Planes y precios</a>
<a href="/es/support.html">Soporte</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero bc-hero">
<div class="container">
<p class="hero-kicker">Q1 2027 &middot; 10 SESIONES EN DIRECTO &middot; OLIVER ARNOLD</p>
<h1>ODOO ERP Automation Bootcamp</h1>
<p class="hero-sub">
Sin programar. Sin servidor que instalar. Si lleva su negocio con una hoja de cálculo, esto también es para usted.
</p>
<div class="hero-stats">
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> 10 sesiones en directo, de una hora cada una</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Jueves, 18:00&ndash;19:00, hora del centro de EE. UU.</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Empieza el jueves 21 de enero de 2027</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Un año de Odoo Community Edition incluido</span>
</div>
<div class="hero-actions">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Comprar por 465.00 USD</button>
</form>
</div>
</div>
</section>
<!-- From zero to a running ERP -->
<section class="section-light">
<div class="container">
<h2 class="section-title">De cero a un ERP en funcionamiento</h2>
<p class="bc-lead">
A lo largo de diez sesiones de jueves repartidas en tres meses, construye un sistema de negocio operativo para su propia empresa: sus productos, sus clientes, sus presupuestos, sus facturas, su inventario. Lo construye sobre un sistema en funcionamiento, no sobre diapositivas, y empieza en la primera sesión en lugar de después de una larga preparación.
</p>
<p class="bc-lead">
Termina con un ERP que de verdad utiliza y con el criterio para mantenerlo en marcha usted mismo.
</p>
<p class="bc-subline">Tres meses. Diez horas de clases. Un sistema que dirige su empresa.</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Comprar por 465.00 USD</button>
</form>
</div>
</div>
</section>
<!-- Who this is for -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Para quién es</h2>
<p class="bc-lead">
Es para el propietario o el responsable de un negocio pequeño que nunca quiso convertirse en administrador de sistemas. Usted gestiona inventario, pedidos, facturas y clientes, y hoy casi todo eso vive en una hoja de cálculo, un grupo de mensajería y la memoria de una persona.
</p>
<p class="bc-lead">
No necesita conocimientos técnicos. Las sesiones no dan por supuesto ningún conocimiento previo de ERP ni de programación.
</p>
<p class="bc-lead">
No es para usted si ya administra Odoo por su cuenta o si busca un curso de desarrollador sobre módulos y código propio. Las diez lecciones tratan de su negocio en marcha, no del software que hay debajo.
</p>
</div>
</section>
<!-- The ten lessons -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Lo que construye: las diez lecciones</h2>
<p class="bc-lead">
Diez sesiones, diez resultados. Cada lección termina con algo que funciona en su propio sistema, no con apuntes para archivar.
</p>
<ol class="bc-lessons">
<li>
<h3>La primera configuración.</h3>
<p>Sale con su propia empresa configurada en el sistema: productos, clientes, moneda e impuestos. Así cada cifra que venga después es real y no una demostración.</p>
</li>
<li>
<h3>Ventas: presupuestos, pedidos y facturas.</h3>
<p>Sale con un flujo de presupuesto a factura que convierte la consulta de un cliente en una factura lista para enviar.</p>
</li>
<li>
<h3>Cree su sitio web.</h3>
<p>Sale con una página publicada en su propia dirección de internet, donde publica un producto y recibe consultas.</p>
</li>
<li>
<h3>CRM.</h3>
<p>Sale con todos los clientes potenciales en una sola lista, con su fase, para que una oportunidad deje de perderse en un hilo de chat.</p>
</li>
<li>
<h3>Gestión de proyectos.</h3>
<p>Sale con el trabajo que vendió organizado en tareas con plazos, para ver lo que va tarde antes de que se lo diga el cliente.</p>
</li>
<li>
<h3>Personalizaciones y externalización.</h3>
<p>Sale sabiendo qué puede cambiar usted mismo y qué conviene encargar a alguien, para no pagar a un desarrollador por algo que ya resuelve una opción de configuración.</p>
</li>
<li>
<h3>Integraciones y pago online.</h3>
<p>Sale pudiendo cobrar online y ofrecer sus productos donde la gente ya compra, para que los pedidos lleguen sin que usted tenga que ir detrás.</p>
</li>
<li>
<h3>Inventario y gestión de existencias.</h3>
<p>Sale con un inventario que coincide con la estantería, para que deje de vender lo que no tiene.</p>
</li>
<li>
<h3>n8n e IA para su negocio.</h3>
<p>Sale con el sistema conectado a las herramientas que ya usa y con una tarea repetitiva que se hace sola.</p>
</li>
<li>
<h3>Marketing online y el taller abierto.</h3>
<p>Sale con una forma de convertir su propia lista de clientes en ventas repetidas, y con la última sesión dedicada a arreglar lo que aún falla en su configuración.</p>
</li>
</ol>
</div>
</section>
<!-- What is included -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Qué incluye</h2>
<ul class="bc-cards">
<li>
<h3>Un año de Odoo Community Edition alojado en nuestra plataforma.</h3>
<p>Su sistema, en marcha, con el servidor, las copias de seguridad y el certificado a nuestro cargo.</p>
</li>
<li>
<h3>Un sistema en funcionamiento desde la primera sesión.</h3>
<p>Trabaja con sus propios datos desde el primer día, no en una demostración vacía.</p>
</li>
<li>
<h3>La comunidad de antiguos alumnos.</h3>
<p>Un chat privado para preguntar, intercambiar plantillas y comparar configuraciones mucho después de que terminen las diez sesiones.</p>
</li>
<li>
<h3>Una revisión experta de su configuración.</h3>
<p>Oliver revisa lo que ha construido y le dice qué conviene corregir.</p>
</li>
</ul>
<p class="bc-note on-dark">
<strong>Lo de n8n, en palabras claras:</strong> en las sesiones de herramientas se usa n8n, y usted usa n8n con su propio plan gratuito. El plan gratuito no forma parte de este precio ni está incluido en el programa. Todo lo demás de la lista sí lo está.
</p>
</div>
</section>
<!-- The schedule -->
<section class="section-light">
<div class="container">
<h2 class="section-title">El calendario</h2>
<p class="bc-lead">
Diez sesiones en directo. De una hora cada una, a la misma hora cada semana, diez horas de clase en total.
</p>
<dl class="bc-schedule">
<dt>Sesiones</dt>
<dd>10, todos los jueves de 18:00&ndash;19:00, hora del centro de EE. UU.</dd>
<dt>Periodo</dt>
<dd>Q1 2027</dd>
<dt>Primera sesión</dt>
<dd>Jueves 21 de enero de 2027</dd>
<dt>Última sesión</dt>
<dd>Jueves 25 de marzo de 2027</dd>
<dt>Fechas</dt>
<dd>21 de enero &middot; 28 de enero &middot; 4 de febrero &middot; 11 de febrero &middot; 18 de febrero &middot; 25 de febrero &middot; 4 de marzo &middot; 11 de marzo &middot; 18 de marzo &middot; 25 de marzo de 2027</dd>
<dt>Duración</dt>
<dd>1 hora por sesión, 10 horas en total</dd>
<dt>Dónde</dt>
<dd>En directo y online</dd>
<dt>Tamaño del grupo</dt>
<dd>Limitado a 6 participantes</dd>
<dt>Instructor</dt>
<dd>Oliver - The OC Guy - Arnold, Technical Lead de ODOO4projects</dd>
</dl>
<p class="bc-note">
La hora del centro de EE. UU. está en UTC&minus;6 hasta el 14 de marzo y después en UTC&minus;5; las invitaciones de calendario llevan la hora local correcta.
</p>
</div>
</section>
<!-- Your instructor -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Su instructor</h2>
<p class="bc-lead">
<strong>Oliver - The OC Guy - Arnold, Technical Lead de ODOO4projects.</strong>
</p>
<p class="bc-lead">
Oliver lleva más de 25 años construyendo software que tiene que seguir funcionando, y es el arquitecto principal de la plataforma en la que se imparte este Bootcamp. Enseña poniendo delante el sistema real y arreglándolo con usted, sesión a sesión.
</p>
<p class="bc-lead">
Es el único instructor del programa. Tendrá a la misma persona todos los jueves durante diez semanas, y por eso la última sesión es un taller abierto y no un traspaso a otra persona.
</p>
</div>
</section>
<!-- Price and booking -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Precio y reserva</h2>
<p class="bc-price">El programa cuesta USD 465.00 por las diez sesiones.</p>
<p class="bc-note"><strong>Limitado a 6 participantes</strong> — el grupo es reducido, para que el instructor pueda trabajar sobre su propia configuración.</p>
<p class="bc-lead">
Cubre el programa completo: diez sesiones en directo, un año de Odoo Community Edition alojado, la comunidad de antiguos alumnos y la revisión experta.
</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Comprar por 465.00 USD</button>
</form>
</div>
<ul class="bc-related">
<li><a href="/es/support.html#contact">¿Preguntas antes de reservar? Hable antes con nosotros</a></li>
<li><a href="/es/odoo-hosting-2027.html">Cómo es el hosting después de su año con nosotros</a></li>
<li><a href="/es/support.html">Qué cubre nuestro soporte y qué no</a></li>
<li><a href="/blog/posts/community-vs-enterprise-cost.html">Lo que cuesta Community frente a Enterprise</a></li>
</ul>
</div>
</section>
<!-- FAQ -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Preguntas que suelen surgir primero</h2>
<div class="bc-faq-grid">
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">¿Necesito conocimientos técnicos?</summary>
<div class="bc-a">
<p>No. Las sesiones no exigen conocimientos de ERP ni de programación, y usted trabaja con sus propios datos en lugar de seguir una demostración vacía.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">¿Y si me pierdo una sesión?</summary>
<div class="bc-a">
<p>Las sesiones son en directo y cada una se apoya en la anterior, así que asista siempre que pueda. Si se pierde una, el chat de antiguos alumnos y el taller abierto de la última sesión son el lugar para ponerse al día.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">¿El hosting está incluido después del curso?</summary>
<div class="bc-a">
<p>Sí, durante un año, incluido en el programa. Pasado ese año, su sistema pasa a uno de nuestros planes de hosting habituales, al precio publicado en nuestro sitio.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">¿Qué necesito instalar?</summary>
<div class="bc-a">
<p>No hay nada que instalar ni nada que ejecutar usted mismo. Bastan un ordenador y un navegador, el sistema en funcionamiento lo ponemos nosotros. n8n, que se usa en la lección 9, es una cuenta gratuita que usted abre con el propio plan gratuito de n8n.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">¿Es un curso sobre Odoo?</summary>
<div class="bc-a">
<p>Es un curso sobre su negocio en marcha. Odoo es el motor que hay bajo el sistema que construye; las diez lecciones tratan de su inventario, sus facturas, sus clientes y las horas que esto le devuelve.</p>
</div>
</details>
</div>
</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>Enlaces útiles</h4>
<ul>
<li><a href="/es/odoo-erp-automation-bootcamp/">ODOO Bootcamp</a></li>
<li><a href="/es/odoo-hosting-2027.html">ODOO Hosting en 2027</a></li>
<li><a href="/es/support.html">Soporte</a></li>
<li><a href="/legal.html">Aviso legal</a></li>
</ul>
</div>
<div>
<h4>Socios</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>Sobre nosotros</h4>
<p>Creamos soluciones de negocio inteligentes y escalables combinando la <strong>estabilidad</strong> de Odoo ERP con la <strong>potencia</strong> de los agentes de IA y las automatizaciones N8N.</p>
<p>Desde unas ventas ágiles hasta despliegues globales, nuestro <strong>lean y ecológico</strong> enfoque ayuda a las empresas a reducir costes, ganar eficiencia y crecer sin límites.</p>
</div>
<div>
<h4>Síganos</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="bc-sr-only" for="footerContactEmail">Su dirección de correo</label>
<input type="email" id="footerContactEmail" name="email" placeholder="Su dirección de correo" required />
<div class="footer-textarea-wrap">
<label class="bc-sr-only" for="footerContactText">Su mensaje</label>
<textarea id="footerContactText" name="message" placeholder="Su mensaje..." required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Enviar mensaje"><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 defer src="/static/buy.js"></script>
<script defer src="/static/lang.js"></script>
</body>
</html>
File diff suppressed because it is too large. Load diff
+587
View File
@@ -0,0 +1,587 @@
<!doctype html>
<html lang="es">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="Soporte y preguntas frecuentes sobre el hosting de ODOO4projects. Ayuda con su instancia de Odoo, módulos, copias de seguridad, dominios y más."
/>
<title>Soporte | ODOO4projects</title>
<link rel="canonical" href="https://odoo4projects.com/es/support.html" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/support.html" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/support.html" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/support.html" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/support.html" />
<meta property="og:title" content="Soporte | ODOO4projects" />
<meta property="og:description" content="Soporte y preguntas frecuentes sobre el hosting de ODOO4projects." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/es/support.html" />
<meta name="twitter:card" content="summary_large_image" />
<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;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="/style.css" />
<style>
/* Language selector — the page's top row: the back-link stays left, the selector travels right.
Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */
.blog-header {
display: flex;
align-items: center;
}
.blog-header > a {
margin-right: auto;
}
.blog-header .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
/* ---- Support Hero ---- */
.support-hero {
padding: 4rem 0 2.5rem;
text-align: center;
background: var(--light);
border-bottom: 1px solid var(--border);
}
.support-hero h1 {
font-size: clamp(1.8rem, 3.2vw, 2.8rem);
color: var(--dark);
}
.support-hero p {
max-width: 680px;
margin: 0 auto;
color: rgba(33, 37, 41, 0.7);
font-size: 1rem;
line-height: 1.7;
}
.support-hero strong {
color: var(--primary);
}
/* ---- FAQ Section ---- */
.faq-section {
padding: 3rem 0 4rem;
}
.faq-section h2 {
text-align: center;
margin-bottom: 2rem;
color: var(--dark);
}
.faq-tabs {
display: flex;
flex-wrap: wrap;
gap: 0.4rem;
justify-content: center;
margin-bottom: 2rem;
}
.faq-tab-btn {
padding: 0.55rem 1.1rem;
border-radius: var(--radius);
border: 1px solid var(--border);
background: #fff;
cursor: pointer;
font-family: "Inter Tight", sans-serif;
font-size: 0.82rem;
font-weight: 500;
color: #212529;
transition: all 0.2s;
line-height: 1.3;
}
.faq-tab-btn small {
display: block;
font-size: 0.7rem;
font-weight: 400;
color: rgba(33, 37, 41, 0.5);
margin-top: 0.1rem;
}
.faq-tab-btn:hover {
border-color: var(--primary);
color: var(--primary);
}
.faq-tab-btn.active {
background: linear-gradient(135deg, rgba(113,75,103,0.08), rgba(113,75,103,0.03));
border-color: var(--primary);
color: var(--primary);
font-weight: 600;
}
.faq-tab-btn.active small {
color: rgba(113, 75, 103, 0.6);
}
.faq-panel {
display: none;
max-width: 720px;
margin: 0 auto;
}
.faq-panel.active {
display: block;
}
.faq-item {
border: 1px solid var(--border);
border-radius: var(--radius);
margin-bottom: 0.6rem;
overflow: hidden;
background: #fff;
}
.faq-question {
width: 100%;
background: none;
border: none;
padding: 0.9rem 1.1rem;
cursor: pointer;
display: flex;
justify-content: space-between;
align-items: center;
color: var(--dark);
font-family: "Inter Tight", sans-serif;
font-size: 0.88rem;
font-weight: 500;
text-align: left;
transition: background 0.2s;
gap: 1rem;
}
.faq-question:hover {
background: var(--light);
}
.faq-question .faq-icon {
flex-shrink: 0;
font-size: 0.7rem;
color: var(--primary);
transition: transform 0.3s;
}
.faq-question.open .faq-icon {
transform: rotate(180deg);
}
.faq-answer {
display: none;
padding: 0 1.1rem 0.9rem;
color: rgba(33, 37, 41, 0.7);
font-size: 0.88rem;
line-height: 1.7;
}
.faq-answer.open {
display: block;
}
.faq-answer ul {
margin: 0.5rem 0;
padding-left: 1.25rem;
}
.faq-answer li {
margin: 0.3rem 0;
}
.faq-answer a {
color: var(--primary);
text-decoration: underline;
}
.faq-answer strong {
color: var(--dark);
}
/* ---- Contact Section ---- */
.contact-section {
padding: 3rem 0 4rem;
background: var(--light);
border-top: 1px solid var(--border);
}
.contact-section h2 {
text-align: center;
margin-bottom: 2rem;
color: var(--dark);
}
.contact-form {
max-width: 580px;
margin: 0 auto;
background: #fff;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 2rem;
}
.form-group {
margin-bottom: 1.1rem;
}
.form-group label {
display: block;
color: rgba(33, 37, 41, 0.6);
font-size: 0.82rem;
font-weight: 500;
margin-bottom: 0.3rem;
}
.form-group label .required {
color: #dc3545;
}
.form-group input,
.form-group textarea {
width: 100%;
padding: 0.65rem 0.85rem;
background: #fff;
border: 1px solid var(--border);
border-radius: var(--radius);
color: var(--dark);
font-family: Inter, sans-serif;
font-size: 0.88rem;
transition: border-color 0.2s;
box-sizing: border-box;
}
.form-group input:focus,
.form-group textarea:focus {
outline: none;
border-color: var(--primary);
}
.form-group textarea {
min-height: 90px;
resize: vertical;
}
.contact-form .btn {
width: 100%;
padding: 0.7rem;
}
.form-success {
display: none;
background: #d4edda;
border: 1px solid #c3e6cb;
border-radius: var(--radius);
padding: 0.8rem 1rem;
text-align: center;
color: #155724;
margin-top: 1rem;
font-size: 0.88rem;
}
.form-success.visible {
display: block;
}
@media (max-width: 768px) {
.support-hero { padding: 2.5rem 0 1.5rem; }
.faq-tab-btn { padding: 0.4rem 0.8rem; font-size: 0.75rem; }
.contact-form { padding: 1.25rem; }
}
</style>
<!-- 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>
<div class="container">
<div class="blog-header">
<a href="/es/">&larr; Volver al inicio</a>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="support-hero">
<div class="container">
<h1>Soporte y preguntas frecuentes</h1>
<p>
Para una ayuda más rápida, lea primero nuestras <strong>preguntas frecuentes</strong>: nuestro
bot de soporte le ayuda con soluciones rápidas como <strong>git pull</strong> o reinicios — o
envíe simplemente un <strong>ticket</strong> a nuestro equipo de soporte.
</p>
</div>
</section>
<!-- FAQ -->
<section class="faq-section" id="faq">
<div class="container">
<h2>Preguntas frecuentes</h2>
<div class="faq-tabs" id="faqTabs">
<button class="faq-tab-btn active" data-tab="first-steps">
Primeros pasos
<small>De qué trata nuestro servicio</small>
</button>
<button class="faq-tab-btn" data-tab="advanced">
Usuarios avanzados
<small>Instalar módulos, configurar copias de seguridad</small>
</button>
<button class="faq-tab-btn" data-tab="trouble">
Solución de problemas
<small>El servicio no está disponible</small>
</button>
<button class="faq-tab-btn" data-tab="commercial">
Comercial
<small>Toda la información sobre nuestros servicios</small>
</button>
<button class="faq-tab-btn" data-tab="migrate">
Traiga su base de datos
<small>Migre desde otro proveedor</small>
</button>
</div>
<!-- First Steps -->
<div class="faq-panel active" id="panel-first-steps">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Mi Odoo parece vacío. ¿Qué puedo hacer con él?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Entregamos una instalación de Odoo sin modificaciones: su Odoo viene vacío pero totalmente listo para que <strong>usted lo personalice</strong> con las apps que necesite su negocio. Para empezar, vaya al menú Aplicaciones, explore las apps disponibles y haga clic en Instalar — cada app aparecerá en su menú principal una vez instalada, lista para usar.</p>
<p>Estos son algunos ejemplos según el tipo de negocio:</p>
<ul>
<li><strong>Fábrica</strong>: instale las apps Fabricación e Inventario/Logística.</li>
<li><strong>Tienda online</strong>: instale las apps Sitio web, Comercio electrónico y Ventas.</li>
<li><strong>Empresa de servicios</strong>: instale las apps Proyecto y Hojas de horas.</li>
<li><strong>Tienda minorista</strong>: instale las apps Punto de venta (POS) e Inventario.</li>
<li><strong>Asesoría contable</strong>: instale las apps Contabilidad y Facturación.</li>
<li><strong>Agencia de marketing</strong>: instale las apps CRM, Marketing y Email Marketing.</li>
<li><strong>Empresa de eventos</strong>: instale las apps Eventos y Sitio web.</li>
</ul>
<p>Sea cual sea su tipo de negocio, elija las apps que se ajusten a sus necesidades y construya su sistema Odoo paso a paso.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo instalo una app nueva?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Abra el menú Aplicaciones, busque la app que quiera y haga clic en Instalar. Esto cubre todas las apps incluidas en Odoo Community y funciona en todos los planes.</p>
<p>Las apps que no forman parte de Odoo Community — módulos personalizados y módulos de <a href="https://odoo-community.org/" target="_blank" rel="noopener">odoo-community.org</a> — las instalamos por usted con Git o con nuestro Quick Git de un clic. Los módulos personalizados y OCA se instalan desde On the Rise. Side Hustle no permite instalar módulos.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo añado mi servidor de correo para enviar mensajes desde Odoo?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Para enviar correos desde Odoo, debe configurar un servidor de correo saliente. Vaya a Ajustes &rarr; Técnico &rarr; Correo electrónico &rarr; Servidores de correo saliente e introduzca los datos de su servidor, como el servidor SMTP, el puerto, el usuario y la contraseña. Puede obtener los datos del servidor SMTP de su proveedor de dominio o de correo. Tras introducirlos, pruebe la conexión para asegurarse de que funciona.</p>
<p>Si además quiere recibir correos en Odoo, configure servidores de correo entrante en el mismo menú, con los datos IMAP/POP3 de su proveedor.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo cambio mi nombre de usuario o mi contraseña?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Antes de hacer cambios, le recomendamos <strong>configurar su servidor de correo saliente</strong> para que las notificaciones y el restablecimiento de contraseñas funcionen correctamente.</p>
<p>Su nombre de usuario es la dirección de correo asociada a su cuenta. Para cambiarlo, vaya a Ajustes &rarr; Usuarios y empresas &rarr; Usuarios, seleccione su usuario y actualice el campo Correo electrónico. Tras cambiar el nombre de usuario, deberá iniciar sesión con el nuevo correo y su contraseña actual. Para cambiar la contraseña, vaya a los mismos ajustes de usuario y haga clic en Cambiar contraseña, o use el enlace «¿Olvidó su contraseña?» en la página de inicio de sesión para restablecerla por correo.</p>
</div>
</div>
</div>
<!-- Advanced Users -->
<div class="faq-panel" id="panel-advanced">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Tengo acceso SSH a mi servicio?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>No — el acceso SSH se limita a las operaciones de Git. El resto de opciones de gestión y configuración están disponibles en nuestro módulo de Ajustes de Odoo.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo configuro la frecuencia de mis copias de seguridad?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>La tarea de copia de seguridad se ejecuta como acción programada dentro de Odoo y guarda sus datos con regularidad. Solo puede acceder a esta tarea y gestionarla cuando el modo desarrollador está activado, lo que permite ver ajustes técnicos y acciones programadas que de otro modo quedan ocultos en la interfaz estándar. Así puede revisar, ajustar o lanzar las copias cuando lo necesite.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cuánto tiempo se guardan las copias de seguridad?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Guardamos las copias de seguridad en puntos de copia, que se conservan hasta que se sobrescriben. Se gestionan con una cola FIFO (primero en entrar, primero en salir). Cuando una copia se sobrescribe, se elimina de forma permanente. Si necesita conservar más copias, puede cambiar de plan y adquirir puntos de copia adicionales.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo dirijo mi dominio a mi Odoo?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Para dirigir su dominio a Odoo, primero actualice el registro A en su proveedor de dominio para que apunte a la dirección IP de nuestro servidor. Encontrará los ajustes del registro A en el panel de su registrador, dentro de la configuración de DNS. Una vez actualizado el registro A, hay que reiniciar el servidor para que reconozca el nuevo dominio.</p>
<p>Tras actualizar el registro A, añada su dominio en Odoo: Ajustes &rarr; 4 Server &rarr; Dominios, y escriba cada dominio en una línea distinta. Consulte su contrato para ver cuántos dominios puede dirigir.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo puedo instalar Odoo Enterprise?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Para instalar Odoo Enterprise, primero debe adquirir una licencia aparte de Odoo. Nuestro repositorio Git preparado ya incluye una carpeta Enterprise donde puede añadir los addons de Enterprise, que luego se instalan vía Git.</p>
</div>
</div>
</div>
<!-- Trouble Shooting -->
<div class="faq-panel" id="panel-trouble">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>Después de un git check in, mi servidor no arranca o muestra un error 500</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Si ha subido un módulo nuevo al servidor y este impide que arranque el servicio, revierta primero los cambios en Git y suba de nuevo la versión corregida al servidor. Después abra el chat de soporte — necesitará su UUID (enviado en el correo de confirmación). Cuando le indique a nuestro chatbot que haga git pull y reinicie el servidor, recibirá un correo de confirmación; una vez confirmado, volveremos a poner en línea su instancia de Odoo.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Por qué mi dominio muestra «Unknown Certificate» o «Bad Gateway»?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Suele ocurrir porque el servidor no se ha reiniciado tras dirigir su dominio a nuestro servicio. Reinicie el servidor — cuando vuelva a estar en línea, Odoo generará el certificado SSL correcto para su dominio. Si el error persiste, envíe una incidencia de soporte.</p>
</div>
</div>
</div>
<!-- Commercial -->
<div class="faq-panel" id="panel-commercial">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Está incluida la Odoo Enterprise License?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>No, la Odoo Enterprise License debe adquirirse aparte.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo puedo cambiar de plan?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Puede cambiar de plan directamente en Odoo: Ajustes &rarr; 4 Server &rarr; Upgrade. Desde ahí puede pasar a un plan superior o añadir funciones por separado, como puntos de copia adicionales o más dominios dirigidos.</p>
</div>
</div>
</div>
<!-- Bring your Database -->
<div class="faq-panel" id="panel-migrate">
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Cómo puedo migrar mi base de datos de Odoo desde otro proveedor?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Para migrar su base de datos a nuestro servicio, envíe una incidencia de soporte indicando que desea migrar. Nuestro equipo le enviará un enlace a un formulario seguro donde subir su base de datos. Una vez recibida, prepararemos un servidor nuevo según sus requisitos y le facilitaremos las credenciales.</p>
<p>No admitimos versiones de parche (p. ej., 18.1 o 17.2) — solo las versiones principales (18.0, 17.0, 19.0). Nuestro servicio de migración admite actualmente bases de datos basadas en Odoo 17, 18 y 19.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question plausible-event-name=FAQ">
<span>¿Puedo actualizar mi base de datos de Odoo desde una versión anterior, p. ej., 14 &rarr; 19?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Sí, podemos ayudarle a actualizar su base de datos desde versiones anteriores a una versión compatible (17, 18 o 19), pero solo tras revisar su base de datos para confirmar la compatibilidad. Envíe una incidencia de soporte para iniciar el proceso.</p>
</div>
</div>
</div>
</div>
</section>
<!-- Contact -->
<section class="contact-section" id="contact">
<div class="container">
<h2>¿Aún tiene dudas? Contacte con nuestro soporte.</h2>
<form class="contact-form" id="supportForm">
<div class="form-group">
<label>Su nombre <span class="required">*</span></label>
<input type="text" id="contactName" name="contact_name" required placeholder="Su nombre" />
</div>
<div class="form-group">
<label>Su correo electrónico <span class="required">*</span></label>
<input type="email" id="contactEmail" name="email_from" required placeholder="Su correo electrónico" />
</div>
<div class="form-group">
<label>UUID</label>
<input type="text" id="contactUuid" name="UUID" placeholder="Pegue aquí su UUID de ODOO4projects" />
</div>
<div class="form-group">
<label>Asunto <span class="required">*</span></label>
<input type="text" id="contactSubject" name="name" required placeholder="Asunto" />
</div>
<div class="form-group">
<label>Su consulta <span class="required">*</span></label>
<textarea id="contactQuestion" name="description" required placeholder="Describa su problema o consulta en detalle..."></textarea>
</div>
<button type="submit" class="btn btn-primary">Enviar</button>
<div class="form-success" id="formSuccess">
<i class="fas fa-check-circle"></i> ¡Gracias! Su incidencia se ha enviado.
</div>
</form>
</div>
</section>
<script>
document.querySelectorAll(".faq-question").forEach(function (btn) {
btn.addEventListener("click", function () {
var answer = this.nextElementSibling;
var isOpen = answer.classList.contains("open");
document.querySelectorAll(".faq-answer.open, .faq-question.open").forEach(function (el) {
el.classList.remove("open");
});
if (!isOpen) { answer.classList.add("open"); this.classList.add("open"); }
});
});
document.querySelectorAll(".faq-tab-btn").forEach(function (tab) {
tab.addEventListener("click", function () {
document.querySelectorAll(".faq-tab-btn, .faq-panel").forEach(function (el) {
el.classList.remove("active");
});
this.classList.add("active");
var panel = document.getElementById("panel-" + this.getAttribute("data-tab"));
if (panel) panel.classList.add("active");
});
});
var form = document.getElementById("supportForm");
var submitBtn = form.querySelector(".btn");
var successDiv = document.getElementById("formSuccess");
form.addEventListener("submit", function (e) {
e.preventDefault();
var name = document.getElementById("contactName").value.trim();
var email = document.getElementById("contactEmail").value.trim();
var uuid = document.getElementById("contactUuid").value.trim();
var subject = document.getElementById("contactSubject").value.trim();
var question = document.getElementById("contactQuestion").value.trim();
if (!name || !email || !subject || !question) { alert("Please fill in all required fields."); return; }
submitBtn.disabled = true;
submitBtn.textContent = "Submitting...";
var payload = { name: name, email: email, subject: subject, requirements: question, area: "support" };
if (uuid) payload.uuid = uuid;
fetch("https://n8n.odoo4projects.com/webhook/ODOO4projects/crm", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
}).then(function (r) {
if (!r.ok) throw new Error("bad status " + r.status);
submitBtn.style.display = "none";
successDiv.classList.add("visible");
}).catch(function () {
submitBtn.disabled = false;
submitBtn.textContent = "Submit";
alert("Could not submit. Please try again.");
});
});
</script>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="720" height="1200" role="img" aria-labelledby="t" viewBox="0 0 720 1200"><title id="t">An agent working on your Odoo server</title><style>@font-face{font-family:&quot;Inter&quot;;font-style:normal;font-weight:400 600;font-display:block;src:url(data:font/woff2;base64,d09GMgABAAAAALyAABUAAAAB4CAAALwFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoZeG4KyRBzVcD9IVkFSi2k/TVZBUl4GYD9TVEFUgU4nJgCFNi9sEQgKgbtAgaEUC4gOADCCnD4BNgIkA5AYBCAFhi4HoQQMB1tzzZFCvBvP7u3DbGpQpdsQgMqps1L7r3ADN3ekcLpSd3VjDvdRxlSwXT24HeDivrPV7P/////PTiZjjG6zbhuAgIaVWf//oFG6m0fKpZa1GtEM3hHeiRiGTOHDNEtW1uphm9xD8Yfsc845xSOllI6MZ0bgBa6OXQbsGPkQKYlQqD3X9YVVvH2KntB6YJwvZMXkp+C5yraOrUrG4lPZsKGIy79I0v3UzBZt9SM6yqcJLyKfWogpGCTMhFHtxxQ74e+iXfmlkqJiNbeKZ4KLcfByGbnFit+pfrn4okou/l1zuyzDbEtoImSSXDLgSfrNakEiSjNkyuNXIhj2Rtg8HXFaJ1HMmcuGV+Se8CUCw/bq3NAqMQ78EUkhmkVBNNkIe66aFY24EF5FxJKmvYhLeZu+817KeHDRANVOdSZTE0mx05wGy3iIsAUf0f92lq9M9/vv/v/fb8Oa8yVqT0nuI2nTGlyeDouviNs9inRBSSqDf7jIJKu0nX6r99J6jx/12cSUdscJp/KxG3QT7RY/9SEwOBbgQ6oeY7Wz9aQv/8DXVf25LyKzMVb1gPyyV/Vl7QRt6Yojsq2qemYjy5LWBREQDCugh4gIihyuKEEw4qrLEgyHmBCRJ4m6LkFU2IMVOZKIiIiYOEQeMxhxWTBhSKjoeZiRLHLKDI9u9i8BQgghYQQIEEKYUxQFUXDWDq/aau0aNzrutm2vd78V8cbevb39PbuWZ+c8x6yKiPAv2cH/SXIzsw/6FFq5J1BCrkRshmBunSgGwlBJAxEEpGLApFwUq2DBGCNGjNwYg41Bb8RokWEBgmRpAypG/w8j8yOHxzn7l6YGDJgwUT8nKWxnYvunm0dKKkBbSk3TVKjTFqliMpggPjnuPrMz5WTD46b9o6Xicz8RK9tuu7tvrowTla6+VY2ikiAhJBCHQEhQ+fE36//kJECQUp/ObldcunvvM5Mvk9KrX8/F1mREaYECwcJRbVYVmlQxSMieub9uWxgmi8RIlphMT53AF76nKsiZ0PP9fv+5+lz6NKMTYVIxFkhYYhkun/JxgkCrUW8HgAHfZv5wV/Vceo2IEwFWEZPFfBFfSpOnX/qnojXxvfbOns7sUMptOJJCQsyoiP+evOentnLVv/qvc+q3CjpUOcAOsAPo0KMDOG0kq58AOljNltFOGB3g1Wk39AQ+xS8O8/f2tb0KFOBgKOMZL1U4wNeMYxxsv9E/WGcJZSGtFOEB7fTCvnubsV0HO3elSVt20/zFnBLJeSx2SYRDOIxGqPU8RgJPuF85+HmvCAoloAW0qpnN1ZoqVyeaB86JTwag9vO2+U4T8Oqd45RC8P1TgDARxX5JhfAg1M6n8RC/Vvnq03CY1Bm5s2EdFWWiq64nQELabXh/W6ELYrD0KGN/dy8Pnu/Hfp2LS/+ZITNElUYJRCp+/sOmQ9KI727UZhKaaVN7/e7eDp/n+d+v37nET/Jmln+chL03c1EfaZBcszZCIc/qeKRSqXhopLsRZGxnVCgYOdkLjTA1U75J7ShGrq85AEUWC04hNRKJJLmkXTYEEomQ8r+0uDorErLq35tqlf7X/UE2WrcsAJTp9U2t+1gLaU0MqaVZ41x+cQMQBkADJJuQWQAUZ5qUa1DDuQ+InAHJZa0akKHIcZY6Z9YY8wFKdS1K2mqRMqDWUVqrUnbWcM6a7C6zNrq66C4zNr4ssjYyPojyi6Pjefzlp9RXxx159GynISsw0ICMHEp2x2Pw96b1UZBRSilwUsStMGYtS6mEg8D//99rmnf3+uukV5OABjjgrdyfaZX/GqqAo8FB7AajPvD/7zSjunpyTr4H5QwKTbZUzt32yPZI6ZV5thZAFtEQuADh/f911tvqzrOO7GXtnH/GIfAnLBpDCGY3XSO9J83T05VsztrWeHDh27OzhAFr7M2RvfsBePIrxNn5wHj6cAVUp0pR5vRY/roO9m3aOvn/177VnXUPkU5IYt5onA5zd7hriHv0O/Lfmgs9U/Obh31IYl9QSfDwdtNuh0l/yQPCLsqCk7aAsgDwYxiG8fBxpbpvArSA3xLRKu3+nj/HSTuhYmYplrUe1IK1ZgUs8T+3urfPITbBbEhpWMR1wRYNLUqgLqa70lw8win+AxOkGc4hlEASFBLH+49zadu+ZpCODzJQKCd86ya/PCUX6OUgf4wKWKid69xkIaJpe8B9qYqXCivJzm0ubT+U1oRC5aKSEw4lgX+3l0fPDZgfC5PyJkVCCRLKvuc7UfJ5cruT7hDMYYIwRgghjAhp8O20fw2wgOmSf4buq3WCi1asL3tb8RLoYXGaTkRUytALu8f1t7tllNFh3+45Z+eWItkgUkSCpEEkc96Gae8EDyDdH9wnQUTEfiJHkJK653clm/QYm6mDz3L/exsG6IGkubz2yz5bg5njsnzHHhc5yjCOQwi22FGChFCOu19raU01dtpuYNXfAVGAH//IzvUXirFP/zv0Q8D3EOZgGihbNVTjCfTMK6jNIPTLEIwgAYxGFmACFAAmRAPARuKCGssWlDdc2DyUMI2KsDy6sEKGsCLmsBN8YacEwy5JhdXJhGnZouoghXXxouoTRkEEOBywO8ROy8zCKiUMYc0hGE+IBuOEgNsD1wcOJoEIBF76FNWvW8a/lWR8cpnwualV31D+g2XPb5YWzMFgE7wQfBUMiAAtzk8QD+7nLDCA3lr4ji7Q0qn9RVPfxlPKpM8205pLNKVuzXBniJpTlqg1ZdfZU/aMPWcvOFOuBXdyD+4UPAq33uSd+lb9t8irUghIFrgw8DAwDcQDKXQVA6xiA76MZ3wdZ3wa3iH+iPoCy31ii6hEQwzkY+RO0pNIrpNMfZQeJVCdlEEt0/+7SXv0Ns2MY4CpgemcrGjJK78i7vGxxvmOODaaYWbamPJQnJtgIt/rscV78eCP0M1GjQYdDqZhIlT0WSxeGk/pWQTGRLq5+prRdZ7EK3o6H/HJP8evCCaCIlCCYqAMR8LTUXtpI4gcpSOKxiNzFIqiMRoXY18ci6sEKq5NYklxEk9K02jmy6JZLItnVXm2SAtSnC+F5TtDRXQUU8xxchFpgJhMk5PSKJJ8aL2HUzy/nXlm2SqXxJZqrCGVy6mfFiVVRSGVVMuyZ9nHwjaTLVjWQfh/hK6gxvV3VUAXZJKUlpW3vMpRFQwnG7V6g83hhLwIiocIima5KB8TEqnBcRiJNC8IzFTdMC27WqfUes5ktjndvmisUmmtDVyBVLUGRD7VFYArSUHATgtlo6/1tt4Ol3u2+Bzs78vHs7B/UKRagDk+YCkBDFQJthOPcYcHfsUXMHXRbL/LZVg/OJt/7eaAsMTJdXMrUCuaLVhf/OXV7+irnJ6SCbEZgvAh3KOsYL642IdjkXJko4KjRshppO/9pI0aLFZX/N3DQxmbYOrjAT/79NOaeBWf88J2dwlitElg8r0ECXjeIqwTKkUDwaLg1SoH/uKvY/3gQ1Jj/KofmAvXXbL1+8nCn5e5j892isPgkDd8ZkN5u5fmmZMfahGqutcXnayYN6Xlw7NN46XUvlhu/lkVUl4w6XzysiO8fH1cuNCuSZWVv9ZVTS+k+kVz5S7r51DS4q660uy2speX4DLhin0E4kVJOLZoghXZU45b4SfhYo16VZcnHEuoYBwSe8U/L7TkdFxRq3AynWlNrRJqQDY4PozgA4ujA+sl2EOsrGNGbbHa8ztEtUG3WmuF0y1o9gyHOWSHaaOsAYlirvCmQIek0+zdqluzo9oDXSOVJOIzZTZrtuAKki0Ey0Jyq6qC6W5ShKjhtLwfszlR1u3ymUIhKYygjxZqQ4jMGiI2CNcgAINtsTVYRD/aUY8KyD1kZiJYQNsZWkIoN7igBUYGO9Zou9rQk93ZNa1qSYs6qkkd1s6WZ6sKE2/c3KwZwlBgE8R4k8A00o6++ED2lLdfLdw8l8oR0FH2KW0rQ6JMDtnNrdmNj9qDjG5iirnc7F7sBrIQbhOS1MFtX25g2/amFoBFyeuvIjZPbtqe1M32bnRTf937nIaxN4kJ5TOiRLYrigtKw+H1am3avnke0G78iZN8myoQtVa5xM5H+Y3Ss2tTnuRoW1HluNqHxXKYBEt4KHvBRmA5ra0eV8rpJ7Ku1z4/dxP/WD84MxS8hdi6vlhiVlQ1SmM4NbDTp/Y+P0MDWzmXZsbp6MnxvBiixZJn8AVb1/yMN2qWBjceS2pDo+krl0JvY7aXv1IL3nzP7UIcPB0/pF3dBK/eaL/t9Fgl+MJOxLV8FidqeKb5sgUXi2Ot2sTGU2edj3EKowZ2/CXvfrUN7TX56J6+XVybPM3erX/zkdzIzXeU6Fbfrw+u/mgcvhq6kPeVjfTS/UssNRSqoytJDzOtCE0aQuuJWz+4D1UrijRM/6Rw1XK8lao/8nSKlKSaeCgTB60KK5/2W/0puNbqSX7BuypUrxpl008XHRNfAtSUojuQPnMTOGmMap1HB/82N59DGUNsnD38aynt8URUd5jmY9TUGKH8q79vOzz69ttFvtdEbLine truncated

After

Width:  |  Height:  |  Size: 93 KiB

+1
View File
@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="800" role="img" aria-labelledby="t" viewBox="0 0 1200 800"><title id="t">An agent working on your Odoo server</title><style>@font-face{font-family:&quot;Inter&quot;;font-style:normal;font-weight:400 600;font-display:block;src:url(data:font/woff2;base64,d09GMgABAAAAALyAABUAAAAB4CAAALwFAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGoZeG4KyRBzVcD9IVkFSi2k/TVZBUl4GYD9TVEFUgU4nJgCFNi9sEQgKgbtAgaEUC4gOADCCnD4BNgIkA5AYBCAFhi4HoQQMB1tzzZFCvBvP7u3DbGpQpdsQgMqps1L7r3ADN3ekcLpSd3VjDvdRxlSwXT24HeDivrPV7P/////PTiZjjG6zbhuAgIaVWf//oFG6m0fKpZa1GtEM3hHeiRiGTOHDNEtW1uphm9xD8Yfsc845xSOllI6MZ0bgBa6OXQbsGPkQKYlQqD3X9YVVvH2KntB6YJwvZMXkp+C5yraOrUrG4lPZsKGIy79I0v3UzBZt9SM6yqcJLyKfWogpGCTMhFHtxxQ74e+iXfmlkqJiNbeKZ4KLcfByGbnFit+pfrn4okou/l1zuyzDbEtoImSSXDLgSfrNakEiSjNkyuNXIhj2Rtg8HXFaJ1HMmcuGV+Se8CUCw/bq3NAqMQ78EUkhmkVBNNkIe66aFY24EF5FxJKmvYhLeZu+817KeHDRANVOdSZTE0mx05wGy3iIsAUf0f92lq9M9/vv/v/fb8Oa8yVqT0nuI2nTGlyeDouviNs9inRBSSqDf7jIJKu0nX6r99J6jx/12cSUdscJp/KxG3QT7RY/9SEwOBbgQ6oeY7Wz9aQv/8DXVf25LyKzMVb1gPyyV/Vl7QRt6Yojsq2qemYjy5LWBREQDCugh4gIihyuKEEw4qrLEgyHmBCRJ4m6LkFU2IMVOZKIiIiYOEQeMxhxWTBhSKjoeZiRLHLKDI9u9i8BQgghYQQIEEKYUxQFUXDWDq/aau0aNzrutm2vd78V8cbevb39PbuWZ+c8x6yKiPAv2cH/SXIzsw/6FFq5J1BCrkRshmBunSgGwlBJAxEEpGLApFwUq2DBGCNGjNwYg41Bb8RokWEBgmRpAypG/w8j8yOHxzn7l6YGDJgwUT8nKWxnYvunm0dKKkBbSk3TVKjTFqliMpggPjnuPrMz5WTD46b9o6Xicz8RK9tuu7tvrowTla6+VY2ikiAhJBCHQEhQ+fE36//kJECQUp/ObldcunvvM5Mvk9KrX8/F1mREaYECwcJRbVYVmlQxSMieub9uWxgmi8RIlphMT53AF76nKsiZ0PP9fv+5+lz6NKMTYVIxFkhYYhkun/JxgkCrUW8HgAHfZv5wV/Vceo2IEwFWEZPFfBFfSpOnX/qnojXxvfbOns7sUMptOJJCQsyoiP+evOentnLVv/qvc+q3CjpUOcAOsAPo0KMDOG0kq58AOljNltFOGB3g1Wk39AQ+xS8O8/f2tb0KFOBgKOMZL1U4wNeMYxxsv9E/WGcJZSGtFOEB7fTCvnubsV0HO3elSVt20/zFnBLJeSx2SYRDOIxGqPU8RgJPuF85+HmvCAoloAW0qpnN1ZoqVyeaB86JTwag9vO2+U4T8Oqd45RC8P1TgDARxX5JhfAg1M6n8RC/Vvnq03CY1Bm5s2EdFWWiq64nQELabXh/W6ELYrD0KGN/dy8Pnu/Hfp2LS/+ZITNElUYJRCp+/sOmQ9KI727UZhKaaVN7/e7eDp/n+d+v37nET/Jmln+chL03c1EfaZBcszZCIc/qeKRSqXhopLsRZGxnVCgYOdkLjTA1U75J7ShGrq85AEUWC04hNRKJJLmkXTYEEomQ8r+0uDorErLq35tqlf7X/UE2WrcsAJTp9U2t+1gLaU0MqaVZ41x+cQMQBkADJJuQWQAUZ5qUa1DDuQ+InAHJZa0akKHIcZY6Z9YY8wFKdS1K2mqRMqDWUVqrUnbWcM6a7C6zNrq66C4zNr4ssjYyPojyi6Pjefzlp9RXxx159GynISsw0ICMHEp2x2Pw96b1UZBRSilwUsStMGYtS6mEg8D//99rmnf3+uukV5OABjjgrdyfaZX/GqqAo8FB7AajPvD/7zSjunpyTr4H5QwKTbZUzt32yPZI6ZV5thZAFtEQuADh/f911tvqzrOO7GXtnH/GIfAnLBpDCGY3XSO9J83T05VsztrWeHDh27OzhAFr7M2RvfsBePIrxNn5wHj6cAVUp0pR5vRY/roO9m3aOvn/177VnXUPkU5IYt5onA5zd7hriHv0O/Lfmgs9U/Obh31IYl9QSfDwdtNuh0l/yQPCLsqCk7aAsgDwYxiG8fBxpbpvArSA3xLRKu3+nj/HSTuhYmYplrUe1IK1ZgUs8T+3urfPITbBbEhpWMR1wRYNLUqgLqa70lw8win+AxOkGc4hlEASFBLH+49zadu+ZpCODzJQKCd86ya/PCUX6OUgf4wKWKid69xkIaJpe8B9qYqXCivJzm0ubT+U1oRC5aKSEw4lgX+3l0fPDZgfC5PyJkVCCRLKvuc7UfJ5cruT7hDMYYIwRgghjAhp8O20fw2wgOmSf4buq3WCi1asL3tb8RLoYXGaTkRUytALu8f1t7tllNFh3+45Z+eWItkgUkSCpEEkc96Gae8EDyDdH9wnQUTEfiJHkJK653clm/QYm6mDz3L/exsG6IGkubz2yz5bg5njsnzHHhc5yjCOQwi22FGChFCOu19raU01dtpuYNXfAVGAH//IzvUXirFP/zv0Q8D3EOZgGihbNVTjCfTMK6jNIPTLEIwgAYxGFmACFAAmRAPARuKCGssWlDdc2DyUMI2KsDy6sEKGsCLmsBN8YacEwy5JhdXJhGnZouoghXXxouoTRkEEOBywO8ROy8zCKiUMYc0hGE+IBuOEgNsD1wcOJoEIBF76FNWvW8a/lWR8cpnwualV31D+g2XPb5YWzMFgE7wQfBUMiAAtzk8QD+7nLDCA3lr4ji7Q0qn9RVPfxlPKpM8205pLNKVuzXBniJpTlqg1ZdfZU/aMPWcvOFOuBXdyD+4UPAq33uSd+lb9t8irUghIFrgw8DAwDcQDKXQVA6xiA76MZ3wdZ3wa3iH+iPoCy31ii6hEQwzkY+RO0pNIrpNMfZQeJVCdlEEt0/+7SXv0Ns2MY4CpgemcrGjJK78i7vGxxvmOODaaYWbamPJQnJtgIt/rscV78eCP0M1GjQYdDqZhIlT0WSxeGk/pWQTGRLq5+prRdZ7EK3o6H/HJP8evCCaCIlCCYqAMR8LTUXtpI4gcpSOKxiNzFIqiMRoXY18ci6sEKq5NYklxEk9K02jmy6JZLItnVXm2SAtSnC+F5TtDRXQUU8xxchFpgJhMk5PSKJJ8aL2HUzy/nXlm2SqXxJZqrCGVy6mfFiVVRSGVVMuyZ9nHwjaTLVjWQfh/hK6gxvV3VUAXZJKUlpW3vMpRFQwnG7V6g83hhLwIiocIima5KB8TEqnBcRiJNC8IzFTdMC27WqfUes5ktjndvmisUmmtDVyBVLUGRD7VFYArSUHATgtlo6/1tt4Ol3u2+Bzs78vHs7B/UKRagDk+YCkBDFQJthOPcYcHfsUXMHXRbL/LZVg/OJt/7eaAsMTJdXMrUCuaLVhf/OXV7+irnJ6SCbEZgvAh3KOsYL642IdjkXJko4KjRshppO/9pI0aLFZX/N3DQxmbYOrjAT/79NOaeBWf88J2dwlitElg8r0ECXjeIqwTKkUDwaLg1SoH/uKvY/3gQ1Jj/KofmAvXXbL1+8nCn5e5j892isPgkDd8ZkN5u5fmmZMfahGqutcXnayYN6Xlw7NN46XUvlhu/lkVUl4w6XzysiO8fH1cuNCuSZWVv9ZVTS+k+kVz5S7r51DS4q660uy2speX4DLhin0E4kVJOLZoghXZU45b4SfhYo16VZcnHEuoYBwSe8U/L7TkdFxRq3AynWlNrRJqQDY4PozgA4ujA+sl2EOsrGNGbbHa8ztEtUG3WmuF0y1o9gyHOWSHaaOsAYlirvCmQIek0+zdqluzo9oDXSOVJOIzZTZrtuAKki0Ey0Jyq6qC6W5ShKjhtLwfszlR1u3ymUIhKYygjxZqQ4jMGiI2CNcgAINtsTVYRD/aUY8KyD1kZiJYQNsZWkIoN7igBUYGO9Zou9rQk93ZNa1qSYs6qkkd1s6WZ6sKE2/c3KwZwlBgE8R4k8A00o6++ED2lLdfLdw8l8oR0FH2KW0rQ6JMDtnNrdmNj9qDjG5iirnc7F7sBrIQbhOS1MFtX25g2/amFoBFyeuvIjZPbtqe1M32bnRTf937nIaxN4kJ5TOiRLYrigtKw+H1am3avnke0G78iZN8myoQtVa5xM5H+Y3Ss2tTnuRoW1HluNqHxXKYBEt4KHvBRmA5ra0eV8rpJ7Ku1z4/dxP/WD84MxS8hdi6vlhiVlQ1SmM4NbDTp/Y+P0MDWzmXZsbp6MnxvBiixZJn8AVb1/yMN2qWBjceS2pDo+krl0JvY7aXv1IL3nzP7UIcPB0/pF3dBK/eaL/t9Fgl+MJOxLV8FidqeKb5sgUXi2Ot2sTGU2edj3EKowZ2/CXvfrUN7TX56J6+XVybPM3erX/zkdzIzXeU6Fbfrw+u/mgcvhq6kPeVjfTS/UssNRSqoytJDzOtCE0aQuuJWz+4D1UrijRM/6Rw1XK8lao/8nSKlKSaeCgTB60KK5/2W/0puNbqSX7BuypUrxpl008XHRNfAtSUojuQPnMTOGmMap1HB/82N59DGUNsnD38aynt8URUd5jmY9TUGKH8q79vOzz69ttFvtdEbLine truncated

After

Width:  |  Height:  |  Size: 95 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 166 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 158 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 175 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

+227 -77
View File
@@ -5,11 +5,15 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="description" content="Deploy Odoo in 5 minutes with fully managed hosting. Automatic backups, SSL, Git-based modules, and 6 global locations." />
<title>ODOO4projects | Deploy Odoo in 5 Minutes — Fully Managed Hosting</title>
<link rel="canonical" href="https://ODOO4projects.com/" />
<link rel="canonical" href="https://odoo4projects.com/" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/" />
<meta property="og:title" content="ODOO4projects | Deploy Odoo in 5 Minutes — Fully Managed Hosting" />
<meta property="og:description" content="Deploy Odoo in 5 minutes with fully managed hosting. Automatic backups, SSL, and Git-based module management." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://ODOO4projects.com/" />
<meta property="og:url" content="https://odoo4projects.com/" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="images/favicon.ico" />
<script type="application/ld+json">
@@ -17,16 +21,73 @@
"@context": "https://schema.org",
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://ODOO4projects.com/",
"url": "https://odoo4projects.com/",
"description": "Odoo hosting with fully managed infrastructure. Deploy in 5 minutes with automatic backups, SSL, and Git-based modules.",
"foundingDate": "2020",
"contactPoint": { "@type": "ContactPoint", "contactType": "customer support", "url": "https://ODOO4projects.com/contactus" },
"contactPoint": { "@type": "ContactPoint", "contactType": "customer support", "url": "https://odoo4projects.com/support.html#contact" },
"sameAs": ["https://www.linkedin.com/company/odoo4projects/"],
"offers": [
{ "@type": "Offer", "name": "Side Hustle", "price": "214.00", "priceCurrency": "USD", "url": "https://ODOO4projects.com/#pricing" },
{ "@type": "Offer", "name": "On the Rise", "price": "395.00", "priceCurrency": "USD", "url": "https://ODOO4projects.com/#pricing" },
{ "@type": "Offer", "name": "Powerhouse", "price": "535.00", "priceCurrency": "USD", "url": "https://ODOO4projects.com/#pricing" },
{ "@type": "Offer", "name": "Empire", "price": ">950.00", "priceCurrency": "USD", "url": "https://ODOO4projects.com/#pricing" }
{ "@type": "Offer", "name": "Side Hustle", "price": "214.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "On the Rise", "price": "395.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "Powerhouse", "price": "595.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" },
{ "@type": "Offer", "name": "Empire", "price": ">950.00", "priceCurrency": "USD", "url": "https://odoo4projects.com/#pricing" }
]
}
</script>
<script type="application/json" id="agent-skills">
{
"skills": [
{
"name": "spin_up_free_trial",
"description": "Spin up a free trial of ODOO4projects.",
"when_to_use": [
"User wants to create an ODOO4projects free trial",
"User asks to spin up or provision a trial",
"User asks to try ODOO4projects"
],
"offer": {
"type": "free_trial",
"available": true
},
"mcp": {
"server": "https://n8n.odoo4projects.com/mcp/trial"
},
"server_locations": [
{
"name": "Manchester",
"id": "manchester"
},
{
"name": "Sydney",
"id": "sydney"
},
{
"name": "Mumbai",
"id": "mumbai"
},
{
"name": "São Paulo",
"id": "sao-paulo"
},
{
"name": "Meppel",
"id": "meppel"
},
{
"name": "Boston",
"id": "boston"
}
],
"workflow": [
"Use the ODOO4projects trial MCP server to create the free trial.",
"If the user specifies a server location, use that location.",
"If no server location is specified, ask the user which available location they prefer.",
"After signup, the user will receive a confirmation email.",
"The user must confirm the trial using the confirmation email.",
"After the trial is confirmed, the user will receive their ODOO4projects credentials."
],
"instruction": "When the user requests a free trial, use the ODOO4projects trial MCP server to provision it. Do not claim that the trial is fully activated until the required email confirmation has been completed. Explain that the user will receive a confirmation email after signup and, once confirmed, will receive their credentials."
}
]
}
</script>
@@ -55,11 +116,24 @@
.hero::after{content:'';position:absolute;inset:0;background:linear-gradient(135deg,var(--midnight) 50%,rgba(13,27,46,.4) 100%);opacity:.5;z-index:0}
.hero-bg{position:absolute;inset:0;z-index:0;overflow:hidden}.hero-bg-slide{position:absolute;inset:0;background-size:cover;background-position:center;background-repeat:no-repeat;opacity:.25;filter:brightness(1.15)saturate(1.1)}
.hero .container{position:relative;z-index:1;flex:1;display:flex;flex-direction:column;justify-content:center}
/* Language selector — top-right of the hero's own top area (page has no site header). CI §1/§2:
brass marks the active language, body colour for the other two; lang.js owns the markup. */
.hero .lang-switch-slot{display:flex;justify-content:flex-end;margin-bottom:1rem}
.hero .lang-switch{color:rgba(255,255,255,.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}
.hero-kicker{font-family:Inter,sans-serif;font-size:.72rem;font-weight:600;letter-spacing:.15em;text-transform:uppercase;color:var(--brass);margin-bottom:.75rem}
.hero h1{color:#fff;max-width:700px;margin-bottom:1rem;font-weight:400}.hero h1 span{color:var(--brass)}
.hero-sub{font-size:1.05rem;color:rgba(255,255,255,.7);max-width:560px;line-height:1.7;margin-bottom:1.5rem}
.hero-stats{display:flex;gap:1.5rem;margin-bottom:2rem;flex-wrap:wrap}.hero-stat{display:flex;align-items:center;gap:.4rem;color:rgba(255,255,255,.65);font-size:.85rem}.hero-stat i{color:var(--brass);font-size:.75rem}
.hero-actions{display:flex;gap:1rem;flex-wrap:wrap;margin-bottom:2rem}
.hero-notice{position:absolute;top:1.25rem;right:1.25rem;z-index:3;display:flex;align-items:center;gap:.55rem;max-width:min(360px,calc(100% - 2rem));padding:.6rem .85rem .6rem 1rem;background:#f5c542;color:var(--midnight);border:1px solid rgba(13,27,46,.14);border-radius:var(--radius);box-shadow:0 8px 24px rgba(13,27,46,.3);font-family:Inter,sans-serif;font-size:.82rem;line-height:1.4;animation:heroNoticeIn .4s cubic-bezier(.16,1,.3,1)}
.hero-notice[hidden]{display:none}
.hero-notice i{color:var(--midnight);font-size:.9rem;flex-shrink:0}
.hero-notice-text{flex:1;min-width:0;overflow-wrap:anywhere}
.hero-notice-close{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:1.35rem;height:1.35rem;padding:0;border:0;border-radius:50%;background:rgba(13,27,46,.12);color:var(--midnight);font-size:1rem;line-height:1;cursor:pointer;transition:background .2s}
.hero-notice-close:hover{background:rgba(13,27,46,.24)}
@keyframes heroNoticeIn{from{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:none}}
.server-banner{background:var(--midnight);padding:2rem 0 1.5rem;border-top:1px solid var(--line-brass);border-bottom:1px solid var(--line-brass);position:relative;overflow:hidden}
.server-banner::before{content:'';position:absolute;inset:0;background:radial-gradient(ellipse 60% 80% at 50% 100%,rgba(201,162,39,.06) 0%,transparent 70%);pointer-events:none}
.server-banner-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:1.25rem;flex-wrap:wrap;gap:.5rem}
@@ -81,7 +155,7 @@
.pricing-server-select{padding:.5rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.08);color:#fff;font-family:Inter,sans-serif;font-size:.85rem;outline:none;cursor:pointer;min-width:180px}
.pricing-server-select option{background:var(--midnight);color:#fff}
@media(max-width:992px){.server-grid{grid-template-columns:repeat(3,1fr)}}
@media(max-width:768px){.hero{min-height:auto;padding:3rem 0 0}.hero-actions{flex-direction:column}.hero-actions .btn{width:100%;text-align:center}.hero-stats{gap:.75rem}.hero-city-label{bottom:1rem;right:1rem;font-size:.78rem;padding:.5rem .9rem}}
@media(max-width:768px){.hero{min-height:auto;padding:3rem 0 0}.hero.has-hero-notice{padding-top:4.75rem}.hero-actions{flex-direction:column}.hero-actions .btn{width:100%;text-align:center}.hero-stats{gap:.75rem}.hero-city-label{bottom:1rem;right:1rem;font-size:.78rem;padding:.5rem .9rem}.hero-notice{top:.75rem;left:.75rem;right:.75rem;max-width:none;font-size:.78rem}}
@media(max-width:576px){.server-grid{grid-template-columns:repeat(2,1fr)}.server-banner-header{flex-direction:column;align-items:flex-start}}
.status-dot{width:7px;height:7px;border-radius:50%;background:var(--brass);display:inline-block;animation:statusPulse 1.2s ease-in-out infinite}
@keyframes statusPulse{0%,100%{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1.2)}}
@@ -124,24 +198,57 @@
.oca-icon-link:hover{color:var(--brass-bright);transform:scale(1.2)}
.oca-empty{text-align:center;padding:2rem;color:rgba(255,255,255,.4);font-style:italic;display:none}
.oca-loading{text-align:center;padding:2rem;color:rgba(255,255,255,.4);font-size:.88rem}
@media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}}
/* Custom Quote Modal */
.ow-sub{font-size:.95rem;color:var(--midnight);margin-bottom:1.5rem}
.ow-panel input[type="text"],.ow-panel textarea{width:100%;padding:.8rem 1rem;border-radius:var(--radius);border:1px solid var(--line-brass);background:rgba(255,255,255,.05);color:#171c26;font-family:Inter,sans-serif;font-size:.88rem;outline:none;transition:border-color .2s,background .2s;box-sizing:border-box}
.ow-panel input[type="text"]:focus,.ow-panel textarea:focus{border-color:var(--brass);background:rgba(255,255,255,.08)}
.ow-panel textarea{min-height:100px;resize:vertical}
.ow-panel textarea::placeholder{color:rgba(23,28,38,.3)}
.ow-panel input[type="email"]::placeholder{color:rgba(23,28,38,.3)}
.ow-close{background:var(--midnight);border:1px solid var(--line);color:#fff;font-size:2rem;cursor:pointer;line-height:1;position:absolute;right:1rem;top:1rem;transition:color .2s,background .2s;border-radius:var(--radius);width:2.5rem;height:2.5rem;display:flex;align-items:center;justify-content:center}
.ow-close:hover{color:var(--brass);background:var(--midnight-2)}
/* Custom Quote Modal overrides for biz-field inside ow-panel */
#customQuoteModal .biz-field label{color:#171c26}
#customQuoteModal .biz-field textarea{color:#171c26}
#customQuoteModal .biz-field textarea::placeholder{color:rgba(23,28,38,.3)}
#customQuoteModal .biz-field input[type="email"]{color:#171c26}
#customQuoteModal .biz-field input[type="email"]::placeholder{color:rgba(23,28,38,.3)}
#customQuoteModal .biz-field input[type="text"]{color:#171c26}
#customQuoteModal .biz-field input[type="text"]::placeholder{color:rgba(23,28,38,.3)}
/* Success message sits on the light modal panel, so it needs dark text (the global .biz-success rules target the dark wizard section) */
#customQuoteModal .biz-success h3{color:var(--midnight)}
#customQuoteModal .biz-success p{color:var(--midnight)}
@media(max-width:600px){.oca-table td,.oca-table th{padding:.5rem .65rem;font-size:.8rem}.ow-panel{left:5%;right:5%}.ow-close{top:.5rem;right:.5rem;font-size:1.6rem}}
</style>
<link rel="stylesheet" href="style.css" media="print" onload="this.media='all'" />
<noscript><link rel="stylesheet" href="style.css" /></noscript>
</head>
<!-- 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>
<!--
THESIS: The homepage as a global business lounge concierge desk — midnight blue, brass, marble, city placards for the six regions. The category default (hero + feature grid + pricing grid) is reframed as hospitality: the visitor checks in, reads the rate card, and books a suite.
OWN-WORLD: Midnight blue (#0d1b2e) ground, brass (#c9a227) for every accent and CTA, cream (#f4f0e8) for light surfaces. Marcellus serif for display, Inter for body. Six city photos (Amsterdam, Boston, London, Mumbai, São Paulo, Sydney) as circular placards. Hairline brass rules. Concierge-card features.
STORY: The visitor understands: "I can deploy Odoo in 5 minutes, globally, without DevOps. This is enterprise-grade, but the concierge handles everything." They believe it from the city photos (real regions), the partner logos, the brass CTA, and the "No setup fee. Stripe Payment. Cancel at any time" footer.
FIRST VIEWPORT: Midnight hero with faint Amsterdam skyline. Brass kicker "FULLY MANAGED ODOO HOSTING". Large serif h1 "Deploy Odoo in 5 Minutes — Fully Managed Hosting". Stats row with brass checks. Brass CTA button "See Plans & Pricing" + ghost "How It Works". Bottom: six city placards (photo + name + region) in a horizontal strip.
FIRST VIEWPORT: Midnight hero with faint Amsterdam skyline. Brass kicker "FULLY MANAGED ODOO COMMUNITY HOSTING". Large serif h1 "Deploy Odoo in 5 Minutes — Fully Managed Hosting". Stats row with brass checks. Brass CTA button "See Plans & Pricing" + ghost "How It Works". Bottom: six city placards (photo + name + region) in a horizontal strip.
FORM: The Grand Hotel Business Lounge (model-pick, user-chosen). Seed key: 7db4dced.
FINISH: unreviewed and undocumented is unfinished; this build ends with the finish review, the verdict, and DESIGN.md.
-->
<!-- Hero -->
<section class="hero">
<div class="hero-notice" id="heroConfirmNotice" role="status" aria-live="polite" hidden>
<i class="fas fa-check-circle" aria-hidden="true"></i>
<span class="hero-notice-text"></span>
<button type="button" class="hero-notice-close" aria-label="Dismiss notification">&times;</button>
</div>
<div class="container">
<div class="hero-kicker">Fully Managed Odoo Hosting</div>
<div data-lang-switcher class="lang-switch-slot"></div>
<div class="hero-kicker">Fully Managed Odoo Community Hosting</div>
<h1>Deploy Odoo in <span>5 Minutes</span> — Fully Managed Hosting</h1>
<p class="hero-sub">Launch a production-ready Odoo Community instance with automatic backups, free SSL, and Git-based module management. No DevOps required.</p>
<div class="hero-stats">
@@ -157,6 +264,18 @@
</div>
</section>
<!-- Spinning Up Widget (shown when ?message=spinning_up) -->
<section class="spinning-up" id="spinningUp" style="display:none;">
<div class="container">
<div class="spinning-card">
<i class="fas fa-cog fa-spin"></i>
<h3>Spinning up your Odoo instance</h3>
<p>We're provisioning your Odoo Community V20 server. This usually takes 2-5 minutes.</p>
<p class="spinning-note">You'll receive an email with your login credentials once it's ready.</p>
</div>
</div>
</section>
<!-- Server Status Banner -->
<section class="server-banner" id="serverBanner">
<div class="container">
@@ -169,7 +288,7 @@
<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"><div class="server-city">Sydney</div><div class="server-region">Australia</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>
@@ -207,7 +326,7 @@
<div class="feature-card">
<i class="fas fa-shield-alt"></i>
<h3>Automatic Backups &amp; SSL</h3>
<p>Daily backups stored in redundant slots. Free SSL certificates on every domain — always secure.</p>
<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>
@@ -243,29 +362,33 @@
<div class="container">
<h2 class="section-title">Frequently asked questions</h2>
<div class="faq-grid">
<div class="faq-card" 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>Pick a plan, choose your region — your instance is live in under 5 minutes. No setup fee. Stripe Payment. Cancel at any time</p></div>
</div>
<div class="faq-card" onclick="this.classList.toggle('open')">
<div class="faq-q"><span>Can I install custom modules?</span> <i class="fas fa-chevron-down"></i></div>
<div class="faq-a"><p>Yes. Starting with On the Rise we fully support Git-based modules. Quick Git is included for one-click installs.</p></div>
</div>
<div class="faq-card" onclick="this.classList.toggle('open')">
<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>Upgrade instantly from your Odoo Settings panel. No data migration, no downtime.</p></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" onclick="this.classList.toggle('open')">
<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 above are Enterprise-ready. You bring your license; we provide the infrastructure.</p></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" onclick="this.classList.toggle('open')">
<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, and more — all in one system. Community is free and fully open-source.</p></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" onclick="this.classList.toggle('open')">
<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. We offer coupon codes for startups and NGOs.</p></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>
@@ -275,15 +398,15 @@
<!-- Pricing -->
<section class="section-dark" id="pricing">
<div class="container">
<p class="section-kicker">Rates &amp; Suites</p>
<p class="section-kicker">Order & Pricing</p>
<h2 class="section-title">Your Plan, Your Timing: Upgrade Anytime</h2>
<div class="pricing-server-row">
<label for="pricingServerLocation">Server Location</label>
<select id="pricingServerLocation" class="pricing-server-select"></select>
<label for="pricingOdooVersion">Odoo Version</label>
<select id="pricingOdooVersion" class="pricing-server-select">
<option value="19.0">19.0 &mdash; Tons of OCA supported modules</option>
<option value="20.0">20.0 &mdash; Latest Greatest</option>
<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">
@@ -294,14 +417,13 @@
<div class="price">
<strong>$ 214.00</strong>
<small class="price-period">/ year</small>
<div class="price-save">Save 8%</div>
</div>
<p class="desc">&ldquo;ODOO Standard .. that is all my business needs&rdquo;</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="54">Buy Now</a>
<p class="desc">"ODOO Standard .. that is all my business needs"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="6">Buy Now</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> ODOO CE Hosting</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic Backups</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Domain Mapping, SSL Cert</li>
<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>
@@ -313,15 +435,14 @@
<div class="price">
<strong>$ 395.00</strong>
<small class="price-period">/ year</small>
<div class="price-save">Save 9%</div>
</div>
<p class="desc">&ldquo;I need some modules and professional reports&rdquo;</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="55">Buy Now</a>
<p class="desc">"I need some modules and professional reports"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="4">Buy Now</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> ODOO CE Hosting</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic Backups</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Domain Mapping, SSL Cert</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Module installation via GIT / quickGIT</li>
<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>
@@ -331,19 +452,17 @@
<div class="pcard-body">
<h3>Powerhouse</h3>
<div class="price">
<strong>$ 535.00</strong>
<strong>$ 595.00</strong>
<small class="price-period">/ year</small>
<div class="price-save">Save 10%</div>
</div>
<p class="desc">&ldquo;ODOO Enterprise is a must have!&rdquo;</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="56">Buy Now</a>
<p class="desc">"ODOO Enterprise is a must have!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy plausible-event-name=Buy" data-id="5">Buy Now</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> ODOO CE Hosting</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic Backups</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 3 Domain Mapping, SSL Cert</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Module installation via GIT / quickGIT</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 2 Workers</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> 2GB HDD</li>
<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>
@@ -355,20 +474,20 @@
<div class="price">
<strong>&gt;$ 950.00</strong>
<small class="price-period">/ year</small>
<div class="price-save"></div>
</div>
<p class="desc">&ldquo;My house! My Horse! My Server!&rdquo;</p>
<a href="javascript:void(0)" class="btn btn-brass btn-empire" data-plan="Empire" data-price="950.00" data-is-empire="true">Get Custom Quote</a>
<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 &amp; features</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 &amp; dedicated onboarding</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>
@@ -382,8 +501,8 @@
<span class="ow-price-amount" id="orderPlanPrice">$ 395.00</span> <span id="orderPlanPeriod">/ year</span>
<span class="ow-price-tax" id="orderPlanTax">+ tax</span>
</p>
<p class="ow-coupon-msg" id="orderCouponMsg">Use coupon <strong>FREE TRIAL</strong> at checkout for 1 month free</p>
<p class="ow-yearly-save" id="orderYearlySave">Save <span id="orderSavePercent">15</span>% with yearly billing</p>
<p class="ow-coupon-msg" id="orderCouponMsg">Questions before you buy? Ask the assistant on this page.</p>
<p class="ow-yearly-save" id="orderYearlySave">Billed yearly. No setup fee.</p>
<label class="ow-field-label" for="orderServerLocation">Server Location</label>
<select id="orderServerLocation" class="ow-select">
<option value="USA">United States (Boston)</option>
@@ -393,16 +512,39 @@
<option value="Netherlands">Netherlands (Amsterdam)</option>
<option value="UK">United Kingdom (London)</option>
</select>
<div style="margin-bottom:1rem">
<label class="ow-field-label" for="orderCouponInput">Coupon Code</label>
<div class="ow-coupon-row">
<input id="orderCouponInput" type="text" value="FREE TRIAL" class="ow-input" />
<button class="ow-btn-apply" onclick="applyCoupon()">Apply</button>
<a id="orderBuyBtn" href="/support.html#contact" class="btn btn-brass ow-buy">Continue to Stripe &rarr;</a>
<p class="ow-note">&#128274; Secure Stripe checkout &middot; Card required to buy, not to start.</p>
</div>
</div>
</div>
<!-- Custom Quote Modal -->
<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>
<p class="ow-coupon-status" id="orderCouponStatus">&#10003; Coupon applied</p>
<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>
<a id="orderBuyBtn" href="/contactus" class="btn btn-brass ow-buy">Continue to Stripe &rarr;</a>
<p class="ow-note">&#128274; Secure Stripe checkout &middot; Credit card required</p>
</div>
</div>
</div>
@@ -425,6 +567,7 @@
<div class="container">
<p class="section-kicker">OCA Modules</p>
<h2 class="section-title">Our Top OCA Module Picks</h2>
<p style="max-width:760px;margin:0 auto 1.5rem;text-align:center;color:rgba(255,255,255,.72);font-size:.95rem;line-height:1.7">Every module on this list is checked by our robots daily; <a href="/blog/posts/track-the-oca-modules-you-actually-use.html">why we track OCA modules</a> explains what the columns mean and how to read them before an upgrade.</p>
<div class="oca-search-wrap">
<input type="text" class="oca-search" id="ocaSearch" placeholder="Search modules..." />
</div>
@@ -492,10 +635,10 @@
<div>
<h4>Useful Links</h4>
<ul>
<li><a href="index.html">Home</a></li>
<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>
<li><a href="/contactus">Contact us</a></li>
</ul>
</div>
<div>
@@ -508,9 +651,8 @@
</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 and N8N automation.</p>
<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>
<p><a href="mailto:support@odoo4projects.com" class="footer-email">support@odoo4projects.com</a></p>
</div>
<div>
<h4>Follow us on</h4>
@@ -518,6 +660,14 @@
<a href="https://www.linkedin.com/company/odoo4projects/" target="_blank" aria-label="LinkedIn"><i class="fab fa-linkedin-in"></i></a>
<a href="https://www.youtube.com/@ODOO4projects" target="_blank" aria-label="YouTube"><i class="fab fa-youtube"></i></a>
</div>
<form class="footer-contact-form" id="footerContactForm">
<input type="email" id="footerContactEmail" placeholder="Your email address" required />
<div class="footer-textarea-wrap">
<textarea id="footerContactText" placeholder="Your message..." required></textarea>
<button type="submit" class="footer-send-btn" aria-label="Send message"><i class="fas fa-paper-plane"></i></button>
</div>
<div class="footer-form-status" id="footerFormStatus" role="status"></div>
</form>
</div>
</div>
<div class="fcopy">Copyright &copy; ODOO4projects LLC</div>
@@ -528,4 +678,4 @@
<script src="script.js"></script>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
</html>
+52 -3
View File
@@ -5,14 +5,14 @@
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="Legal information for ODOO4projects LLC — company details, contact, image credits, and trademark notices."
content="Legal information for ODOO4projects LLC — company details, contact, image and video credits, and trademark notices."
/>
<title>Legal | ODOO4projects</title>
<link rel="canonical" href="https://ODOO4projects.com/legal" />
<link rel="canonical" href="https://odoo4projects.com/legal.html" />
<meta property="og:title" content="Legal | ODOO4projects" />
<meta property="og:description" content="Legal information for ODOO4projects LLC." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://ODOO4projects.com/legal" />
<meta property="og:url" content="https://odoo4projects.com/legal" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="images/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
@@ -87,6 +87,18 @@
.image-credits .credit-row a {
color: var(--primary);
}
.video-credits {
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.video-credits .credit-row {
color: rgba(33, 37, 41, 0.6);
font-size: 0.82rem;
}
.video-credits .credit-row a {
color: var(--primary);
}
.trademark-notice {
background: rgba(113, 75, 103, 0.04);
border: 1px solid rgba(113, 75, 103, 0.15);
@@ -103,6 +115,12 @@
.legal-card { padding: 1.25rem; }
}
</style>
<!-- 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>
</head>
<body>
<div class="container">
@@ -131,6 +149,21 @@
</p>
</div>
<div class="legal-card">
<h2>Privacy &amp; Terms</h2>
<p>
What data we hold and how we use it:
<a href="privacy.html">Privacy Policy</a>
</p>
<p>
The rules of the service, plans, trial and cancellation:
<a href="terms.html">Terms of Service</a>
</p>
<p style="margin-top: 0.75rem; font-size: 0.82rem;">
Both pages last updated 2026-10-21.
</p>
</div>
<div class="legal-card">
<h2>Image Credits</h2>
<div class="image-credits">
@@ -144,6 +177,22 @@
</div>
</div>
<div class="legal-card">
<h2>Video Credits</h2>
<div class="video-credits">
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/alexkopeykin-6178059/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=154950" target="_blank" rel="noopener">AlexKopeykin</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=154950" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/bellergy-1846871/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=23008" target="_blank" rel="noopener">bellergy</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=23008" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/fokus_media-43014057/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=208160" target="_blank" rel="noopener">fokus_media</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=208160" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/prakashchavda-6869965/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=74507" target="_blank" rel="noopener">PrakashChavda</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=74507" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/tungart7-38741244/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=203404" target="_blank" rel="noopener">TungArt7</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=203404" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/equalstock-42331718/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=267359" target="_blank" rel="noopener">EqualStock</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=267359" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/vimeo-free-videos-1283884/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=784" target="_blank" rel="noopener">Vimeo-Free-Videos</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=784" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/wastedgeneration-3184449/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=12543" target="_blank" rel="noopener">wastedgeneration</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=12543" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/vimeo-free-videos-1283884/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=1073" target="_blank" rel="noopener">Vimeo-Free-Videos</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=1073" target="_blank" rel="noopener">Pixabay</a></span>
<span class="credit-row">Video von <a href="https://pixabay.com/de/users/sharaed-10850801/?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=20836" target="_blank" rel="noopener">sharaed</a> / <a href="https://pixabay.com/de//?utm_source=link-attribution&utm_medium=referral&utm_campaign=video&utm_content=20836" target="_blank" rel="noopener">Pixabay</a></span>
</div>
</div>
<div class="legal-card">
<h2>Trademark Notice</h2>
<div class="trademark-notice">
+85
View File
@@ -0,0 +1,85 @@
# ODOO4projects
> ODOO4projects is a managed Odoo Community hosting service. We run the server, the backups, the
> SSL certificate and the version upgrades for a monthly-or-yearly price, so the customer does not
> have to administer a server. One login: everything happens inside the customer's own Odoo
> instance. We do not sell Odoo itself; we sell a business system that runs.
## Products and pricing (verified 2026-10-21, list prices, USD, VAT excluded)
- Side Hustle — $214 per year. Managed Odoo Community hosting: server, backups, SSL, one domain.
No per-user licence. No module installation on this plan.
- On the Rise — $395 per year. The same, plus Git and one-click module installs, and three domains.
- Powerhouse — $595 per year. Everything in On the Rise, plus Odoo Enterprise readiness and two
workers.
- Empire — quoted on the plans page (no fixed price published).
- Odoo Community has no per-user licence. Odoo Enterprise, if the customer brings their own
licence, is licensed per user by Odoo S.A.
## What we support
- Odoo Community, hosted and managed.
- odoo.sh (Odoo S.A.'s own platform) — supported and coexists with our service.
- Growth into Odoo Enterprise — bring your own licence, keep the same instance, no migration.
- Own hardware — the Empire plan runs our service on the customer's own server.
## What we do not support
- Odoo Online (Odoo's SaaS). It runs Odoo's standard apps only and is incompatible with custom
modules, so it is not a fit for our managed Community model.
## Key pages
- [Odoo Community upgrade](https://odoo4projects.com/odoo-community-upgrade.html): what an upgrade changes, the published step-by-step process, the real commands for a developer (Odoo's upgrade platform and the OCA OpenUpgrade route) and how we migrate a database onto our servers. No price and no duration are published for the migration service; it starts with a support ticket.
- [Odoo hosting in Australia — Sydney](https://odoo4projects.com/australia.html): managed Odoo Community hosting on our own servers in Sydney, for Australian businesses. The four plans and yearly prices, the checkout with Australia (Sydney) pre-selected, and the one Sydney claim we make — we host in Sydney (no AU support hours, no AU entity, no AUD price published).
- [Odoo hosting offers](https://odoo4projects.com/odoo-hosting-offers/) — what a year of managed Odoo Community hosting costs: one flat yearly price, no per-user licence, no setup fee, 30-day free trial.
- [Odoo Black Friday](https://odoo4projects.com/odoo-black-friday/) — our yearly Black Friday and Cyber Monday offer on managed Odoo Community hosting.
- [Odoo hosting 2027 — comparison landing page](https://odoo4projects.com/odoo-hosting-2027.html): every route to Odoo (managed, VPS, odoo.sh, Odoo Online, own hardware) side by side, with annual and five-year cost comparisons.
- [Odoo ERP Automation Bootcamp](https://odoo4projects.com/odoo-erp-automation-bootcamp/): a three-month, ten-session live bootcamp with Oliver Arnold, Technical Lead, that takes a small business from zero to a running ERP. Thursdays, one hour, Q1 2027, starting 21 January 2027; one year of hosted Odoo Community Edition included. The bootcamp is limited to six participants per cohort. The current price is confirmed on registration.
- [ODOO x N8N Masterclass](https://odoo4projects.com/odoo-n8n-masterclass/): a two-hour live masterclass with Oliver Arnold on connecting Odoo to n8n — calling n8n webhooks from Odoo automated actions, how the n8n integration for Odoo works, and website workarounds that extend your automation. Hands-on in a free Odoo trial system; n8n itself runs on n8n's own free plan, which is not included. USD 120.00, next session the four Thursdays of February 2027 at 17:00 Central Time.
- [ODOO Workshops and Classes](https://odoo4projects.com/workshops/): the two live courses side by side — the two-hour ODOO x N8N Masterclass (USD 120.00) and the ten-session ODOO ERP Automation Bootcamp (USD 465.00), both taught by Oliver Arnold — which course fits which business, and a full comparison table.
- [What can I use Odoo for?](https://odoo4projects.com/what-can-i-use-odoo-for/): plain-English guide to what Odoo is used for — the ten apps and what each is for, what Odoo is used for by business type (manufacturing, retail and trade, services, construction, nonprofits, accounting practices, small business starting out), where it stops (Odoo Online will not take custom code, it will not do your trade's specialist work), what it costs, and how to start. Includes the nine-question FAQ.
- [Odoo staging environment](https://odoo4projects.com/odoo-staging-environment/): what an Odoo staging environment is, how odoo.sh's staging branches work, why most small businesses do not need one, and the simpler back-up-install-test route we offer instead.
- [Home](https://odoo4projects.com/): plans and pricing, FAQ, server locations.
- [Support](https://odoo4projects.com/support.html): support and frequently asked questions.
- [Legal](https://odoo4projects.com/legal.html): company details.
- [Privacy Policy](https://odoo4projects.com/privacy.html): what data we hold and how we use it.
- [Terms of Service](https://odoo4projects.com/terms.html): plans, trial, payment and cancellation.
## Blog posts
- [ODOO4projects Supports the OCA Paraguay Internationalization Hackathon](https://odoo4projects.com/blog/posts/oca-paraguay-internationalization-hackathon.html) — 2026-10-29 — Two online days to push Odoo's Paraguayan localisation forward — and we are supporting them.
- [How to Install Odoo Modules Using Git — and the Quick Git Route That Skips the Console](https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html) — 2026-10-28 — Every business is slightly different, which is why a system that only does the standard thing is only ever half a system.
- [ODOO Community Is Going Online on ODOO4projects](https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html) — 2026-10-27 — ODOO Community is online.
- [Track the OCA Modules You Actually Use — Without Refreshing GitHub Every Day](https://odoo4projects.com/blog/posts/track-the-oca-modules-you-actually-use.html) — 2026-10-24 — Every new Odoo release starts the same routine.
- [This is how i updated my Invoices from Odoo 19 to Odoo 20 with n8n and much MCP](https://odoo4projects.com/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html) — 2026-10-23 — Copying invoices from one Odoo instance to another by hand is the kind of task that looks small until you are on…
- [6 Tips to Leverage the Latest Odoo Management App Update](https://odoo4projects.com/blog/posts/6-tips-to-leverage-the-latest-odoo-management-app-update.html) — 2026-10-08 — We've just rolled out a major update to the management app preinstalled on your ODOO4project service.
- [Odoo 20 Is Live on Our Servers — With an MCP Server and Free Backups](https://odoo4projects.com/blog/posts/odoo-20-is-live-on-our-servers-with-an-mcp-server-and-free-backups.html) — 2026-10-06 — Two weeks. That is how long it took us to bring up Odoo 20 on our servers, with all of the new features that come with it. It is live now.
- [Odoo Community vs. Enterprise: The Real Cost Breakdown (2026)](https://odoo4projects.com/blog/posts/community-vs-enterprise-cost.html) — 2026-06-27 — A transparent cost comparison of Odoo Community vs Enterprise — including hosting, licensing, and hidden costs for 5, 10, and 25-user teams.
- [Platform Update: New Dashboard, Faster Backups & Smarter Monitoring](https://odoo4projects.com/blog/posts/news-platform-update.html) — 2026-06-24 — We've rolled out a major platform update with a redesigned dashboard, incremental backups, and AI-powered uptime monitoring.
- [Why ODOO Community is Perfect for Working with AI Agents](https://odoo4projects.com/blog/posts/odoocommunity-agents.html) — 2026-06-24 — Odoo Community carries no licensing fees, so each AI agent can have its own user account and access rights without additional cost - a game changer for automation.
- [How to Migrate from Odoo Community to Enterprise Without Downtime](https://odoo4projects.com/blog/posts/guide-migrate-enterprise.html) — 2026-06-20 — A step-by-step guide to migrating your Odoo CE instance to Enterprise edition with zero downtime and full data integrity.
- [Install Custom Odoo Modules via Git – A Practical How-To](https://odoo4projects.com/blog/posts/howto-custom-module.html) — 2026-06-17 — Learn how to install and manage custom Odoo modules directly from Git repositories on your ODOO4projects instance.
- [ODOO4projects Becomes an Official Odoo Ready Partner](https://odoo4projects.com/blog/posts/news-official-partner.html) — 2026-06-14 — We're thrilled to announce our official partnership with Odoo SA, bringing enterprise-grade hosting to even more businesses.
- [Set Up Automated Backups in Under 2 Minutes](https://odoo4projects.com/blog/posts/speed-run-backup.html) — 2026-06-10 — Protect your Odoo data in moments. This speed-run walks you through enabling automated daily backups with one click.
- [Build AI-Powered Workflows with Odoo & n8n](https://odoo4projects.com/blog/posts/howto-ai-automation.html) — 2026-06-06 — Connect Odoo to AI services and automate repetitive tasks using n8n workflows. A hands-on guide for busy operators.
- [Deploy Your First Odoo Instance in 5 Minutes](https://odoo4projects.com/blog/posts/speed-run-deploy.html) — 2026-06-02 — From zero to live Odoo instance in under five minutes. Follow this speed-run and see your business apps running instantly.
- [Getting Started with Odoo Hosting – What You Need to Know](https://odoo4projects.com/blog/posts/my-first-post.html) — 2026-05-28 — New to Odoo hosting? This guide covers everything from choosing a plan to configuring your first domain and SSL.
## Notes
- Prices are list prices captured on 21 October 2026 and are re-checked before each publishing year.
- Findability: [sitemap.xml](https://odoo4projects.com/sitemap.xml).
## Languages
- German: https://odoo4projects.com/de/ — the site's pages mirrored under `/de/`:
`/de/`, `/de/odoo-hosting-2027.html`, `/de/odoo-community-upgrade.html`,
`/de/support.html`, `/de/odoo-erp-automation-bootcamp/`.
- Spanish: https://odoo4projects.com/es/ — the site's pages mirrored under `/es/`:
`/es/`, `/es/odoo-hosting-2027.html`, `/es/odoo-community-upgrade.html`,
`/es/support.html`, `/es/odoo-erp-automation-bootcamp/`.
- Language selection is client-side (`/static/lang.js`): a German- or
Spanish-preferring browser is sent to `/de/` or `/es/` once per session.
An explicit choice — `?lang=de|es|en` or the EN | DE | ES switcher — is
remembered and always wins. Deep links (`/de/...`) are never redirected.
+678
View File
@@ -0,0 +1,678 @@
<!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": "465.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 465. 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 465.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>
+940
View File
@@ -0,0 +1,940 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Community + AI Agent: Run It With Your Own Agent</title>
<meta name="description" content="Odoo Community + your own AI agent, on our managed hosting. Bring Hermes or Claude Code, keep your keys and your data, no lock-in. Much MCP is free." />
<!-- DRAFT: not indexed, not linked, not in sitemap.xml / llms.txt. Remove this robots meta on go-live. -->
<meta name="robots" content="noindex, nofollow" />
<link rel="canonical" href="https://odoo4projects.com/odoo-community-ai/" />
<meta property="og:title" content="Run Odoo Community with your own AI agent" />
<meta property="og:description" content="Bring the AI agent you already use to your Odoo Community system. It works inside Odoo, we run the server, and you keep your keys." />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://odoo4projects.com/odoo-community-ai/" />
<meta name="twitter:card" content="summary" />
<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 Community + AI agent" page (page-scoped; additive).
Reuses the top bar, band rhythm, hero, FAQ and final-CTA treatment already
shipped on odoo-staging-environment/ and what-can-i-use-odoo-for/.
Additions this page needs and no other: .oca-table (the two MCP servers shown
apart), .oca-fence (the "does not move data" sentence, the page's pivot),
.oca-proof (the §3 proof sentence), .oca-dev (the collapsed developer
<details>, after the offer) and the light-band CTA re-pointing. ---- */
.oca-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) */
.cmp-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.cmp-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.cmp-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.cmp-brand span {
color: var(--brass);
}
.cmp-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.cmp-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar-links a:hover {
color: var(--brass);
}
.cmp-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.cmp-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar .lang-switch a:hover,
.cmp-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.cmp-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.oc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.oc-hero .container {
position: relative;
z-index: 1;
}
.oc-hero .hero-sub {
max-width: 760px;
}
.oc-hero-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.25;
filter: brightness(1.15) saturate(1.1);
}
/* Prose column */
.oc-body {
max-width: 760px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .oc-body {
color: rgba(255, 255, 255, 0.78);
}
.oc-body p:last-child {
margin-bottom: 0;
}
.oc-body strong {
color: var(--ink);
}
.section-dark .oc-body strong {
color: #fff;
}
.section-dark .oc-body a {
color: var(--brass-bright);
}
/* Sub-headings inside the prose: inherit the site's h3 size (clamp(1.1rem, 2vw, 1.4rem)) */
.oc-body h3 {
font-family: Marcellus, Georgia, serif;
font-weight: 400;
letter-spacing: 0.01em;
color: var(--midnight);
margin: 1.7rem 0 0.4rem;
}
.section-dark .oc-body h3 {
color: #fff;
}
/* The §3 proof sentence, read first: brass rules top and bottom, ink text */
.oca-proof {
color: var(--ink);
border-top: 1px solid var(--line-brass);
border-bottom: 1px solid var(--line-brass);
padding: 0.9rem 0;
margin-bottom: 1.2rem;
}
/* The two MCP servers, shown apart (§5) */
.oca-table {
width: 100%;
max-width: 900px;
margin: 1.5rem auto;
border-collapse: collapse;
font-size: 0.88rem;
line-height: 1.6;
}
.oca-table th,
.oca-table td {
text-align: left;
vertical-align: top;
padding: 0.7rem 0.9rem;
border-bottom: 1px solid var(--line);
color: var(--ink-soft);
}
.oca-table thead th {
font-family: Marcellus, Georgia, serif;
font-weight: 400;
color: var(--midnight);
border-bottom: 1px solid rgba(201, 162, 39, 0.5);
}
.oca-table tbody th {
color: var(--ink);
font-weight: 600;
white-space: nowrap;
}
.oca-table td strong {
color: var(--ink);
}
/* The fence sentence, the page's pivot: a midnight plaque with a brass hairline */
.oca-fence {
max-width: 860px;
margin: 1.75rem auto 0;
padding: 1.35rem 1.5rem;
background: var(--midnight);
border: 1px solid var(--line-brass);
border-radius: var(--radius);
color: rgba(255, 255, 255, 0.82);
line-height: 1.75;
}
.oca-fence p {
margin: 0;
}
.oca-fence a {
color: var(--brass-bright);
}
/* Numbered run-through */
.oc-steps {
max-width: 820px;
margin: 1.5rem auto 0;
padding: 0;
list-style: none;
counter-reset: oc-step;
}
.oc-steps li {
position: relative;
counter-increment: oc-step;
padding: 0 0 1.4rem 3.2rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.7;
border-left: 1px solid rgba(201, 162, 39, 0.25);
margin-left: 1rem;
}
.oc-steps li::before {
content: counter(oc-step);
position: absolute;
left: -1.05rem;
top: -0.15rem;
width: 2.1rem;
height: 2.1rem;
display: flex;
align-items: center;
justify-content: center;
font-family: Marcellus, Georgia, serif;
font-size: 1rem;
color: var(--midnight);
background: var(--brass);
border-radius: 50%;
}
.oc-steps li strong {
color: #fff;
font-weight: 600;
}
.oc-steps li:last-child {
padding-bottom: 0;
}
.section-light .oc-steps li {
color: var(--ink-soft);
border-left-color: rgba(138, 111, 31, 0.3);
}
.section-light .oc-steps li strong {
color: var(--ink);
}
/* FAQ */
.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],
.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 .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
/* Final CTA (the block odoo-hosting-2027.html uses), run on the light band here */
.cmp-cta {
text-align: center;
}
.cmp-cta .cmp-lead {
font-size: 1.1rem;
color: rgba(255, 255, 255, 0.72);
max-width: 720px;
line-height: 1.75;
margin: 0 auto 1.5rem;
}
/* .cmp-cta and .section-light sit on the SAME element, so the override must be a
compound selector, not a descendant one. */
.cmp-cta.section-light .cmp-lead {
color: var(--ink-soft);
}
.cmp-cta.section-light .cmp-lead p:last-child {
margin-bottom: 0;
}
.cmp-cta-actions {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 0.5rem;
}
.section-light .cmp-cta-actions .btn-outline {
color: var(--ink);
border-color: rgba(23, 28, 38, 0.22);
}
.section-light .cmp-cta-actions .btn-outline:hover {
color: var(--brass-deep);
border-color: var(--brass-deep);
background: rgba(201, 162, 39, 0.08);
}
.oca-recap {
max-width: 820px;
margin: 1.75rem auto 0;
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
}
/* For your developer: the collapsed technical block, after the offer */
.oca-dev {
max-width: 860px;
margin: 0 auto;
background: var(--midnight-2);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 0.5rem 1.5rem;
}
.oca-dev summary {
cursor: pointer;
list-style: none;
padding: 0.95rem 0;
display: flex;
justify-content: space-between;
align-items: center;
gap: 0.75rem;
font-family: Marcellus, Georgia, serif;
font-size: 1.05rem;
color: #fff;
}
.oca-dev summary::-webkit-details-marker {
display: none;
}
.oca-dev summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
}
.oca-dev[open] summary::after {
content: "\2212";
}
.oca-dev summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.oca-dev .oca-dev-body {
color: rgba(255, 255, 255, 0.78);
font-size: 0.87rem;
line-height: 1.75;
padding-bottom: 1.25rem;
}
.oca-dev .oca-dev-body p:last-child {
margin-bottom: 0;
}
.oca-dev .oca-dev-body ol {
padding-left: 1.2rem;
margin: 0 0 1rem;
}
.oca-dev .oca-dev-body li {
margin-bottom: 0.6rem;
}
.oca-dev .oca-dev-body li:last-child {
margin-bottom: 1rem;
}
.oca-dev .oca-dev-body li::marker {
color: var(--brass);
}
/* Focus states on every CTA */
.btn:focus-visible,
.cmp-topbar-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
.section-light .btn-brass:focus-visible {
outline-color: var(--midnight);
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
.oc-hero {
padding: 3rem 0 2.5rem;
}
.oc-steps li {
padding-left: 2.6rem;
}
}
/* Below 640px the two MCP columns cannot hold text side by side, so each row
becomes a card: the row label is the title, each value carries its own column
label (data-label). The two servers stay visibly apart. */
@media (max-width: 640px) {
.oca-table {
border-collapse: separate;
font-size: 1rem;
}
.oca-table thead {
display: none;
}
.oca-table tr {
display: block;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
padding: 0.35rem 1rem 0.85rem;
margin-bottom: 0.9rem;
box-shadow: var(--shadow-rest);
}
.oca-table tbody th {
display: block;
padding: 0.6rem 0 0.5rem;
border-bottom: 1px solid var(--line-brass);
white-space: normal;
}
.oca-table td {
display: block;
padding: 0.6rem 0 0;
border-bottom: 0;
color: var(--ink);
}
.oca-table td::before {
content: attr(data-label);
display: block;
font-weight: 600;
font-size: 0.82rem;
color: var(--midnight);
margin-bottom: 0.15rem;
}
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://odoo4projects.com/odoo-community-ai/#webpage",
"url": "https://odoo4projects.com/odoo-community-ai/",
"name": "Odoo Community + AI Agent: Run It With Your Own Agent",
"description": "Odoo Community + your own AI agent, on our managed hosting. Bring Hermes or Claude Code, keep your keys and your data, no lock-in. Much MCP is free.",
"inLanguage": "en-US",
"isPartOf": {
"@id": "https://odoo4projects.com/#organization"
},
"breadcrumb": {
"@id": "https://odoo4projects.com/odoo-community-ai/#breadcrumb"
},
"mainEntity": {
"@id": "https://odoo4projects.com/odoo-community-ai/#article"
}
},
{
"@type": "Article",
"@id": "https://odoo4projects.com/odoo-community-ai/#article",
"headline": "Odoo Community + AI Agent: Run It With Your Own Agent",
"description": "Odoo Community + your own AI agent, on our managed hosting. Bring Hermes or Claude Code, keep your keys and your data, no lock-in. Much MCP is free.",
"articleSection": [
"What you get",
"Why Odoo Community is ready for this now",
"What you need",
"A run-through: connect your agent, then install a module",
"Why your own agent beats a provider's closed AI",
"Questions owners ask",
"Start"
],
"inLanguage": "en-US",
"datePublished": "2026-11-01",
"dateModified": "2026-11-01",
"author": {
"@id": "https://odoo4projects.com/#organization"
},
"publisher": {
"@id": "https://odoo4projects.com/#organization"
},
"mainEntityOfPage": {
"@id": "https://odoo4projects.com/odoo-community-ai/#webpage"
}
},
{
"@type": "FAQPage",
"@id": "https://odoo4projects.com/odoo-community-ai/#faq",
"isPartOf": {
"@id": "https://odoo4projects.com/odoo-community-ai/#webpage"
},
"mainEntity": [
{
"@type": "Question",
"name": "Do I need to be technical?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. You need to already use an AI agent, and that is the only precondition. Two of our own clients run theirs with no IT background at all. If you can ask for something in plain words, you can use this."
}
},
{
"@type": "Question",
"name": "What do I need to already have?",
"acceptedAnswer": {
"@type": "Answer",
"text": "An AI agent you already run (Hermes or Claude Code), and an Odoo Community system with us — or the plans to start one. There is nothing to install by hand: we set up the two MCP connections for the agent, and the free Much MCP gives it the Odoo skills."
}
},
{
"@type": "Question",
"name": "How much of my time does this take?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Once the two connections are set up, the next thing you do is ask the agent for something. You point your agent at the two MCP servers once, or send us a short message and we set them up for you. From then on the agent works inside your Odoo and you read and approve the result. There is nothing to build or train on your side."
}
},
{
"@type": "Question",
"name": "Is my data locked in?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Your keys stay yours, your agent stays yours, and your Odoo database stays yours. We run the hosting; we do not hold your agent or the work you have built with it."
}
},
{
"@type": "Question",
"name": "Which agent does this work with?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Hermes or Claude Code, today. Those are the two we support now."
}
},
{
"@type": "Question",
"name": "What can the agent actually do, and what can’t it?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Inside Odoo, the agent can read and write your records through the Odoo MCP (an invoice, a customer, a product line), because the free Much MCP gives it those Odoo skills. Around Odoo, it can run the hosting through our MCP: start, stop and restart services, install a module, add or check a domain, manage backups, and read the logfiles. What our MCP does not do is move your data. It does not migrate or import records; it runs the server. Moving data is a different job with its own route."
}
},
{
"@type": "Question",
"name": "Do I need Enterprise to get AI in Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Odoo’s own built-in AI is an Enterprise feature. On Community you bring your own agent instead, which is the point of this page, and the free community modules and MCP servers cover much of the ground Enterprise used to hold back."
}
},
{
"@type": "Question",
"name": "What does it cost?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Much MCP is free and comes bundled with our service, so it is not an extra you buy. You pay for the hosting, on the same four plans as always, and Odoo Community carries no per-user licence, so the agent’s own account costs nothing extra."
}
}
]
},
{
"@type": "BreadcrumbList",
"@id": "https://odoo4projects.com/odoo-community-ai/#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://odoo4projects.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Odoo Community + AI",
"item": "https://odoo4projects.com/odoo-community-ai/"
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="cmp-topbar">
<div class="container">
<a class="cmp-brand" href="/index.html">ODOO4<span>projects</span></a>
<nav class="cmp-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 oc-hero">
<div class="hero-bg">
<img
class="oc-hero-img"
src="/images/hero/amsterdam.webp"
alt="Amsterdam at dusk, one of the six regions our servers run in"
width="1920"
height="768"
fetchpriority="high"
decoding="async"
/>
</div>
<div class="container">
<p class="hero-kicker">ODOO COMMUNITY + AI</p>
<h1>Run your Odoo Community business with your own AI agent</h1>
<p class="hero-sub">You already use an AI agent — Hermes or Claude Code. Connect it to your Odoo and it can do the work you keep putting off: write the invoice, update the customer, add the stock item, install the module. You answer the question once, and the agent does the typing. Your keys stay yours, and your data stays yours.</p>
<div class="hero-actions">
<a href="/support.html#contact" class="btn btn-brass btn-lg">Ask us a question</a>
<a href="/index.html#pricing" class="btn btn-outline btn-lg">See the plans</a>
</div>
</div>
</section>
<!-- What you get -->
<section class="section-light">
<div class="container">
<h2 class="section-title">What you get</h2>
<div class="oc-body">
<p class="oca-proof">Two of our clients know nothing about IT, and they use Claude Code to implement modules in their Odoo. Not developers, not IT staff. Business owners with an agent, the same as you.</p>
<!-- OPEN-SLOT (O1): the two non-technical Claude Code clients stay unnamed until naming permission is confirmed. -->
<p>You did not start a business to type the same invoice forty times, or to hunt for a record you know is in there somewhere. An agent removes that kind of work, because the work is repetitive and the rules are simple, which is exactly what an agent is good at and a person is bad at.</p>
<p>Ask for something in plain words. The invoice gets written, the customer record gets updated, the missing stock item gets added, the module you wanted gets installed. You read the result and approve it, instead of building it by hand.</p>
<p>Here is how that lands during a week. The supplier invoices that used to pile up until the weekend are entered on the day they arrive, because you hand them to the agent and check the first one. The product you forgot to add is added when you notice it, not when someone finally complains. The new menu you asked your developer about last quarter is installed this afternoon.</p>
<p>None of this is a promise about your numbers. It is the plain shape of it: the repetitive part moves off your desk, and you keep the judgement.</p>
</div>
</div>
</section>
<!-- Why Odoo Community is ready for this now -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Why Odoo Community is ready for this now</h2>
<div class="oc-body">
<p>Odoo's best AI features used to be Enterprise-only. On Community you get there a different way — with your own agent — and that route works today, for three reasons. Odoo's own built-in AI still lives in the Enterprise edition, and Community does not ship it; that used to be a real gap.</p>
<p>First, the community modules. The Odoo Community Association, the group that writes and maintains free Odoo modules, now builds modules that cover a lot of what Enterprise used to hold back. Enterprise's newest features are increasingly matched by free community modules. It is not a mirror image, and we are not going to claim it is, but the distance is much shorter than it was.</p>
<p>Second, the agent side. MCP is the plug that lets an AI agent use an outside tool. Free MCP servers now exist that give an AI agent the skills to work inside Odoo. That is the piece that lets your agent, which you already have, do real work in the system rather than just talk about it.</p>
<p>Third, the hosting side. We run your Odoo for you on our own servers, and we ship our own MCP server so your agent can run the hosting tasks as well. You do not need a server of your own to make any of this work.</p>
<p>One more difference worth knowing, because it decides whether this is affordable at all. Odoo Community has no per-user licence. So giving your agent its own user account, with its own limits on what it may touch, costs you nothing extra.</p>
</div>
</div>
</section>
<!-- What you need -->
<section class="section-light">
<div class="container">
<h2 class="section-title">What you need</h2>
<div class="oc-body">
<p>There are four things. You bring one, and we bring the other three.</p>
<h3>(1) An agent you already run.</h3>
<p>Hermes or Claude Code, today. That is the only technical precondition on this whole page. The rest we do for you. If you are already using one of those, you are ready.</p>
<h3>(2) Two MCP connections — and it matters that there are two.</h3>
<p>You point your agent at an MCP server, and the agent can use whatever that server offers. You will set up two of them, and they do two different jobs. Keep them apart in your head, because blurring them is the mistake.</p>
</div>
<table class="oca-table">
<caption class="oca-sr-only">The two MCP servers, side by side</caption>
<thead>
<tr><th scope="col"></th><th scope="col">The Odoo MCP</th><th scope="col">The hosting MCP</th></tr>
</thead>
<tbody>
<tr><th scope="row">What it is</th><td data-label="The Odoo MCP">A free MCP server that gives your agent Odoo skills (we use Much MCP)</td><td data-label="The hosting MCP">Our own MCP server, shipped inside our service</td></tr>
<tr><th scope="row">What it does</th><td data-label="The Odoo MCP">The agent works <strong>inside Odoo</strong>: reads and writes records, such as an invoice, a customer or a product line</td><td data-label="The hosting MCP">The agent runs <strong>the server around Odoo</strong>: start, stop and restart services, install a module, add or check a domain, manage backups, read the logfiles</td></tr>
<tr><th scope="row">What it touches</th><td data-label="The Odoo MCP">Your business records</td><td data-label="The hosting MCP">The hosting, not your records</td></tr>
</tbody>
</table>
<div class="oc-body">
<h3>(3) Much MCP is free, and it comes with our service.</h3>
<p>Much MCP is the free MCP server that gives your agent its Odoo skills. It comes bundled with our service. You do not buy it separately, and it is not a third-party cost on top of your plan.</p>
<h3>(4) Our hosting.</h3>
<p>Your Odoo runs on our servers, managed by us: the server, the backups, the certificate and the updates are our job, not yours. Our MCP server is the piece your agent uses to run the hosting tasks, which is why there is no server of your own to look after.</p>
</div>
<div class="oca-fence">
<p>Our MCP does hosting operations only. It does not move your data, and it does not perform migrations. Moving records between two systems is a different job with a different route; this page is about running your business with an agent, not about upgrading a version. (Upgrading an Odoo version is a separate job. That is on <a href="/odoo-community-upgrade.html">our upgrade page</a>.)</p>
</div>
</div>
</section>
<!-- A real run-through -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">A run-through: connect your agent, then install a module</h2>
<!-- DRAFT(R1): steps reconstructed from the published capability list; awaiting the user's real steps. -->
<div class="oc-body">
<p>Here is one task, start to finish: you connect the agent you already run to your Odoo, then ask it to install a module. It is two connections, then one request. Nothing here needs a server of your own, and nothing here is a migration. No records move.</p>
<p>Your agent reaches Odoo through MCP, the plug that lets an agent use an outside tool, and this task uses two of them: one for your Odoo system, one for the hosting. They are the two §5 describes, set up in the order below.</p>
</div>
<ol class="oc-steps">
<li>
<strong>Check what you need, three things.</strong> Hermes or Claude Code already installed and answering you. An Odoo Community system with us on a plan from On the Rise upward (module installation is not part of Side Hustle, so on that plan this task stops here). And the module you want, or just a plain description of what you want it to do. You do not need its technical name; the agent can find the module from what you describe.
</li>
<li>
<strong>Open the management console and find the two MCP settings.</strong> The console is the app we preinstall on your service, and it is where our side of the setup lives. It shows two MCP settings. One points at your Odoo system (that is Much MCP, the free one we bundle). The other points at operations (that is our own MCP). Keep them apart: the first works inside your Odoo, the second runs the server around it.
</li>
<li>
<strong>Connect the Odoo setting to your agent.</strong> Take the Odoo MCP connection details from the console and add them where your agent keeps its MCP servers. This is the connection that gives your agent its Odoo skills, which is what lets it read and write records. You add a server to your agent once, and both Hermes and Claude Code have a place to list one.
<!-- OPEN-SLOT: the exact Odoo MCP connection details from the console, the server address and the key. -->
</li>
<li>
<strong>Connect the operations setting, the same way.</strong> Add the operations MCP from the console beside the first. This is the connection that lets the agent run the hosting, and installing a module is one of those operations.
<!-- OPEN-SLOT: the exact operations MCP connection details from the console, the server address and the key. -->
</li>
<li>
<strong>Confirm both connections landed.</strong> Ask the agent, in plain words, what it can do in Odoo. It should answer with two kinds of work: inside the system (records, invoices, customers, products) and on the server (restart a service, install a module, domains, backups, logfiles). If one of the two is missing, that setting did not take, and you add it again from step 3 or step 4.
</li>
<li>
<strong>Ask for the install in plain words.</strong> Now say something like: install the module that adds what you did not have. Installing a module is a hosting operation, so it runs through the operations MCP, not the Odoo one. If you want a way back before any change, ask the agent to take a backup first, because managing backups is one of the operations.
</li>
<li>
<strong>Read what the agent reports, then check it in Odoo.</strong> The agent tells you the module is installed, or tells you plainly what stopped it. Then open your Odoo, log in, and open the app menu. The module is listed as installed and its new menu or feature is there. That is the whole task: you asked, the agent did the steps, and you checked the result.
</li>
</ol>
</div>
</section>
<!-- Why your own agent beats a provider's closed AI -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Why your own agent beats a provider's closed AI</h2>
<div class="oc-body">
<p>Some hosts give you their own AI, and it only works inside their product. The tasks you teach it, and the way you set it up, stay with them — not with you. Leave, and the AI stays behind.</p>
<p>We do the opposite. We bring the hosting, the Odoo system and the MCP servers that connect them, and you bring your own agent.</p>
<p>That means your keys are yours. Your agent is yours. The rules you teach it, the tasks you build, the way it works with your business: none of that is locked inside our product. If you leave us tomorrow, you take your agent and everything you built with it. And because it can also run the hosting tasks, there is very little you cannot do yourself. That is the whole point.</p>
<p>We would rather sell you the thing that runs, and let the agent be yours.</p>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-dark" id="faq">
<div class="container">
<h2 class="section-title">Questions owners ask</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do I need to be technical?</summary>
<div class="cmp-a">
<p>No. You need to already use an AI agent, and that is the only precondition. Two of our own clients run theirs with no IT background at all. If you can ask for something in plain words, you can use this.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What do I need to already have?</summary>
<div class="cmp-a">
<p>An AI agent you already run (Hermes or Claude Code), and an Odoo Community system with us — or the plans to start one. There is nothing to install by hand: we set up the two MCP connections for the agent, and the free Much MCP gives it the Odoo skills.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">How much of my time does this take?</summary>
<div class="cmp-a">
<p>Once the two connections are set up, the next thing you do is ask the agent for something. You point your agent at the two MCP servers once, or send us a short message and we set them up for you. From then on the agent works inside your Odoo and you read and approve the result. There is nothing to build or train on your side.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Is my data locked in?</summary>
<div class="cmp-a">
<p>No. Your keys stay yours, your agent stays yours, and your Odoo database stays yours. We run the hosting; we do not hold your agent or the work you have built with it.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Which agent does this work with?</summary>
<div class="cmp-a">
<p>Hermes or Claude Code, today. Those are the two we support now.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What can the agent actually do, and what can’t it?</summary>
<div class="cmp-a">
<p>Inside Odoo, the agent can read and write your records through the Odoo MCP (an invoice, a customer, a product line), because the free Much MCP gives it those Odoo skills. Around Odoo, it can run the hosting through our MCP: start, stop and restart services, install a module, add or check a domain, manage backups, and read the logfiles. What our MCP does not do is move your data. It does not migrate or import records; it runs the server. Moving data is a different job with its own route.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do I need Enterprise to get AI in Odoo?</summary>
<div class="cmp-a">
<p>No. Odoo’s own built-in AI is an Enterprise feature. On Community you bring your own agent instead, which is the point of this page, and the free community modules and MCP servers cover much of the ground Enterprise used to hold back.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What does it cost?</summary>
<div class="cmp-a">
<p>Much MCP is free and comes bundled with our service, so it is not an extra you buy. You pay for the hosting, on the same four plans as always, and Odoo Community carries no per-user licence, so the agent’s own account costs nothing extra.</p>
</div>
</details>
</div>
</div>
</section>
<!-- Start -->
<section class="section-light cmp-cta" id="start">
<div class="container">
<h2 class="section-title">Start</h2>
<div class="cmp-lead">
<p>If you already run an agent and your business runs on Odoo Community with us, you are one connection away from handing it work. Send us a message and we will point you at the two MCP connections, or tell you plainly what fits your situation.</p>
<p>If you are not hosted with us yet, the plans are here, and you can bring your own agent from the first day.</p>
</div>
<div class="cmp-cta-actions">
<a href="/support.html#contact" class="btn btn-brass btn-lg">Ask us a question</a>
<a href="/index.html#pricing" class="btn btn-outline btn-lg">See the plans</a>
</div>
<p class="oca-recap">On Odoo Community you can run your business with your own AI agent. The agent works inside Odoo through an MCP server, and your host runs the server. ODOO4projects bundles the free Much MCP, which gives the agent Odoo skills, and ships its own hosting MCP for operations: starting and stopping services, uploading modules, domains, backups and logfiles. Your keys and your data stay yours.</p>
</div>
</section>
<!-- For your developer (collapsed, after the offer) -->
<section class="section-dark">
<div class="container">
<details class="oca-dev">
<summary>For your developer: which MCP does what</summary>
<div class="oca-dev-body">
<p>Two MCP servers connect to the agent.</p>
<ol>
<li>The Odoo MCP, "Much MCP" (free; bundled with the hosted service). Points the agent at Odoo and gives it the Odoo skills to read and write records inside the system. This is the MCP that touches business data.</li>
<li>The hosting MCP, ours, shipped inside the ODOO4projects management console (the app preinstalled on the service). Its published operations: restart the server, upload/install modules, add or check domains, manage backups, read and download logfiles. It does running the server and nothing else. It does not move, import or migrate data.</li>
</ol>
<p>Both connect the same way: you add each MCP server to your agent (Hermes or Claude Code) and the agent can then use the tools that server exposes.</p>
</div>
</details>
</div>
</section>
<!-- Footer (copied from odoo-staging-environment/; no link to this page is added anywhere) -->
<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="oca-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="oca-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 defer src="/static/lang.js"></script>
</body>
</html>
File diff suppressed because it is too large. Load diff
+903
View File
@@ -0,0 +1,903 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Bootcamp: From Zero to a Running ERP in 3 Months</title>
<meta
name="description"
content="Ten live Thursday sessions with Oliver Arnold, Technical Lead at ODOO4projects. Build a working ERP for your business: quotes, invoices, stock."
/>
<link rel="canonical" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/odoo-erp-automation-bootcamp/" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<meta property="og:title" content="Odoo Bootcamp: From Zero to a Running ERP in 3 Months" />
<meta
property="og:description"
content="Ten live Thursday sessions with Oliver Arnold, Technical Lead at ODOO4projects. Build a working ERP for your business: quotes, invoices, stock."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/odoo-erp-automation-bootcamp/" />
<meta name="twitter:card" content="summary" />
<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 ERP Automation Bootcamp landing page (page-scoped; additive) ---- */
.bc-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) */
.bc-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.bc-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.bc-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.bc-brand span {
color: var(--brass);
}
.bc-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
}
.bc-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.bc-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. */
.bc-topbar-links {
margin-left: auto;
}
.bc-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.bc-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.bc-topbar .lang-switch a:hover,
.bc-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.bc-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.bc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
/* Real London night aerial (our own photo, CI §5) behind the header copy.
TWO-ZONE scrim (2026-10-25): the copy zone — kicker, H1, value line, the four
facts, the CTA — holds a .78 midnight scrim, then the scrim falls off hard to
.25 so the lit skyline on the right actually reads: at the right edge the photo
is composited through a quarter-strength scrim instead of a uniform .55-.72, so
the lit skyline reads at ~1.6x the flat-midnight luma instead of ~1.4x.
Stops: .78 0%-88%, ramp 88%-94%, .25 94%-100%.
.78 is the smallest flat alpha that holds every text block over its floor
(body 4.5:1, large 3.0:1) at all four widths in all three languages, and 88%
is where the ramp has to start: the longest fact line (DE, 1024px) reaches
89.3% of the hero, and clear of 88% the copy sits on the flat scrim. The tail of
that one DE line rides the top of the ramp at .70+, measured. Numbers:
handoffs/2026-10-24-webmaster-to-olchi-bootcamp-page-published.md ("Amendment 6").
The old single ramp was .72 -> .55 across the full width and composited the right
zone to luma ~35 against a flat midnight of 25.4. */
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-desktop-1920.webp");
background-size: cover;
background-position: 50% 25%;
background-repeat: no-repeat;
}
/* The global .hero::after is a second, 50%-opacity midnight wash for the homepage's
flat hero; with the photo + gradient scrim above the copy it only dulls the shot,
so it is switched off on this page. One page-scoped rule, no global CSS touched. */
.bc-hero::after {
content: none;
}
@media (max-width: 640px) {
/* Portrait crop for narrow viewports: legible cut of the same photo. Same scrim
stops as the desktop rule — the ramp at 88% clears every language's copy, whose
longest mobile fact line ends at 87.7% of the hero. */
.bc-hero {
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-mobile-900.webp");
background-position: 50% 50%;
}
}
/* wrapped hero-stat labels keep their tick on the first line */
.bc-hero .hero-stat {
align-items: flex-start;
}
.bc-hero .hero-stat i {
line-height: 1.6;
}
.bc-lead {
font-size: 1.05rem;
color: rgba(23, 28, 38, 0.78);
max-width: 720px;
margin: 0 auto 1rem;
line-height: 1.75;
}
.section-dark .bc-lead,
.bc-lead.on-dark {
color: rgba(255, 255, 255, 0.72);
}
.bc-subline {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
color: var(--midnight);
text-align: center;
max-width: 720px;
margin: 1.75rem auto 1.25rem;
letter-spacing: 0.02em;
}
.bc-action {
text-align: center;
margin-top: 0.5rem;
}
/* The three CTAs are native basket <form>s with a <button> (they were <a>s).
A <button> takes `line-height: normal` from the UA font shorthand while
the <a>s inherited the body line-height, which would make the button
5.6px shorter. Match the anchors' height: one declaration, no new look. */
form[action$="/shop/post_basket"] .btn {
line-height: inherit;
}
/* Grids — auto-fit so no breakpoint is needed */
.bc-list {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
/* Lesson tiles (light canvas) */
.bc-lessons {
list-style: none;
counter-reset: bc-lesson;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-lessons li {
counter-increment: bc-lesson;
position: relative;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.4rem 1.4rem 1.4rem 3.4rem;
transition: box-shadow 0.25s, transform 0.25s;
}
.bc-lessons li:hover {
box-shadow: var(--shadow-hover);
transform: translateY(-3px);
}
.bc-lessons li::before {
content: counter(bc-lesson);
position: absolute;
left: 1.15rem;
top: 1.3rem;
font-family: Marcellus, Georgia, serif;
font-size: 1.5rem;
color: var(--brass-deep);
line-height: 1;
}
.bc-lessons h3 {
font-size: 1rem;
font-weight: 400;
color: var(--midnight);
margin-bottom: 0.35rem;
}
.bc-lessons p {
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.6;
margin: 0;
}
/* Cards on midnight */
.bc-cards {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-cards li {
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1.35rem 1.4rem;
}
.bc-cards h3 {
font-size: 1rem;
color: #fff;
margin-bottom: 0.45rem;
}
.bc-cards p {
font-size: 0.86rem;
color: rgba(255, 255, 255, 0.72);
line-height: 1.65;
margin: 0;
}
.bc-note {
max-width: 720px;
margin: 1.5rem auto 0;
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.65;
}
.bc-note.on-dark {
color: rgba(255, 255, 255, 0.6);
}
.bc-note strong {
color: var(--midnight);
}
.bc-note.on-dark strong {
color: #fff;
}
/* Schedule */
.bc-schedule {
max-width: 720px;
margin: 0 auto;
display: grid;
grid-template-columns: minmax(9rem, auto) 1fr;
gap: 0.55rem 1.25rem;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.5rem 1.75rem;
}
.bc-schedule dt {
font-family: Marcellus, Georgia, serif;
font-size: 0.92rem;
color: var(--brass-deep);
}
.bc-schedule dd {
margin: 0;
font-size: 0.9rem;
color: var(--ink);
line-height: 1.55;
}
/* Price line */
.bc-price {
font-family: Marcellus, Georgia, serif;
font-size: 1.3rem;
color: var(--midnight);
text-align: center;
margin: 0 auto 1rem;
}
/* Related links */
.bc-related {
list-style: none;
padding: 0;
margin: 2rem auto 0;
max-width: 720px;
display: grid;
gap: 0.5rem;
}
.bc-related li {
position: relative;
padding-left: 1.4rem;
font-size: 0.88rem;
}
.bc-related li::before {
content: "";
position: absolute;
left: 0.25rem;
top: 0.55rem;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--brass);
}
.bc-related a {
color: var(--midnight);
text-decoration: underline;
text-decoration-color: var(--brass);
text-underline-offset: 2px;
}
.bc-related a:hover {
text-decoration-color: var(--brass-deep);
text-decoration-thickness: 2px;
}
/* FAQ (native details/summary — no JS) */
.bc-faq-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
max-width: 1000px;
margin: 0 auto;
align-items: start;
}
.bc-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;
}
.bc-faq[open],
.bc-faq:hover {
box-shadow: var(--shadow-hover);
}
.bc-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);
}
.bc-faq summary::-webkit-details-marker {
display: none;
}
.bc-faq summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
}
.bc-faq[open] summary::after {
content: "\2212";
}
.bc-faq summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.bc-faq .bc-a {
font-size: 0.87rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.7;
padding-bottom: 1rem;
}
.bc-faq .bc-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.bc-faq-grid {
grid-template-columns: 1fr;
}
.bc-schedule {
grid-template-columns: 1fr;
gap: 0.15rem 0;
padding: 1.25rem 1.35rem;
}
.bc-schedule dd {
margin-bottom: 0.7rem;
}
}
/* Focus states */
.btn:focus-visible,
.bc-topbar-links a:focus-visible,
.bc-related a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Course",
"name": "ODOO ERP Automation Bootcamp",
"description": "A ten-session live bootcamp that takes a small business from zero to a running ERP. Build your products, quotes, invoices, stock and payments into one system on a live hosted setup, with no programming and no server to run.",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/",
"provider": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"alternateName": "The OC Guy",
"jobTitle": "Technical Lead",
"worksFor": {
"@type": "Organization",
"name": "ODOO4projects"
}
},
"inLanguage": "en",
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"courseWorkload": "PT1H",
"maximumAttendeeCapacity": 6,
"startDate": "2027-01-21",
"endDate": "2027-03-25",
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"alternateName": "The OC Guy"
},
"courseSchedule": {
"@type": "Schedule",
"repeatFrequency": "P1W",
"repeatCount": 10,
"byDay": "https://schema.org/Thursday",
"startTime": "18:00-06:00",
"duration": "PT1H"
}
},
"offers": {
"@type": "Offer",
"price": "465.00",
"priceCurrency": "USD",
"category": "Paid",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/"
}
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do I need technical skills?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. The sessions assume no ERP knowledge and no coding, and you build on your own data rather than following along on an empty demo."
}
},
{
"@type": "Question",
"name": "What if I miss a session?",
"acceptedAnswer": {
"@type": "Answer",
"text": "The sessions are live and each one builds on the last, so attend if you can. If you miss one, the alumni chat and the open workshop in the final session are where you catch up."
}
},
{
"@type": "Question",
"name": "Is hosting included after the course?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, for one year, included in the programme. After that year your system moves to one of our normal hosting plans, at the price published on our site."
}
},
{
"@type": "Question",
"name": "What do I need installed?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nothing to install and nothing to run yourself. A computer and a browser are enough — we provide the live system. n8n, used in lesson 9, is a free account you sign up for on n8n's own free plan."
}
},
{
"@type": "Question",
"name": "Is this a course about Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "It is a course about your business running. Odoo is the engine under the system you build; the ten lessons are about your stock, your invoices, your customers and the hours this gives back."
}
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="bc-topbar">
<div class="container">
<a class="bc-brand" href="/">ODOO4<span>projects</span></a>
<nav class="bc-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 bc-hero">
<div class="container">
<p class="hero-kicker">Q1 2027 &middot; 10 LIVE SESSIONS &middot; OLIVER ARNOLD</p>
<h1>ODOO ERP Automation Bootcamp</h1>
<p class="hero-sub">
No programming. No server to install. If you can run your business on a spreadsheet, you can do
this.
</p>
<div class="hero-stats">
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> 10 live sessions, one hour each</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Thursdays 18:00&ndash;19:00 Central Time</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Starts Thursday 21 January 2027</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> One year of Odoo Community Edition included</span>
</div>
<div class="hero-actions">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Buy for 465.00 USD</button>
</form>
</div>
</div>
</section>
<!-- From zero to a running ERP -->
<section class="section-light">
<div class="container">
<h2 class="section-title">From zero to a running ERP</h2>
<p class="bc-lead">
Over ten Thursday sessions across three months, you build a working business system for your own
company: your products, your customers, your quotes, your invoices, your stock. You build it on a
live system, not on slides, and you start in the first session rather than after a long setup.
</p>
<p class="bc-lead">
You finish with an ERP you actually use, and with the judgement to keep it running yourself.
</p>
<p class="bc-subline">Three months. Ten hours of teaching. One system that runs your company.</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Buy for 465.00 USD</button>
</form>
</div>
</div>
</section>
<!-- Who this is for -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Who this is for</h2>
<p class="bc-lead">
This is for the owner or operator of a small business who never wanted to become the system
administrator. You run stock, orders, invoices and customers, and today most of it lives in a
spreadsheet, a messaging group and one person's memory.
</p>
<p class="bc-lead">
You do not need a technical background. The sessions assume no prior ERP knowledge and no coding.
</p>
<p class="bc-lead">
It is not for you if you already administer Odoo, or if you want a developer's course in modules
and custom code. The ten lessons are about your business running, not about the software
underneath it.
</p>
</div>
</section>
<!-- The ten lessons -->
<section class="section-light">
<div class="container">
<h2 class="section-title">What you build: the ten lessons</h2>
<p class="bc-lead">
Ten sessions, ten outcomes. Each lesson ends with something working in your own system, not notes
to file away.
</p>
<ol class="bc-lessons">
<li>
<h3>First configuration.</h3>
<p>You leave with your own company set up in the system &mdash; products, customers, currency and tax &mdash; so every number that follows is real and not a demo.</p>
</li>
<li>
<h3>Sales: quotes, orders and invoices.</h3>
<p>You leave with a quote-to-invoice flow that turns a customer enquiry into an invoice you can send.</p>
</li>
<li>
<h3>Build your website.</h3>
<p>You leave with a live page on your own web address, publishing a product and taking an enquiry from it.</p>
</li>
<li>
<h3>CRM.</h3>
<p>You leave with every lead in one list, with its stage, so an opportunity stops disappearing into a chat thread.</p>
</li>
<li>
<h3>Project management.</h3>
<p>You leave with the work you sold tracked as tasks with deadlines, so you can see what is late before the customer tells you.</p>
</li>
<li>
<h3>Customisations and outsourcing.</h3>
<p>You leave knowing what you can change yourself and what is worth paying someone for, so you do not buy a developer for a job a setting already does.</p>
</li>
<li>
<h3>Integrations and online payment.</h3>
<p>You leave able to take payment online and offer your products where people already shop, so orders arrive without you chasing them.</p>
</li>
<li>
<h3>Inventory and stock management.</h3>
<p>You leave with a stock count that matches the shelf, so you stop selling what you do not have.</p>
</li>
<li>
<h3>n8n and AI for your business.</h3>
<p>You leave with the system connected to the tools you already use and one repetitive job running itself.</p>
</li>
<li>
<h3>Online marketing, and the open workshop.</h3>
<p>You leave with a way to turn your own customer list into repeat sales, and with the last session used to fix whatever is still broken in your setup.</p>
</li>
</ol>
</div>
</section>
<!-- What is included -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">What is included</h2>
<ul class="bc-cards">
<li>
<h3>One year of Odoo Community Edition, hosted on our platform.</h3>
<p>Your system, running, with the server, backups and certificate handled for you.</p>
</li>
<li>
<h3>A live system from the first session.</h3>
<p>You work on your own data from day one, not on an empty demo.</p>
</li>
<li>
<h3>The alumni community.</h3>
<p>A private chat to ask questions, swap templates and compare setups long after the ten sessions end.</p>
</li>
<li>
<h3>An expert review of your setup.</h3>
<p>Oliver reviews what you have built and tells you what to fix.</p>
</li>
</ul>
<p class="bc-note on-dark">
<strong>On n8n, in plain words:</strong> the tool sessions use n8n, and you use n8n on its own
free plan. The free plan is not part of this price and is not included in the programme.
Everything else listed above is.
</p>
<p class="bc-note on-dark">
<strong>Adding capability later:</strong> our guide to <a href="/blog/posts/howto-custom-module.html">installing custom Odoo modules from Git</a> shows both routes — Quick Git for a zip you bought, Git for a developer.
</p>
</div>
</section>
<!-- The schedule -->
<section class="section-light">
<div class="container">
<h2 class="section-title">The schedule</h2>
<p class="bc-lead">
Ten live sessions. One hour each, at the same time every week, ten hours of teaching in total.
</p>
<dl class="bc-schedule">
<dt>Sessions</dt>
<dd>10, every Thursday at 18:00&ndash;19:00 Central Time</dd>
<dt>Term</dt>
<dd>Q1 2027</dd>
<dt>First session</dt>
<dd>Thursday 21 January 2027</dd>
<dt>Last session</dt>
<dd>Thursday 25 March 2027</dd>
<dt>Dates</dt>
<dd>21 Jan &middot; 28 Jan &middot; 4 Feb &middot; 11 Feb &middot; 18 Feb &middot; 25 Feb &middot; 4 Mar &middot; 11 Mar &middot; 18 Mar &middot; 25 Mar 2027</dd>
<dt>Length</dt>
<dd>1 hour per session, 10 hours total</dd>
<dt>Where</dt>
<dd>Live and online</dd>
<dt>Class size</dt>
<dd>Limited to 6 participants</dd>
<dt>Instructor</dt>
<dd>Oliver - The OC Guy - Arnold, Technical Lead at ODOO4projects</dd>
</dl>
<p class="bc-note">
Central Time is UTC&minus;6 until 14 March and UTC&minus;5 afterwards &mdash; calendar invites carry
the correct local time.
</p>
</div>
</section>
<!-- Your instructor -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Your instructor</h2>
<p class="bc-lead">
<strong>Oliver - The OC Guy - Arnold, Technical Lead at ODOO4projects.</strong>
</p>
<p class="bc-lead">
Oliver has spent more than 25 years building software that has to keep working, and he is the lead
architect of the platform this Bootcamp runs on. He teaches by putting the real thing in front of
you and fixing it together, one session at a time.
</p>
<p class="bc-lead">
He is the only instructor on this programme. You get the same person every Thursday for ten weeks,
which is why the last session is an open workshop rather than a handover to someone else.
</p>
</div>
</section>
<!-- Price and booking -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Price and booking</h2>
<p class="bc-price">The programme costs USD 465.00 for all ten sessions.</p>
<p class="bc-note"><strong>Limited to 6 participants</strong> &mdash; the cohort is capped, so the instructor can work through your own setup.</p>
<p class="bc-lead">
Covers the full programme: ten live sessions, one year of hosted Odoo Community Edition, the
alumni community and the expert review.
</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":12,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg">Buy for 465.00 USD</button>
</form>
</div>
<ul class="bc-related">
<li><a href="/support.html#contact">Questions before you book? Talk to us first</a></li>
<li><a href="/workshops/">All our live courses, side by side</a></li>
<li><a href="/odoo-n8n-masterclass/">The two-hour masterclass on calling n8n from Odoo</a></li>
<li><a href="/odoo-hosting-2027.html">What hosting looks like after your year with us</a></li>
<li><a href="/support.html">What our support does and does not cover</a></li>
<li><a href="/blog/posts/community-vs-enterprise-cost.html">What Community costs compared with Enterprise</a></li>
</ul>
</div>
</section>
<!-- FAQ -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Questions people ask first</h2>
<div class="bc-faq-grid">
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Do I need technical skills?</summary>
<div class="bc-a">
<p>No. The sessions assume no ERP knowledge and no coding, and you build on your own data rather than following along on an empty demo.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What if I miss a session?</summary>
<div class="bc-a">
<p>The sessions are live and each one builds on the last, so attend if you can. If you miss one, the alumni chat and the open workshop in the final session are where you catch up.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Is hosting included after the course?</summary>
<div class="bc-a">
<p>Yes, for one year, included in the programme. After that year your system moves to one of our normal hosting plans, at the price published on our site.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What do I need installed?</summary>
<div class="bc-a">
<p>Nothing to install and nothing to run yourself. A computer and a browser are enough &mdash; we provide the live system. n8n, used in lesson 9, is a free account you sign up for on n8n's own free plan.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Is this a course about Odoo?</summary>
<div class="bc-a">
<p>It is a course about your business running. Odoo is the engine under the system you build; the ten lessons are about your stock, your invoices, your customers and the hours this gives back.</p>
</div>
</details>
</div>
</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="bc-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="bc-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 defer src="/static/buy.js"></script>
<script defer src="/static/lang.js"></script>
</body>
</html>
File diff suppressed because it is too large. Load diff
+616
View File
@@ -0,0 +1,616 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Hosting Offers: What a Year Actually Costs</title>
<meta
name="description"
content="Odoo hosting offers explained: one flat yearly price, no per-user licence, no setup fee, a 30-day free trial, and what each plan costs."
/>
<link rel="canonical" href="https://odoo4projects.com/odoo-hosting-offers/" />
<meta property="og:title" content="Odoo Hosting Offers: What a Year Actually Costs" />
<meta
property="og:description"
content="Odoo hosting offers explained: one flat yearly price, no per-user licence, no setup fee, a 30-day free trial, and what each plan costs."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/odoo-hosting-offers/" />
<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' and '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 Hosting Offers (evergreen hub) page (page-scoped; additive) ---- */
.of-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) */
.of-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.of-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.of-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.of-brand span {
color: var(--brass);
}
.of-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.of-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.of-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. */
.of-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.of-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.of-topbar .lang-switch a:hover,
.of-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.of-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.of-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.of-hero .hero-sub {
max-width: 640px;
}
/* Date-scoped Black Friday block (removed after 30 Nov 2026 — see BF-BLOCK markers) */
.bf-hub {
max-width: 780px;
margin: 0 auto;
background: var(--ivory);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.75rem 2rem;
text-align: center;
}
.bf-hub h2 {
margin-bottom: 0.85rem;
}
.bf-hub .bf-hub-line {
font-size: 1.02rem;
color: var(--ink-soft);
line-height: 1.7;
margin: 0 0 1rem;
}
.bf-hub .bf-hub-link {
margin: 0;
}
.bf-hub .bf-hub-link 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-hub .bf-hub-link a:hover {
background: var(--brass-bright);
color: var(--midnight);
}
.bf-hub .bf-hub-link a:focus-visible {
outline: 3px solid var(--midnight);
outline-offset: 2px;
}
/* Prose bands */
.of-lead {
font-size: 1.05rem;
line-height: 1.75;
max-width: 760px;
margin: 0 auto 1.25rem;
text-align: center;
}
.section-dark .of-lead {
color: rgba(255, 255, 255, 0.78);
}
.of-lead:last-child {
margin-bottom: 0;
}
.of-lead strong {
color: #fff;
}
/* Plans */
.offers-plans {
list-style: none;
padding: 0;
max-width: 620px;
margin: 0 auto 1.25rem;
}
.offers-plans li {
font-size: 1rem;
color: var(--ink);
line-height: 1.6;
padding: 0.85rem 0;
border-bottom: 1px solid var(--line);
}
.offers-plans li:last-child {
border-bottom: none;
}
.offers-plans strong {
font-family: Marcellus, Georgia, serif;
font-weight: 400;
font-size: 1.1rem;
color: var(--midnight);
}
.offers-note {
font-size: 0.9rem;
color: var(--ink-soft);
line-height: 1.7;
max-width: 620px;
margin: 0 auto;
text-align: center;
}
/* Pricing list */
.of-price-list {
list-style: none;
padding: 0;
max-width: 760px;
margin: 0 auto;
}
.of-price-list li {
position: relative;
padding-left: 1.4rem;
margin-bottom: 0.7rem;
font-size: 0.95rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.65;
}
.of-price-list li::before {
content: "";
position: absolute;
left: 0.25rem;
top: 0.6rem;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--brass);
}
.of-price-list strong {
color: #fff;
}
.of-regions {
font-size: 0.95rem;
color: rgba(255, 255, 255, 0.72);
line-height: 1.7;
max-width: 760px;
margin: 1.5rem auto 0;
text-align: center;
}
/* 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 */
.of-links {
display: flex;
gap: 1.25rem;
flex-wrap: wrap;
justify-content: center;
max-width: 900px;
margin: 2.5rem auto 0;
}
.of-links a {
font-size: 0.88rem;
color: var(--brass-deep);
text-decoration: underline;
text-underline-offset: 3px;
}
.of-links a:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.btn:focus-visible,
.of-topbar-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-hosting-offers/",
"url": "https://odoo4projects.com/odoo-hosting-offers/",
"name": "Odoo Hosting Offers: What a Year Actually Costs",
"description": "Odoo hosting offers explained: one flat yearly price, no per-user licence, no setup fee, a 30-day free trial, and what each plan costs.",
"isPartOf": { "@id": "https://odoo4projects.com/#organization" },
"about": [
{ "@type": "Thing", "name": "Odoo hosting offers" },
{ "@type": "Thing", "name": "managed Odoo Community hosting" }
]
},
{
"@type": "BreadcrumbList",
"itemListElement": [
{ "@type": "ListItem", "position": 1, "name": "Home", "item": "https://odoo4projects.com/" },
{ "@type": "ListItem", "position": 2, "name": "Odoo hosting offers", "item": "https://odoo4projects.com/odoo-hosting-offers/" }
]
},
{
"@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 and no setup fee.",
"brand": { "@id": "https://odoo4projects.com/#organization" },
"offers": [
{
"@type": "Offer",
"name": "On the Rise",
"price": "395.00",
"priceCurrency": "USD",
"url": "https://odoo4projects.com/odoo-hosting-offers/"
}
]
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Is there a per-user licence?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. Odoo Community has no per-user licence, and our plans are one flat yearly price. There is nothing to pay for each person who logs in."
}
},
{
"@type": "Question",
"name": "Is there a setup fee?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No setup fee. You pay one price for the year and nothing to get started."
}
},
{
"@type": "Question",
"name": "What does the 30-day free trial include?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A live system for 30 days, with no card needed. It does not include backups or your own web address; those start with a paid plan."
}
},
{
"@type": "Question",
"name": "Do you have a discount code for Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Not for Odoo itself. We do not sell Odoo licences, so there is no licence coupon here. When we run a deal, like our yearly Black Friday offer on hosting, it is stated on our own pages."
}
},
{
"@type": "Question",
"name": "Where is my system hosted?",
"acceptedAnswer": {
"@type": "Answer",
"text": "In one of six regions: Amsterdam, Boston, Manchester, Mumbai, São Paulo or Sydney. You choose the closest when you start."
}
}
]
}
]
}
</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="of-topbar">
<div class="container">
<a class="of-brand" href="/">ODOO4<span>projects</span></a>
<nav class="of-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 of-hero">
<div class="container">
<h1>Odoo hosting offers, and what a year costs</h1>
<p class="hero-sub">One yearly price for your whole business. No per-user licence. No setup fee.</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>
<!-- Date-scoped Black Friday block -->
<section class="section-light">
<div class="container">
<!-- BF-BLOCK-START: live 16–30 November 2026 only. Remove this block after 30 Nov 2026. -->
<div class="bf-hub">
<h2>Black Friday and Cyber Monday 2026</h2>
<p class="bf-hub-line">This November we take $100 off your first year of hosting. The window is 16–30 November 2026, and it ends on Cyber Monday.</p>
<!-- 2026-11-01, dated for removal: the offer and the code are revealed on /odoo-black-friday/ only. Remove this link with the BF block after 30 November 2026. -->
<p class="bf-hub-link"><a href="/odoo-black-friday/">See the Black Friday offer</a></p>
</div>
<!-- BF-BLOCK-END -->
</div>
</section>
<!-- What a hosting offer from us actually is -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">What a hosting offer from us actually is</h2>
<p class="of-lead">A hosting offer from us is one flat price for a year. That price runs your whole business system, and we run everything under it: the server, the backups, your certificate and the version upgrades.</p>
<p class="of-lead">What is not on the bill: a charge for each person who logs in, and a fee to set you up. Odoo Community has no per-user licence, so there is nothing per seat to pay, and there is no setup fee.</p>
<p class="of-lead">Start with a 30-day free trial and no card. If it fits, the year starts when you pay, not when you sign up.</p>
</div>
</section>
<!-- Our plans and what each costs -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Our plans and what each costs</h2>
<p class="of-lead">Three plans, each one flat price for a year. Pick by how much room you need, not by how many people will use it.</p>
<ul class="offers-plans">
<li><strong>Side Hustle</strong> — $214 a year.</li>
<li><strong>On the Rise</strong> — $395 a year.</li>
<li><strong>Powerhouse</strong> — $595 a year.</li>
</ul>
<p class="offers-note">On the Rise and up install modules, so you can add capability as your business asks for it. Side Hustle is built for a single web address.</p>
</div>
</section>
<!-- How our pricing works -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">How our pricing works</h2>
<ul class="of-price-list">
<li><strong>One yearly price.</strong> Billed yearly, not monthly.</li>
<li><strong>No per-user licence.</strong> Community has none, so we do not charge one.</li>
<li><strong>No setup fee.</strong> Nothing to pay to start.</li>
<li><strong>Renews at list.</strong> Your second year costs what the first year's list price was. There is no quiet increase.</li>
<li><strong>30-day free trial.</strong> No card, no commitment.</li>
</ul>
<p class="of-regions">Hosted in six regions: Amsterdam, Boston, Manchester, Mumbai, São Paulo and Sydney. Pick the one nearest your team.</p>
</div>
</section>
<!-- FAQ -->
<section class="section-light" id="faq">
<div class="container">
<h2 class="section-title">Hosting questions</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Is there a per-user licence?</summary>
<div class="faq-a"><p>No. Odoo Community has no per-user licence, and our plans are one flat yearly price. There is nothing to pay for each person who logs in.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Is there a setup fee?</summary>
<div class="faq-a"><p>No setup fee. You pay one price for the year and nothing to get started.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What does the 30-day free trial include?</summary>
<div class="faq-a"><p>A live system for 30 days, with no card needed. It does not include backups or your own web address; those start with a paid plan.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do you have a discount code for Odoo?</summary>
<div class="faq-a"><p>Not for Odoo itself. We do not sell Odoo licences, so there is no licence coupon here. When we run a deal, like our yearly Black Friday offer on hosting, it is stated on our own pages.</p></div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Where is my system hosted?</summary>
<div class="faq-a"><p>In one of six regions: Amsterdam, Boston, Manchester, Mumbai, São Paulo or Sydney. You choose the closest when you start.</p></div>
</details>
</div>
<nav class="of-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="of-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="of-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>
</body>
</html>
+835
View File
@@ -0,0 +1,835 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ODOO x N8N Masterclass: Call n8n from Odoo, Live in 2 Hours</title>
<meta
name="description"
content="Two live hours with Oliver Arnold: call n8n webhooks from Odoo automated actions and build a working automation yourself. Free trial systems, $120."
/>
<link rel="canonical" href="https://odoo4projects.com/odoo-n8n-masterclass/" />
<meta property="og:title" content="ODOO x N8N Masterclass: Call n8n from Odoo, Live in 2 Hours" />
<meta
property="og:description"
content="Two live hours with Oliver Arnold: call n8n webhooks from Odoo automated actions and build a working automation yourself. Free trial systems, $120."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/odoo-n8n-masterclass/" />
<meta name="twitter:card" content="summary" />
<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 x N8N Masterclass landing page (page-scoped; additive).
The block below is the bootcamp page's page-scoped CSS, reused so the two
course pages share one visual language. Only the hero photo comment is
rewritten; every value is the bootcamp's. ---- */
.bc-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) */
.bc-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.bc-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.bc-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.bc-brand span {
color: var(--brass);
}
.bc-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
}
.bc-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.bc-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. */
.bc-topbar-links {
margin-left: auto;
}
.bc-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.bc-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.bc-topbar .lang-switch a:hover,
.bc-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.bc-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero — same treatment as the bootcamp page: our own London night aerial
(CI §5) behind the header copy, with the identical two-zone scrim
(.78 0%-88%, ramp 88%-94%, .25 94%-100%) so every text block in the copy
zone keeps its contrast floor. Numbers for the scrim: see the bootcamp
page's comment and handoffs/2026-10-24-webmaster-to-olchi-bootcamp-page-published.md. */
.bc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-desktop-1920.webp");
background-size: cover;
background-position: 50% 25%;
background-repeat: no-repeat;
}
/* The global .hero::after is a second, 50%-opacity midnight wash for the homepage's
flat hero; with the photo + gradient scrim above the copy it only dulls the shot,
so it is switched off on this page. One page-scoped rule, no global CSS touched. */
.bc-hero::after {
content: none;
}
@media (max-width: 640px) {
.bc-hero {
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-mobile-900.webp");
background-position: 50% 50%;
}
}
/* wrapped hero-stat labels keep their tick on the first line */
.bc-hero .hero-stat {
align-items: flex-start;
}
.bc-hero .hero-stat i {
line-height: 1.6;
}
.bc-lead {
font-size: 1.05rem;
color: rgba(23, 28, 38, 0.78);
max-width: 720px;
margin: 0 auto 1rem;
line-height: 1.75;
}
.section-dark .bc-lead,
.bc-lead.on-dark {
color: rgba(255, 255, 255, 0.72);
}
.bc-subline {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
color: var(--midnight);
text-align: center;
max-width: 720px;
margin: 1.75rem auto 1.25rem;
letter-spacing: 0.02em;
}
.bc-action {
text-align: center;
margin-top: 0.5rem;
}
/* The CTAs are native basket <form>s with a <button>. A <button> takes
`line-height: normal` from the UA font shorthand while an <a> inherits the
body line-height, which would make the button 5.6px shorter. Match the
anchors' height: one declaration, no new look. */
form[action$="/shop/post_basket"] .btn {
line-height: inherit;
}
/* Grids — auto-fit so no breakpoint is needed */
.bc-list {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
/* Learning tiles (light canvas) */
.bc-lessons {
list-style: none;
counter-reset: bc-lesson;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-lessons li {
counter-increment: bc-lesson;
position: relative;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.4rem 1.4rem 1.4rem 3.4rem;
transition: box-shadow 0.25s, transform 0.25s;
}
.bc-lessons li:hover {
box-shadow: var(--shadow-hover);
transform: translateY(-3px);
}
.bc-lessons li::before {
content: counter(bc-lesson);
position: absolute;
left: 1.15rem;
top: 1.3rem;
font-family: Marcellus, Georgia, serif;
font-size: 1.5rem;
color: var(--brass-deep);
line-height: 1;
}
.bc-lessons h3 {
font-size: 1rem;
font-weight: 400;
color: var(--midnight);
margin-bottom: 0.35rem;
}
.bc-lessons p {
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.6;
margin: 0;
}
/* Cards on midnight */
.bc-cards {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-cards li {
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1.35rem 1.4rem;
}
.bc-cards h3 {
font-size: 1rem;
color: #fff;
margin-bottom: 0.45rem;
}
.bc-cards p {
font-size: 0.86rem;
color: rgba(255, 255, 255, 0.72);
line-height: 1.65;
margin: 0;
}
.bc-note {
max-width: 720px;
margin: 1.5rem auto 0;
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.65;
}
.bc-note.on-dark {
color: rgba(255, 255, 255, 0.6);
}
.bc-note strong {
color: var(--midnight);
}
.bc-note.on-dark strong {
color: #fff;
}
/* Definition list (prerequisites) */
.bc-schedule {
max-width: 720px;
margin: 0 auto;
display: grid;
grid-template-columns: minmax(9rem, auto) 1fr;
gap: 0.55rem 1.25rem;
background: var(--ivory);
border: 1px solid var(--line);
border-radius: var(--radius-lg);
box-shadow: var(--shadow-rest);
padding: 1.5rem 1.75rem;
}
.bc-schedule dt {
font-family: Marcellus, Georgia, serif;
font-size: 0.92rem;
color: var(--brass-deep);
}
.bc-schedule dd {
margin: 0;
font-size: 0.9rem;
color: var(--ink);
line-height: 1.55;
}
/* Price line */
.bc-price {
font-family: Marcellus, Georgia, serif;
font-size: 1.3rem;
color: var(--midnight);
text-align: center;
margin: 0 auto 1rem;
}
/* Related links */
.bc-related {
list-style: none;
padding: 0;
margin: 2rem auto 0;
max-width: 720px;
display: grid;
gap: 0.5rem;
}
.bc-related li {
position: relative;
padding-left: 1.4rem;
font-size: 0.88rem;
}
.bc-related li::before {
content: "";
position: absolute;
left: 0.25rem;
top: 0.55rem;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--brass);
}
.bc-related a {
color: var(--midnight);
text-decoration: underline;
text-decoration-color: var(--brass);
text-underline-offset: 2px;
}
.bc-related a:hover {
text-decoration-color: var(--brass-deep);
text-decoration-thickness: 2px;
}
/* FAQ (native details/summary — no JS) */
.bc-faq-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
max-width: 1000px;
margin: 0 auto;
align-items: start;
}
.bc-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;
}
.bc-faq[open],
.bc-faq:hover {
box-shadow: var(--shadow-hover);
}
.bc-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);
}
.bc-faq summary::-webkit-details-marker {
display: none;
}
.bc-faq summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
}
.bc-faq[open] summary::after {
content: "\2212";
}
.bc-faq summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.bc-faq .bc-a {
font-size: 0.87rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.7;
padding-bottom: 1rem;
}
.bc-faq .bc-a p:last-child {
margin-bottom: 0;
}
@media (max-width: 768px) {
.bc-faq-grid {
grid-template-columns: 1fr;
}
.bc-schedule {
grid-template-columns: 1fr;
gap: 0.15rem 0;
padding: 1.25rem 1.35rem;
}
.bc-schedule dd {
margin-bottom: 0.7rem;
}
}
/* Focus states */
.btn:focus-visible,
.bc-topbar-links a:focus-visible,
.bc-related a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "Course",
"name": "ODOO × N8N Masterclass",
"description": "A two-hour live masterclass on connecting Odoo to n8n: calling n8n webhooks from Odoo automated actions, how the n8n integration for Odoo works, and website workarounds for extending your automation. Hands-on in free trial systems.",
"url": "https://odoo4projects.com/odoo-n8n-masterclass/",
"provider": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"instructor": {
"@type": "Person",
"name": "Oliver Arnold",
"jobTitle": "Technical Lead",
"worksFor": {
"@type": "Organization",
"name": "ODOO4projects"
}
},
"inLanguage": "en",
"hasCourseInstance": {
"@type": "CourseInstance",
"courseMode": "online",
"courseWorkload": "PT2H",
"startDate": "2027-02-04",
"instructor": {
"@type": "Person",
"name": "Oliver Arnold"
}
},
"offers": {
"@type": "Offer",
"price": "120.00",
"priceCurrency": "USD",
"category": "Paid",
"url": "https://20.odoo4projects.com/shop/post_basket"
}
},
{
"@type": "FAQPage",
"mainEntity": [
{
"@type": "Question",
"name": "Do I need to know n8n already?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No. You can arrive having never opened it. The session starts at the webhook and builds up from there, inside n8n's own free plan."
}
},
{
"@type": "Question",
"name": "What do I need to know before I join?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Two things. Basic Odoo, meaning you know what workflows and automated actions are and where they live in the interface. And basic programming, enough to know what an API is and how one gets called."
}
},
{
"@type": "Question",
"name": "What do I need installed?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Nothing. A computer and a browser. We provide the free Odoo trial system, so you are working in a live setup rather than a video. You use n8n on n8n's own free plan."
}
},
{
"@type": "Question",
"name": "Do I get a certificate?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. You receive a certificate at the end of the masterclass."
}
},
{
"@type": "Question",
"name": "What language is it in?",
"acceptedAnswer": {
"@type": "Answer",
"text": "English."
}
},
{
"@type": "Question",
"name": "Is this for me if I do not write code?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, as long as you can read code rather than write it. You need to understand what an API call is, not to build an application. If code is entirely foreign to you, the bootcamp covers automating your business without any of it."
}
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="bc-topbar">
<div class="container">
<a class="bc-brand" href="/">ODOO4<span>projects</span></a>
<nav class="bc-topbar-links" aria-label="Page links">
<a href="/index.html#pricing">Plans &amp; pricing</a>
<a href="/workshops/">Workshops</a>
<a href="/support.html">Support</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero bc-hero">
<div class="container">
<p class="hero-kicker">2 HOURS &middot; LIVE &middot; OLIVER ARNOLD &middot; ENGLISH</p>
<p class="hero-kicker">NEXT SESSION &middot; THURSDAYS IN FEBRUARY 2027 &middot; 17:00 CENTRAL TIME</p>
<h1>ODOO &times; N8N Masterclass</h1>
<p class="hero-sub">
Two live hours with Oliver Arnold, working inside real Odoo and n8n systems: make your ERP start
its own jobs instead of waiting for someone to click.
</p>
<div class="hero-stats">
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> 2 hours live, with a Q&amp;A at the end</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> You build and test a live automation yourself</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> A free Odoo trial system; n8n on n8n's own free plan</span>
<span class="hero-stat"><i aria-hidden="true">&#10003;</i> Certificate when you are done</span>
</div>
<div class="hero-actions">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":44,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg plausible-event-name=Buy">Buy for 120.00 USD</button>
</form>
</div>
</div>
</section>
<!-- What the two hours give you -->
<section class="section-light">
<div class="container">
<h2 class="section-title">What the two hours give you</h2>
<p class="bc-lead">
Your Odoo system already knows the moment a quote is confirmed, a stock level drops, or an
invoice gets paid. Today most of that knowledge sits still until a person notices it and does the
next thing by hand.
</p>
<p class="bc-lead">
In two hours you learn how to hand that next thing to n8n. One Odoo automated action fires on a
business event, calls an n8n webhook, and n8n carries the work forward while you are somewhere
else. You build it in the session and you keep the pattern afterwards.
</p>
<p class="bc-subline">Two hours. One working automation. Your system doing its own work.</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":44,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg plausible-event-name=Buy">Buy for 120.00 USD</button>
</form>
</div>
</div>
</section>
<!-- Who this is for -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Who this is for</h2>
<p class="bc-lead">
You already run Odoo and you can name the manual steps that pile up every week. The quote that
needs a message sent, the payment that needs a note added, the report someone rebuilds by hand on
Friday. You know your way around workflows and automated actions in the interface, and you are
comfortable enough with code to read a payload.
</p>
<p class="bc-lead">
This is not a first course in Odoo, and it is not an owner's introduction to ERP. If you have
never opened Odoo, or an API is still a vague word to you, start with the
<a href="/odoo-erp-automation-bootcamp/">ODOO ERP Automation Bootcamp</a> instead. This
masterclass assumes you are already past that line.
</p>
</div>
</section>
<!-- What you will learn -->
<section class="section-light">
<div class="container">
<h2 class="section-title">What you will learn</h2>
<ol class="bc-lessons">
<li>
<h3>Calling n8n webhooks from Odoo automated actions.</h3>
<p>The core of the session. You set an automated action to fire on a business event and call an n8n webhook, carrying the record's data with it, and you watch the workflow pick it up on the other side. This is the piece most people have never wired up themselves.</p>
</li>
<li>
<h3>How the n8n integration for Odoo works, with tips and tricks from real use cases.</h3>
<p>What is actually happening underneath when the two systems talk, the parts that trip people up, and the shortcuts that come from running this on live systems rather than in a demo.</p>
</li>
<li>
<h3>Smart website workarounds for extending your Odoo automation.</h3>
<p>Where Odoo's own automation stops, and the website-side workarounds that get you further without writing a custom module.</p>
</li>
</ol>
<p class="bc-lead">For a worked example end to end, our post on <a href="/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html">migrating invoices between Odoo versions</a> shows the same idea with an n8n workflow and an MCP tool.</p>
</div>
</section>
<!-- The hands-on part -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">The hands-on part</h2>
<p class="bc-lead">
You spend most of the two hours inside the systems. We give you a free Odoo trial environment,
and you work through the exercises step by step inside n8n's own free plan: build the automated
action, wire the webhook, run the workflow, then break it and fix it with Oliver alongside you.
</p>
<p class="bc-lead">
You finish having tested a live automation on your own screen, and you keep access to the pattern
you built.
</p>
<p class="bc-note on-dark">
<strong>On n8n, in plain words:</strong> the n8n workspace is n8n's own free plan, which you sign
up for yourself. It is not part of the $120 and not included.
</p>
</div>
</section>
<!-- What you need first -->
<section class="section-light">
<div class="container">
<h2 class="section-title">What you need first</h2>
<dl class="bc-schedule">
<dt>Basic Odoo</dt>
<dd>You know what workflows and automated actions are and where to find them.</dd>
<dt>Basic programming</dt>
<dd>You know what an API is and how one gets called. You do not need to be a developer.</dd>
<dt>n8n experience</dt>
<dd>None needed. You can arrive having never opened n8n.</dd>
</dl>
<p class="bc-note">
If the first two do not describe you yet, the
<a href="/odoo-erp-automation-bootcamp/">bootcamp</a> is the right first step.
</p>
</div>
</section>
<!-- Your instructor -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Your instructor</h2>
<p class="bc-lead">
<strong>Oliver Arnold, Technical Lead at ODOO4projects.</strong>
</p>
<p class="bc-lead">
Oliver has spent more than 25 years building software that has to keep working, and he is the lead
architect of the platform our hosting runs on. He teaches the way he works: the real system on the
screen, the real error in front of you, and the two of you fixing it together.
</p>
<p class="bc-lead">
He is the only instructor on this masterclass. Every session is him.
</p>
</div>
</section>
<!-- Price and booking -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Price and booking</h2>
<p class="bc-price">The masterclass costs USD 120.00.</p>
<p class="bc-lead">
Covers two live hours with Oliver, the Q&amp;A, the step-by-step exercises, the free Odoo trial
system, and your certificate when you finish.
</p>
<p class="bc-subline">Next session: Thursdays in February 2027, 17:00 Central Time</p>
<p class="bc-note">
The four Thursdays are 4, 11, 18 and 25 February 2027. Central Time is UTC&minus;6 in February
&mdash; calendar invites carry the correct local time.
</p>
<div class="bc-action">
<form method="post" action="https://20.odoo4projects.com/shop/post_basket" target="_blank" class="plausible-event-name=Buy">
<input type="hidden" name="basket" value='[{"product_id":44,"qty":1}]' />
<input type="hidden" name="clear" value="1" />
<button type="submit" class="btn btn-brass btn-lg plausible-event-name=Buy">Buy for 120.00 USD</button>
</form>
</div>
<ul class="bc-related">
<li><a href="/support.html#contact">Questions before you book? Talk to us first</a></li>
<li><a href="/workshops/">All our live courses, side by side</a></li>
<li><a href="/odoo-erp-automation-bootcamp/">The ten-week bootcamp, if you are starting from zero</a></li>
<li><a href="/support.html">What our support does and does not cover</a></li>
</ul>
</div>
</section>
<!-- FAQ -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Questions people ask first</h2>
<div class="bc-faq-grid">
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Do I need to know n8n already?</summary>
<div class="bc-a">
<p>No. You can arrive having never opened it. The session starts at the webhook and builds up from there, inside n8n's own free plan.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What do I need to know before I join?</summary>
<div class="bc-a">
<p>Two things. Basic Odoo, meaning you know what workflows and automated actions are and where they live in the interface. And basic programming, enough to know what an API is and how one gets called.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What do I need installed?</summary>
<div class="bc-a">
<p>Nothing. A computer and a browser. We provide the free Odoo trial system, so you are working in a live setup rather than a video. You use n8n on n8n's own free plan.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Do I get a certificate?</summary>
<div class="bc-a">
<p>Yes. You receive a certificate at the end of the masterclass.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What language is it in?</summary>
<div class="bc-a">
<p>English.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Is this for me if I do not write code?</summary>
<div class="bc-a">
<p>Yes, as long as you can read code rather than write it. You need to understand what an API call is, not to build an application. If code is entirely foreign to you, the <a href="/odoo-erp-automation-bootcamp/">bootcamp</a> covers automating your business without any of it.</p>
</div>
</details>
</div>
</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="bc-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="bc-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 defer src="/static/buy.js"></script>
<script defer src="/static/lang.js"></script>
</body>
</html>
+825
View File
@@ -0,0 +1,825 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Odoo Staging Environment: Do You Actually Need One?</title>
<meta
name="description"
content="Most small businesses don't need an Odoo staging environment. How staging works, what it costs, and the back-up-install-test route we offer instead."
/>
<link rel="canonical" href="https://odoo4projects.com/odoo-staging-environment/" />
<meta property="og:title" content="Odoo Staging Environment: Do You Actually Need One?" />
<meta
property="og:description"
content="What an Odoo staging environment is, how odoo.sh's staging works, and the simpler route most small businesses should use instead."
/>
<meta property="og:type" content="article" />
<meta property="og:url" content="https://odoo4projects.com/odoo-staging-environment/" />
<meta property="og:image" content="https://odoo4projects.com/images/hero/amsterdam.webp" />
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="https://odoo4projects.com/images/hero/amsterdam.webp" />
<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 staging environment" guide page (page-scoped; additive).
Reuses the top bar, band rhythm, hero and FAQ treatment already shipped on
what-can-i-use-odoo-for/, plus the final-CTA block from odoo-hosting-2027.html.
Three additions this page needs and no other: .oc-lede (the opening prose in
the hero), the light-band re-pointing of the shared .oc-steps colours, and the
in-prose bullet list inside a dark band. ---- */
.oc-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) */
.cmp-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.cmp-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.cmp-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.cmp-brand span {
color: var(--brass);
}
.cmp-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.cmp-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar-links a:hover {
color: var(--brass);
}
.cmp-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.cmp-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar .lang-switch a:hover,
.cmp-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.cmp-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.oc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.oc-hero .container {
position: relative;
z-index: 1;
}
.oc-hero .hero-sub {
max-width: 760px;
}
.oc-hero-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.25;
filter: brightness(1.15) saturate(1.1);
}
/* The opening prose in the hero: the reader's question is answered before the first H2. */
.oc-lede {
max-width: 780px;
color: rgba(255, 255, 255, 0.72);
line-height: 1.7;
font-size: 1rem;
}
.oc-lede p {
margin-bottom: 0.9rem;
}
.oc-lede p:last-child {
margin-bottom: 0;
}
.oc-lede a {
color: var(--brass-bright);
}
/* Prose column */
.oc-body {
max-width: 760px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .oc-body {
color: rgba(255, 255, 255, 0.78);
}
.oc-body p:last-child {
margin-bottom: 0;
}
.oc-body strong {
color: var(--ink);
}
.section-dark .oc-body strong {
color: #fff;
}
.section-dark .oc-body a {
color: var(--brass-bright);
}
/* In-prose bullet list (the odoo.sh facts): the shared list has no styling of its own. */
.oc-body ul {
padding-left: 1.2rem;
margin: 0 0 1.2rem;
}
.oc-body li {
margin-bottom: 0.55rem;
}
.oc-body li:last-child {
margin-bottom: 0;
}
.section-dark .oc-body li::marker {
color: var(--brass);
}
/* Numbered path (back up, install, test) */
.oc-steps {
max-width: 820px;
margin: 0 auto;
padding: 0;
list-style: none;
counter-reset: oc-step;
}
.oc-steps li {
position: relative;
counter-increment: oc-step;
padding: 0 0 1.4rem 3.2rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.7;
border-left: 1px solid rgba(201, 162, 39, 0.25);
margin-left: 1rem;
}
.oc-steps li::before {
content: counter(oc-step);
position: absolute;
left: -1.05rem;
top: -0.15rem;
width: 2.1rem;
height: 2.1rem;
display: flex;
align-items: center;
justify-content: center;
font-family: Marcellus, Georgia, serif;
font-size: 1rem;
color: var(--midnight);
background: var(--brass);
border-radius: 50%;
}
.oc-steps li strong {
color: #fff;
font-weight: 600;
}
.oc-steps li em {
color: rgba(255, 255, 255, 0.9);
}
.oc-steps li:last-child {
padding-bottom: 0;
}
/* The shared .oc-steps colours are tuned for a dark band; this page runs the path
on the light band, so the text re-points to ink (the brass counter still reads). */
.section-light .oc-steps li {
color: var(--ink-soft);
border-left-color: rgba(138, 111, 31, 0.3);
}
.section-light .oc-steps li strong {
color: var(--ink);
}
.section-light .oc-steps li em {
color: var(--ink);
}
.section-light .oc-steps li a {
color: var(--brass-deep);
}
/* FAQ */
.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],
.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 .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
/* Final CTA (the same block odoo-hosting-2027.html uses) */
.cmp-cta {
text-align: center;
}
.cmp-cta .cmp-lead {
font-size: 1.1rem;
color: rgba(255, 255, 255, 0.72);
max-width: 720px;
line-height: 1.75;
margin: 0 auto 1.5rem;
}
.cmp-cta-actions {
display: flex;
gap: 1rem;
justify-content: center;
flex-wrap: wrap;
margin-top: 0.5rem;
}
/* Focus states on every CTA */
.btn:focus-visible,
.cmp-topbar-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
.oc-hero {
padding: 3rem 0 2.5rem;
}
.oc-steps li {
padding-left: 2.6rem;
}
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://odoo4projects.com/odoo-staging-environment/#webpage",
"url": "https://odoo4projects.com/odoo-staging-environment/",
"name": "Odoo Staging Environment: Do You Actually Need One?",
"description": "Most small businesses don't need an Odoo staging environment. How staging works, what it costs, and the back-up-install-test route we offer instead.",
"inLanguage": "en-US",
"isPartOf": { "@id": "https://odoo4projects.com/#organization" },
"breadcrumb": { "@id": "https://odoo4projects.com/odoo-staging-environment/#breadcrumb" },
"mainEntity": { "@id": "https://odoo4projects.com/odoo-staging-environment/#article" }
},
{
"@type": "Article",
"@id": "https://odoo4projects.com/odoo-staging-environment/#article",
"headline": "Odoo Staging Environment: Do You Actually Need One?",
"description": "Most small businesses don't need an Odoo staging environment. How staging works, what it costs, and the back-up-install-test route we offer instead.",
"articleSection": [
"What is an Odoo staging environment?",
"How odoo.sh works with staging",
"Who staging is really for",
"Do you need one? For most small businesses, no.",
"The simpler way: back up, install, test",
"When it does get complicated, we set up staging for you",
"Frequently asked questions"
],
"inLanguage": "en-US",
"datePublished": "2026-11-01",
"dateModified": "2026-11-01",
"author": { "@id": "https://odoo4projects.com/#organization" },
"publisher": { "@id": "https://odoo4projects.com/#organization" },
"mainEntityOfPage": { "@id": "https://odoo4projects.com/odoo-staging-environment/#webpage" }
},
{
"@type": "FAQPage",
"@id": "https://odoo4projects.com/odoo-staging-environment/#faq",
"isPartOf": { "@id": "https://odoo4projects.com/odoo-staging-environment/#webpage" },
"mainEntity": [
{
"@type": "Question",
"name": "Do I need a staging environment for my Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Most small businesses do not. You need one if you change Odoo's code, writing or editing modules or migrating a whole system, and you want to test the change on real data before it goes live. If you add finished modules to a running business system, a backup and a careful test does the job that staging would."
}
},
{
"@type": "Question",
"name": "What is an Odoo staging environment?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A copy of your live Odoo, with the same apps and a recent copy of your data, running separately so a mistake in it cannot reach the system your business uses. You try a change in the copy first and move it to the live system only once it works."
}
},
{
"@type": "Question",
"name": "How much does an Odoo.sh staging environment cost?",
"acceptedAnswer": {
"@type": "Answer",
"text": "odoo.sh's own pricing page lists base hosting from $57.80 a month and Staging environment as a metered line at $14.40 per environment per month, and states the hosting price does not include the Enterprise licence. odoo.sh is reached through Odoo's Custom plan."
}
},
{
"@type": "Question",
"name": "Can I test a new module without a staging environment?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Take a backup first, install the module into your live Odoo, and try it on your real data. Modules install from the On the Rise plan upwards, in one click. If it misbehaves, the backup you took is what puts the system back."
}
},
{
"@type": "Question",
"name": "What happens if a new module breaks my Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "If you took a backup first, tell us through support and we restore it, and your system goes back to the moment of your backup. That is why the backup comes first: it is the safety net that makes a staging environment unnecessary for a single change."
}
},
{
"@type": "Question",
"name": "Can you set up a staging environment for me?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. When a change is bigger than one module, a version upgrade, several modules at once, a migration, tell us and we set up the staging environment for you. You do not need a hosting account elsewhere or to learn how staging branches work."
}
}
]
},
{
"@type": "BreadcrumbList",
"@id": "https://odoo4projects.com/odoo-staging-environment/#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://odoo4projects.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "Odoo Staging Environment",
"item": "https://odoo4projects.com/odoo-staging-environment/"
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="cmp-topbar">
<div class="container">
<a class="cmp-brand" href="/index.html">ODOO4<span>projects</span></a>
<nav class="cmp-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: the reader's question, answered before the first H2 -->
<section class="hero oc-hero">
<div class="hero-bg">
<img
class="oc-hero-img"
src="/images/hero/amsterdam.webp"
alt="Amsterdam at night — one of the six regions our servers run in"
width="1920"
height="768"
fetchpriority="high"
decoding="async"
/>
</div>
<div class="container">
<p class="hero-kicker">STAGING, IN PLAIN WORDS</p>
<h1>Do You Need an Odoo Staging Environment?</h1>
<div class="oc-lede">
<p>
An Odoo staging environment is a copy of your live Odoo that you are allowed to break. It carries
the same apps, the same settings and a copy of your real data, and it runs on its own, so nothing
you do inside it reaches the system your invoices, orders and stock depend on. You install a module
— an add-on, a feature you switch on — into the copy, put it through its paces, and if it misbehaves
you delete the copy and the business never noticed.
</p>
<p>
That is a developer's tool. Staging exists for the person who changes Odoo's code and wants to see
the change work on real data before it goes near the live system. If you write or edit Odoo modules
for a living, it is the right instrument, and you already know what to do with it.
</p>
<p>
Most people who search for a staging environment are not that person. They run a shop, a workshop or
an office, someone told them they need staging before they touch their Odoo, and the honest answer
is that they usually do not. The rest of this page covers how staging works, who it is really for,
and what to do instead.
</p>
</div>
</div>
</section>
<!-- What it is -->
<section class="section-light">
<div class="container">
<p class="section-kicker">The plain definition</p>
<h2 class="section-title">What is an Odoo staging environment?</h2>
<div class="oc-body">
<p>
Staging is a second version of your Odoo that stands beside the one your business actually uses. The
version customers and staff touch is called production. Staging is a copy of it, with the same
applications and configuration and a recent copy of your data, running separately so that a mistake
there cannot reach production.
</p>
<p>
You use it to try something before committing to it. A new module, a changed setting, a small piece
of code: you put it into the copy first, see how it behaves with your real products and your real
customers, and only then move it across. If it turns out badly, production never saw it.
</p>
<p>Staging is somewhere to be wrong without paying for it.</p>
</div>
</div>
</section>
<!-- odoo.sh -->
<section class="section-dark">
<div class="container">
<p class="section-kicker">Another vendor's product, stated fairly</p>
<h2 class="section-title">How odoo.sh works with staging</h2>
<div class="oc-body">
<p>
odoo.sh is Odoo's own hosting platform, and it has staging built in. A project on odoo.sh is
organised into three stages, named exactly Production, Staging and Development, and you move a
branch between them. A staging branch is a neutralized duplicate of the production database: it
holds your real data, and neutralization switches off the parts that would reach the outside world.
Scheduled actions and outgoing email are stopped (mail is caught rather than sent), and payment
providers, shipping connectors and Odoo's own paid services are put into test mode. That way you can
test on production's data without emailing a customer or charging a real card.
</p>
<p>A few facts worth knowing before you plan around it:</p>
<ul>
<li>
Staging databases are not backed up automatically. You either take a manual backup or restore a
production backup into the staging branch.
</li>
<li>A staging database is deleted automatically after one month. To keep using the branch, you rebuild it.</li>
<li>
When you merge staging back into production, only the source code moves across. Database changes
you made while testing are not carried over, so a setting you need permanently has to be committed
as code or copied by hand.
</li>
<li>On a trial project, production and every staging branch drop back to the Development stage after 30 days.</li>
</ul>
<p>
The price, from odoo.sh's own pricing page: base hosting starts at $57.80 a month, and Staging
environment is a metered line at $14.40 per environment per month. Dedicated hosting is $480.00 a
month, workers are $57.60 each per month, and storage is $0.20 per GB per month. That page states
the hosting price does not include the Enterprise licence. You reach odoo.sh through Odoo's Custom
plan, US$49.00 per user per month billed yearly, or US$61.00 monthly.
</p>
<p>That is an accurate picture of a good product. For a team that ships Odoo code, it is a sensible way to work.</p>
</div>
</div>
</section>
<!-- Who it is for -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Who the tool is built for</p>
<h2 class="section-title">Who staging is really for</h2>
<div class="oc-body">
<p>
Staging is for people who change Odoo's code. A developer adding a module, an agency doing a
migration, a technical person on staff who has to know a change works before the warehouse opens on
Monday. Their job creates the risk staging removes: they are editing the machinery, and a mistake in
the machinery is expensive and stays invisible until it is live.
</p>
<p>If you have that person, or you are that person, staging is a normal and sensible expense.</p>
<p>
For everyone else, the useful question is whether they need staging at all. For most small
businesses the answer is no, and the reason is worth spelling out.
</p>
</div>
</div>
</section>
<!-- Do you need one -->
<section class="section-dark">
<div class="container">
<p class="section-kicker">The honest answer</p>
<h2 class="section-title">Do you need one? For most small businesses, no.</h2>
<div class="oc-body">
<p>Two things are true of a typical small business, and both point the same way.</p>
<p>
The first is how you get a new capability. You do not write a module; you buy one that is already
finished and proven. A stock feature, a report, a payment option: it was built and tested by someone
else and is already in use at thousands of businesses. You install it and you use it. There is no
code of yours to test, because there is no code of yours.
</p>
<p>
The second is who tests it. If you have anybody technical at all, the usual arrangement is that your
developer runs the module on their own machine before it comes near your live system, and hands it
over when it already works. That local test does the job staging does, for the change you are
actually making.
</p>
<p>
So the risk staging removes, breaking live data with an untested code change, barely exists in your
week. You are not running a code pipeline. You are adding a capability to a business system, and the
honest tool for that is smaller than staging: a backup, an install, and a way back if it goes wrong.
</p>
</div>
</div>
</section>
<!-- The simpler way -->
<section class="section-light">
<div class="container">
<p class="section-kicker">The path we recommend first</p>
<h2 class="section-title">The simpler way: back up, install, test</h2>
<div class="oc-body">
<p>There is a lighter version of the same safety net, and it is the one we recommend first.</p>
<p>
Everything a staging environment protects against comes down to one fear: that a change breaks your
live system and your data goes with it. You can settle that fear directly, on the system you already
have, without a second environment to pay for and keep running.
</p>
</div>
<ol class="oc-steps">
<li>
<strong>Take a backup.</strong> Backups run on your instance already. Before you install anything,
<a href="/blog/posts/speed-run-backup.html">take one by hand</a>, so you hold a known-good copy from
the moment before the change. Backups run on paid plans: four rotating slots on On the Rise and
Powerhouse, one on Side Hustle. The 30-day trial has none. Slots work first-in, first-out, so a new
backup overwrites the oldest: a backup is your latest safety copy, not a permanent one. If you are
on Side Hustle, check the backup exists before you install, and finish your test before the next
scheduled backup replaces it.
</li>
<li>
<strong>Install the module.</strong> Modules
<a href="/blog/posts/how-to-install-odoo-modules-using-git.html">install from the On the Rise plan upwards</a>,
from inside <a href="/odoo-hosting-2027.html">your own Odoo</a>, in one click. On Side Hustle, module
installation is not included. Contact support and we will take it from there. You install straight
into your live system, which is the point: you want to see it work with your real data.
</li>
<li>
<strong>Test it, for real.</strong> Open the module, click through what it does, and run it against
your actual products, customers and orders. Ten minutes of real use tells you more than any test
environment.
</li>
<li>
<strong>If it does not work, put the backup back.</strong> If the module misbehaves, tell us through
<a href="/support.html">support</a> and we restore the backup you took; the request is handled by
support like any other. Restoring puts the system back to the state it was in when you took the
backup. Anything entered since then (orders, invoices, payments) goes back with it, so test at a
quiet moment and keep the gap short. On a one-slot plan the backup is only as fresh as the next
scheduled run, so finish the test before that replaces it.
</li>
</ol>
<div class="oc-body" style="margin-top: 2.25rem">
<p>
The whole sequence is a backup, a click, a look, and, only if you need it, a restore. For a single
module that is less work than setting up and maintaining a staging environment, and it happens on
the system your staff already use.
</p>
</div>
</div>
</section>
<!-- The escalation -->
<section class="section-dark">
<div class="container">
<p class="section-kicker">When the change is bigger</p>
<h2 class="section-title">When it does get complicated, we set up staging for you</h2>
<div class="oc-body">
<p>Sometimes the change is bigger than a single module.</p>
<p>
A <a href="/odoo-community-upgrade.html">version upgrade</a> that moves your whole system to a new
Odoo. Several modules arriving at once. A migration where the data itself is being reshaped. A change
nobody in the business wants to be the one who risks on the live system. These are the moments where
a plain backup and restore is not enough, because you need to see a whole rebuilt system working
beside the real one before you commit.
</p>
<p>
That is a staging environment, and it is exactly the job it was built for. If you reach that moment,
tell us. We set up the staging environment for you: the copy, the test data, the place to try the
change. You do not need to learn how the branches work, or hold a hosting account somewhere else to
get one.
</p>
<p>
We scope it with you and price it before we start, and we only suggest it when the change is
genuinely bigger than a module, not for one app you could install on a backup.
</p>
<p>
That is the honest split. You install finished modules on a backup; we build you a staging
environment the day a small business genuinely needs one.
</p>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-light" id="faq">
<div class="container">
<p class="section-kicker">Straight answers</p>
<h2 class="section-title">Frequently asked questions</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do I need a staging environment for my Odoo?</summary>
<div class="cmp-a">
<p>Most small businesses do not. You need one if you change Odoo's code, writing or editing modules or migrating a whole system, and you want to test the change on real data before it goes live. If you add finished modules to a running business system, a backup and a careful test does the job that staging would.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What is an Odoo staging environment?</summary>
<div class="cmp-a">
<p>A copy of your live Odoo, with the same apps and a recent copy of your data, running separately so a mistake in it cannot reach the system your business uses. You try a change in the copy first and move it to the live system only once it works.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">How much does an Odoo.sh staging environment cost?</summary>
<div class="cmp-a">
<p>odoo.sh's own pricing page lists base hosting from $57.80 a month and Staging environment as a metered line at $14.40 per environment per month, and states the hosting price does not include the Enterprise licence. odoo.sh is reached through Odoo's Custom plan.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Can I test a new module without a staging environment?</summary>
<div class="cmp-a">
<p>Yes. Take a backup first, install the module into your live Odoo, and try it on your real data. Modules install from the On the Rise plan upwards, in one click. If it misbehaves, the backup you took is what puts the system back.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What happens if a new module breaks my Odoo?</summary>
<div class="cmp-a">
<p>If you took a backup first, tell us through support and we restore it, and your system goes back to the moment of your backup. That is why the backup comes first: it is the safety net that makes a staging environment unnecessary for a single change.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Can you set up a staging environment for me?</summary>
<div class="cmp-a">
<p>Yes. When a change is bigger than one module, a version upgrade, several modules at once, a migration, tell us and we set up the staging environment for you. You do not need a hosting account elsewhere or to learn how staging branches work.</p>
</div>
</details>
</div>
</div>
</section>
<!-- Final CTA -->
<section class="section-dark cmp-cta" id="talk">
<div class="container">
<p class="section-kicker">One change, handled properly</p>
<h2 class="section-title">Talk to us about your change.</h2>
<p class="cmp-lead">
Installing a module: take a backup, click install, and ask us if anything looks wrong. A bigger
change: we set up a staging environment for you.
</p>
<div class="cmp-cta-actions">
<a href="/support.html#contact" class="btn btn-brass btn-lg">Contact support</a>
</div>
</div>
</section>
<!-- Footer (copied from what-can-i-use-odoo-for/; 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="oc-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="oc-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 defer src="/static/lang.js"></script>
</body>
</html>
+17 -15
View File
@@ -20,7 +20,7 @@
*{box-sizing:border-box}
body{margin:0;background:linear-gradient(180deg,var(--bg),#eef2f8);min-height:100vh;display:flex;align-items:center;justify-content:center;padding:28px}
.app{width:960px;max-width:96vw;background:transparent;display:grid;grid-template-columns:320px 1fr;gap:20px}
.app{width:1146px;max-width:96vw;background:transparent;display:grid;grid-template-columns:320px 1fr;gap:20px;align-items:stretch}
/* Left column - user list / details */
.sidebar{background:linear-gradient(180deg,rgba(255,255,255,0.9),var(--card));border-radius:var(--radius);padding:20px;box-shadow:0 6px 20px rgba(24,39,75,0.06);overflow:hidden}
@@ -55,17 +55,16 @@
.sidebar .hint{margin-top:14px;padding:10px;border-radius:10px;background:#fbf8ff;color:#5b4160;font-size:13px}
/* Chat area */
.chat-card{background:var(--card);border-radius:var(--radius);display:flex;flex-direction:column;height:70vh;box-shadow:0 10px 30px rgba(24,39,75,0.06);overflow:hidden}
.chat-card{background:var(--card);border-radius:var(--radius);display:flex;flex-direction:column;height:100%;min-height:0;box-shadow:0 10px 30px rgba(24,39,75,0.06);overflow:hidden}
.chat-header{display:flex;align-items:center;gap:12px;padding:18px;border-bottom:1px solid #eef1f6}
.chat-header .title{font-weight:600;color:var(--odoo-dark)}
.chat-header .sub{font-size:13px;color:var(--muted)}
.messages{flex:1;padding:22px;overflow:auto;background:linear-gradient(180deg,#fbfcff, #f7f9fc)}
.messages{flex:1;min-height:0;padding:22px;overflow:auto;background:linear-gradient(180deg,#fbfcff, #f7f9fc)}
.messages-inner{max-width:760px;margin:0 auto;display:flex;flex-direction:column;gap:12px}
.msg{display:flex;gap:10px;align-items:flex-end}
.msg.me{justify-content:flex-end}
.bubble{max-width:68%;padding:12px 14px;border-radius:12px;background:white;border:1px solid #eef1f6;font-size:14px;color:#222}
.msg{display:flex;gap:10px;align-items:flex-end;width:100%}
.bubble{width:100%;max-width:100%;padding:12px 14px;border-radius:12px;background:white;border:1px solid #eef1f6;font-size:14px;color:#222}
.bubble.me{background:linear-gradient(90deg,var(--odoo-purple),#9b6fa0);color:white;border:none}
.meta-time{font-size:11px;color:var(--muted);margin-top:6px}
@@ -93,6 +92,12 @@
.chat-card{height:82vh}
}
</style>
<!-- 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>
</head>
<body>
<div class="app">
@@ -132,7 +137,7 @@ Please note: it does not cover general Odoo usage or functional questions.
</li>
</ul>
<div style="margin-top:10px;">
⚠️ <strong>Important:</strong> If you cannot access Odoo due to a Git change, you can easily <a href="https://ODOO4projects.com" style="color:inherit; text-decoration:underline;">revert the last change via our homepage</a>.
⚠️ <strong>Important:</strong> If you cannot access Odoo due to a Git change, you can easily <a href="https://odoo4projects.com" style="color:inherit; text-decoration:underline;">revert the last change via our homepage</a>.
</div>
</div>
@@ -164,7 +169,7 @@ Please note: it does not cover general Odoo usage or functional questions.
<script>
// Configuration - use your webhook
const WEBHOOK = 'https://002-001-5dd6e535-4d1c-46bc-9bd9-42ad4bc5f082.odoo4projects.com/webhook/702862fd-dd17-4a34-8efb-e9056d2c50df/chat';
const WEBHOOK = 'https://n8n.odoo4projects.com/webhook/960d7f0f-d0ef-42a5-a8f1-79db6a7d70bd/chat';
const messagesEl = document.getElementById('messagesInner');
const input = document.getElementById('messageInput');
@@ -204,16 +209,13 @@ Please note: it does not cover general Odoo usage or functional questions.
const col = document.createElement('div');
col.style.display = 'flex';
col.style.flexDirection = 'column';
col.style.flex = '1';
col.style.minWidth = '0';
col.appendChild(bubble);
col.appendChild(meta);
if(who==='me'){
wrap.appendChild(col);
wrap.appendChild(avatar);
} else {
wrap.appendChild(avatar);
wrap.appendChild(col);
}
wrap.appendChild(avatar);
wrap.appendChild(col);
messagesEl.appendChild(wrap);
messagesEl.parentElement.scrollTop = messagesEl.parentElement.scrollHeight;
+58 -13
View File
@@ -202,6 +202,12 @@
user-select: all;
}
</style>
<!-- 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>
</head>
<body>
<div class="page-subtitle">
@@ -213,7 +219,7 @@
<!-- ── Trial ─────────────────────────────────────────────────── -->
<div class="plan-card" id="card-trial">
<div class="plan-name">Trial</div>
<div class="plan-price">4 weeks free</div>
<div class="plan-price">30 days free</div>
<div class="plan-price-period">&nbsp;</div>
<div class="plan-tagline">
"I want to see what ODOO can do for my company."
@@ -242,7 +248,7 @@
<div class="plan-tagline">
"ODOO Standard .. that is all my business needs"
</div>
<button class="plan-btn" id="btn-sidehustle">
<button class="plan-btn plausible-event-name=Buy" id="btn-sidehustle">
Upgrade Now
</button>
<ul class="plan-features">
@@ -262,7 +268,7 @@
<div class="plan-tagline">
"I need some modules and professional reports"
</div>
<button class="plan-btn" id="btn-ontherise">Upgrade Now</button>
<button class="plan-btn plausible-event-name=Buy" id="btn-ontherise">Upgrade Now</button>
<ul class="plan-features">
<li>ODOO CE hosting</li>
<li>Space for 4 Backups</li>
@@ -280,7 +286,7 @@
<div class="plan-tagline">
"ODOO Enterprise is a must have!"
</div>
<button class="plan-btn" id="btn-powerhouse">
<button class="plan-btn plausible-event-name=Buy" id="btn-powerhouse">
Upgrade Now
</button>
<ul class="plan-features">
@@ -297,7 +303,7 @@
<script>
// ── Webhooks ─────────────────────────────────────────────────────────────
const getContract_Webhook =
"https://002-001-5dd6e535-4d1c-46bc-9bd9-42ad4bc5f082.odoo4projects.com/webhook/0c8536be-d175-4740-8e78-123159193b23";
"https://n8n.odoo4projects.com/webhook/ODOO4projects/upsell";
// ── Plan hierarchy (index = tier, lower = cheaper) ────────────────────────
const PLAN_ORDER = [
@@ -337,11 +343,46 @@
// ── Product ID mapping ─────────────────────────────────────────
const PRODUCT_IDS = {
sidehustle: 54,
ontherise: 55,
powerhouse: 56,
sidehustle: 6,
ontherise: 4,
powerhouse: 5,
};
// ── UTM tracking (source / medium / campaign) ─────────────────────────────
const UTM_KEYS = ["source", "medium", "campaign"];
function getCookie(name) {
const match = document.cookie.match(new RegExp("(^| )" + name + "=([^;]+)"));
return match ? decodeURIComponent(match[2]) : null;
}
function setCookie(name, value, days) {
const date = new Date();
date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
document.cookie =
name + "=" + encodeURIComponent(value) +
"; expires=" + date.toUTCString() +
"; path=/; SameSite=Lax";
}
UTM_KEYS.forEach(function (key) {
const val = params.get("utm_" + key);
if (val) setCookie("utm_" + key, val, 90);
});
function appendUTM(form) {
UTM_KEYS.forEach(function (key) {
const val = getCookie("utm_" + key);
if (val) {
const input = document.createElement("input");
input.type = "hidden";
input.name = "utm_" + key;
input.value = val;
form.appendChild(input);
}
});
}
// ── Buy handler ───────────────────────────────────────────────────────────
function buyProduct(productId) {
if (!uuid) {
@@ -355,7 +396,7 @@
}
var form = document.createElement("form");
form.method = "POST";
form.action = window.location.origin + "/shop/post_basket";
form.action = "https://20.odoo4projects.com/shop/post_basket";
form.target = "_blank";
form.style.display = "none";
var basket = document.createElement("input");
@@ -369,6 +410,7 @@
clear.name = "clear";
clear.value = "1";
form.appendChild(clear);
appendUTM(form);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
@@ -390,7 +432,7 @@
const currentIdx = PLAN_ORDER.indexOf(contractName);
if (currentIdx === -1) return; // unknown plan – leave defaults
const badgeLabel = expires ? "✅ " + expires : "✅";
const badgeLabel = expires ? "✅ Expires " + expires : "✅";
PLAN_ORDER.forEach(function (plan, idx) {
var meta = PLAN_META[plan];
@@ -432,12 +474,15 @@
if (!res.ok) throw new Error("HTTP " + res.status);
const payload = await res.json();
// Webhook returns: [{ "expires": "YYYY-MM-DD", "contractName": "Trial" }]
// Webhook returns: { "expires": "YYYY-MM-DD", "contractName": "Trial" }
// (tolerate an array wrapper and snake_case keys as well)
const record = Array.isArray(payload)
? payload[0]
: payload;
if (record && record.contract_name) {
applyPlanState(record.contract_name, record.expires);
const contractName =
record && (record.contractName || record.contract_name);
if (contractName) {
applyPlanState(contractName, record.expires);
}
} catch (err) {
console.error("Could not load contract data:", err);
+200
View File
@@ -0,0 +1,200 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="Privacy Policy for ODOO4projects LLC — what data we hold, where your instance runs, and how to reach us."
/>
<title>Privacy Policy | ODOO4projects</title>
<link rel="canonical" href="https://odoo4projects.com/privacy.html" />
<meta property="og:title" content="Privacy Policy | ODOO4projects" />
<meta property="og:description" content="What data ODOO4projects holds and why." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/privacy.html" />
<meta name="twitter:card" content="summary_large_image" />
<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;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="style.css" />
<style>
.legal-hero {
padding: 4rem 0 2.5rem;
text-align: center;
background: var(--light);
border-bottom: 1px solid var(--border);
}
.legal-hero h1 {
font-size: clamp(1.8rem, 3.2vw, 2.8rem);
color: var(--dark);
}
.legal-section {
padding: 3rem 0 4rem;
}
.legal-section .container {
max-width: 700px;
}
.legal-card {
background: #fff;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 1.75rem;
margin-bottom: 1.25rem;
}
.legal-card:last-child {
margin-bottom: 0;
}
.legal-card h2 {
font-size: 1.05rem;
font-weight: 600;
color: var(--primary);
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border);
}
.legal-card p,
.legal-card .address {
color: rgba(33, 37, 41, 0.7);
font-size: 0.88rem;
line-height: 1.7;
margin-bottom: 0.4rem;
}
.legal-card strong {
color: var(--dark);
}
.legal-card .contact-email {
color: var(--primary);
font-weight: 500;
}
.image-credits {
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.image-credits .credit-row {
color: rgba(33, 37, 41, 0.6);
font-size: 0.82rem;
}
.image-credits .credit-row a {
color: var(--primary);
}
.trademark-notice {
background: rgba(113, 75, 103, 0.04);
border: 1px solid rgba(113, 75, 103, 0.15);
border-radius: var(--radius);
padding: 1rem 1.25rem;
}
.trademark-notice p {
font-size: 0.82rem;
margin: 0;
color: rgba(33, 37, 41, 0.6);
}
@media (max-width: 768px) {
.legal-hero { padding: 2.5rem 0 1.5rem; }
.legal-card { padding: 1.25rem; }
}
</style>
<!-- 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>
</head>
<body>
<div class="container">
<div class="blog-header">
<a href="index.html">&larr; Back to Home</a>
</div>
</div>
<section class="legal-hero">
<div class="container">
<h1>Privacy Policy</h1>
<p style="margin-top: 0.5rem; color: rgba(33, 37, 41, 0.6); font-size: 0.85rem;">
Last updated 2026-10-21
</p>
</div>
</section>
<section class="legal-section">
<div class="container">
<div class="legal-card">
<h2>Who we are</h2>
<p><strong>ODOO4projects LLC</strong></p>
<p class="address">
30 N Gould St, STE R, Sheridan<br />
WY 82801, USA
</p>
<p>Contact: <span class="contact-email">support@ODOO4projects.com</span></p>
</div>
<div class="legal-card">
<h2>What we hold</h2>
<p><strong>Account details you give us:</strong> your name, your company name, and your email address.</p>
<p><strong>Service details:</strong> the plan you bought, the region you chose, and your instance address.</p>
<p><strong>Payment records:</strong> invoices and their payment status.</p>
<p><strong>Support messages:</strong> what you send us, and our replies.</p>
<p>Card details are entered on Stripe's checkout page. We do not receive or store your card number.</p>
</div>
<div class="legal-card">
<h2>Why we hold it</h2>
<p>To create and run your instance, to invoice you, to answer your support requests, and to email you about your account.</p>
</div>
<div class="legal-card">
<h2>Where your instance runs</h2>
<p>You choose the region when you sign up. The regions we offer are Amsterdam, Boston, Manchester, Mumbai, S&atilde;o Paulo and Sydney. Your instance and its data run in the region you chose.</p>
</div>
<div class="legal-card">
<h2>Backups</h2>
<p>How many backups we keep depends on your plan: one rotating slot on Side Hustle, four on On the Rise and Powerhouse. Slots work first-in, first-out. When the slots are full, the oldest backup is overwritten and permanently deleted. We keep no separate copy.</p>
<p>The free trial has no backups.</p>
</div>
<div class="legal-card">
<h2>The assistant on this website</h2>
<p>Our homepage carries an AI assistant that answers questions and can pass a request to a person. Do not enter confidential information into it.</p>
</div>
<div class="legal-card">
<h2>Other services our pages load</h2>
<p>Our pages load Stripe (payments), Google Fonts, Font Awesome, GSAP, and our own agent widget from our server. Like any website, these requests can see the IP address your browser connects from.</p>
</div>
<div class="legal-card">
<h2>Email</h2>
<p>We email you about your account, your invoices and your service. Marketing email carries an unsubscribe link, and unsubscribing does not stop service email about an active account.</p>
</div>
<div class="legal-card">
<h2>What we do not do</h2>
<p>We do not sell your data. We run no affiliate programme and we pay no commission to anyone who recommends us.</p>
</div>
<div class="legal-card">
<h2>Your requests</h2>
<p>Ask us for a copy of your data, a correction, or deletion at <span class="contact-email">support@ODOO4projects.com</span>. If your account is active, deletion ends the service. We keep invoice records for as long as accounting rules require them.</p>
</div>
<div class="legal-card">
<h2>Changes</h2>
<p>We update this page when the facts change. The date at the top changes with it.</p>
</div>
</div>
</section>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
+1 -1
View File
@@ -1,3 +1,3 @@
User-agent: *
Allow: /
Sitemap: https://ODOO4projects.com/sitemap.xml
Sitemap: https://odoo4projects.com/sitemap.xml
+265 -27
View File
@@ -6,6 +6,120 @@ var si = 0,
autoStop = false,
autoInterval = 7000;
/* ---- UTM tracking helpers ---- */
(function () {
function getCookie(name) {
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? decodeURIComponent(match[2]) : null;
}
function setCookie(name, value, days) {
var expires = '';
if (days) {
var date = new Date();
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
expires = '; expires=' + date.toUTCString();
}
document.cookie = name + '=' + encodeURIComponent(value) + expires + '; path=/; SameSite=Lax';
}
function parseUTM() {
var urlParams = new URLSearchParams(window.location.search);
var utm = {};
var keys = ['source', 'medium', 'campaign'];
for (var i = 0; i < keys.length; i++) {
var val = urlParams.get('utm_' + keys[i]);
if (val) {
utm[keys[i]] = val;
setCookie('utm_' + keys[i], val, 90);
}
}
return utm;
}
function getStoredUTM() {
var utm = {};
var keys = ['source', 'medium', 'campaign'];
for (var i = 0; i < keys.length; i++) {
var val = getCookie('utm_' + keys[i]);
if (val) utm[keys[i]] = val;
}
return utm;
}
function injectUTM(data) {
var stored = getStoredUTM();
if (Object.keys(stored).length > 0) {
data.utm_source = stored.source || null;
data.utm_medium = stored.medium || null;
data.utm_campaign = stored.campaign || null;
}
return data;
}
function appendToForm(form) {
var stored = getStoredUTM();
var keys = ['source', 'medium', 'campaign'];
for (var i = 0; i < keys.length; i++) {
if (stored[keys[i]]) {
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'utm_' + keys[i];
input.value = stored[keys[i]];
form.appendChild(input);
}
}
}
function toQuery() {
var stored = getStoredUTM();
var parts = [];
var keys = ['source', 'medium', 'campaign'];
for (var i = 0; i < keys.length; i++) {
if (stored[keys[i]]) {
parts.push('utm_' + keys[i] + '=' + encodeURIComponent(stored[keys[i]]));
}
}
return parts.join('&');
}
window.UTM = { parse: parseUTM, getStored: getStoredUTM, inject: injectUTM, appendToForm: appendToForm, toQuery: toQuery };
window.UTM.parse(); // Parse on page load
})();
/* ---- Spinning Up Widget (shown when ?message=spinning_up) ---- */
(function () {
var urlParams = new URLSearchParams(window.location.search);
if (urlParams.get('message') === 'spinning_up') {
var el = document.getElementById('spinningUp');
if (el) el.style.display = 'block';
}
})();
/* ---- Hero confirmation notice (shown when ?confirm=...) ---- */
(function () {
var message = new URLSearchParams(window.location.search).get('confirm');
if (!message || !message.trim()) return;
var notice = document.getElementById('heroConfirmNotice');
if (!notice) return;
var text = notice.querySelector('.hero-notice-text');
var close = notice.querySelector('.hero-notice-close');
var hero = notice.closest('.hero');
text.textContent = message.trim();
notice.hidden = false;
if (hero) hero.classList.add('has-hero-notice');
if (close) {
close.addEventListener('click', function () {
notice.hidden = true;
if (hero) hero.classList.remove('has-hero-notice');
});
}
})();
if (slides.length > 0 && dots.length > 0) {
function show(i, direction) {
if (direction === undefined) return;
@@ -132,13 +246,15 @@ var si = 0,
yearlySave.style.display = "block";
var buyBtn = document.getElementById("orderBuyBtn");
var loc = document.getElementById("orderServerLocation").value;
var utmQuery = UTM.toQuery();
buyBtn.href =
"/3/" +
price.toFixed(2) +
"/4/" +
encodeURIComponent(plan) +
"?location=" +
encodeURIComponent(loc);
encodeURIComponent(loc) +
(utmQuery ? "&" + utmQuery : "");
widget.style.display = "flex";
orderPopupShown = true;
}
@@ -169,28 +285,16 @@ var si = 0,
.trim();
var price = parseFloat(priceText);
var loc = this.value;
var utmQuery = UTM.toQuery();
document.getElementById("orderBuyBtn").href =
"/3/" +
price.toFixed(2) +
"/4/" +
encodeURIComponent(plan) +
"?location=" +
encodeURIComponent(loc);
encodeURIComponent(loc) +
(utmQuery ? "&" + utmQuery : "");
});
function applyCoupon() {
var input = document.getElementById("orderCouponInput");
var status = document.getElementById("orderCouponStatus");
var code = input.value.trim();
if (code.toLowerCase() === "free trial") {
status.textContent =
"\u2713 Coupon FREE TRIAL applied - 1 month free";
status.style.color = "#1a7f37";
} else {
status.textContent = "Invalid coupon code";
status.style.color = "#dc3545";
}
status.style.display = "block";
}
/* ---- Blog Module ---- */
var blogState = {
allPosts: [],
@@ -269,6 +373,14 @@ var si = 0,
for (var i = 0; i < pagePosts.length; i++) {
var p = pagePosts[i];
var bc = badgeClass(p.area);
var thumbHtml = "";
if (p.image)
thumbHtml =
'<img class="blog-thumb" src="' +
p.image +
'" alt="' +
p.headline +
'" loading="lazy" />';
var agentHtml = "";
if (p.agent)
agentHtml =
@@ -277,6 +389,7 @@ var si = 0,
"</span>";
html +=
'<div class="blog-card">' +
thumbHtml +
'<div class="blog-card-top">' +
'<span class="blog-badge blog-badge-' +
bc +
@@ -443,7 +556,9 @@ var si = 0,
if (el) {
SERVERS.forEach(function(s) {
var opt = document.createElement('option');
opt.value = s.host;
// Extract city from host: api.saopaulo.odoo4projects.com -> saopaulo
var cityVal = s.host.replace('api.', '').replace('.odoo4projects.com', '');
opt.value = cityVal;
opt.textContent = s.city;
el.appendChild(opt);
});
@@ -464,8 +579,9 @@ var si = 0,
if (bestServer) {
[trialLoc, pricingLoc].forEach(function(el) {
if (el) {
var cityVal = bestServer.host.replace('api.', '').replace('.odoo4projects.com', '');
for (var i = 0; i < el.options.length; i++) {
if (el.options[i].value === bestServer.host) {
if (el.options[i].value === cityVal) {
el.selectedIndex = i;
break;
}
@@ -502,11 +618,12 @@ var si = 0,
var btn = trialForm.querySelector('.btn-brass');
btn.textContent = 'Sending...';
btn.disabled = true;
fetch('https://002-001-5dd6e535-4d1c-46bc-9bd9-42ad4bc5f082.odoo4projects.com/webhook/c25169c6-4234-4b47-8e74-612b9539da0a', {
fetch('https://n8n.odoo4projects.com/webhook/ODOO4projects/trial', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email: email, location: location })
body: JSON.stringify(UTM.inject({ email: email, location: location }))
}).then(function() {
if (window.plausible) window.plausible('Trial');
trialForm.style.display = 'none';
document.getElementById('trialSuccess').classList.add('visible');
}).catch(function() {
@@ -535,9 +652,14 @@ var si = 0,
'<div class="blog-empty">Could not load blog posts.</div>';
});
var blogSearchTracked = false;
document
.getElementById("blogSearch")
.addEventListener("input", function () {
if (!blogSearchTracked) {
blogSearchTracked = true;
if (window.plausible) window.plausible('search posts');
}
blogState.searchTerm = this.value;
blogState.currentPage = 1;
renderBlog();
@@ -609,7 +731,7 @@ var si = 0,
fetch('https://n8n.odoo4projects.com/webhook/bring-your-business', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
body: JSON.stringify(UTM.inject({
email: email,
description: description,
goals: goals,
@@ -617,10 +739,11 @@ var si = 0,
has_homepage: hasHomepage,
uses_odoo: usesOdoo,
has_developer: hasDeveloper
})
}))
}).catch(function () { /* ignore */ });
/* Show success message — we'll email the report */
if (window.plausible) window.plausible('Project Plan');
form.style.display = 'none';
success.style.display = 'block';
});
@@ -634,7 +757,7 @@ var si = 0,
var version = verSelect ? verSelect.value : '';
var form = document.createElement('form');
form.method = 'POST';
form.action = 'https://odoo.odoo4projects.com/shop/post_basket';
form.action = 'https://20.odoo4projects.com/shop/post_basket';
form.target = '_blank';
form.style.display = 'none';
var basket = document.createElement('input');
@@ -652,6 +775,7 @@ var si = 0,
clear.name = 'clear';
clear.value = '1';
form.appendChild(clear);
UTM.appendToForm(form);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
@@ -729,10 +853,124 @@ var si = 0,
document.querySelectorAll('.btn-empire').forEach(function(btn) {
btn.addEventListener('click', function() {
var plan = this.getAttribute('data-plan');
var price = parseFloat(this.getAttribute('data-price'));
var isEmpire = this.getAttribute('data-is-empire') === 'true';
if (plan) openOrderWidget(plan, price, isEmpire);
openCustomQuoteModal();
});
});
/* ---- Custom Quote Modal ---- */
function openCustomQuoteModal() {
document.getElementById('customQuotePanel').style.display = 'block';
document.getElementById('customQuoteModal').style.display = 'flex';
}
function closeCustomQuoteModal() {
document.getElementById('customQuoteModal').style.display = 'none';
document.getElementById('customQuoteForm').reset();
document.getElementById('customQuoteSuccess').style.display = 'none';
}
/* Expose to global scope so the inline onclick handlers in the modal markup can reach them */
window.openCustomQuoteModal = openCustomQuoteModal;
window.closeCustomQuoteModal = closeCustomQuoteModal;
document.addEventListener('keydown', function(e) {
if (e.key === 'Escape') {
var modal = document.getElementById('customQuoteModal');
if (modal && modal.style.display === 'flex') {
closeCustomQuoteModal();
}
}
});
/* Submit custom quote form */
var customQuoteForm = document.getElementById('customQuoteForm');
if (customQuoteForm) {
customQuoteForm.addEventListener('submit', function(e) {
e.preventDefault();
var name = document.getElementById('cqName').value.trim();
var email = document.getElementById('cqEmail').value.trim();
var requirements = document.getElementById('cqRequirements').value.trim();
if (!name || !email || !requirements) return;
var submitBtn = customQuoteForm.querySelector('.btn-lg');
submitBtn.textContent = 'Sending...';
submitBtn.disabled = true;
fetch('https://n8n.odoo4projects.com/webhook/ODOO4projects/crm', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(UTM.inject({
name: name,
email: email,
requirements: requirements,
area: 'quote'
}))
}).then(function(r) {
if (!r.ok) throw new Error('bad status ' + r.status);
if (window.plausible) window.plausible('Custom Quote');
customQuoteForm.style.display = 'none';
document.getElementById('customQuoteSuccess').style.display = 'block';
submitBtn.textContent = 'Submit Request';
submitBtn.disabled = false;
}).catch(function() {
submitBtn.textContent = 'Submit Request';
submitBtn.disabled = false;
var errorMsg = document.createElement('div');
errorMsg.style.marginTop = '1rem';
errorMsg.style.color = '#dc3545';
errorMsg.textContent = 'Something went wrong. Please try again.';
customQuoteForm.appendChild(errorMsg);
setTimeout(function() { if(errorMsg.parentNode) errorMsg.parentNode.removeChild(errorMsg); }, 3000);
});
});
}
/* Attach "Get Custom Quote" click handlers to Empire buttons */
document.querySelectorAll('.btn-empire').forEach(function(btn) {
btn.addEventListener('click', function() {
openCustomQuoteModal();
});
});
})();
/* ---- Footer contact form ---- */
(function () {
var form = document.getElementById('footerContactForm');
if (!form) return;
var emailInput = document.getElementById('footerContactEmail');
var textInput = document.getElementById('footerContactText');
var submitBtn = form.querySelector('.footer-send-btn');
var status = document.getElementById('footerFormStatus');
function showStatus(message, isError) {
status.textContent = message;
status.classList.toggle('error', !!isError);
status.classList.add('visible');
}
form.addEventListener('submit', function (e) {
e.preventDefault();
var email = emailInput.value.trim();
var text = textInput.value.trim();
if (!email || !text) return;
submitBtn.disabled = true;
status.classList.remove('visible');
fetch('https://n8n.odoo4projects.com/webhook/ODOO4projects/crm', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(UTM.inject({
email: email,
requirements: text,
area: 'message'
}))
}).then(function (r) {
if (!r.ok) throw new Error('bad status ' + r.status);
form.reset();
submitBtn.disabled = false;
showStatus("Thanks! We'll get back to you shortly.", false);
}).catch(function () {
submitBtn.disabled = false;
showStatus('Something went wrong. Please try again.', true);
});
});
})();
+218 -20
View File
@@ -1,57 +1,255 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://ODOO4projects.com/</loc>
<lastmod>2026-06-24</lastmod>
<loc>https://odoo4projects.com/</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>weekly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/news-platform-update.html</loc>
<loc>https://odoo4projects.com/odoo-hosting-2027.html</loc>
<lastmod>2026-10-26</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/australia.html</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/odoo-community-upgrade.html</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/odoo-hosting-offers/</loc>
<lastmod>2026-10-30</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/odoo-black-friday/</loc>
<lastmod>2026-10-30</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/odoo-erp-automation-bootcamp/</loc>
<lastmod>2026-10-30</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/odoo-n8n-masterclass/</loc>
<lastmod>2026-10-28</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/workshops/</loc>
<lastmod>2026-10-28</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/what-can-i-use-odoo-for/</loc>
<lastmod>2026-10-28</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/odoo-staging-environment/</loc>
<lastmod>2026-11-01</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/support.html</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>yearly</changefreq>
<priority>0.4</priority>
</url>
<url>
<loc>https://odoo4projects.com/legal.html</loc>
<lastmod>2026-10-22</lastmod>
<changefreq>yearly</changefreq>
<priority>0.4</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/oca-paraguay-internationalization-hackathon.html</loc>
<lastmod>2026-10-29</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/how-to-install-odoo-modules-using-git.html</loc>
<lastmod>2026-10-28</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/odoo-community-is-going-online-on-odoo4projects.html</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/track-the-oca-modules-you-actually-use.html</loc>
<lastmod>2026-10-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/odoo-19-to-20-invoice-migration-with-n8n-and-mcp.html</loc>
<lastmod>2026-10-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/6-tips-to-leverage-the-latest-odoo-management-app-update.html</loc>
<lastmod>2026-10-08</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/odoo-20-is-live-on-our-servers-with-an-mcp-server-and-free-backups.html</loc>
<lastmod>2026-10-06</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/community-vs-enterprise-cost.html</loc>
<lastmod>2026-10-21</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/odoocommunity-agents.html</loc>
<lastmod>2026-10-21</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/news-platform-update.html</loc>
<lastmod>2026-08-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/guide-migrate-enterprise.html</loc>
<lastmod>2026-08-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/howto-custom-module.html</loc>
<lastmod>2026-08-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/news-official-partner.html</loc>
<lastmod>2026-08-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/speed-run-backup.html</loc>
<lastmod>2026-10-21</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://odoo4projects.com/blog/posts/howto-ai-automation.html</loc>
<lastmod>2026-06-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/guide-migrate-enterprise.html</loc>
<lastmod>2026-06-20</lastmod>
<loc>https://odoo4projects.com/blog/posts/speed-run-deploy.html</loc>
<lastmod>2026-08-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/howto-custom-module.html</loc>
<lastmod>2026-06-17</lastmod>
<loc>https://odoo4projects.com/blog/posts/my-first-post.html</loc>
<lastmod>2026-10-21</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/news-official-partner.html</loc>
<lastmod>2026-06-14</lastmod>
<loc>https://odoo4projects.com/privacy.html</loc>
<lastmod>2026-10-21</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://odoo4projects.com/terms.html</loc>
<lastmod>2026-10-21</lastmod>
<changefreq>yearly</changefreq>
<priority>0.3</priority>
</url>
<url>
<loc>https://odoo4projects.com/de/</loc>
<lastmod>2026-10-26</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://odoo4projects.com/es/</loc>
<lastmod>2026-10-26</lastmod>
<changefreq>monthly</changefreq>
<priority>0.7</priority>
</url>
<url>
<loc>https://odoo4projects.com/de/support.html</loc>
<lastmod>2026-10-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/speed-run-backup.html</loc>
<lastmod>2026-06-10</lastmod>
<loc>https://odoo4projects.com/es/support.html</loc>
<lastmod>2026-10-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/howto-ai-automation.html</loc>
<lastmod>2026-06-06</lastmod>
<loc>https://odoo4projects.com/de/odoo-hosting-2027.html</loc>
<lastmod>2026-10-26</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
<priority>0.9</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/speed-run-deploy.html</loc>
<lastmod>2026-06-02</lastmod>
<loc>https://odoo4projects.com/es/odoo-hosting-2027.html</loc>
<lastmod>2026-10-26</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
<priority>0.9</priority>
</url>
<url>
<loc>https://ODOO4projects.com/blog/posts/my-first-post.html</loc>
<lastmod>2026-05-28</lastmod>
<loc>https://odoo4projects.com/de/odoo-erp-automation-bootcamp/</loc>
<lastmod>2026-10-30</lastmod>
<changefreq>monthly</changefreq>
<priority>0.6</priority>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/es/odoo-erp-automation-bootcamp/</loc>
<lastmod>2026-10-30</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/de/odoo-community-upgrade.html</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://odoo4projects.com/es/odoo-community-upgrade.html</loc>
<lastmod>2026-10-27</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
</urlset>
+1 -1
View File
@@ -3,7 +3,7 @@
const baseUrl = '/static/agent-odoo4projects';
const config = {
cssUrl: `${baseUrl}/agent.css`, // CSS file
api: `https://002-001-5dd6e535-4d1c-46bc-9bd9-42ad4bc5f082.odoo4projects.com/webhook/702862fd-dd17-4a34-8efb-e9056d2c50df/chat`, // Backend webhook endpoint
api: `https://n8n.odoo4projects.com/webhook/960d7f0f-d0ef-42a5-a8f1-79db6a7d70bd/chat`, // Backend webhook endpoint
buttonImage: `${baseUrl}/images/4.svg`, // Chat toggle button image
logoImage: `${baseUrl}/images/logo.svg`, // Logo image for chat widget
preamble: '🤔 This is the ODOO4Projects sales agent 🛠️. Besides Sales, he can help revert module installations or restart your server using your UUID and a confirmation email. 📬 For human follow-up, leave your email.' // Initial bot message
+55
View File
@@ -0,0 +1,55 @@
/* buy.js — page-local checkout helper (progressive enhancement).
*
* The checkout itself is a native <form method="post" target="_blank"> that posts
* basket=[{"product_id":12,"qty":1}] + clear=1 to
* https://20.odoo4projects.com/shop/post_basket. With JavaScript off it still works.
*
* This file only adds attribution: on submit it appends the utm_* hidden inputs
* from the cookies, then lets the native submit proceed (it never preventDefault).
*
* The UTM helpers mirror `script.js` `buyNow()` — the main page's checkout path.
* If that changes, change this too.
*/
(function () {
'use strict';
/* ---- UTM tracking helpers (verbatim from script.js) ---- */
function getCookie(name) {
var match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
return match ? decodeURIComponent(match[2]) : null;
}
function getStoredUTM() {
var utm = {};
var keys = ['source', 'medium', 'campaign'];
for (var i = 0; i < keys.length; i++) {
var val = getCookie('utm_' + keys[i]);
if (val) utm[keys[i]] = val;
}
return utm;
}
function appendToForm(form) {
var stored = getStoredUTM();
var keys = ['source', 'medium', 'campaign'];
for (var i = 0; i < keys.length; i++) {
if (stored[keys[i]] && !form.elements['utm_' + keys[i]]) {
var input = document.createElement('input');
input.type = 'hidden';
input.name = 'utm_' + keys[i];
input.value = stored[keys[i]];
form.appendChild(input);
}
}
}
/* ---- Progressive enhancement: add UTM inputs to the native basket form ----
Capture phase, so the inputs are in the form before the browser serialises it.
No preventDefault — the native POST proceeds untouched. */
document.addEventListener('submit', function (e) {
var form = e.target;
if (!form || form.tagName !== 'FORM') return;
if (!form.querySelector('input[name="basket"]')) return;
appendToForm(form);
}, true);
})();
+44
View File
@@ -0,0 +1,44 @@
/* ODOO4projects lang selector + EN-homepage auto-detect, <script defer src="/static/lang.js">.
Inert on /de/ & /es/; stored choice (?lang= or click) wins forever; detect once per session; no loop.
ES5, no deps. Contract: work/i18n/I18N-BUILD-PLAN.md */
(function () {
"use strict";
var HOME={en:"/",de:"/de/",es:"/es/"},ORDER=["en","de","es"],KEY="o4p_lang",SESS="o4p_lang_checked",YEAR=31536000;
function ls(){try{return window.localStorage||null}catch(e){return null}}
function ss(){try{return window.sessionStorage||null}catch(e){return null}}
function rd(s,k){try{return s?s.getItem(k):null}catch(e){return null}}
function wr(s,k,v){try{if(s)s.setItem(k,v)}catch(e){}}
function gck(k){try{var m=(document.cookie||"").match(new RegExp("(?:^|;\\s*)"+k+"=([^;]*)"));return m?decodeURIComponent(m[1]):null}catch(e){return null}}
function sck(k,v){try{document.cookie=k+"="+encodeURIComponent(v)+";path=/;max-age="+YEAR+";SameSite=Lax"}catch(e){}}
function stored(){return rd(ls(),KEY)||gck(KEY)}
function remember(l){wr(ls(),KEY,l);sck(KEY,l)}
function cur(){var p=location.pathname||"/";return /^\/de(\/|$)/.test(p)?"de":/^\/es(\/|$)/.test(p)?"es":"en"}
function enHome(){var p=location.pathname||"/";return p==="/"||p===""||/^\/index\.html$/i.test(p)}
/* equivalent page in another lang: this page's hreflang alternate, else that lang's homepage */
function urlFor(l){var a,i,h;try{a=document.querySelectorAll('link[rel="alternate"][hreflang]')}catch(e){a=[]}
for(i=0;i<(a?a.length:0);i++){h=(a[i].getAttribute("hreflang")||"").toLowerCase();if(!h)continue;
if(l==="en"&&(h==="en"||h.indexOf("en-")===0))return a[i].href;if(h===l)return a[i].href}return HOME[l]}
var c=cur();
/* (1) explicit ?lang= wins and is remembered */
var q=(location.search||"").match(/[?&]lang=(en|de|es)(?:&|$)/i);
if(q){var pick=q[1].toLowerCase();remember(pick);if(pick!==c){location.replace(urlFor(pick));return}}
/* (2) auto-detect: EN homepage only, once per session, never over a stored choice */
if(c==="en"&&enHome()&&!stored()&&rd(ss(),SESS)!=="1"){wr(ss(),SESS,"1");var pref="";
try{pref=(navigator.languages&&navigator.languages[0])||navigator.language||""}catch(e){pref=""}
pref=String(pref).toLowerCase();
if(pref.indexOf("de")===0){location.replace(HOME.de);return}
if(pref.indexOf("es")===0){location.replace(HOME.es);return}}
/* (3) switcher EN | DE | ES */
render(c);
function render(current){var nav=document.createElement("nav"),i,a;nav.className="lang-switch";nav.setAttribute("aria-label","Language");
for(i=0;i<ORDER.length;i++){a=document.createElement("a");a.href=urlFor(ORDER[i]);a.textContent=ORDER[i].toUpperCase();
a.setAttribute("hreflang",ORDER[i]==="en"?"en-US":ORDER[i]);if(ORDER[i]===current)a.setAttribute("aria-current","true");
/* a click is an explicit choice: remember it, or the auto-detect bounces the visitor back */
a.onclick=function(){var l=String(this.getAttribute("hreflang")||"").toLowerCase();remember(l.indexOf("en")===0?"en":l)};
nav.appendChild(a);if(i<ORDER.length-1)nav.appendChild(document.createTextNode(" | "))}
var slot=null;try{slot=document.querySelector("[data-lang-switcher]")}catch(e){slot=null}
try{if(!document.getElementById("o4p-lang-style")){var s=document.createElement("style");s.id="o4p-lang-style";
s.appendChild(document.createTextNode(".lang-switch{font:600 12px/1 Inter,system-ui,sans-serif;letter-spacing:.06em;white-space:nowrap}.lang-switch a{color:inherit;text-decoration:none}.lang-switch a[aria-current=true]{color:#a3801a;text-decoration:underline}.lang-switch--float{position:fixed;top:10px;right:12px;z-index:99;background:rgba(244,240,232,.92);border:1px solid rgba(201,162,39,.4);border-radius:999px;padding:6px 12px;color:#0d1b2e}"));
document.head.appendChild(s)}
if(slot){slot.appendChild(nav)}else{nav.className="lang-switch lang-switch--float";document.body.appendChild(nav)}}catch(e){}}
})();
+104 -16
View File
@@ -663,7 +663,7 @@ img { max-width: 100%; height: auto; vertical-align: middle; }
transition: all 0.2s;
}
.ow-close:hover { background: var(--cream); color: var(--ink); }
.ow-content { padding: 2rem; }
.ow-content { padding: 2rem; color: var(--ink); }
.ow-title { font-family: Marcellus, Georgia, serif; font-size: clamp(1rem, 2vw, 1.24rem); margin-bottom: 0.5rem; color: var(--midnight); }
.ow-price { font-size: 0.85rem; color: var(--ink-soft); margin-bottom: 1rem; }
.ow-price .ow-price-amount { font-size: 1rem; font-weight: 600; color: var(--midnight); }
@@ -708,6 +708,7 @@ img { max-width: 100%; height: auto; vertical-align: middle; }
border-color: var(--brass);
box-shadow: var(--shadow-hover);
}
.blog-thumb { display: block; width: 100%; aspect-ratio: 16/9; object-fit: cover; border-radius: 0.5rem; margin-bottom: 0.75rem; }
.blog-card-top { display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem; flex-wrap: wrap; }
.blog-badge {
display: inline-block; padding: 0.2rem 0.6rem; border-radius: 3rem;
@@ -920,23 +921,76 @@ img { max-width: 100%; height: auto; vertical-align: middle; }
}
.fcopy a { color: rgba(255,255,255,0.4); }
.fcopy a:hover { color: var(--brass); }
.footer-email {
display: inline-block;
margin-top: 0.75rem;
padding: 0.5rem 0.8rem;
background: rgba(201,162,39,0.08);
border: 1px solid rgba(201,162,39,0.25);
.footer-contact-form {
margin-top: 1.25rem;
display: flex;
flex-direction: column;
gap: 0.6rem;
}
.footer-contact-form input[type="email"],
.footer-contact-form textarea {
width: 100%;
padding: 0.6rem 0.8rem;
border-radius: var(--radius);
color: var(--brass);
font-family: Inter, sans-serif;
font-size: 0.85rem;
transition: all 0.2s;
}
.footer-email:hover {
background: rgba(201,162,39,0.12);
border-color: var(--brass);
border: 1px solid var(--line-brass);
background: rgba(255,255,255,0.06);
color: #fff;
font-family: Inter, sans-serif;
font-size: 0.82rem;
line-height: 1.6;
outline: none;
box-sizing: border-box;
transition: border-color 0.2s, background 0.2s;
}
.footer-contact-form input[type="email"]:focus,
.footer-contact-form textarea:focus {
border-color: var(--brass);
background: rgba(255,255,255,0.1);
}
.footer-contact-form input[type="email"]::placeholder,
.footer-contact-form textarea::placeholder {
color: rgba(255,255,255,0.3);
}
.footer-textarea-wrap { position: relative; }
.footer-contact-form textarea {
min-height: 84px;
padding-right: 2.6rem;
resize: vertical;
}
.footer-send-btn {
position: absolute;
right: 0.45rem;
bottom: 0.45rem;
width: 1.9rem;
height: 1.9rem;
border: none;
border-radius: 50%;
background: var(--brass);
color: var(--midnight);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
font-size: 0.72rem;
transition: background 0.2s, transform 0.2s;
}
.footer-send-btn:hover {
background: var(--brass-bright);
transform: translateY(-1px);
}
.footer-send-btn:disabled {
opacity: 0.6;
cursor: default;
transform: none;
}
.footer-form-status {
font-size: 0.82rem;
line-height: 1.4;
color: #4ade80;
display: none;
}
.footer-form-status.visible { display: block; }
.footer-form-status.error { color: #ef4444; }
@media (max-width: 768px) {
.fgrid { grid-template-columns: 1fr; }
.footer { padding-top: 2.5rem; padding-bottom: 5rem; }
@@ -969,4 +1023,38 @@ img { max-width: 100%; height: auto; vertical-align: middle; }
.blog-section-dark .blog-badge-guide { background: #a78bfa; }
.blog-section-dark .blog-badge-howto { background: #00f5ff; }
.blog-section-dark .blog-badge-news { background: #ffaa00; }
.blog-section-dark .blog-badge-default { background: #a78bfa; }
.blog-section-dark .blog-badge-default { background: #a78bfa; }
/* ---- Spinning Up Widget ---- */
.spinning-up {
background: #0d1b2e;
padding: 3rem 0;
text-align: center;
}
.spinning-card {
display: inline-block;
background: rgba(201,162,39,0.08);
border: 1px solid rgba(201,162,39,0.25);
border-radius: var(--radius-lg);
padding: 2rem;
max-width: 600px;
}
.spinning-card i {
color: var(--brass);
font-size: 3rem;
margin-bottom: 1.25rem;
display: block;
}
.spinning-card h3 {
color: #fff;
font-size: 1.6rem;
margin-bottom: 0.75rem;
}
.spinning-card p {
color: rgba(255,255,255,0.7);
margin: 0 0 0.75rem 0;
}
.spinning-note {
font-size: 0.9rem;
color: var(--brass);
}
+67 -29
View File
@@ -8,11 +8,15 @@
content="Support and FAQ for ODOO4projects hosting. Get help with your Odoo instance, modules, backups, domains, and more."
/>
<title>Support | ODOO4projects</title>
<link rel="canonical" href="https://ODOO4projects.com/support" />
<link rel="canonical" href="https://odoo4projects.com/support.html" />
<link rel="alternate" hreflang="en-US" href="https://odoo4projects.com/support.html" />
<link rel="alternate" hreflang="de" href="https://odoo4projects.com/de/support.html" />
<link rel="alternate" hreflang="es" href="https://odoo4projects.com/es/support.html" />
<link rel="alternate" hreflang="x-default" href="https://odoo4projects.com/support.html" />
<meta property="og:title" content="Support | ODOO4projects" />
<meta property="og:description" content="Support and FAQ for ODOO4projects hosting." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://ODOO4projects.com/support" />
<meta property="og:url" content="https://odoo4projects.com/support.html" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="images/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
@@ -27,6 +31,21 @@
/>
<link rel="stylesheet" href="style.css" />
<style>
/* Language selector — the page's top row: the back-link stays left, the selector travels right.
Cream canvas, so lang.js's own dark-brass active colour is the correct one (no override). */
.blog-header {
display: flex;
align-items: center;
}
.blog-header > a {
margin-right: auto;
}
.blog-header .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
/* ---- Support Hero ---- */
.support-hero {
padding: 4rem 0 2.5rem;
@@ -249,11 +268,19 @@
.contact-form { padding: 1.25rem; }
}
</style>
<!-- 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>
<div class="container">
<div class="blog-header">
<a href="index.html">&larr; Back to Home</a>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
@@ -300,7 +327,7 @@
<!-- First Steps -->
<div class="faq-panel active" id="panel-first-steps">
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>My Odoo seems empty. What can I do with it?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -317,20 +344,22 @@
<li><strong>Event company</strong>: Install Events and Website apps.</li>
</ul>
<p>No matter your business type, you can pick the apps that match your needs, and gradually build your Odoo system step by step.</p>
<p>If you are at the very start &mdash; choosing a plan, deploying your instance, mapping your first domain &mdash; our guide on <a href="blog/posts/my-first-post.html">getting started with Odoo hosting</a> walks through it step by step.</p>
<p>If the question you are asking is bigger than the apps — <em>what can I use Odoo for at all, and is it right for my kind of business?</em> — we have written that answer out properly, business type by business type: <a href="what-can-i-use-odoo-for/">what you can use Odoo for</a>.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How do I install a new app?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Open the Apps menu, search for the app you want, and click Install. Once installed, the app will appear in your main menu, ready to use. For additional apps not included by default, you can also install them via Git or use our one-click Quick Git feature for faster setup.</p>
<p>All Odoo Community apps are included, and more free apps can be found at <a href="https://odoo-community.org/" target="_blank" rel="noopener">odoo-community.org</a>.</p>
<p>Open the Apps menu, search for the app you want, and click Install. That covers every app that ships with Odoo Community, and it works on every plan.</p>
<p>Apps that are not part of Odoo Community — custom modules and modules from <a href="https://odoo-community.org/" target="_blank" rel="noopener">odoo-community.org</a> — are installed for you by Git or with our one-click Quick Git. Custom and OCA modules install from On the Rise up. Side Hustle has no module installation.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How do I add my email Server for sending messages from Odoo?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -340,7 +369,7 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How do I change my login name or password?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -354,7 +383,7 @@
<!-- Advanced Users -->
<div class="faq-panel" id="panel-advanced">
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>Do I get SSH access to my service?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -363,7 +392,7 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How do I configure my Backup frequency?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -372,7 +401,7 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How long are Backups stored?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -381,7 +410,7 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How do I route my domain to my Odoo?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -391,7 +420,7 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How can I install Odoo Enterprise?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -404,16 +433,17 @@
<!-- Trouble Shooting -->
<div class="faq-panel" id="panel-trouble">
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>After a git check in, my server does not come up again or shows an error 500</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>If you've pushed a new module to the server and it prevents the service from starting, first revert your changes in Git and push the corrected version back to the server. Then open the support chat — you'll need your UUID (sent in the confirmation email). After you tell our chatbot to git pull and restart the server, you'll receive a confirmation email; once confirmed, we'll bring your Odoo instance back online.</p>
<p>Before you check in a change like this, read <a href="/odoo-staging-environment/">test it safely first</a>: a staging environment is what stops a bad check-in taking your server down, and most small businesses do not need one.</p>
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>Why does my domain show an "Unknown Certificate" or "Bad Gateway"?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -426,7 +456,7 @@
<!-- Commercial -->
<div class="faq-panel" id="panel-commercial">
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>Is the Odoo Enterprise License included?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -435,7 +465,7 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How can I upgrade my service?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -448,7 +478,7 @@
<!-- Bring your Database -->
<div class="faq-panel" id="panel-migrate">
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>How can I migrate my Odoo database from another service provider?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
@@ -458,12 +488,13 @@
</div>
</div>
<div class="faq-item">
<button class="faq-question">
<button class="faq-question plausible-event-name=FAQ">
<span>Can I update my Odoo database from an older version, e.g., 14 &rarr; 19?</span>
<span class="faq-icon"><i class="fas fa-chevron-down"></i></span>
</button>
<div class="faq-answer">
<p>Yes, we can help you upgrade your database from older versions to a supported release (17, 18, or 19), but only after reviewing your database to ensure compatibility. Please submit a support ticket to start the process.</p>
<p>The full process, and the commands a developer would run, are explained on our <a href="odoo-community-upgrade.html">Odoo Community upgrade page</a>.</p>
</div>
</div>
</div>
@@ -474,8 +505,7 @@
<section class="contact-section" id="contact">
<div class="container">
<h2>Still questions? Contact our support.</h2>
<form class="contact-form" id="supportForm" action="https://ODOO4projects.com/website/form/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="csrf_token" id="csrfToken" value="" />
<form class="contact-form" id="supportForm">
<div class="form-group">
<label>Your Name <span class="required">*</span></label>
<input type="text" id="contactName" name="contact_name" required placeholder="Your Name" />
@@ -528,23 +558,31 @@
var form = document.getElementById("supportForm");
var submitBtn = form.querySelector(".btn");
var successDiv = document.getElementById("formSuccess");
fetch("https://ODOO4projects.com/web/csrf_token")
.then(function (r) { return r.json(); })
.then(function (data) {
document.getElementById("csrfToken").value = data.result || data.csrf_token || "";
}).catch(function () {});
form.addEventListener("submit", function (e) {
e.preventDefault();
var name = document.getElementById("contactName").value.trim();
var email = document.getElementById("contactEmail").value.trim();
var uuid = document.getElementById("contactUuid").value.trim();
var subject = document.getElementById("contactSubject").value.trim();
var question = document.getElementById("contactQuestion").value.trim();
if (!name || !email || !subject || !question) { alert("Please fill in all required fields."); return; }
submitBtn.disabled = true;
submitBtn.textContent = "Submitting...";
fetch(form.action, { method: "POST", body: new FormData(form) })
.then(function () { submitBtn.style.display = "none"; successDiv.classList.add("visible"); })
.catch(function () { submitBtn.disabled = false; submitBtn.textContent = "Submit"; alert("Could not submit. Please try again."); });
var payload = { name: name, email: email, subject: subject, requirements: question, area: "support" };
if (uuid) payload.uuid = uuid;
fetch("https://n8n.odoo4projects.com/webhook/ODOO4projects/crm", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
}).then(function (r) {
if (!r.ok) throw new Error("bad status " + r.status);
submitBtn.style.display = "none";
successDiv.classList.add("visible");
}).catch(function () {
submitBtn.disabled = false;
submitBtn.textContent = "Submit";
alert("Could not submit. Please try again.");
});
});
</script>
+198
View File
@@ -0,0 +1,198 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta
name="description"
content="Terms of Service for ODOO4projects LLC — plans, the free trial, payment, cancellation and your data."
/>
<title>Terms of Service | ODOO4projects</title>
<link rel="canonical" href="https://odoo4projects.com/terms.html" />
<meta property="og:title" content="Terms of Service | ODOO4projects" />
<meta property="og:description" content="The rules of the ODOO4projects service." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/terms.html" />
<meta name="twitter:card" content="summary_large_image" />
<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;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="style.css" />
<style>
.legal-hero {
padding: 4rem 0 2.5rem;
text-align: center;
background: var(--light);
border-bottom: 1px solid var(--border);
}
.legal-hero h1 {
font-size: clamp(1.8rem, 3.2vw, 2.8rem);
color: var(--dark);
}
.legal-section {
padding: 3rem 0 4rem;
}
.legal-section .container {
max-width: 700px;
}
.legal-card {
background: #fff;
border: 1px solid var(--border);
border-radius: var(--radius-lg);
padding: 1.75rem;
margin-bottom: 1.25rem;
}
.legal-card:last-child {
margin-bottom: 0;
}
.legal-card h2 {
font-size: 1.05rem;
font-weight: 600;
color: var(--primary);
margin-bottom: 0.75rem;
padding-bottom: 0.5rem;
border-bottom: 1px solid var(--border);
}
.legal-card p,
.legal-card .address {
color: rgba(33, 37, 41, 0.7);
font-size: 0.88rem;
line-height: 1.7;
margin-bottom: 0.4rem;
}
.legal-card strong {
color: var(--dark);
}
.legal-card .contact-email {
color: var(--primary);
font-weight: 500;
}
.image-credits {
display: flex;
flex-direction: column;
gap: 0.3rem;
}
.image-credits .credit-row {
color: rgba(33, 37, 41, 0.6);
font-size: 0.82rem;
}
.image-credits .credit-row a {
color: var(--primary);
}
.trademark-notice {
background: rgba(113, 75, 103, 0.04);
border: 1px solid rgba(113, 75, 103, 0.15);
border-radius: var(--radius);
padding: 1rem 1.25rem;
}
.trademark-notice p {
font-size: 0.82rem;
margin: 0;
color: rgba(33, 37, 41, 0.6);
}
@media (max-width: 768px) {
.legal-hero { padding: 2.5rem 0 1.5rem; }
.legal-card { padding: 1.25rem; }
}
</style>
<!-- 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>
</head>
<body>
<div class="container">
<div class="blog-header">
<a href="index.html">&larr; Back to Home</a>
</div>
</div>
<section class="legal-hero">
<div class="container">
<h1>Terms of Service</h1>
<p style="margin-top: 0.5rem; color: rgba(33, 37, 41, 0.6); font-size: 0.85rem;">
Last updated 2026-10-21
</p>
</div>
</section>
<section class="legal-section">
<div class="container">
<div class="legal-card">
<h2>Who we are</h2>
<p>ODOO4projects LLC, 30 N Gould St, STE R, Sheridan, WY 82801, USA. Contact: <span class="contact-email">support@ODOO4projects.com</span></p>
<p>These terms cover the hosting service we sell on this website.</p>
</div>
<div class="legal-card">
<h2>The service</h2>
<p>We host and manage an Odoo Community instance for you. We run the server, the backups, the SSL certificate and the updates. You use the instance to run your business.</p>
</div>
<div class="legal-card">
<h2>Your plan</h2>
<p>Every app that ships with Odoo Community is available on every plan. Custom modules and modules from odoo-community.org install from On the Rise up. Side Hustle has no module installation.</p>
<p>Backup slots and domain routings are listed on the pricing page and in the app. Side Hustle keeps one backup slot and one domain; On the Rise and Powerhouse keep four backups and three domains.</p>
</div>
<div class="legal-card">
<h2>The free trial</h2>
<p>The trial runs for 30 days from signup and there is one way to start it: sign up. No credit card is needed to start.</p>
<p>The trial has no backups, no domain mapping and no module installation.</p>
</div>
<div class="legal-card">
<h2>Price and payment</h2>
<p>Plans are billed yearly, in advance, in US dollars, plus tax where it applies. Payment is taken by card through Stripe. The current prices are the ones on the pricing page.</p>
</div>
<div class="legal-card">
<h2>Cancelling</h2>
<p>You can cancel at any time. Cancelling stops the next renewal. It does not refund the period you have already paid for. We make no refund promise beyond what is written here.</p>
</div>
<div class="legal-card">
<h2>Version upgrades and migrations</h2>
<p>Ask our support team for a version upgrade. We migrate databases on the main Odoo releases 17, 18 and 19. We do not support patch releases such as 18.1.</p>
</div>
<div class="legal-card">
<h2>Your data</h2>
<p>Your data is yours. You can export it from your instance at any time. We hold it only to run the service for you, as described in the <a href="privacy.html">Privacy Policy</a>.</p>
</div>
<div class="legal-card">
<h2>What you must not do</h2>
<p>Do not use the service for anything unlawful, do not resell it as your own, and do not attempt to interfere with the platform or with other customers' instances.</p>
</div>
<div class="legal-card">
<h2>Availability and maintenance</h2>
<p>The service needs restarts, patches and maintenance from time to time. We keep interruptions as short as we can and we do not promise a fixed uptime figure.</p>
</div>
<div class="legal-card">
<h2>Changes to these terms</h2>
<p>We update these terms when the service changes. The date at the top changes with them.</p>
</div>
<div class="legal-card">
<h2>Governing law</h2>
<p>These terms are governed by the laws of the State of Wyoming, United States.</p>
</div>
</div>
</section>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>
+955
View File
@@ -0,0 +1,955 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>What Can I Use Odoo For? What Odoo Does, and What It Costs</title>
<meta
name="description"
content="Odoo runs stock, invoicing, CRM, website and projects in one place. What you can use Odoo for, what is free, and how to get it running in about five minutes."
/>
<link rel="canonical" href="https://odoo4projects.com/what-can-i-use-odoo-for/" />
<meta property="og:title" content="What Can I Use Odoo For? What Odoo Does, and What It Costs" />
<meta
property="og:description"
content="Stock, invoicing, CRM, projects and a website in one system. What Odoo is used for, what it costs, and the shortest route to running it."
/>
<meta property="og:type" content="article" />
<meta property="og:url" content="https://odoo4projects.com/what-can-i-use-odoo-for/" />
<meta name="twitter:card" content="summary_large_image" />
<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>
/* ---- "What Can I Use Odoo For?" guide page (page-scoped; additive).
The block below is odoo-community-upgrade.html's page-scoped CSS, reused so
this guide shares the site's top bar, band rhythm and FAQ treatment, plus the
comparison-table block already in use on odoo-hosting-2027.html. One addition
only: .wd-wrap, the prose column for the app table's surrounding copy. ---- */
.oc-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) */
.cmp-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.cmp-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.cmp-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.cmp-brand span {
color: var(--brass);
}
.cmp-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
margin-left: auto;
}
.cmp-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar-links a:hover {
color: var(--brass);
}
.cmp-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.cmp-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.cmp-topbar .lang-switch a:hover,
.cmp-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.cmp-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero */
.oc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
}
.oc-hero .container {
position: relative;
z-index: 1;
}
.oc-hero h1 span {
color: var(--brass);
}
.oc-hero .hero-sub {
max-width: 760px;
}
.oc-hero-img {
position: absolute;
inset: 0;
width: 100%;
height: 100%;
object-fit: cover;
object-position: center;
opacity: 0.25;
filter: brightness(1.15) saturate(1.1);
}
/* Prose column */
.oc-body {
max-width: 760px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .oc-body {
color: rgba(255, 255, 255, 0.78);
}
.oc-body p:last-child {
margin-bottom: 0;
}
.oc-body strong {
color: var(--ink);
}
.section-dark .oc-body strong {
color: #fff;
}
.section-dark .oc-body a {
color: var(--brass-bright);
}
/* The one addition: the app table's lead-in and closing line keep the same
column width as .oc-body, so the table and the prose line up. */
.wd-wrap {
max-width: 820px;
margin: 0 auto;
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .wd-wrap {
color: rgba(255, 255, 255, 0.78);
}
.wd-wrap p:last-child {
margin-bottom: 0;
}
/* Sub-sections (the business types) */
.oc-sub {
margin-top: 2.25rem;
}
.oc-sub h3 {
color: var(--ink);
margin-bottom: 0.35rem;
}
.oc-sub > p {
color: var(--ink-soft);
line-height: 1.75;
}
.section-dark .oc-sub h3 {
color: var(--cream);
}
.section-dark .oc-sub > p {
color: rgba(255, 255, 255, 0.78);
}
/* Numbered how-to-start list */
.oc-steps {
max-width: 820px;
margin: 0 auto;
padding: 0;
list-style: none;
counter-reset: oc-step;
}
.oc-steps li {
position: relative;
counter-increment: oc-step;
padding: 0 0 1.4rem 3.2rem;
color: rgba(255, 255, 255, 0.78);
line-height: 1.7;
border-left: 1px solid rgba(201, 162, 39, 0.25);
margin-left: 1rem;
}
.oc-steps li::before {
content: counter(oc-step);
position: absolute;
left: -1.05rem;
top: -0.15rem;
width: 2.1rem;
height: 2.1rem;
display: flex;
align-items: center;
justify-content: center;
font-family: Marcellus, Georgia, serif;
font-size: 1rem;
color: var(--midnight);
background: var(--brass);
border-radius: 50%;
}
.oc-steps li strong {
color: #fff;
font-weight: 600;
}
.oc-steps li em {
color: rgba(255, 255, 255, 0.9);
}
.oc-steps li:last-child {
padding-bottom: 0;
}
/* App table (the same block odoo-hosting-2027.html uses) */
.cmp-table-wrap {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
border-radius: var(--radius-lg);
border: 1px solid var(--line-brass);
background: rgba(255, 255, 255, 0.03);
margin: 1.5rem 0 1.5rem;
}
.cmp-table {
width: 100%;
border-collapse: collapse;
min-width: 640px;
}
.cmp-table th,
.cmp-table td {
padding: 0.7rem 0.9rem;
font-size: 0.85rem;
text-align: left;
vertical-align: top;
border-bottom: 1px solid rgba(201, 162, 39, 0.1);
}
.cmp-table thead th {
font-family: Marcellus, Georgia, serif;
font-size: 0.82rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--brass);
background: rgba(13, 27, 46, 0.55);
border-bottom: 1px solid var(--line-brass);
white-space: normal;
line-height: 1.3;
}
.cmp-table tbody th {
font-family: Inter, sans-serif;
font-weight: 600;
font-size: 0.82rem;
color: #fff;
background: rgba(255, 255, 255, 0.02);
}
.cmp-table td {
color: rgba(255, 255, 255, 0.78);
line-height: 1.5;
}
.cmp-table tbody tr:hover td,
.cmp-table tbody tr:hover th {
background: rgba(201, 162, 39, 0.06);
}
.cmp-table tbody tr:last-child th,
.cmp-table tbody tr:last-child td {
border-bottom: none;
}
/* FAQ */
.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],
.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 .cmp-a {
font-size: 0.87rem;
color: var(--ink-soft);
line-height: 1.7;
padding-bottom: 1rem;
}
.cmp-faq .cmp-a p:last-child {
margin-bottom: 0;
}
/* Focus states on every CTA */
.btn:focus-visible,
.cmp-topbar-links a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
@media (max-width: 768px) {
.cmp-faq-grid {
grid-template-columns: 1fr;
}
.oc-hero {
padding: 3rem 0 2.5rem;
}
.oc-steps li {
padding-left: 2.6rem;
}
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@graph": [
{
"@type": "WebPage",
"@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#webpage",
"url": "https://odoo4projects.com/what-can-i-use-odoo-for/",
"name": "What Can I Use Odoo For?",
"description": "Odoo runs stock, invoicing, CRM, website and projects in one place. What you can use Odoo for, what is free, and how to get it running in about five minutes.",
"inLanguage": "en-US",
"isPartOf": { "@id": "https://odoo4projects.com/#organization" },
"breadcrumb": { "@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#breadcrumb" },
"mainEntity": { "@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#article" }
},
{
"@type": "Article",
"@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#article",
"headline": "What Can I Use Odoo For? What Odoo Does, and What It Costs",
"description": "Odoo runs stock, invoicing, CRM, website and projects in one place. What you can use Odoo for, what is free, and how to get it running in about five minutes.",
"articleSection": [
"What Odoo actually is",
"What you can run on Odoo",
"What Odoo is used for, by business type",
"What Odoo is not for",
"What it costs to use Odoo",
"How to start using Odoo",
"Frequently asked questions"
],
"inLanguage": "en-US",
"datePublished": "2026-10-28",
"dateModified": "2026-10-28",
"author": { "@id": "https://odoo4projects.com/#organization" },
"publisher": { "@id": "https://odoo4projects.com/#organization" },
"mainEntityOfPage": { "@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#webpage" }
},
{
"@type": "FAQPage",
"@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#faq",
"isPartOf": { "@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#webpage" },
"mainEntity": [
{
"@type": "Question",
"name": "What is Odoo used for?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Odoo is used to run the parts of a business that produce paperwork and numbers: sales and quotes, customer invoices and supplier bills, stock and purchasing, manufacturing, projects and timesheets, the website and its orders, the till, and the employee records behind payroll. All of it works on one database, so stock, orders and accounts agree with each other instead of being reconciled at month end."
}
},
{
"@type": "Question",
"name": "What can Odoo do?",
"acceptedAnswer": {
"@type": "Answer",
"text": "It holds stock by location, raises a supplier order when a reorder rule trips, turns a quote into a sales order and that order into an invoice, takes payment, reconciles the bank statement, and reports what the month looked like. It does the same job for manufacturing, for services billed by the hour, and for a shop with a till and a website. You install the apps that apply to you."
}
},
{
"@type": "Question",
"name": "Can I use Odoo for free?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Odoo Community is free and open source, and you can install and run it yourself at no licence cost. What is not free is the running of it: a server or VPS, someone's hours on updates and backups, and the certificate. If you want Community without that work, hosting is a paid service, ours starting at $214 a year."
}
},
{
"@type": "Question",
"name": "How is Odoo free if it is also sold per user?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Two different editions. Community is open source and carries no licence and no per-user charge; Enterprise is the licensed edition, sold per user by Odoo S.A. Enterprise exists for the extra apps and official support, not because Community is crippled. Plenty of businesses run Community for years and never buy a licence."
}
},
{
"@type": "Question",
"name": "Can I use Odoo for dropshipping?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes. Odoo has dropshipping built in as a purchase route: you enable the Dropshipping setting, mark the product so it can be sold and purchased, and set its vendor. A sales order then raises the supplier request for quotation automatically, and the supplier ships to your customer. Two things to know: a dropshipped product never enters your stock, so it does not appear in your stock valuation, and no custom module is needed for any of it."
}
},
{
"@type": "Question",
"name": "Is Odoo easy to use?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Daily use is straightforward once someone has set it up: a sale, an invoice and a stock move are each a few clicks and Odoo's own screens are consistent between apps. Setting it up is the part that is not easy, and Odoo's own documentation is written for an administrator rather than for an owner. The practical split is that you learn the business screens in an afternoon and hand the configuration and the server to someone who does it for a living."
}
},
{
"@type": "Question",
"name": "Can Odoo be used for project management?",
"acceptedAnswer": {
"@type": "Answer",
"text": "Yes, and for many service businesses it is the reason they moved. The Project app gives you tasks on a board, deadlines, sub-tasks, customer-facing stages, and timesheets against each job, so the hours you spent become the invoice you send. If you already run projects in a separate tool, the question is whether you want the hours and the invoice in the same system."
}
},
{
"@type": "Question",
"name": "Do I need a developer to run Odoo?",
"acceptedAnswer": {
"@type": "Answer",
"text": "No, not to run it. You need a developer if you are installing custom modules or writing your own, and you need somebody technical once, to set the system up properly. After that, ordinary use is a browser login: install apps, enter your products, raise invoices, look at reports. The developer question usually arrives with a custom module, not with day-to-day work."
}
},
{
"@type": "Question",
"name": "How long before it is useful?",
"acceptedAnswer": {
"@type": "Answer",
"text": "A day for the first app, with the owner's decisions on the chart of accounts and the products. A week of real use before it is genuinely running your month. An instance on our plans is live in about five minutes; the rest of the time goes on your own data and your own decisions."
}
}
]
},
{
"@type": "BreadcrumbList",
"@id": "https://odoo4projects.com/what-can-i-use-odoo-for/#breadcrumb",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"name": "Home",
"item": "https://odoo4projects.com/"
},
{
"@type": "ListItem",
"position": 2,
"name": "What Can I Use Odoo For?",
"item": "https://odoo4projects.com/what-can-i-use-odoo-for/"
}
]
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="cmp-topbar">
<div class="container">
<a class="cmp-brand" href="/index.html">ODOO4<span>projects</span></a>
<nav class="cmp-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: the question, answered in the first hundred words -->
<section class="hero oc-hero">
<div class="hero-bg">
<img
class="oc-hero-img"
src="/images/hero/boston.webp"
alt="Boston at night — one of the six regions our servers run in"
width="1920"
height="768"
fetchpriority="high"
decoding="async"
/>
</div>
<div class="container">
<p class="hero-kicker">USING ODOO</p>
<h1>What Can I Use Odoo For?</h1>
<p class="hero-sub">
Odoo is business software you install a piece at a time. Stock, sales, invoicing, accounting,
purchasing, manufacturing, projects, a website, a point of sale and HR are separate apps in one
system, sharing one database. A shop uses it for stock and a till. A workshop uses it for quotes,
jobs and supplier orders. A distributor uses it for orders, deliveries and invoices. An office uses
it for timesheets and billing. Odoo Community is free and open source, so nobody is charged a
licence for logging in.
</p>
</div>
</section>
<!-- What Odoo is -->
<section class="section-light">
<div class="container">
<p class="section-kicker">The plain definition</p>
<h2 class="section-title">What Odoo actually is</h2>
<div class="oc-body">
<p>
Odoo is an ERP system: a set of applications that all read and write the same database. Odoo S.A.
publishes two editions. Community is open source and free to run, and it is the edition we host.
Enterprise is the licensed edition sold per user, with extra accounting reports, the Studio
customisation tool and official support on top.
</p>
<p>
When you install Odoo you get an empty system and an app library. Install Sales and Inventory and you
have a shop. Add Purchase and a confirmed sales order can raise the supplier order for you. Add
Manufacturing and those supplier orders become components of a work order. A customer, a product and
an invoice each exist once, so the number the accountant sees is the number the warehouse sees.
</p>
<p>
That is the whole idea, and it is why the answer to "what can I use Odoo for" is a list of apps rather
than a list of features.
</p>
</div>
</div>
</section>
<!-- Apps -->
<section class="section-dark" id="apps">
<div class="container">
<p class="section-kicker">A list of apps</p>
<h2 class="section-title">What you can run on Odoo</h2>
<div class="wd-wrap">
<p>
Each of these installs from the Apps menu inside your own instance, and you install the ones your
business needs:
</p>
</div>
<div class="cmp-table-wrap">
<table class="cmp-table">
<caption class="oc-sr-only">
The ten Odoo applications this guide lists, and what each one is used for.
</caption>
<thead>
<tr>
<th scope="col">App</th>
<th scope="col">What you use it for</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Invoicing and Accounting</th>
<td>Customer invoices, supplier bills, bank reconciliation, VAT returns, payment reminders</td>
</tr>
<tr>
<th scope="row">Sales</th>
<td>Quotes, sales orders, price lists, order confirmations</td>
</tr>
<tr>
<th scope="row">Inventory</th>
<td>Stock on hand, warehouse locations, lot and serial numbers, barcode scanning, reorder rules</td>
</tr>
<tr>
<th scope="row">Purchase</th>
<td>Requests for quotation, supplier orders, vendor price lists</td>
</tr>
<tr>
<th scope="row">CRM</th>
<td>Leads, a pipeline you can look at, and what happened to each one</td>
</tr>
<tr>
<th scope="row">Point of Sale</th>
<td>A till for a shop or a counter, cash and card, sales landing in the same stock and books</td>
</tr>
<tr>
<th scope="row">Manufacturing</th>
<td>Bills of materials, work orders, a shop-floor screen for the people making the thing</td>
</tr>
<tr>
<th scope="row">Projects and Timesheets</th>
<td>Tasks on a board, hours logged against a job, invoices raised from those hours</td>
</tr>
<tr>
<th scope="row">Website and eCommerce</th>
<td>Pages, a product catalogue, orders from the web arriving as sales orders</td>
</tr>
<tr>
<th scope="row">Employees and Time Off</th>
<td>Who works here, holiday requests, the record behind the payroll</td>
</tr>
</tbody>
</table>
</div>
<div class="wd-wrap">
<p>
Ten entries is not the ceiling. Odoo's app library is much larger, and Odoo Community has no per-user
licence, so adding an app for one person costs nothing extra to try.
</p>
</div>
</div>
</section>
<!-- By business type -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Your kind of business</p>
<h2 class="section-title">What Odoo is used for, by business type</h2>
<div class="wd-wrap">
<div class="oc-sub">
<h3>Manufacturing</h3>
<p>
This is the case Odoo was built around. You write down what goes into a product (a bill of
materials), and Odoo works out what the factory needs: components in stock, what has to be bought,
which work order is next, and what each unit actually cost to make. When a customer orders twelve
units, the stock reservation and the production order happen in the same movement.
</p>
</div>
<div class="oc-sub">
<h3>Retail and trade</h3>
<p>
A counter till, stock by location, and purchasing that reacts to the shelf instead of to a feeling.
When the last of a line sells, the reorder rule raises the supplier order. Shops selling online run
the same catalogue through the website app, so a web order and a counter sale come out of the same
stock figure.
</p>
</div>
<div class="oc-sub">
<h3>Services and agencies</h3>
<p>
Quotes become projects, projects collect timesheets, and timesheets become invoices. The person who
did the work is the person whose hours are on the invoice, which is the part most small firms
rebuild by hand every month.
</p>
</div>
<div class="oc-sub">
<h3>Construction and trades</h3>
<p>
A job is a project. Materials are purchased against that job, so you can see what a build has cost
so far instead of guessing until the final invoice. Progress billing and purchase orders sit on the
same project record.
</p>
</div>
<div class="oc-sub">
<h3>Nonprofits and membership organisations</h3>
<p>
Contacts, events, invoicing and the website come from one place, and the accounts run on the same
data your membership list does. Small teams like this usually have no one to spare for double
entry, which is exactly where a single system earns its keep.
</p>
</div>
<div class="oc-sub">
<h3>Accounting practices</h3>
<p>
Several clients' books are kept apart inside one Odoo database, each with its own journals and
reports, and the reconciliation work is one screen per bank account. Practices that host Odoo for
clients end up selling their clients' access to the same instance rather than maintaining a
different tool per client.
</p>
</div>
<div class="oc-sub">
<h3>Small business, starting out</h3>
<p>
Start with Invoicing and one other app. Most owners pick Inventory or Sales, get the real products
and the real customers in, and add the next app the week it starts to hurt.
</p>
</div>
</div>
</div>
</section>
<!-- What it is not for -->
<section class="section-dark">
<div class="container">
<p class="section-kicker">Where it stops</p>
<h2 class="section-title">What Odoo is not for</h2>
<div class="oc-body">
<p>
<strong>Odoo Online will not take custom code.</strong> Odoo's own hosted offering runs standard apps
on databases without custom modules; that is how their own standard plan is described. If you know
you need a custom module or a bespoke integration, that route is closed to you and Community or
odoo.sh is where custom code lives. This is the one boundary that changes the answer to "can I use
Odoo for this" from yes to no.
</p>
<p>
<strong>It will not do your trade's specialist work.</strong> Odoo will not keep a dentist's clinical
notes or produce a machinist's CAD drawings. It runs the business around that work: appointments,
quotes, invoices, stock, purchasing, hours.
</p>
<p>
<strong>It does not configure itself.</strong> A fresh Odoo arrives empty. Your chart of accounts,
your tax rules, your warehouse layout and your price lists are decisions somebody has to make, and
the first week on Odoo is mostly those decisions.
</p>
<p>
<strong>It is not free of maintenance.</strong> Somebody has to run the server, take the backups,
renew the certificate and move you to the next major version. If that somebody is you, you have
bought a second job alongside the first one.
</p>
<p>
<strong>And if your whole requirement is four invoices a month from a phone, it is more system than
you need.</strong> That is a real answer, and we would rather give it here than after you have paid
for a year.
</p>
</div>
</div>
</section>
<!-- What it costs -->
<section class="section-light">
<div class="container">
<p class="section-kicker">Two costs, not one</p>
<h2 class="section-title">What it costs to use Odoo</h2>
<div class="oc-body">
<p>There are two costs, and people usually only count one of them.</p>
<p>
<strong>The software.</strong> Odoo Community is free and open source: no licence, no charge per
user. Odoo Enterprise is licensed per user by Odoo S.A., at prices Odoo sets and changes, so we do
not print a figure for it here. If you bring your own Enterprise licence, you keep it and we host it
on the same instance, with no migration.
</p>
<p>
<strong>Running it.</strong> Odoo's own cloud is a per-user subscription with hosting included, and
it is the route that will not take custom modules. Running it yourself means a server or VPS bill
plus your own hours on updates and backups. A managed service is a flat yearly price and the hours
are somebody else's. What separates those routes is whose hours go into the updates and backups, and
we have written the full comparison out on the
<a href="/odoo-hosting-2027.html">Odoo hosting comparison page</a>.
</p>
<p>
<strong>What we charge, since we publish it.</strong> Our managed Community plans start at
<strong>$214 a year</strong> for Side Hustle, then <strong>$395</strong> for On the Rise and
<strong>$595</strong> for Powerhouse, with Empire quoted per setup. There is no per-user licence on
any of them and no setup fee, the instance is live in about five minutes, and the trial runs 30 days
without a credit card. The
<a href="/index.html#pricing">plans and prices are on the pricing page</a>.
</p>
<p>
<strong>Dropshipping changes none of this.</strong> It is a setting inside the Purchase app, not a
paid add-on, so your licence position is the same as any other seller's. See the
<a href="#can-i-use-odoo-for-dropshipping">dropshipping answer in the FAQ</a>.
</p>
<p>
<strong>If you would rather learn it by doing it,</strong> the
<a href="/odoo-erp-automation-bootcamp/">ODOO ERP Automation Bootcamp</a> is a ten-session live
course at USD 465.00 with a year of hosted Odoo Community included, and the two-hour
<a href="/odoo-n8n-masterclass/">ODOO x N8N Masterclass</a> is USD 120.00.
</p>
</div>
</div>
</section>
<!-- How to start -->
<section class="section-dark">
<div class="container">
<p class="section-kicker">Five moves</p>
<h2 class="section-title">How to start using Odoo</h2>
<ol class="oc-steps">
<li>
<strong>Write down the five things that hurt, in your words.</strong> Not "we need inventory
management" — <em>"we sold twelve pallets and the paperwork says nine."</em> The pain is the
requirement.
</li>
<li>
<strong>Name what you are buying.</strong> Hours back per week, money that stopped leaking, one
place to look. If you cannot say it in a sentence, you are not ready to buy software yet.
</li>
<li>
<strong>Put your real work in this week.</strong> Your actual customers and products, not a demo.
Use it for a week before you decide anything else.
</li>
<li>
<strong>Add the next app when you reach its limit,</strong> not on a project plan. A system you use
today beats one you will use properly in six months.
</li>
<li>
<strong>Hand off the boring parts on day one.</strong> Backups, certificates, upgrades, restarts. If
you are the one fixing the server at 11pm, you bought a job rather than a system.
</li>
</ol>
<div class="oc-body" style="margin-top: 2.25rem">
<p>
An ODOO4projects instance is live in about five minutes, on servers in one of six regions, with
backups already running and support reachable in your own words when you get stuck. If something
breaks once your data is in it, the
<a href="/odoo-community-upgrade.html">upgrade and migration route is here</a>, and the place to
ask is <a href="/support.html">support</a>.
</p>
<p>
<strong>Start with your own data:</strong>
<a href="/index.html#pricing">see the plans</a>.
</p>
</div>
</div>
</section>
<!-- FAQ -->
<section class="section-light" id="faq">
<div class="container">
<p class="section-kicker">Straight answers</p>
<h2 class="section-title">Frequently asked questions</h2>
<div class="cmp-faq-grid">
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What is Odoo used for?</summary>
<div class="cmp-a">
<p>Odoo is used to run the parts of a business that produce paperwork and numbers: sales and quotes, customer invoices and supplier bills, stock and purchasing, manufacturing, projects and timesheets, the website and its orders, the till, and the employee records behind payroll. All of it works on one database, so stock, orders and accounts agree with each other instead of being reconciled at month end.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">What can Odoo do?</summary>
<div class="cmp-a">
<p>It holds stock by location, raises a supplier order when a reorder rule trips, turns a quote into a sales order and that order into an invoice, takes payment, reconciles the bank statement, and reports what the month looked like. It does the same job for manufacturing, for services billed by the hour, and for a shop with a till and a website. You install the apps that apply to you.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Can I use Odoo for free?</summary>
<div class="cmp-a">
<p>Yes. Odoo Community is free and open source, and you can install and run it yourself at no licence cost. What is not free is the running of it: a server or VPS, someone's hours on updates and backups, and the certificate. If you want Community without that work, hosting is a paid service, ours starting at $214 a year.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">How is Odoo free if it is also sold per user?</summary>
<div class="cmp-a">
<p>Two different editions. Community is open source and carries no licence and no per-user charge; Enterprise is the licensed edition, sold per user by Odoo S.A. Enterprise exists for the extra apps and official support, not because Community is crippled. Plenty of businesses run Community for years and never buy a licence.</p>
</div>
</details>
<details class="cmp-faq" id="can-i-use-odoo-for-dropshipping">
<summary class="plausible-event-name=FAQ">Can I use Odoo for dropshipping?</summary>
<div class="cmp-a">
<p>Yes. Odoo has dropshipping built in as a purchase route: you enable the Dropshipping setting, mark the product so it can be sold and purchased, and set its vendor. A sales order then raises the supplier request for quotation automatically, and the supplier ships to your customer. Two things to know: a dropshipped product never enters your stock, so it does not appear in your stock valuation, and no custom module is needed for any of it.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Is Odoo easy to use?</summary>
<div class="cmp-a">
<p>Daily use is straightforward once someone has set it up: a sale, an invoice and a stock move are each a few clicks and Odoo's own screens are consistent between apps. Setting it up is the part that is not easy, and Odoo's own documentation is written for an administrator rather than for an owner. The practical split is that you learn the business screens in an afternoon and hand the configuration and the server to someone who does it for a living.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Can Odoo be used for project management?</summary>
<div class="cmp-a">
<p>Yes, and for many service businesses it is the reason they moved. The Project app gives you tasks on a board, deadlines, sub-tasks, customer-facing stages, and timesheets against each job, so the hours you spent become the invoice you send. If you already run projects in a separate tool, the question is whether you want the hours and the invoice in the same system.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">Do I need a developer to run Odoo?</summary>
<div class="cmp-a">
<p>No, not to run it. You need a developer if you are installing custom modules or writing your own, and you need somebody technical once, to set the system up properly. After that, ordinary use is a browser login: install apps, enter your products, raise invoices, look at reports. The developer question usually arrives with a custom module, not with day-to-day work.</p>
</div>
</details>
<details class="cmp-faq">
<summary class="plausible-event-name=FAQ">How long before it is useful?</summary>
<div class="cmp-a">
<p>A day for the first app, with the owner's decisions on the chart of accounts and the products. A week of real use before it is genuinely running your month. An instance on our plans is live in about five minutes; the rest of the time goes on your own data and your own decisions.</p>
</div>
</details>
</div>
</div>
</section>
<!-- Footer (copied from odoo-community-upgrade.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="oc-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="oc-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 defer src="/static/lang.js"></script>
</body>
</html>
+791
View File
@@ -0,0 +1,791 @@
<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>ODOO Workshops and Classes: Live Courses from USD 120</title>
<meta
name="description"
content="Two live courses with Oliver Arnold: the two-hour ODOO x N8N Masterclass at USD 120.00 and the ten-session ODOO ERP Automation Bootcamp at USD 465.00."
/>
<link rel="canonical" href="https://odoo4projects.com/workshops/" />
<meta property="og:title" content="ODOO Workshops and Classes: Live Courses from USD 120" />
<meta
property="og:description"
content="Two live courses with Oliver Arnold: the two-hour ODOO x N8N Masterclass at USD 120.00 and the ten-session ODOO ERP Automation Bootcamp at USD 465.00."
/>
<meta property="og:type" content="website" />
<meta property="og:url" content="https://odoo4projects.com/workshops/" />
<meta name="twitter:card" content="summary" />
<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>
/* ---- Workshops and Classes hub page (page-scoped; additive).
The block below is the bootcamp page's page-scoped CSS, reused so the two
course pages and this hub share one visual language, plus the comparison
table block already in use on odoo-hosting-2027.html. Three additions only,
each marked below. ---- */
.bc-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) */
.bc-topbar {
background: var(--midnight-2);
border-bottom: 1px solid var(--line-brass);
padding: 0.85rem 0;
}
.bc-topbar .container {
display: flex;
align-items: center;
justify-content: space-between;
gap: 1rem;
flex-wrap: wrap;
}
.bc-brand {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
letter-spacing: 0.04em;
color: #fff;
}
.bc-brand span {
color: var(--brass);
}
.bc-topbar-links {
display: flex;
gap: 1.25rem;
font-size: 0.82rem;
}
.bc-topbar-links a {
color: rgba(255, 255, 255, 0.7);
}
.bc-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. */
.bc-topbar-links {
margin-left: auto;
}
.bc-topbar .lang-switch-slot {
display: flex;
align-items: center;
padding-left: 1rem;
border-left: 1px solid rgba(201, 162, 39, 0.45);
}
.bc-topbar .lang-switch {
color: rgba(255, 255, 255, 0.7);
}
.bc-topbar .lang-switch a:hover,
.bc-topbar .lang-switch a:focus-visible {
color: var(--brass-bright);
}
.bc-topbar .lang-switch a[aria-current="true"] {
color: var(--brass);
text-decoration: underline;
text-underline-offset: 3px;
}
/* Hero — same treatment as the bootcamp page: our own London night aerial
(CI §5) behind the header copy, with the identical two-zone scrim
(.78 0%-88%, ramp 88%-94%, .25 94%-100%) so every text block in the copy
zone keeps its contrast floor. */
.bc-hero {
min-height: 0;
padding: 3.5rem 0 3rem;
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-desktop-1920.webp");
background-size: cover;
background-position: 50% 25%;
background-repeat: no-repeat;
}
/* The global .hero::after is a second, 50%-opacity midnight wash for the homepage's
flat hero; with the photo + gradient scrim above the copy it only dulls the shot,
so it is switched off on this page. One page-scoped rule, no global CSS touched. */
.bc-hero::after {
content: none;
}
@media (max-width: 640px) {
.bc-hero {
background-image: linear-gradient(90deg,
rgba(13, 27, 46, 0.78) 0%,
rgba(13, 27, 46, 0.78) 88%,
rgba(13, 27, 46, 0.25) 94%,
rgba(13, 27, 46, 0.25) 100%),
url("/images/hero/bootcamp-hero-mobile-900.webp");
background-position: 50% 50%;
}
}
/* wrapped hero-stat labels keep their tick on the first line */
.bc-hero .hero-stat {
align-items: flex-start;
}
.bc-hero .hero-stat i {
line-height: 1.6;
}
.bc-lead {
font-size: 1.05rem;
color: rgba(23, 28, 38, 0.78);
max-width: 720px;
margin: 0 auto 1rem;
line-height: 1.75;
}
.section-dark .bc-lead,
.bc-lead.on-dark {
color: rgba(255, 255, 255, 0.72);
}
.bc-subline {
font-family: Marcellus, Georgia, serif;
font-size: 1.15rem;
color: var(--midnight);
text-align: center;
max-width: 720px;
margin: 1.75rem auto 1.25rem;
letter-spacing: 0.02em;
}
.bc-action {
text-align: center;
margin-top: 0.5rem;
}
/* Grids — auto-fit so no breakpoint is needed */
.bc-list {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
/* Cards on midnight */
.bc-cards {
list-style: none;
padding: 0;
margin: 0 auto;
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 1rem;
max-width: 1040px;
}
.bc-cards li {
background: rgba(255, 255, 255, 0.04);
border: 1px solid var(--line-brass);
border-radius: var(--radius-lg);
padding: 1.35rem 1.4rem;
/* the two course cards carry a CTA: flex column lets .bc-card-cta sit on the
card floor so the two buttons line up across the grid row */
display: flex;
flex-direction: column;
}
.bc-cards .bc-card-cta {
margin-top: auto;
padding-top: 0.8rem;
}
.bc-cards h3 {
font-size: 1rem;
color: #fff;
margin-bottom: 0.45rem;
}
.bc-cards p {
font-size: 0.86rem;
color: rgba(255, 255, 255, 0.72);
line-height: 1.65;
margin: 0;
}
/* ADDITION 1 — the bootcamp's card carries a single paragraph; the course cards
here carry price, promise, format and a button. One spacing rule, no new look. */
.bc-cards li > * + * {
margin-top: 0.7rem;
}
.bc-cards p.bc-card-price {
font-family: Marcellus, Georgia, serif;
font-size: 1.05rem;
color: var(--brass);
}
.bc-cards .bc-card-format {
font-size: 0.78rem;
color: rgba(255, 255, 255, 0.55);
}
.bc-note {
max-width: 720px;
margin: 1.5rem auto 0;
font-size: 0.86rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.65;
}
.bc-note.on-dark {
color: rgba(255, 255, 255, 0.6);
}
.bc-note strong {
color: var(--midnight);
}
.bc-note.on-dark strong {
color: #fff;
}
/* Pull quote (hero-adjacent, the old page's treatment) */
.bc-quote {
font-family: Marcellus, Georgia, serif;
font-size: 1.25rem;
line-height: 1.55;
color: var(--midnight);
text-align: center;
max-width: 760px;
margin: 0 auto 0.75rem;
}
.bc-quote-attr {
font-family: Inter, sans-serif;
font-size: 0.72rem;
font-weight: 600;
letter-spacing: 0.15em;
text-transform: uppercase;
/* midnight, not brass-deep: brass-deep on cream measures 4.2:1 and fails AA
at this size (detector finding, 2026-10-28) */
color: var(--midnight);
text-align: center;
}
/* Related links */
.bc-related {
list-style: none;
padding: 0;
margin: 2rem auto 0;
max-width: 720px;
display: grid;
gap: 0.5rem;
}
.bc-related li {
position: relative;
padding-left: 1.4rem;
font-size: 0.88rem;
}
.bc-related li::before {
content: "";
position: absolute;
left: 0.25rem;
top: 0.55rem;
width: 6px;
height: 6px;
border-radius: 50%;
background: var(--brass);
}
.bc-related a {
color: var(--midnight);
text-decoration: underline;
text-decoration-color: var(--brass);
text-underline-offset: 2px;
}
.bc-related a:hover {
text-decoration-color: var(--brass-deep);
text-decoration-thickness: 2px;
}
/* FAQ (native details/summary — no JS) */
.bc-faq-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 1rem;
max-width: 1000px;
margin: 0 auto;
align-items: start;
}
.bc-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;
}
.bc-faq[open],
.bc-faq:hover {
box-shadow: var(--shadow-hover);
}
.bc-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);
}
.bc-faq summary::-webkit-details-marker {
display: none;
}
.bc-faq summary::after {
content: "+";
font-family: Inter, sans-serif;
color: var(--brass);
font-size: 1.15rem;
line-height: 1;
flex-shrink: 0;
}
.bc-faq[open] summary::after {
content: "\2212";
}
.bc-faq summary:focus-visible {
outline: 2px solid var(--brass);
outline-offset: 3px;
border-radius: var(--radius);
}
.bc-faq .bc-a {
font-size: 0.87rem;
color: rgba(23, 28, 38, 0.78);
line-height: 1.7;
padding-bottom: 1rem;
}
.bc-faq .bc-a p:last-child {
margin-bottom: 0;
}
/* ADDITION 2 — comparison table, copied verbatim from odoo-hosting-2027.html
(same component, same dark palette, no new look). */
.cmp-table-wrap {
overflow-x: auto;
-webkit-overflow-scrolling: touch;
border-radius: var(--radius-lg);
border: 1px solid var(--line-brass);
background: rgba(255, 255, 255, 0.03);
}
.cmp-table {
width: 100%;
border-collapse: collapse;
min-width: 860px;
}
.cmp-table th,
.cmp-table td {
padding: 0.7rem 0.9rem;
font-size: 0.85rem;
text-align: left;
vertical-align: top;
border-bottom: 1px solid rgba(201, 162, 39, 0.1);
}
.cmp-table thead th {
font-family: Marcellus, Georgia, serif;
font-size: 0.82rem;
letter-spacing: 0.05em;
text-transform: uppercase;
color: var(--brass);
background: rgba(13, 27, 46, 0.55);
border-bottom: 1px solid var(--line-brass);
white-space: normal;
line-height: 1.3;
}
.cmp-table tbody th {
font-family: Inter, sans-serif;
font-weight: 600;
font-size: 0.82rem;
color: #fff;
background: rgba(255, 255, 255, 0.02);
}
.cmp-table td {
color: rgba(255, 255, 255, 0.78);
line-height: 1.5;
}
.cmp-table tbody tr:hover td,
.cmp-table tbody tr:hover th {
background: rgba(201, 162, 39, 0.06);
}
.cmp-table tbody tr:last-child th,
.cmp-table tbody tr:last-child td {
border-bottom: none;
}
.cmp-table a {
color: var(--brass-bright);
text-decoration: underline;
text-underline-offset: 2px;
}
@media (max-width: 768px) {
.bc-faq-grid {
grid-template-columns: 1fr;
}
}
/* ADDITION 3 — focus states for the two new interactive elements on this page
(the anchor CTA and the card buttons); the bootcamp's two rules unchanged. */
.btn:focus-visible,
.bc-topbar-links a:focus-visible,
.bc-related a:focus-visible,
.cmp-table a:focus-visible {
outline: 3px solid var(--brass-bright);
outline-offset: 2px;
border-radius: var(--radius);
}
.btn-brass:focus-visible {
outline-color: #fff;
}
</style>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "ItemList",
"name": "ODOO4projects workshops and classes",
"url": "https://odoo4projects.com/workshops/",
"itemListElement": [
{
"@type": "ListItem",
"position": 1,
"item": {
"@type": "Course",
"name": "ODOO × N8N Masterclass",
"url": "https://odoo4projects.com/odoo-n8n-masterclass/",
"provider": { "@type": "Organization", "name": "ODOO4projects", "url": "https://odoo4projects.com/" },
"instructor": { "@type": "Person", "name": "Oliver Arnold", "jobTitle": "Technical Lead" },
"inLanguage": "en",
"offers": { "@type": "Offer", "price": "120.00", "priceCurrency": "USD", "category": "Paid" },
"hasCourseInstance": { "@type": "CourseInstance", "courseMode": "online", "courseWorkload": "PT2H" }
}
},
{
"@type": "ListItem",
"position": 2,
"item": {
"@type": "Course",
"name": "ODOO ERP Automation Bootcamp",
"url": "https://odoo4projects.com/odoo-erp-automation-bootcamp/",
"provider": { "@type": "Organization", "name": "ODOO4projects", "url": "https://odoo4projects.com/" },
"instructor": { "@type": "Person", "name": "Oliver Arnold", "jobTitle": "Technical Lead" },
"inLanguage": "en",
"offers": { "@type": "Offer", "price": "465.00", "priceCurrency": "USD", "category": "Paid" },
"hasCourseInstance": { "@type": "CourseInstance", "courseMode": "online", "courseWorkload": "PT10H" }
}
}
]
}
</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>
</head>
<body>
<!-- Page-scoped top bar: the site has no global header, so the page carries its own way home. -->
<div class="bc-topbar">
<div class="container">
<a class="bc-brand" href="/">ODOO4<span>projects</span></a>
<nav class="bc-topbar-links" aria-label="Page links">
<a href="/index.html#pricing">Plans &amp; pricing</a>
<a href="/odoo-erp-automation-bootcamp/">Bootcamp</a>
<a href="/support.html">Support</a>
</nav>
<div data-lang-switcher class="lang-switch-slot"></div>
</div>
</div>
<!-- Hero -->
<section class="hero bc-hero">
<div class="container">
<p class="hero-kicker">TWO LIVE COURSES &middot; ONLINE &middot; OLIVER ARNOLD &middot; ENGLISH</p>
<h1>Workshops and Classes</h1>
<p class="hero-sub">
Two live courses, one instructor, and a working system at the end of both. You work on real data
with the person who runs this platform, and you leave able to do the thing the course is named
after.
</p>
<div class="hero-actions">
<a class="btn btn-brass btn-lg" href="#our-workshops">See the two courses</a>
</div>
</div>
</section>
<!-- Pull quote (kept verbatim, attributed) -->
<section class="section-light">
<div class="container">
<p class="bc-quote">
&ldquo;You need to learn your skills from people who use them on a daily basis!&rdquo;
&ldquo;That is what I teach my kids and that is how we organize our workshops.&rdquo;
</p>
<p class="bc-quote-attr">&mdash; Oliver Arnold, Technical Lead, ODOO4projects</p>
</div>
</section>
<!-- Our Workshops -->
<section class="section-dark" id="our-workshops">
<div class="container">
<h2 class="section-title">Our Workshops</h2>
<p class="bc-lead">
Two courses. Both live, both online, both taught by Oliver Arnold, and both end with something
running in front of you rather than notes to file away. Pick the one that matches where your
business is today.
</p>
<ul class="bc-cards">
<li>
<h3>ODOO &times; N8N Masterclass</h3>
<p class="bc-card-price">USD 120.00 &middot; 2 hours</p>
<p>You leave able to make Odoo start its own jobs: <a href="/blog/posts/howto-ai-automation.html">an automated action fires on a business event, calls an n8n webhook</a>, and n8n carries the work forward while you are somewhere else.</p>
<p class="bc-card-format">Live webinar with a Q&amp;A at the end &middot; Online &middot; English</p>
<p class="bc-card-cta"><a class="btn btn-brass" href="/odoo-n8n-masterclass/">More Info</a></p>
</li>
<li>
<h3>ODOO ERP Automation Bootcamp</h3>
<p class="bc-card-price">USD 465.00 &middot; 10 live sessions, 1 hour each</p>
<p>You leave with a working ERP for your own company: your products, your customers, your quotes, your invoices and your stock in one system you can keep running yourself.</p>
<p class="bc-card-format">Live and online, every Thursday 18:00&ndash;19:00 Central Time &middot; One year of hosted Odoo Community Edition included &middot; Limited to 6 participants &middot; English</p>
<p class="bc-card-cta"><a class="btn btn-brass" href="/odoo-erp-automation-bootcamp/">More Info</a></p>
</li>
</ul>
</div>
</section>
<!-- Which one is yours -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Which one is yours</h2>
<p class="bc-lead">
The two courses answer two different problems, and the price difference is the honest measure of
how much work is in front of you.
</p>
<p class="bc-lead">
<strong>If Odoo already runs your business.</strong> Take the masterclass if Odoo is already
running your business and the gap is between the systems. You know what workflows and automated
actions are and where they live in the interface, and you are comfortable enough with code to
read a payload. Two hours later the automation you have been doing by hand is running without
you.
</p>
<p class="bc-lead">
<strong>If you do not have a system yet.</strong> Take the bootcamp if the system is the thing
you do not have. You run the business, the stock and the invoices, and most of it lives in a
spreadsheet and one person's memory. No ERP knowledge and no coding are assumed, because the ten
sessions are about your business running, not about the software under it.
</p>
<p class="bc-lead">
<strong>The honest limit.</strong> If you have never opened Odoo, or an API is still a vague word
to you, start with the
<a href="/odoo-erp-automation-bootcamp/">bootcamp</a>. The masterclass assumes you are already
past that line.
</p>
<p class="bc-lead">
If you want n8n but not the technical depth, lesson 9 of the bootcamp is n8n and AI for your
business, built for the owner rather than the developer.
</p>
</div>
</section>
<!-- How our sessions work -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">How our sessions work</h2>
<ul class="bc-cards">
<li>
<h3>Live and online.</h3>
<p>Everything runs in your browser, on the computer you already have, with nothing to install on it.</p>
</li>
<li>
<h3>One instructor.</h3>
<p>Oliver Arnold, Technical Lead at ODOO4projects, teaches every session of both courses. You get the same person in week ten that you met in week one.</p>
</li>
<li>
<h3>English, with your questions answered in the room.</h3>
<p>The masterclass ends in a Q&amp;A; the bootcamp's last session is an open workshop where we fix whatever is still broken in your setup.</p>
</li>
</ul>
<p class="bc-note on-dark">
<strong>On n8n, in plain words:</strong> n8n is a third-party tool, used on n8n's own free plan.
The free plan is not part of either price and is not included.
</p>
</div>
</section>
<!-- Your instructor -->
<section class="section-light">
<div class="container">
<h2 class="section-title">Your instructor</h2>
<p class="bc-lead">
<strong>Oliver Arnold, Technical Lead at ODOO4projects.</strong>
</p>
<p class="bc-lead">
Oliver has spent more than 25 years building software that has to keep working, and he is the lead
architect of the platform these courses run on. He teaches by putting the real system in front of
you and fixing the real problem with you, which is the whole reason the courses are live instead
of recorded.
</p>
<p class="bc-lead">He is the only instructor on both courses.</p>
<ul class="bc-related">
<li><a href="/odoo-n8n-masterclass/">The two-hour ODOO &times; N8N Masterclass</a></li>
<li><a href="/odoo-erp-automation-bootcamp/">The ten-session ODOO ERP Automation Bootcamp</a></li>
<li><a href="/support.html#contact">Questions before you book? Talk to us first</a></li>
</ul>
</div>
</section>
<!-- FAQ -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Questions people ask first</h2>
<div class="bc-faq-grid">
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Which one should I take?</summary>
<div class="bc-a">
<p>Take the masterclass if Odoo already runs your business and you want Odoo and n8n working together. Take the bootcamp if you do not have a system yet and want to build one. If you have never opened Odoo, the bootcamp comes first.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">Do I need technical skills?</summary>
<div class="bc-a">
<p>For the bootcamp, no. The sessions assume no ERP knowledge and no coding. For the masterclass, two things: you already run Odoo and know what workflows and automated actions are, and you know what an API is and how one gets called. You do not need to be a developer.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What do I need installed?</summary>
<div class="bc-a">
<p>Nothing. A computer and a browser. The masterclass hands you a free Odoo trial system and you use n8n on n8n's own free plan; the bootcamp runs on your own hosted system from the first session.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What language are the courses in?</summary>
<div class="bc-a">
<p>English.</p>
</div>
</details>
<details class="bc-faq">
<summary class="plausible-event-name=FAQ">What is the difference in length?</summary>
<div class="bc-a">
<p>Two hours, once, for the masterclass. Ten sessions of one hour across three months for the bootcamp, ten hours of teaching in total.</p>
</div>
</details>
</div>
</div>
</section>
<!-- Both courses, side by side -->
<section class="section-dark">
<div class="container">
<h2 class="section-title">Both courses, side by side</h2>
<div class="cmp-table-wrap">
<table class="cmp-table">
<caption class="bc-sr-only">
The two live courses compared on price, length, format, class size, prerequisites and what is included.
</caption>
<thead>
<tr>
<th scope="col">&nbsp;</th>
<th scope="col">ODOO &times; N8N Masterclass</th>
<th scope="col">ODOO ERP Automation Bootcamp</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">Price</th>
<td>USD 120.00</td>
<td>USD 465.00</td>
</tr>
<tr>
<th scope="row">Length</th>
<td>2 hours</td>
<td>10 sessions &times; 1 hour (10 hours)</td>
</tr>
<tr>
<th scope="row">Format</th>
<td>Live webinar with Q&amp;A</td>
<td>Live and online, Thursdays 18:00&ndash;19:00 Central Time</td>
</tr>
<tr>
<th scope="row">Class size</th>
<td>&mdash;</td>
<td>Limited to 6 participants</td>
</tr>
<tr>
<th scope="row">Prerequisites</th>
<td>Basic Odoo, basic programming</td>
<td>None</td>
</tr>
<tr>
<th scope="row">Included</th>
<td>2 live hours, Q&amp;A, free Odoo trial system, certificate</td>
<td>10 live sessions, one year of hosted Odoo CE, alumni chat, setup review</td>
</tr>
<tr>
<th scope="row">More info</th>
<td><a href="/odoo-n8n-masterclass/">/odoo-n8n-masterclass/</a></td>
<td><a href="/odoo-erp-automation-bootcamp/">/odoo-erp-automation-bootcamp/</a></td>
</tr>
</tbody>
</table>
</div>
</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="bc-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="bc-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 defer src="/static/lang.js"></script>
</body>
</html>