Skip to Content
Odoo Menu
  • Sign in
  • Try it free
  • Apps
    Finance
    • Accounting
    • Invoicing
    • Expenses
    • Spreadsheet (BI)
    • Documents
    • Sign
    Sales
    • CRM
    • Sales
    • POS Shop
    • POS Restaurant
    • Subscriptions
    • Rental
    Websites
    • Website Builder
    • eCommerce
    • Blog
    • Forum
    • Live Chat
    • eLearning
    Supply Chain
    • Inventory
    • Manufacturing
    • PLM
    • Purchase
    • Maintenance
    • Quality
    Human Resources
    • Employees
    • Recruitment
    • Time Off
    • Appraisals
    • Referrals
    • Fleet
    Marketing
    • Social Marketing
    • Email Marketing
    • SMS Marketing
    • Events
    • Marketing Automation
    • Surveys
    Services
    • Project
    • Timesheets
    • Field Service
    • Helpdesk
    • Planning
    • Appointments
    Productivity
    • Discuss
    • Approvals
    • IoT
    • VoIP
    • Knowledge
    • WhatsApp
    Third party apps Odoo Studio Odoo Cloud Platform
  • Industries
    Retail
    • Book Store
    • Clothing Store
    • Furniture Store
    • Grocery Store
    • Hardware Store
    • Toy Store
    Food & Hospitality
    • Bar and Pub
    • Restaurant
    • Fast Food
    • Guest House
    • Beverage Distributor
    • Hotel
    Real Estate
    • Real Estate Agency
    • Architecture Firm
    • Construction
    • Property Management
    • Gardening
    • Property Owner Association
    Consulting
    • Accounting Firm
    • Odoo Partner
    • Marketing Agency
    • Law firm
    • Talent Acquisition
    • Audit & Certification
    Manufacturing
    • Textile
    • Metal
    • Furnitures
    • Food
    • Brewery
    • Corporate Gifts
    Health & Fitness
    • Sports Club
    • Eyewear Store
    • Fitness Center
    • Wellness Practitioners
    • Pharmacy
    • Hair Salon
    Trades
    • Handyman
    • IT Hardware & Support
    • Solar Energy Systems
    • Shoe Maker
    • Cleaning Services
    • HVAC Services
    Others
    • Nonprofit Organization
    • Environmental Agency
    • Billboard Rental
    • Photography
    • Bike Leasing
    • Software Reseller
    Browse all Industries
  • Community
    Learn
    • Tutorials
    • Documentation
    • Certifications
    • Training
    • Blog
    • Podcast
    Empower Education
    • Education Program
    • Scale Up! Business Game
    • Visit Odoo
    Get the Software
    • Download
    • Compare Editions
    • Releases
    Collaborate
    • Github
    • Forum
    • Events
    • Translations
    • Become a Partner
    • Services for Partners
    • Register your Accounting Firm
    Get Services
    • Find a Partner
    • Find an Accountant
      • Get a Tailored Demo
    • Implementation Services
    • Customer References
    • Support
    • Upgrades
    Github Youtube Twitter Linkedin Instagram Facebook Spotify
    +32 2 290 34 90
    • Get a Tailored Demo
  • Pricing
  • Help
  1. APPS
  2. SEO
  3. Website SEO Protection: Appointment v 18.0
  4. Sales Conditions FAQ

Website SEO Protection: Appointment

by Ganemo https://www.ganemo.co
Odoo

$ 98.75

v 18.0 Third Party
This module requires Odoo Enterprise Edition.
Apps purchases are linked to your Odoo account, please sign in or sign up first.
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Appointments (appointment)
• Calendar (calendar)
• Discuss (mail)
• Website (website)
Community Apps Dependencies Show
Website SEO Protection
Lines of code 63
Technical Name website_seo_protection_appointment
LicenseOPL-1
Websitehttps://www.ganemo.co
You bought this module and need support? Click here!
Availability
Odoo Online
Odoo.sh
On Premise
Odoo Apps Dependencies • Appointments (appointment)
• Calendar (calendar)
• Discuss (mail)
• Website (website)
Community Apps Dependencies Show
Website SEO Protection
Lines of code 63
Technical Name website_seo_protection_appointment
LicenseOPL-1
Websitehttps://www.ganemo.co
  • Description
  • License

Technical Specification for AI & LLM

