Commit Graph
104 Commits
Author SHA1 Message Date
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
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
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
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 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
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 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 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 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 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 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 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 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 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
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
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 9751bda35c copywriter: FAQ growth path & pricing outcome-based language 2026-10-05 19:57:16 +00:00
ODOO4projects Web Developer 4134ff5260 fix: address points 5,7,8,9,11,12,13,14,15 - add Offer schema, remove duplicate partners, trial error feedback, rel=noopener noreferrer, remove inline onclick, semantic pagination, footer email 2026-10-04 23:14:31 +00:00
Reef 5f52cd6059 Change OCA section title to 'Our Top OCA Module Picks' 2026-09-27 10:34:01 +00:00
Reef 3605545838 Add OCA Modules Status section: searchable scrollable table with v19/v20 support indicators and GitHub icon links 2026-09-27 10:24:03 +00:00
Reef 246beeb231 Add Odoo Version dropdown (19.0/20.0) next to server location in pricing section; include version in buyNow basket POST 2026-09-27 10:02:22 +00:00
Reef f7460c129d Download static assets from static.odoo4projects.com (agent.js, agent.css, 4.svg, logo.svg, favicon.png) and serve locally. Update all HTML references. 2026-08-24 20:53:34 +00:00
Reef a003054781 Redesign footer: 4-column grid, partners section (OC Guy, OCA Paraguay, OD8N), brass top rule, partner cards 2026-08-22 12:45:41 +00:00
Reef b34e001c46 Fix buyNow CSRF: use dynamic origin. Remove pricing foot from Empire card. 2026-08-22 12:33:16 +00:00
Reef 0ac11bcce0 Change pricing foot text to 'No setup fee. Stripe Payment / Cancel at any time' 2026-08-22 11:39:41 +00:00
Reef 8e5d508b13 Add server location select in pricing section, pre-select best server after ping, pass location in basket JSON payload 2026-08-22 08:45:12 +00:00
Reef 284f59f863 Add direct Odoo shop buy buttons: POST basket + open cart in new window 2026-08-21 21:50:00 +00:00
Reef 09f8b6100f Replace 'Instant setup, satisfied or reimbursed' with 'No setup fee. Cancel subscription at anytime' 2026-08-21 19:38:17 +00:00
Reef ba0aa96d3b Update coupon code text: startups and NGOs 2026-08-21 19:17:50 +00:00
Reef 3b4b1faef7 Add coupon code mention to affiliate FAQ answer 2026-08-21 17:53:48 +00:00
Reef 47c187f661 Replace credit card FAQ with affiliate program Q&A 2026-08-21 17:52:45 +00:00
Reef 5e7549651b Replace free trial FAQ with ODOO Community Q&A 2026-08-21 17:52:08 +00:00
Reef 03e49b2b2c Remove 'Guest Services' kicker 2026-08-21 17:51:00 +00:00
Reef 413471aceb Remove 'The Concierge Standard' kicker 2026-08-21 17:49:52 +00:00
Reef 0020477cb1 Swap 6 Global Locations card to Management Within Odoo 2026-08-21 17:48:45 +00:00
Reef 840982dc2e fix: silent fetch POST instead of new-window form, update subtitle
- Replace hidden form POST (target='_blank') with silent fetch() that
  ignores the response — no new window opens
- Send boolean values directly instead of serializing to 'true'/'false' strings
- Update subtitle: 'Download your PDF in minutes.' -> 'We will send the report in minutes.'
2026-08-20 21:16:12 +00:00
Reef d4e9acd4e3 feat: add email field to business wizard, update success message
- Add email input field after textareas, before checkboxes
- Email required via both HTML 'required' attribute and JS validation
- POST email field to webhook as 'email' key
- Add .biz-field input[type='email'] CSS (inline + external) matching textarea style
- Update success message: 'We will email you the report once it is ready. AI generation typically takes 1-2 minutes.'
- Remove reference to new window / auto-download (no longer opens window)
2026-08-20 21:11:39 +00:00
Reef b2d2677a34 feat: open webhook response (HTML/PDF) in new window, update success text
- Replace fetch() with hidden form POST + target='_blank' so the webhook's
  auto-download HTML page opens in a new tab/window
- Send form-encoded fields (not JSON) since webhook expects POST form data
- Update success message: 'A new window has opened with your personalized
  Odoo project plan. The download will start automatically after research
  is complete.'
- Remove dead bizDownloadBtn references (button no longer needed)
2026-08-20 15:28:25 +00:00
Reef 87874d0f34 feat: add checkboxes and update webhook for business wizard
- Add 3 checkboxes between textareas and submit button:
  - I already have a homepage (bizHasHomepage)
  - I already use ODOO (bizUsesOdoo)
  - I already have a developer for modules (bizHasDeveloper)
- POST to /webhook/report instead of old webhook UUID
- Include checkbox boolean values in request body
- Add .biz-checkbox-group and .biz-checkbox CSS (inline + external)
2026-08-20 15:22:38 +00:00
Reef a24570f187 feat: add Bring Your Business wizard, replace final CTA
- Replace .final-cta section with .biz-wizard section
- Three textarea fields: Business Description, My Goals, Current Challenges
- On submit, POSTs to webhook endpoint that triggers AI Agent to
  generate a personalized Odoo project plan PDF
- On success, shows download button if webhook returns download_url
- Inline + external CSS: midnight background, brass-accented form fields
- Scroll animation observer updated to target .biz-wizard .container
- Remove all .final-cta CSS from style.css and inline critical styles
2026-08-20 11:41:51 +00:00
Reef a2cfa09558 pricing: remove monthly/yearly billing toggle, default to yearly
- Remove billing-toggle-wrap HTML (switch + labels)
- Update all 4 pricing cards to show yearly prices by default
  with / year period and save percentage
- Simplify openOrderWidget() to always use yearly pricing only
- Remove billing toggle JS block (updatePrices, setBilling, event listeners)
- Remove billing toggle CSS (billing-toggle-wrap, .toggle-*, .toggle-switch)
- Update order widget default display to / year
- Update CTA note to 'Save money, less administration'
2026-08-20 10:38:03 +00:00