Se rendre au contenu

Créer un site web avec le Website Builder natif d'Odoo 19 CE

Ce guide s'adresse à toute personne souhaitant créer ou restructurer un site web avec Odoo 19 Community Edition en utilisant les outils natifs du Website Builder : site vitrine, homepage d'une instance existante, ou site livré à un client.

Il ne couvre pas les développements sur mesure (modules custom, thèmes spécifiques, injection de code HTML brut) — ces cas relèvent d'une prestation de développement.

Principe directeur

Une seule règle gouverne toute la méthode, et elle conditionne la pérennité du site livré.

Construire avec les outils natifs d'Odoo, pas contre eux.

Un site construit avec les snippets natifs est : éditable par le client lui-même ; maintenable (compatible mises à jour Odoo) ; cohérent avec l'écosystème (blog, boutique, formulaires s'intègrent naturellement) ; transférable (un autre intégrateur ou le client peut reprendre le travail).

Règles permanentes de design et de contenu

Ces règles s'appliquent d'office à tous les sites construits avec cette méthode. Elles ne sont pas des options — elles constituent le socle de qualité.

Règle D1 — Proportions guidées par le nombre d'or et Fibonacci

Le nombre d'or (φ ≈ 1,618) et la suite de Fibonacci (8, 13, 21, 34, 55, 89…) fixent toutes les proportions du site : colonnes, blocs, espacements et typographie.

Mise en page deux colonnes — ratio 38,2 % / 61,8 %, jamais 50/50. Avec Bootstrap 12 colonnes : col-lg-5 (texte) + col-lg-7 (image/grille). La colonne secondaire est la plus grande.

UsageColonnes Bootstrap
Texte (intro) + Image ou grillecol-lg-5 + col-lg-7
Image + Texte (humain, portrait gauche)col-lg-5 + col-lg-7

Ratios de blocs : hero, cartes, images vedettes → 1:1,618 ou 1,618:1. Hauteur du hero ≈ 62 % du viewport (min-height: 62vh).

Espacements — échelle Fibonacci, portée par les variables CSS du thème :

--space-1: 8px;   /* Fibonacci : 8  */
--space-2: 13px;  /* Fibonacci : 13 */
--space-3: 21px;  /* Fibonacci : 21 */
--space-4: 34px;  /* Fibonacci : 34 */
--space-5: 55px;  /* Fibonacci : 55 */
--space-6: 89px;  /* Fibonacci : 89 */

Utiliser ces variables pour padding, gap, margin. Ne pas coder de valeurs arbitraires (32px, 40px, 60px…).

Hiérarchie typographique — ratios φ, base 16 px :

h1  : 42 px  (16 × φ²)
h2  : 26 px  (16 × φ)
h3  : 20 px  (intermédiaire)
body: 16 px
small: 10 px  (16 ÷ φ)

Règle D2 — Fidélité éditoriale

Quand un brief pointe vers une maquette de référence ou un catalogue validé, les textes éditoriaux doivent en être repris textuellement, pas reformulés. Toute réécriture — même légère — introduit une dérive de message.

  1. Identifier la source de vérité éditoriale (maquette, catalogue, brief client).
  2. Copier les textes tels quels dans les snippets.
  3. Si une formulation ne tient pas : signaler et proposer une réduction (troncature signalée avec […]) — pas une réécriture spontanée.
  4. Ne jamais reformuler sans accord explicite du client ou du donneur d'ordre.

Prérequis

Avant d'ouvrir l'éditeur, vérifier que les éléments suivants sont en place. Un chantier lancé sans contenu ni identité visuelle définie s'enlise systématiquement.

PrérequisDétail
Odoo 19 CE installéModule Website activé
Accès administrateurOdoo Admin → Site Web
Nom de domaine configuréDNS pointant vers le serveur, SSL actif
Contenu textuel préparéTextes, argumentaire, tarifs — avant de commencer
Images disponiblesLogo, photos — formats web (JPEG/PNG/SVG, <500 ko)
Identité visuelle définieCouleurs primaire/secondaire, police si personnalisée

Processus de création

Le processus se déroule en sept étapes, de la préparation du contenu jusqu'au SEO. L'ordre compte : le contenu précède toujours la mise en forme.

Étape 1 — Préparer le contenu (avant d'ouvrir l'éditeur)

C'est l'étape la plus importante et la plus souvent négligée.