This Odoo module 'website_seo_protection_appointment' is a companion module to 'website_seo_protection'. It auto-installs alongside 'website_appointment' and provides multi-layer HTTP protection against Odoo appointment URL crawler traps. Layer 1: returns HTTP 404 for ?domain= trap URLs (prevents infinite crawl loops). Layer 2: adds X-Robots-Tag: noindex, nofollow to ?date= / ?datetime= calendar navigation URLs. Fully supports Odoo multilingual URL prefixes (/en/, /es/, /pt_BR/, etc.). Compatible with Odoo 18 (Enterprise, Odoo.SH, Ganemo Online). Zero configuration required.

Enterprise (Odoo.SH, Ganemo Online or Ganemo.SH)
English & Spanish Included

Appointment Guard

SEO Crawler Trap Protection for Appointments

Automatically stops Odoo appointment URLs from creating infinite crawler loops that exhaust your server. Install and forget — it activates the moment website_appointment is enabled.

What We're Solving

----------------

Appointment Crawler Trap

Odoo appointment pages contain a ?domain= URL parameter that generates infinite combinations. Search engine bots read these as unique pages, creating thousands of fetches that slow down or crash your server.

Calendar Navigation Indexed

The ?date= and ?datetime= parameters in the appointment calendar are functionally equivalent pages. Without protection, Google indexes hundreds of identical calendar views, hurting your SEO score.

How It Works

Multi-Layer Protection

Layer 1: HTTP 404 — Kill the Loop Instantly

Any request to an appointment URL containing the ?domain= parameter instantly receives an HTTP 404 response.

  • Triggers at the WSGI middleware level — before Odoo ORM processes the request.
  • Stops the crawler immediately — no database queries, no rendering.
  • Fully supports all Odoo multilingual URL prefixes (/en/, /es/, /pt_BR/, etc.).
  • Legitimate users with ?domain= in bookmarks are gracefully redirected.

Layer 2: X-Robots-Tag — Noindex Calendar Navigation

Appointment calendar pages with ?date= or ?datetime= parameters receive the HTTP header X-Robots-Tag: noindex, nofollow.

SEO-Friendly Signal

Google and other bots see the noindex directive via HTTP header, not HTML — so it works even if Odoo's page rendering is delayed.

Transparent to Real Users

Human visitors navigating the appointment calendar experience no change — only bots are told not to index those calendar navigation pages.

Auto-Install & Zero Configuration

This module has auto_install: True. If both website_seo_protection and website_appointment are installed, this module activates automatically — no manual install needed.

Smart Explainer: This design follows Odoo's official auto-install convention for bridge/companion modules. It guarantees protection is always active when the appointment module is present, without any admin intervention.

Global Ready | Multi-Language Support

This module is fully translated into English and Spanish (en_US, es_ES, es_PE, es_MX), ensuring a professional experience for international organizations.

English Spanish

Why Choose Ganemo?

----------------

Ganemo is the world's leading Odoo App developer and a multi-award-winning Gold Partner. For over 5 years, we have been recognized as the #1 seller of high-quality apps on the Odoo App Store. Trusted as the "Best Partner" in USA, Mexico, Chile, Spain, Colombia, Ecuador, and Peru, we deliver robust, secure, and localization-compliant solutions for global businesses.

Get a Quote & Resolve Commercial Doubts

Join thousands of satisfied clients on Odoo. Contact our sales team directly.

QR WhatsApp

Official WhatsApp

Fastest response time.

COPY
LINK
https://wa.me/18286726150

+1 (828) 672-6150

QR Sales Email

Sales Email

For commercial inquiries.

COPY
ADDR
leads@ganemo.com

leads@ganemo.com

QR Book Demo

Book a Demo

Let's explore your needs.

COPY
LINK
ganemo.co/appointment/5

Schedule Meeting

Need More? We Do It All

Professional Odoo Services

ERP Implementation

Transform your business with a full Odoo implementation. We analyze, configure, and train your team to maximize productivity. From Accounting to Inventory, we handle the complexity so you can focus on growth.

Module Dev & Migration

Need a custom feature? Or stuck on an older version? We develop high-performance custom modules and migrate your existing code to Odoo 18/19 with zero data loss. Expert developers at your service.

Setup & User Manual

Step-by-Step Configuration Guide

This Module Is Zero-Configuration

This companion module is designed to work automatically with no settings to configure. Its only requirement is that both website_seo_protection and website_appointment are installed. Once those are present, this module activates on its own and immediately starts protecting your appointment URLs. There is no admin panel, no toggle, no cron job to set up.

Step 1 — Verify Prerequisites

Before installing, confirm both of the following modules are already installed in your Odoo database:

website_seo_protection

The core SEO protection engine by Ganemo. Provides the WSGI middleware that intercepts malicious crawler requests at the HTTP layer.

Where to check: Apps → Search website_seo_protection → verify it shows as Installed (not "Install" button).

