Commit Graph
59 Commits
Author SHA1 Message Date
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 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 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 ca89d8e7b7 confirm 2026-10-17 17:10:09 -03:00
oliver b4e0faa62e UTM 2026-10-17 10:40:05 -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 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 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 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 3e899391d7 fix: change trial webhook to n8n.odoo4projects.com/webhook/ODOO4projects/trial 2026-10-05 19:18:51 +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 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 e5604381da Fix buyNow webhook URL to odoo.odoo4projects.com; update skill with test case for changeable URL 2026-08-24 21:42:45 +00:00
Reef aeb465e9dd Remove ping debug console.log output 2026-08-24 21:39:17 +00:00
Reef 1fb2bdf525 Fix hero animation: heroImages keys now have api. prefix to match SERVERS hosts 2026-08-24 21:36:40 +00:00
Reef d26a3ee725 Add console debug output to pingServer: OK/ERR/TIMEOUT with elapsed ms 2026-08-24 21:33:31 +00:00
Reef 1642497c10 Prefix all SERVERS hosts with api. and remove duplicate api. from pingServer 2026-08-24 21:02:09 +00:00
Reef 602329db27 Ping api.{host}/favicon.ico instead of {host}/favicon.ico 2026-08-24 19:36:46 +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 5a6380871d Lowercase info field 2026-08-22 09:16:58 +00:00
Reef fcc972557b Rename location field to INFO, strip .odoo4projects.com from server value 2026-08-22 09:13:26 +00:00
Reef 07de1249cf Log basket JSON to console on buyNow click 2026-08-22 09:06:55 +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 ba55327400 Fix buyNow: form POST to /shop/post_basket with JSON basket field, opens checkout in new tab — no CORS, no CSRF 2026-08-21 22:05:45 +00:00
Reef d37ceca9bd Fix buyNow: direct product page links instead of CSRF-blocked POST 2026-08-21 22:01:44 +00:00
Reef d58089d194 Fix 4 console errors: guard old slider code, guard spinner null, guard GSAP empty-grid targets, replace CORS fetch with form-based buyNow 2026-08-21 21:59: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 4afa74bd16 fix: restore gsap.set pre-hide + simpler observer (threshold 0.1, no rootMargin) — ensures no flash and animations fire correctly on scroll 2026-08-20 22:20:56 +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 60b41d7453 fix: update business wizard webhook URL to n8n.odoo4projects.com 2026-08-20 15:30:29 +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
Reef 3e9a6d5c4b feat: scroll-triggered section animations via IntersectionObserver + GSAP
Adds a staggered fade-in/rise animation (y:30→0, opacity:0→1, stagger 0.08s,
power2.out, 0.7s) for 5 section grids when they scroll into view:

- .features-grid (The Concierge Standard — includes Free Trial card)
- .faq-grid
- .pricing-grid
- .blog-grid
- .final-cta .container

Uses native IntersectionObserver (threshold 0.12, no extra CDN load). Children
are pre-set to hidden state at page load to prevent flash, then animated once
per section via GSAP. Animate-once guard per section via dataset flag.
2026-08-20 10:32:19 +00:00
Reef 94b5e36d8e hero: switch to new 1920x768 images in images/hero/ 2026-08-20 09:42:16 +00:00
Reef 9a87d3a5fe Free Trial form in features grid: 2x3 layout, email + location + send
- features-grid changed to repeat(3, 1fr) for 2x3 layout
- 6th cell is a Free Trial card with midnight bg, brass border
- Email input, location dropdown (preselected to best ping server),
  brass Send button
- POST to webhook as JSON {email, location}
- On success: form hides, success message shown
- Responsive: 3col -> 2col -> 1col
2026-08-19 22:58:14 +00:00
Reef b5c9361fc9 Click server card to slide its city into hero bg (no label change) 2026-08-19 22:55:18 +00:00
Reef 1c362f4683 Golden frame on best server card — brass border, glow, lifted 2026-08-19 22:42:15 +00:00
Reef a0ed2c7e9f Silent ping for hero carousel: pings in background, animates best city
- Pings all 6 servers silently with 2s timeout
- Picks the lowest-latency server
- GSAP slides the city image in from right with label
- Server banner cards stay static (city + country only, no ping UI)
2026-08-19 22:35:51 +00:00
Reef b96c2870ef Simplify server banner: static city cards, no JS, no ping, no status
- Header changed to 'Our Server Locations'
- Cards hardcoded in HTML with just city name + region
- Removed all ping JS (IIFE, pingServer, markBest, etc.)
- Removed server-ping-wrap, best-badge, server-best, ping-spinner,
  status-dot, server-optimal CSS
- Removed empty server-optimal div
- Removed card entrance animation (static display)
2026-08-19 22:33:01 +00:00
Reef a9328bf383 Remove initial background image — hero starts clean with gradient only, city slides in on first swap 2026-08-19 22:25:55 +00:00
Reef 5e315cee0e GSAP for all animations, 3x slower, brighter city images
- Added GSAP 3.12.5 from CDN
- Card stagger entrance now uses gsap.fromTo with 0.6s duration, 0.09 stagger
- Carousel slide uses gsap.timeline: old slides out right (3s), new slides
  in from right (3s), label slides in (2.5s after 0.3s offset)
- All animations use power2.out easing
- Image brightness: opacity 0.12→0.25, filter brightness(1.15) saturate(1.1)
- ::after overlay changed from solid midnight @ 0.6 to gradient
  (midnight→transparent @ 0.5) — brighter image with smooth falloff
2026-08-19 22:23:28 +00:00
Reef e2e37e18b4 Carousel hero bg: old image slides out right, new slides in from right
- ::after is now a dark overlay only (no bg image)
- .hero-bg container created on first swap
- Old slide (Amsterdam default) starts at translateX(0), animates to
  translateX(100%) — slides out to the right
- New slide (winning city) starts at translateX(100%), animates to
  translateX(0) — slides in from the right
- Both fire simultaneously via requestAnimationFrame, same easing
- Old slide removed after 1.2s cleanup timeout
- Label 'Our <City> server fits your location' slides in from right
  alongside the carousel animation
2026-08-19 22:18:25 +00:00