Textes : titre H1 hero (1 ligne) · sous-titre hero (1-2 phrases) · proposition de valeur (2-3 phrases) · description de chaque offre (3-5 lignes/carte) · bio/présentation équipe (4-6 lignes) · processus client (3 étapes max) · CTA final (1 titre + 1 sous-titre) · meta description SEO (150-160 caractères).

Images : logo (SVG ou PNG fond transparent) · photo hero (optionnelle, fond sombre si texte blanc) · portrait(s) humain(s) (JPEG, ratio portrait) · favicons (gérés par Odoo).

Règle : ne jamais rédiger dans l'éditeur Odoo. Rédiger dans un document texte, valider avec le client, puis copier-coller. L'éditeur est pour la mise en forme, pas la rédaction.

Étape 2 — Configurer l'identité visuelle

La palette et le logo se règlent une fois pour toutes avant de poser le premier snippet.

  1. Odoo Admin → Site Web → Configuration → Couleurs (ou Website Builder → icône pinceau).
  2. Définir Couleur 1 (primaire), Couleur 2 (secondaire). Les sections utilisent les niveaux o_cc1 à o_cc5 (de clair à foncé).
  3. Configurer le logo : Site Web → Configuration → Logo.
  4. Configurer le nom du site et la meta description par défaut : Site Web → Configuration → Informations générales.

Note : si la palette Odoo ne suffit pas, une micro-customisation CSS ciblée est possible via Site Web → Thème → CSS personnalisé (option avancée, à documenter dans le livrable).

Étape 3 — Construire la homepage avec les snippets

Odoo Admin → Site Web → homepage → Modifier. Les sections s'ajoutent par glisser-déposer puis se personnalisent en cliquant dessus.

Structure type d'une homepage vitrine (ordre recommandé) :

#SectionSnippetRôle
1Heros_coverAccroche principale, bouton CTA
2Réassurances_text_blockProposition de valeur, ton
3Offres / servicess_featuresGrille de cartes descriptives
4Offre vedette 1s_text_imageDétail + tarif de l'offre principale
5Offre vedette 2s_text_imageIdem pour une 2e offre si pertinent
6Présentation humaines_text_imagePortrait + bio
7Processuss_features3 étapes max
8CTA finals_call_to_actionBouton de conversion

Cette structure n'est pas obligatoire — elle est issue de l'expérience terrain, à adapter au métier.

Étape 4 — Catalogue des snippets natifs utiles