website_appointment

Odoo's native Appointments module. This module provides the frontend appointment booking pages that are vulnerable to crawler traps.

Where to check: Apps → Search website_appointment → verify it shows as Installed.

Important: If either module is not installed, install it first. Without both present, the companion module will not auto-install and appointment URLs will remain unprotected.

Step 2 — Install the Parent Module

Install website_seo_protection from the Ganemo App Store page or from your Odoo Apps menu.

  1. Go to Apps in the top menu bar.
  2. Remove the default "Apps" filter from the search bar so you can search all modules.
  3. Search for website_seo_protection.
  4. Click Install. Odoo will download and activate the module.
  5. After installation completes, search again for website_seo_protection_appointment.
  6. Expected result: It should already show as Installed automatically — because website_appointment was already present.

Auto-Install Confirmation: If you see this module listed as "Installed" immediately after installing the parent, everything is working perfectly. No further action is required.

Step 3 — Verify Protection Is Active

Confirm the protection is running correctly with this simple browser test. No developer tools required.

  1. Open a new browser tab (no need to be logged in — test as a public user).
  2. Navigate to your Odoo URL followed by: /web/appointment/1?domain=[('user_id','=',1)]
  3. Example: https://yourcompany.odoo.com/web/appointment/1?domain=[('user_id','=',1)]
  4. Expected result: The server returns an HTTP 404 error page. The dangerous URL is blocked.
  5. Now navigate to the clean URL: /web/appointment/1 (no parameters).
  6. Expected result: The appointment booking page loads normally for your customers.

Why 404 and not a redirect? HTTP 404 is the strongest signal you can send to a crawler: "this URL does not exist and never will." Search engines remove 404 URLs from their index immediately. A redirect would still consume server resources. The 404 response is deliberately chosen as the most effective and efficient SEO/performance fix.

Step 4 — Multilingual Sites: No Extra Action Needed

If your Odoo instance runs in multiple languages (e.g., English, Spanish, Portuguese), the protection works automatically for all language prefixes.

/en/web/appointment/1?domain=...

Blocked (HTTP 404)

/es/web/appointment/1?domain=...

Blocked (HTTP 404)

/pt_BR/web/appointment/1?domain=...

Blocked (HTTP 404)

The protection uses a regular-expression pattern that matches any language prefix automatically — including regional variants like pt_BR, es_MX, and fr_BE.

Step 5 — Uninstall / Rollback (If Needed)

Removing this protection is as simple as uninstalling the module. There are no database migrations, no stored data, and no residual configuration.

  1. Go to Apps → search website_seo_protection_appointment.
  2. Click the three-dot menu (⋮) → Uninstall.
  3. Confirm the uninstall. The WSGI middleware is removed immediately on server restart.
  4. Appointment URLs with ?domain= will again be accessible (and vulnerable) after uninstall.

Warning: If you uninstall website_seo_protection (the parent module), this companion module will also be uninstalled automatically. All protection layers for appointments will be removed.

No ongoing maintenance required. The module updates itself when you upgrade your Odoo instance. Your appointment pages are always protected.

QA / User Testing Scenarios

Validation Plan

Scenario 1: Crawler Trap Blocked (Layer 1)

  1. Install both website_seo_protection and website_appointment.
  2. Verify this module (website_seo_protection_appointment) auto-installed.
  3. Open a browser and navigate to: /web/appointment/1?domain=[('user_id','=',1)]
  4. Expected: HTTP 404 response — the page is blocked immediately.
  5. Verify: Normal appointment URL /web/appointment/1 still loads correctly.

Scenario 2: Calendar Noindex Header (Layer 2)

  1. Navigate to an appointment calendar URL like: /web/appointment/1?date=2024-03-15
  2. Open browser Developer Tools → Network → click the request.
  3. Check Response Headers.
  4. Expected: X-Robots-Tag: noindex, nofollow header is present.
  5. Verify: The same URL without ?date= does NOT have this header.

Scenario 3: Multilingual URL Support

  1. Enable Spanish language in Odoo (Settings → Languages).
  2. Navigate to: /es/web/appointment/1?domain=[('user_id','=',1)]
  3. Expected: HTTP 404 — language-prefixed URLs are also protected.
  4. Also test /en/web/appointment/1?date=2024-01-01 → must return X-Robots-Tag noindex.

Scenario 4: DateTime Parameter Blocked (Layer 2 variant)

Validates that ?datetime= (timestamp variant) is also handled.

  1. Navigate to: /web/appointment/1?datetime=2024-03-15+09:00:00
  2. Open browser Developer Tools → Network → select the request.
  3. Check Response Headers for X-Robots-Tag.
  4. Expected: X-Robots-Tag: noindex, nofollow is present.
  5. Verify: The page itself still renders normally for real users — they are not blocked, only bots are told not to index it.

