Skip to content

Odoo Website SEO: domain, robots.txt, llms.txt and schema for Odoo eCommerce

Published 7 October 20269 min readBy the SmoothSeen editorial team

Odoo Website SEO is set in three places: the Domain field in the website settings, which drives the canonical, sitemap and robots.txt; the Optimize SEO dialog on each page, for title, description and social image; and the robots.txt editor, which needs developer mode. Odoo generates the sitemap, hreflang and JSON-LD on its own. This applies to Odoo 19 and 20.

Key points

  • Odoo 20 was released in September 2026 with standard support planned until September 2029; Odoo 19 is supported until September 2028.
  • The Domain field in the website settings drives the canonical, the sitemap and robots.txt; without it, Odoo's own address can compete with yours in Google.
  • Odoo's canonical strips URL parameters, and page 2 onwards of paginated listings carries noindex.
  • The Edit robots.txt button only appears in developer mode; Odoo 20 adds Edit llms.txt, which publishes /llms.txt.
  • Odoo 20 outputs JSON-LD with Organization, BreadcrumbList and Product (price, availability, SKU and GTIN), but no brand, shipping or returns.

To check it on your own site: SEO audit

On this page

Odoo is a Python ERP whose Website app (and its eCommerce extension) publishes pages, a blog and a shop from the same database. It controls URLs, the canonical tag, hreflang, the sitemap, robots.txt and structured data. It has no settings for HTTP security headers or compression: on Odoo Online and Odoo.sh you do not run the web server, and on a self-hosted install that is the job of the proxy in front. Menu paths are quoted as they appear in the official documentation.

Which Odoo version should you run in October 2026?

Odoo 20 was released in September 2026, with standard support planned until September 2029; Odoo 19 is supported until September 2028 and Odoo 17 lost standard support in September 20261. Odoo Online also gets SaaS releases every two to three months (19.1 to 19.4), which exist only there1. What changes for SEO between 19 and 20, according to the source code:

What
Canonical, hreflang and x-default
Odoo 19
Automatic
Odoo 20
Automatic
Your job
Fill in the Domain field
What
Sitemap
Odoo 19
/sitemap.xml, every 12 hours
Odoo 20
Same
Your job
Submit it to Search Console
What
robots.txt
Odoo 19
Editable in developer mode
Odoo 20
Same
Your job
Add your AI policy
What
llms.txt
Odoo 19
No
Odoo 20
Edit llms.txt button
Your job
Optional
What
Redirects menu
Odoo 19
Developer mode only
Odoo 20
Always visible
Your job
Redirect old URLs when migrating
What
JSON-LD
Odoo 19
Organization, Product and ProductGroup (with eCommerce)
Odoo 20
Plus BreadcrumbList, BlogPosting and Event, in one block
Your job
Complete the product fields
What
Security headers
Odoo 19
No setting in the admin
Odoo 20
No setting in the admin
Your job
Proxy or Cloudflare

Why is the Domain field the first thing to set?

Because Odoo builds the canonical from the website's domain, not from the host of the request2. Go to Website > Configuration > Settings and enter the full URL in Domain, for example https://www.example.com3. With that value set, Odoo does three things:

  1. Every page's <link rel="canonical"> points to your domain, without parameters, and the home page always points to /2.
  2. If someone arrives through the database address (mycompany.odoo.com), robots.txt answers Disallow: / and pages carry noindex4. The documentation puts it simply: mapping your domain stops Google indexing the original address3.
  3. The sitemap and the Sitemap line in robots.txt use your domain.

Odoo issues a Let's Encrypt certificate for each domain you connect, but not for the naked domain (example.com without www)3. That is why the documentation recommends a 301 from example.com to https://www.example.com at your DNS provider or through Cloudflare. Without it, anyone typing the address without www may get an error.

How do you optimise titles, descriptions and images in Odoo?

Open the page in the editor and go to Website > Site > Optimize SEO5. The dialog offers:

  • Title and description. Leave them empty and Odoo uses defaults taken from the content. A preview shows how they would look in Google. Fill with AI suggests both.
  • Keywords. They fill <meta name="keywords">, which search engines ignore; the real value is seeing whether the term appears in the H1, H2s, title and body. The documentation asks for a single H1 per page5.
  • Social share image. The logo by default. You can set a different default under Settings > Default Social Share Image.

Odoo compresses uploaded images and converts them to WebP; alt text goes in each image's Description field5. Rename a product or a blog post and Odoo changes the URL and creates a 301 from the old one5.

How does Odoo prevent duplicate content in the shop?

Through three mechanisms found in its code:

  • Parameter-free canonical. Attribute filters, sorting and shop search add parameters to the URL; the canonical drops them and points to the category or to /shop2. Google treats the canonical as a strong signal when choosing the representative URL among duplicates6.
  • noindex on pagination. Page 2 onwards of a paginated listing carries noindex4. Google asks for each page in a series to have its own URL and canonical, which Odoo provides, but these pages stay out of the index7. Products are still discovered through the sitemap, which lists them all.
  • Indexed. Under Website > Site > Properties, the Indexed switch removes a static page from results and from the sitemap. Dynamic pages (product pages, blog posts) do not have it yet5.