Dix snippets natifs suffisent à construire la quasi-totalité d'un site vitrine. Chacun se glisse depuis la barre de l'éditeur.

  • s_cover — Hero pleine hauteur. Image/fond de couleur (o_cc5 pour fond foncé), texte centré H1 + sous-titre + 1-2 CTA, parallax activable.
  • s_text_block — Bloc texte simple (réassurance, intro, citation). text-center pour centrer.
  • s_features — Grille de cartes (offres, avantages, étapes). 3 colonnes natives, extensible (col-lg-4col). Icônes Font Awesome natives.
  • s_text_image — Deux colonnes texte + image. Idéal grilles de prix (remplacer l'image par une liste
      dans l'éditeur HTML). CTA intégré.
    • s_call_to_action — Bande CTA, layout 9/3. o_cc5 fond foncé, o_cc1 fond clair.
    • s_comparisons — Grille de plans tarifaires (3 offres). Requiert data-vxml="001" et data-vcss="001".
    • s_pricelist_boxed — Liste de prix encadrée, style « menu restaurant ».
    • s_quotes_carousel — Carrousel de témoignages. Requiert data-vxml="001" et data-vcss="002".
    • s_numbers — Métriques / chiffres clés (classe s_number, animés à l'entrée viewport).
    • s_website_form — Formulaire de contact (voir étape 5).

    Étape 5 — Configurer le formulaire de contact

    Le formulaire natif s_website_form est le moyen recommandé. Configuration minimale :

    ParamètreValeur recommandée
    Modèle ciblemail.mail (envoi d'email)
    Route/website/form/ (action du
    )
    Email destinataireChamp caché email_to → adresse de réception
    Redirection après envoidata-success-mode="redirect" + data-success-page="/"

    Champs utiles : email_from (modèle), subject (modèle), name (custom → corps du mail), description (custom → corps).

    Piège connu : la route Odoo 19 est /website/form/ (avec préfixe website/) — pas /website_form/. Le JS construit l'URL action + data-model_name ; l'action doit donc être /website/form/ uniquement (voir le piège N001).

    Prérequis livraison : configurer le SMTP sortant (Paramètres → Email → Serveurs sortants). Sans SMTP, les messages sont créés en base mais non livrés.

    Étape 6 — Images et médias

    La médiathèque Odoo doit rester la source unique des images du site : elle garantit des URLs propres et des fichiers retrouvables.

    Recommandé : uploader via le Website Builder (clic image → « Remplacer ») ou Médiathèque. Odoo stocke en ir.attachment et génère des URLs propres (/web/image/ir.attachment/ID/raw). Éviter : les data URI base64 dans le HTML (alourdissent les vues, hors médiathèque).

    Optimisation : JPEG (photos), PNG (transparence), SVG (logos/icônes). Max 200 ko contenu, 50 ko icônes.

    Étape 7 — SEO de base

    Chaque page publiée reçoit un titre, une meta description et une URL personnalisés directement dans le Website Builder.

    ÉlémentOù le configurer
    Titre de la page (</code>)</td><td>Website Builder → icône SEO → « Titre »</td></tr> <tr><td>Meta description</td><td>Website Builder → icône SEO → « Description »</td></tr> <tr><td>Meta description par défaut</td><td>Site Web → Config → Infos générales</td></tr> <tr><td>Titre <code><h1></code> visible</td><td>Directement dans le snippet hero</td></tr> <tr><td>URL de la page</td><td>Website Builder → icône engrenage → « URL »</td></tr> </tbody> </table> <p><strong>Règles :</strong> titre 50-60 caractères (mot-clé en tête) ; meta description 150-160 caractères ; H1 unique par page.</p> <h2>Critères de validation (checklist de sortie)</h2> <p>Un site n'est livrable que lorsque les quatre familles de critères sont vérifiées, chacune de bout en bout.</p> <ul> <li><strong>Contenu :</strong> sections présentes · textes relus/validés client · tarifs à jour · aucun placeholder « Lorem ipsum » / « Bientôt ».</li> <li><strong>Technique :</strong> affichage mobile correct (responsive Bootstrap) · liens CTA corrects · formulaire testé (un envoi arrive à l'adresse cible) · SMTP configuré et vérifié · SSL valide.</li> <li><strong>SEO :</strong> titre HTML personnalisé · meta description personnalisée · attributs <code>alt</code> sur les images.</li> <li><strong>Éditabilité :</strong> le client peut ouvrir le Website Builder et modifier les textes · client formé aux opérations de base.</li> </ul> </div> </section> <section class="pt-5 pb-4"> <div class="container"> <h2>Multi-website Odoo 19 — plusieurs domaines sur une instance</h2> <p>Odoo 19 CE supporte nativement plusieurs sites web sur une même instance. Chaque site est un enregistrement <code>website</code> avec son propre domaine, sa palette, ses pages et son menu.</p> <p><strong>Argument commercial :</strong> pour plusieurs marques ou sites sectoriels, le multi-website évite de déployer une instance supplémentaire — réduction des coûts d'infrastructure, de maintenance et de sauvegardes. <em>« Plusieurs sites pour plusieurs marques, tous gérés depuis le même backoffice, avec les mêmes clients et commandes. »</em></p> <h3>Création d'un 2e site (ou Nème)</h3> <p>Un site supplémentaire se crée en une commande dans le shell Odoo.</p> <pre><code>website2 = env['website'].create({ 'name': 'Nom du site', 'domain': 'exemple2.fr', # sans https:// ni slash final 'company_id': env.company.id, 'default_lang_id': env.ref('base.lang_fr').id, }) env.cr.commit() # → website_id attribué automatiquement (ex. 2)</code></pre> <p><strong>Partage de <code>res.company</code> :</strong> par défaut, tous les sites partagent la même société. Si le multi-website représente des entités juridiques distinctes, créer une société séparée par site avant de créer les sites.</p> <h3>Mapping domaine → website_id</h3> <p>Odoo détermine le site servi en comparant le header <code>Host:</code> HTTP au champ <code>website.domain</code> :</p> <table class="table table-striped table-sm"> <thead><tr><th><code>Host:</code> entrant</th><th><code>website.domain</code></th><th>Site servi</th></tr></thead> <tbody> <tr><td><code>exemple1.fr</code></td><td><code>exemple1.fr</code></td><td>website_id=1</td></tr> <tr><td><code>exemple2.fr</code></td><td><code>exemple2.fr</code></td><td>website_id=2</td></tr> <tr><td>Tout autre</td><td><em>(aucun match)</em></td><td>Premier site (website_id=1 par défaut)</td></tr> </tbody> </table> <p><strong>Important :</strong> <code>domain</code> ne doit pas contenir <code>https://</code> ni <code>www.</code> — Odoo compare le hostname nu.</p> <h3>Configuration Nginx — un vhost par domaine</h3> <p>Chaque domaine additionnel a son vhost. Tous proxy-passent vers le même Odoo (<code>127.0.0.1:8069</code>) — Odoo résout le site via le <code>Host:</code>.</p> <pre><code>server { server_name exemple.fr www.exemple.fr; location / { proxy_pass http://127.0.0.1:8069; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; # ← critique : Odoo lit ce header proxy_buffering off; proxy_read_timeout 720s; } location ~* /web/static/ { proxy_cache_valid 200 90d; proxy_buffering on; expires 864000; proxy_pass http://127.0.0.1:8069; proxy_set_header Host $host; } listen 443 ssl; ssl_certificate /etc/letsencrypt/live/exemple.fr/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/exemple.fr/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; } server { if ($host = www.exemple.fr) { return 301 https://exemple.fr$request_uri; } if ($host = exemple.fr) { return 301 https://exemple.fr$request_uri; } listen 80; server_name exemple.fr www.exemple.fr; return 404; }</code></pre> <pre><code>ln -s /etc/nginx/sites-available/exemple.fr.conf /etc/nginx/sites-enabled/ nginx -t && systemctl reload nginx certbot --nginx -d exemple.fr -d www.exemple.fr --non-interactive --agree-tos \ --redirect -m contact@exemple.fr</code></pre> <h3>Pages et menus spécifiques à un site</h3> <p>La séparation par site s'appuie sur le champ <code>website_id</code>, présent sur les pages, les vues QWeb et les menus.</p> <ul> <li><strong>Pages :</strong> une <code>website.page</code> est liée via <code>website_id</code>. <code>website_id=2</code> → visible que sur le site 2 ; sans <code>website_id</code> → partagée.</li> <li><strong>Vues QWeb :</strong> une <code>ir.ui.view</code> avec <code>website_id=2</code> override la vue globale pour le site 2.</li> <li><strong>Menus :</strong> <code>website.menu</code> lié à <code>website_id</code> ; créer un menu racine par site.</li> </ul> <p><strong>Clés de vues — convention :</strong></p> <pre><code>website.NOMSITE_homepage website.NOMSITE_palette website.NOMSITE_mentions_legales website.NOMSITE_footer_legal website.NOMSITE_hide_footer_copyright</code></pre> <p><strong>Pièges spécifiques :</strong> le multi-website concentre une série de pièges validés terrain (mauvais site servi, CSS de palette jamais appliqué, vues d'extension inopérantes…). Ils sont documentés avec symptôme, cause et solution sur la page <a href="/documentation/odoo-claude/pieges">Pièges Odoo 19</a>, références <a href="/documentation/odoo-claude/pieges#n009">N009</a> à <a href="/documentation/odoo-claude/pieges#n017">N017</a>.</p> <p><strong>Cache à connaître :</strong> les changements de <strong>vues</strong> (<code>ir.ui.view</code>) peuvent tarder (cache de page/QWeb des workers) — patienter ou <code>systemctl restart odoo</code>. <code>custom_code_head</code>, <code>website.logo</code> et <code>website.rewrite</code> se reflètent vite.</p> </div> </section> <section class="pt-5 pb-4"> <div class="container"> <h2>Analytics — Plausible CE (optionnel recommandé)</h2> <p>Option recommandée — non obligatoire, mais conseillée pour tout site livré à un client soucieux de ses données. À activer si le VPS client le permet.</p> <p><strong>Plausible Analytics CE</strong> est une solution d'analyse de trafic open source (AGPL v3), auto-hébergée sur le VPS du client — chaque client reste maître de ses données.</p> <h3>Pourquoi le recommander</h3> <ul> <li>Cohérent avec une promesse « informatique libre et éthique ».</li> <li><strong>Sans cookies</strong> → pas de bandeau de consentement obligatoire (RGPD).</li> <li><strong>Exempt CNIL</strong> (5 critères : données anonymisées, auto-hébergé, pas de suivi inter-sites, pas de fingerprinting, pas de partage tiers).</li> <li>Données hébergées chez le client, pas sur un tiers.</li> </ul> <h3>Déploiement Plausible CE sur un VPS Ubuntu</h3> <p><strong>À refaire si le VPS est réinstallé</strong> — Plausible tourne dans des containers Docker qui ne font pas partie des sauvegardes système standard.</p> <h4>Étape A — Installer Docker Engine</h4> <pre><code>sudo apt-get update && sudo apt-get install -y ca-certificates curl gnupg sudo install -m 0755 -d /etc/apt/keyrings curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \ sudo gpg --dearmor --yes -o /etc/apt/keyrings/docker.gpg sudo chmod a+r /etc/apt/keyrings/docker.gpg echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \ https://download.docker.com/linux/ubuntu \ $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null sudo apt-get update && sudo apt-get install -y \ docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo docker --version && sudo docker compose version</code></pre> <h4>Étape B — Déployer la stack Plausible CE</h4> <pre><code>sudo mkdir -p /opt/plausible/community-edition cd /opt/plausible/community-edition sudo curl -fsSL \ https://raw.githubusercontent.com/plausible/community-edition/v2.1.5/compose.yml \ -o compose.yml sudo mkdir -p clickhouse # logs.xml — niveau warning uniquement sudo tee clickhouse/logs.xml > /dev/null << 'XEOF' <clickhouse> <logger><level>warning</level><console>true</console></logger> <query_thread_log remove="remove"/> <query_log remove="remove"/> <text_log remove="remove"/> <trace_log remove="remove"/> <metric_log remove="remove"/> <asynchronous_metric_log remove="remove"/> <session_log remove="remove"/> <part_log remove="remove"/> </clickhouse> XEOF # ipv4-only.xml — IPv4 uniquement (Docker bridge) sudo tee clickhouse/ipv4-only.xml > /dev/null << 'XEOF' <clickhouse><listen_host>0.0.0.0</listen_host></clickhouse> XEOF # low-resources.xml — NE PAS réduire background_pool_size (conflit MergeTree) sudo tee clickhouse/low-resources.xml > /dev/null << 'XEOF' <clickhouse><max_server_memory_usage_to_ram_ratio>0.5</max_server_memory_usage_to_ram_ratio></clickhouse> XEOF # .env — variables d'environnement SECRET=$(openssl rand -hex 64) sudo tee .env > /dev/null << XEOF BASE_URL=https://analytics.CLIENT.fr SECRET_KEY_BASE=${SECRET} HTTP_PORT=8000 DISABLE_REGISTRATION=invite_only MAILER_ADAPTER=Bamboo.SMTPAdapter MAILER_EMAIL=contact@CLIENT.fr SMTP_HOST_ADDR=smtp.exemple.fr SMTP_HOST_PORT=465 SMTP_USER_NAME=contact@CLIENT.fr SMTP_USER_PWD=MOT_DE_PASSE_SMTP SMTP_HOST_SSL_ENABLED=true XEOF # compose.override.yml — exposer le port 8000 en localhost uniquement sudo tee compose.override.yml > /dev/null << 'XEOF' services: plausible: ports: - 127.0.0.1:8000:8000 XEOF sudo docker compose up -d sudo docker ps --format "table {{.Names}}\t{{.Status}}" # attendre ~30s</code></pre> <h4>Étape C — Créer le compte admin et les sites</h4> <pre><code>sudo docker cp /tmp/setup.exs community-edition-plausible-1:/tmp/ sudo docker exec community-edition-plausible-1 \ /app/bin/plausible rpc 'Code.eval_file("/tmp/setup.exs")'</code></pre> <p>Contenu de <code>/tmp/setup.exs</code> :</p> <pre><code>alias Plausible.{Repo, Auth, Sites, Site} import Ecto.Changeset {:ok, admin} = Auth.create_user("Nom Admin", "admin@CLIENT.fr", "MOT_DE_PASSE") for domain <- ["CLIENT.fr"] do {:ok, %{site: site}} = Sites.create(admin, %{domain: domain, timezone: "Europe/Paris"}) slug = :crypto.strong_rand_bytes(16) |> Base.url_encode64(padding: false) cs = Site.SharedLink.changeset(%Site.SharedLink{}, %{name: "Odoo Dashboard", slug: slug}) |> put_change(:site_id, site.id) {:ok, link} = Repo.insert(cs) IO.puts("#{domain} → slug=#{link.slug}") end</code></pre> <p><strong>Note Plausible v2.x :</strong> le <code>slug</code> du SharedLink est <code>required</code> (à générer). <code>Sites.create/2</code> retourne <code>{:ok, %{site: site}}</code>. L'admin doit être créé AVANT les sites.</p> <h4>Étape D — Vhost Nginx + SSL</h4> <pre><code>sudo tee /etc/nginx/sites-available/analytics.CLIENT.fr.conf > /dev/null << 'XEOF' server { server_name analytics.CLIENT.fr; location / { proxy_pass http://127.0.0.1:8000; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Host $host; proxy_buffering off; } listen 80; } XEOF sudo ln -sf /etc/nginx/sites-available/analytics.CLIENT.fr.conf /etc/nginx/sites-enabled/ sudo nginx -t && sudo systemctl reload nginx sudo certbot --nginx -d analytics.CLIENT.fr --non-interactive --agree-tos \ --redirect -m contact@CLIENT.fr</code></pre> <h3>Mise en service côté Odoo</h3> <p>Une fois la stack en place, deux réglages relient Odoo à Plausible : les paramètres système (une fois par instance) et la configuration de chaque site.</p> <ol> <li><strong>Paramètres système Odoo</strong> (une fois par instance) : <pre><code>ICP = env['ir.config_parameter'].sudo() ICP.set_param('website.plausible_server', 'https://analytics.CLIENT.fr') ICP.set_param('website.plausible_script', 'https://analytics.CLIENT.fr/js/script.js')</code></pre> </li> <li><strong>Configurer le site Odoo</strong> : <pre><code>env['website'].browse(1).write({ 'plausible_site': 'CLIENT.fr', 'plausible_shared_key': '<slug du shared link>', })</code></pre> → Odoo injecte le script dans le <code><head></code> de toutes les pages et le rapport devient visible dans le backoffice (Site Web → tableau de bord). </li> <li><strong>Vérifier l'injection unique</strong> : <code>curl -s https://CLIENT.fr | grep -c "plausible"</code> → 1. Si le compteur retourne 2 ou plus, voir le piège <a href="/documentation/odoo-claude/pieges#n008">N008</a> (double injection).</li> </ol> <h3>Champs Odoo 19 CE (référence)</h3> <table class="table table-striped table-sm"> <thead><tr><th>Champ</th><th>Modèle</th><th>Valeur</th></tr></thead> <tbody> <tr><td><code>plausible_site</code></td><td><code>website</code></td><td>domaine (ex : <code>client.fr</code>)</td></tr> <tr><td><code>plausible_shared_key</code></td><td><code>website</code></td><td>slug auth uniquement (pas l'URL complète)</td></tr> <tr><td><code>website.plausible_server</code></td><td><code>ir.config_parameter</code></td><td><code>https://analytics.CLIENT.fr</code></td></tr> <tr><td><code>website.plausible_script</code></td><td><code>ir.config_parameter</code></td><td><code>https://analytics.CLIENT.fr/js/script.js</code></td></tr> </tbody> </table> <p><code>_onchange_shared_key</code> accepte aussi l'URL complète dans l'UI (extrait le slug). En script, passer le slug directement.</p> <h3>Plausible per-website</h3> <p>Les champs <code>plausible_site</code> / <code>plausible_shared_key</code> sont au niveau de chaque <code>website</code> → configurables par site. Les <code>ir.config_parameter</code> (<code>website.plausible_server</code> / <code>website.plausible_script</code>) sont <strong>globaux</strong> (une valeur par instance).</p> <pre><code>env['website'].browse(2).write({ 'plausible_site': 'exemple2.fr', 'plausible_shared_key': '<slug du shared link site 2>', })</code></pre> <h3>Mentions légales / politique de confidentialité</h3> <p>Si Plausible est activé, mentionner dans la politique de confidentialité : outil de mesure d'audience auto-hébergé, sans cookies, exempté CNIL.</p> <h2>Pièges connus de la méthode native</h2> <p>Les erreurs récurrentes du Website Builder (route de formulaire en 404, mauvais modèle cible, snippets sans styles, multi-website servi par le mauvais site…) sont classifiées sous les références <strong>N001 à N019</strong>, chacune avec symptôme, cause et solution vérifiés sur Odoo 19 CE. Elles sont regroupées sur la page dédiée : <a href="/documentation/odoo-claude/pieges">Pièges Odoo 19 — index des erreurs classifiées</a>.</p> <p class="text-muted small">Méthode IA&TIC — © 2026 IA&TIC — Freddy Maillard & Fabrice-Loïc Barbier — <a href="https://creativecommons.org/licenses/by-sa/4.0/">CC BY-SA 4.0</a></p> </div> </section> </div> <div id="o_shared_blocks" class="oe_unremovable"></div> </main> <footer id="bottom" data-anchor="true" data-name="Footer" class="o_footer o_colored_level o_cc "> <div id="footer" class="oe_structure oe_structure_solo" style="--box-border-left-width: 0px; --box-border-right-width: 0px;"> <style> #footer { background: #0f1b2d !important; color: #8a9bb0; border-top: 1px solid rgba(255,255,255,0.08); } #footer a { color: #8a9bb0; text-decoration: none; } #footer a:hover { color: #f4f4f2; } .netetic-footer-inner { max-width: 1100px; margin: 0 auto; padding: 2.5rem 3rem; display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: 2rem; } .netetic-footer-mentions { font-size: 0.82rem; line-height: 1.9; } .netetic-footer-brand { color: #e07b2a; font-size: 1rem; font-weight: 700; letter-spacing: 0.05em; display: block; margin-bottom: 0.2rem; } .netetic-footer-tagline { color: #8a9bb0; font-style: italic; font-size: 0.8rem; } .netetic-footer-gamme { font-size: 0.82rem; line-height: 2; } .netetic-footer-gamme .netetic-footer-col-title { color: #e07b2a; font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; display: block; margin-bottom: 0.4rem; } .netetic-footer-legal { display: flex; flex-direction: column; gap: 0.3rem; font-size: 0.8rem; } .netetic-footer-legal .netetic-footer-col-title { color: #e07b2a; font-size: 0.72rem; font-weight: 700; text-transform: uppercase; letter-spacing: 0.08em; display: block; margin-bottom: 0.4rem; } .netetic-footer-iatic { font-size: 0.72rem; color: #6a7d94; margin-top: 0.8rem; } .netetic-footer-bottom { border-top: 1px solid rgba(255,255,255,0.06); padding: 1rem 3rem; max-width: 1100px; margin: 0 auto; display: flex; justify-content: space-between; font-size: 0.78rem; flex-wrap: wrap; gap: 0.5rem; color: #6a7d94; } .netetic-footer-bottom a { color: #6a7d94; } </style> <div class="netetic-footer-inner"> <div class="netetic-footer-mentions"> <span class="netetic-footer-brand">NET&TIC</span> <span class="netetic-footer-tagline">Informatique libre et éthique</span> <div style="margin-top:0.8rem; font-size:0.79rem;">Polytalents SAS</div> <div style="font-size:0.79rem;">33 Grande Rue, 10190 Messon</div> <div style="font-size:0.79rem;">SIREN 103 542 007 — RCS Troyes</div> <div class="netetic-footer-iatic">Méthode <a href="https://iatic.fr">IA&TIC</a> — CC BY-SA 4.0</div> </div> <div class="netetic-footer-gamme"> <span class="netetic-footer-col-title">La gamme</span> <div><a href="/gamme/infra-tic">Infra&TIC — Infrastructure</a></div> <div><a href="/gamme/dev-tic">Dev&TIC — Développement</a></div> <div><a href="/gamme/ia-tic">IA&TIC — Intelligence artificielle</a></div> <div><a href="/gamme/form-tic">Form&TIC — Formation</a></div> <div><a href="/gamme/help-tic">Help&TIC — Maintenance & assistance</a></div> </div> <div class="netetic-footer-legal"> <span class="netetic-footer-col-title">Informations</span> <a href="/contact">Contact</a> <a href="/mentions-legales">Mentions légales</a> <a href="/politique-confidentialite">Politique de confidentialité</a> <a href="/cgv">CGV</a> <a href="/cookie-policy">Cookies</a> </div> </div> <div class="netetic-footer-bottom"> <span>© 2026 NET&TIC — Polytalents SAS</span> </div> </div> <div class="o_footer_copyright d-none"></div> </footer> </div> </body> </html>