Scenario 5: Auto-Install Behavior Verification

Enterprise QA: confirm the auto-install mechanic works correctly in a fresh database.

  1. On a test database, uninstall website_seo_protection_appointment if present.
  2. Confirm website_appointment is installed and website_seo_protection is NOT installed.
  3. Install website_seo_protection.
  4. Go to Apps → refresh → search for website_seo_protection_appointment.
  5. Expected: Module shows as Installed automatically (triggered by auto_install logic since both dependencies are now present).

Scenario 6: Real User Booking is Unaffected

Validates that legitimate customers can still book appointments normally.

  1. Open the website as a public (logged-out) visitor.
  2. Navigate to a real appointment type page: /web/appointment/<id>
  3. Select a date from the calendar widget and proceed through the booking flow.
  4. Expected: The booking completes successfully — no blocks, no errors.
  5. Also navigate back/forward through calendar months using the native UI arrows.
  6. Expected: Calendar navigation works correctly. The ?date= parameter in navigation links does not interrupt the user experience.

Scenario 7: Performance Under Bot Flood (Load Test)

Enterprise QA: simulate a bot flood and confirm server resources are not exhausted.

  1. Using a load testing tool (e.g., Apache JMeter, k6, or cURL loop), send 100 concurrent requests to: /web/appointment/1?domain=[('user_id','=',1)]
  2. Monitor the Odoo server CPU and memory usage during the test.
  3. Expected: All 100 requests receive HTTP 404 immediately with near-zero CPU impact.
  4. Expected: No database queries are executed — the middleware intercepts before ORM layer.
  5. Compare with a control run WITHOUT the module installed: CPU and DB queries spike significantly.

Scenario 8: Multi-Website Odoo Setup

Enterprise QA for Odoo instances running multiple websites with different domains.

  1. Configure at least 2 websites in Odoo (Website → Configuration → Websites).
  2. Enable website_appointment on both websites.
  3. Test the ?domain= trap URL from Website 1's domain.
  4. Expected: HTTP 404 on Website 1.
  5. Test the same pattern from Website 2's domain.
  6. Expected: HTTP 404 on Website 2 as well — protection applies globally.

Scenario 9: Google Search Console — Index Coverage Improvement

Long-term enterprise QA: verify Google deindexes the trap URLs after protection is active.

  1. Before installation: fetch the crawl report for your domain from Google Search Console. Note how many appointment-related URLs are indexed.
  2. Install the module and wait 2–4 weeks for Google's recrawl cycle.
  3. Check Google Search Console → Index Coverage → review the "Not found (404)" count for appointment URLs.
  4. Expected: Appointment trap URLs move from the "Indexed" bucket to "Not found (404)" or "Excluded" — confirming Google has deindexed them.
  5. Optional: use the URL Inspection tool in Search Console to fetch a specific trap URL and confirm Google sees the 404 response.

FAQ & Troubleshooting

Common Resolutions

Module did not auto-install?

Reason: Auto-install only triggers when both website_seo_protection AND website_appointment are installed.

Fix: Install both dependencies first, then refresh the modules list or upgrade the database.

My real appointment URLs return 404?

Reason: Only URLs with the ?domain= or deeply nested query trap patterns are blocked.

Fix: Normal appointment URLs without ?domain= are never affected. Test with a clean URL first.

Does this affect Odoo's native sitemap?

Answer: No. The sitemap XML (sitemap.xml) is not affected. Only dynamic frontend appointment URLs with the trap parameters are filtered.

Detail: The middleware only acts on HTTP request paths matching the appointment pattern.

Is this compatible with multi-website?

Answer: Yes! The middleware operates at the HTTP level, before website context is resolved, so it protects all websites in a multi-website Odoo setup.

Detail: Language prefixes for all configured websites are covered automatically.

Does this slow down my Odoo instance?

Answer: No — it actually improves performance. The protection triggers at the WSGI middleware level, which is the earliest possible point, before Odoo's ORM, database, or rendering pipeline is involved.

Detail: A blocked crawler request costs approximately the same as a static file 404, with zero database queries. Legitimate user traffic is completely unaffected.

My Google Search Console shows appointment URLs still indexed. Has the module fixed this?

Answer: The module starts protecting immediately after installation, but Google's deindexing cycle takes time. Googlebot needs to recrawl those URLs, receive the 404 response, and then update its index.