For manual redirects, Website > Configuration > Redirects supports 301, 302, 404 and 3088. The 308 «Redirect / Rewrite» renames a dynamic page, for example /shop to /store. In Odoo 19 that menu only appears in developer mode9.

How do you edit robots.txt in Odoo?

Odoo builds robots.txt from a template and appends whatever you write under Website > Configuration > Settings > Tracking & SEO > Edit robots.txt5. That button only shows in developer mode: Settings > Developer Tools > Activate the developer mode, or ?debug=1 in the URL1011. With the domain set and the right address, the fixed part is this4:

User-agent: *
Sitemap: https://www.example.com/sitemap.xml
Disallow: /web/login
Disallow: /*/web/login
Disallow: /web/signup
Disallow: /*/web/signup
Disallow: /web/reset_password
Disallow: /*/web/reset_password
Disallow: /my/
Disallow: /*/my/*

##############
#   custom   #
##############

Whatever you type in the editor is pasted after those lines. This is a sensible policy for training crawlers:

# Model training: blocking it does not remove you from ChatGPT or Google
User-agent: GPTBot
User-agent: ClaudeBot
User-agent: Google-Extended
User-agent: CCBot
Disallow: /

We checked the full file with Protego, which applies Google's rules: product pages, categories and the blog stay open to Googlebot, OAI-SearchBot and Claude-SearchBot; login and /my/ stay closed; GPTBot, ClaudeBot and CCBot are kept out. The mistake to avoid: a stray line such as Disallow: /shop without its own User-agent joins the User-agent: * group and closes the shop to everyone, AI search crawlers included. The crawlers that decide whether ChatGPT or Claude can cite you are OAI-SearchBot and Claude-SearchBot; Google-Extended has no effect on Google Search121314.

What is Odoo 20's llms.txt for?

Odoo 20 adds an Edit llms.txt button next to the robots.txt one: whatever you write is published at /llms.txt as plain text, and if you leave it empty that address returns a 4041015. It is optional and cheap, but no AI search engine has documented reading it, and Google does not use it. The guide to llms.txt sums up what the data says.

What structured data does Odoo generate?

Odoo's documentation still talks about microdata, but the code in Odoo 19 and 20 outputs JSON-LD on product pages1617. In Odoo 19 with eCommerce installed, every page also carries an Organization with the company name18. In Odoo 20 every page carries a single block with Organization (website name, URL and logo), BreadcrumbList and the page's own type19. On a product page, these are the properties and where they come from16:

Property
name, image, url
Odoo field
Product name, main image and URL
Property
offers.price and priceCurrency
Odoo field
Website pricelist price, with taxes if that is how prices are shown
Property
offers.availability
Odoo field
Odoo 20 only, for tracked-inventory products: InStock or OutOfStock
Property
sku
Odoo field
Internal reference
Property
gtin
Odoo field
Barcode
Property
description
Odoo field
Meta description or sales description
Property
aggregateRating
Odoo field
Ratings, if product reviews are enabled

A product with variants comes out as a ProductGroup with one Product per variant17. Brand, shipping and return policy are missing, and Google recommends them for merchant listings20. If you need them, add them with a custom module or one from the Odoo Apps Store. What Google expects for each property is in the guide to Product schema.

How do you add HSTS and other security headers?

The website settings have no header options at all10. On Odoo Online or Odoo.sh, the route is a proxy such as Cloudflare in front of your domain, which Odoo's own documentation uses to redirect the naked domain3; the guide to Cloudflare security headers and caching has the rules. On a self-hosted install, the deployment documentation puts Nginx in front of Odoo with proxy_mode = True in Odoo's configuration21. This block starts from its example; we validated it with nginx -t on the official nginx:stable image:

server {
    listen 443 ssl;
    server_name www.example.com;
    # ssl_certificate and ssl_certificate_key for your certificate

    location / {
        proxy_set_header X-Forwarded-Host $http_host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_redirect off;
        proxy_pass http://odoo;

        # One day to start with; raise it once everything works over https
        add_header Strict-Transport-Security "max-age=86400" always;
        add_header Referrer-Policy "strict-origin-when-cross-origin" always;
        add_header X-Content-Type-Options "nosniff" always;
    }

    gzip on;
    gzip_types text/css text/plain text/xml application/xml application/json application/javascript;
}

The official example uses a one-year max-age with includeSubDomains from day one21. Start with one day: HSTS forces the browser onto https for that whole period, and with includeSubDomains on every subdomain too22.

How to check it

  • Domain and canonical: open https://mycompany.odoo.com/robots.txt; it should say Disallow: /. On your domain, the source of a filtered shop page should carry a canonical without parameters.
  • Sitemap: open /sitemap.xml and submit it in Search Console.
  • Structured data: run a product page through the Rich Results Test.
  • Headers: curl -I https://www.example.com/ and Mozilla's HTTP Observatory.

What SmoothSeen does with this

SmoothSeen checks a page of your site for what this guide configures: robots.txt, sitemap, canonical and noindex, titles and descriptions, structured data, HTTPS and the redirect to https, and security headers via Mozilla's HTTP Observatory. On the AI side it looks at which crawlers your robots.txt allows, separating search from training, whether there is an llms.txt, and whether your server returns a 403 to any crawler while serving the page to a browser.

What to do this week

Check that the Domain field holds your address with https:// and www, and that mycompany.odoo.com/robots.txt answers Disallow: /. Then fill in the internal reference and barcode on your best-selling products, because they go straight into the JSON-LD. To see your shop measured, run an online store audit with SmoothSeen.

Frequently asked questions

Why is Google indexing my Odoo site on the odoo.com address?

Because the Domain field in the website settings is empty or does not match your domain. Once you fill it in, Odoo answers Disallow: / in the robots.txt of the original address and marks its pages noindex. Whatever is already indexed takes time to drop out; you can speed up removal from Search Console.

Where is the button to edit robots.txt in Odoo?

Under Website > Configuration > Settings, in the Tracking & SEO section, but only with developer mode switched on, which is why many users cannot find it. Turn it on under Settings > Developer Tools or by adding ?debug=1 to the backend URL. What you write is appended to the robots.txt Odoo generates; it does not replace it.

Does Odoo mark up product pages with Product schema?

Yes, as JSON-LD: name, image, price, currency, internal reference as SKU and barcode as GTIN; Odoo 20 adds availability for tracked-inventory products, and ratings if you enable reviews. It does not include brand, shipping costs or a return policy, which Google recommends for merchant listings.

Can I set security headers on Odoo Online?

Not from Odoo: the website settings have no such option and on Odoo Online you do not manage the web server. The alternative is to put a proxy such as Cloudflare in front of your domain and add HSTS, Referrer-Policy and the rest there. If Odoo runs on your own server, add them in the Nginx in front of it.

Sources

  1. 1Standard and extended support, Odoo 20.0 documentation, accessed 9 October 2026.
  2. 2addons/website/models/website.py, _get_canonical_url and _is_indexable_url functions, official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  3. 3Domain names, Odoo 20.0 documentation, accessed 9 October 2026.
  4. 4addons/website/views/website_templates.xml (head, noindex and robots template), official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  5. 5Search Engine Optimization (SEO), Odoo 20.0 documentation, accessed 9 October 2026.
  6. 6How to specify a canonical URL with rel="canonical" and other methods, Google Search Central, updated 10 July 2026.
  7. 7Pagination, incremental page loading, and their impact on Google Search, Google Search Central, updated 10 December 2025.
  8. 8Pages, Odoo 20.0 documentation, accessed 9 October 2026.
  9. 9addons/website/views/website_rewrite.xml, official odoo/odoo repository, 19.0 branch, accessed 9 October 2026.
  10. 10addons/website/views/res_config_settings_views.xml, official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  11. 11Developer mode (debug mode), Odoo 20.0 documentation, accessed 9 October 2026.
  12. 12Overview of OpenAI Crawlers, OpenAI, accessed 9 October 2026.
  13. 13Does Anthropic crawl data from the web, and how can site owners block the crawler?, Anthropic, updated 7 April 2026.
  14. 14AI features and your website, Google Search Central, updated 10 December 2025.
  15. 15addons/website/controllers/main.py, /llms.txt route, official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  16. 16addons/website_sale/models/product_product.py, _prepare_jsonld_vals function, official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  17. 17addons/website_sale/models/product_template.py, official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  18. 18addons/website_sale/views/templates.xml, official odoo/odoo repository, 19.0 branch, accessed 9 October 2026.
  19. 19addons/website/models/mixins.py, WebsiteStructuredDataMixin class, official odoo/odoo repository, 20.0 branch, accessed 9 October 2026.
  20. 20Merchant listing (Product, Offer) structured data, Google Search Central, updated 8 September 2026.
  21. 21System configuration (Deploying Odoo), Odoo 20.0 documentation, accessed 9 October 2026.
  22. 22Strict-Transport-Security header, MDN Web Docs, updated 11 September 2026.

How to cite this article

SmoothSeen. (2026, October 7). Odoo Website SEO: domain, robots.txt, llms.txt and schema for Odoo eCommerce. https://smoothseen.com/en/blog/odoo-website-seo/

Who writes this

SmoothSeen is a website audit tool that measures visibility in search engines and AI assistants and delivers reports under the agency's own brand.

This blog belongs to SmoothSeen: when an article discusses the product, it does so knowing the product is ours. Third-party figures link to their original source.

Change history

  • First version.

Keep reading

Odoo Website SEO for Odoo 19 and 20 (eCommerce too)