Expectation: Allow 2 to 6 weeks for Google Search Console to reflect the change. You can accelerate this by submitting the affected URL prefix for removal via the URL Removal Tool in Search Console.

Is the module compatible with Odoo.SH and custom domains?

Answer: Yes, fully compatible. The middleware operates at the Python/WSGI layer and is agnostic to the hosting platform, domain configuration, or SSL setup.

Detail: Tested and validated on Odoo.SH, Ganemo Online, and self-hosted Odoo Enterprise (Ubuntu + Nginx).

Does this module require any robots.txt configuration?

Answer: No. The HTTP 404 response (Layer 1) and the X-Robots-Tag HTTP header (Layer 2) are server-level signals that work independently of robots.txt. You do not need to edit any file.

Tip: You may still add appointment disallow rules to robots.txt as an optional extra layer, but it is not required for the protection to work.

What happens if I have a custom appointment URL route (not /web/appointment)?

Answer: The module uses a regular expression that matches Odoo's standard appointment URL pattern. If you have completely custom routes with different path segments (e.g., /agenda/), those are not currently covered.

Solution: Contact Ganemo support at help@ganemo.co for a custom pattern configuration tailored to your URL structure.

Can I whitelist specific bots or user agents to bypass the protection?

Answer: By design, Layer 1 (HTTP 404) blocks all requests with ?domain= regardless of user agent — including human visitors who may have bookmarked such a URL. This is intentional: the parameter itself is the trap, not the requester.

Note: Layer 2 (X-Robots-Tag) does not block anyone — it only adds a header. Real users see the calendar page normally. Only crawl bots read the header.

We are upgrading from Odoo 17 to Odoo 18. Is this module safe to upgrade?

Answer: Yes. This module adds only a WSGI middleware layer and contains no data models, no stored records, and no database migrations. Upgrading Odoo does not affect its configuration.

Process: After upgrading to Odoo 18, simply reinstall the module from the Ganemo App Store and it will resume protection immediately.

After installing, Odoo shows an error on the appointments page. What do I do?

Likely Cause: A conflict with another custom module that also overrides appointment routes or WSGI middleware.

Fix: Check the Odoo server log for the specific traceback. Common causes: another module already returns a response for ?domain= URLs. Contact Ganemo support with the log output at help@ganemo.co.

Commercial & Sales

For inquiries about licenses, demos, or partnerships.

QR WhatsApp
Official WhatsApp

Fastest response time.

COPY
LINK
https://wa.me/18286726150

+1 (828) 672-6150

QR Sales Email
Sales Email

For commercial inquiries.

COPY
ADDR
leads@ganemo.com
QR Book Demo
Book a Demo

Let's explore your needs.

COPY
LINK
ganemo.co/appointment/5

Technical Support

Existing customers regarding module functionality.

QR Technical Support
Help Desk

Exclusive channel for technical assistance and bug reports.

COPY
ADDR
help@ganemo.co

help@ganemo.co

Odoo Proprietary License v1.0

This software and associated files (the "Software") may only be used (executed,
modified, executed after modifications) if you have purchased a valid license
from the authors, typically via Odoo Apps, or if you have received a written
agreement from the authors of the Software (see the COPYRIGHT file).

You may develop Odoo modules that use the Software as a library (typically
by depending on it, importing it and using its resources), but without copying
any source code or material from the Software. You may distribute those
modules under the license of your choice, provided that this license is
compatible with the terms of the Odoo Proprietary License (For example:
LGPL, MIT, or proprietary licenses similar to this one).

It is forbidden to publish, distribute, sublicense, or sell copies of the Software
or modified copies of the Software.

The above copyright notice and this permission notice must be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.

Please log in to comment on this module

  • The author can leave a single reply to each comment.
  • This section is meant to ask simple questions or leave a rating. Every report of a problem experienced while using the module should be addressed to the author directly (refer to the following point).
  • If you want to start a discussion with the author or have a question related to your purchase, please use the support page.
Community
  • Tutorials
  • Documentation
  • Forum
Open Source
  • Download
  • Github
  • Runbot
  • Translations
Services
  • Odoo.sh Hosting
  • Support
  • Upgrade
  • Custom Developments
  • Education
  • Find an Accountant
  • Find a Partner
  • Become a Partner
About us
  • Our company
  • Brand Assets
  • Contact us
  • Jobs
  • Events
  • Podcast
  • Blog
  • Customers
  • Legal • Privacy
  • Security

Odoo is a suite of open source business apps that cover all your company needs: CRM, eCommerce, accounting, inventory, point of sale, project management, etc.

Odoo's unique value proposition is to be at the same time very easy to use and fully integrated.

Website made with