Files
ODOO4projects.com/blog/posts/howto-custom-module.html
T
webmaster 28f04e13fe fix(seo): repair the 10 blog canonicals, sitemap.xml, blog/index.json and llms.txt
From seo/out/site-seo-ai-search-audit-2026-10-27.md (§6 items 1, 2, 3a, 5).

- canonical: 10 blog posts declared https://odooprojects.com/... — a live parked
  third-party domain — as their canonical. Now self-referencing on
  https://odoo4projects.com/blog/posts/<slug>.html (1 line each, nothing else).
- sitemap.xml: 27 -> 33 URLs. Added the 6 live pages that were missing
  (support.html, legal.html, community-vs-enterprise-cost, 6-tips,
  odoocommunity-agents, odoo-20-is-live); corrected 13 lastmod values to the
  real last content commit (homepage was 4 months stale); /de/ and /es/
  priority 1.0 -> 0.7 so a translation does not outrank its original.
- blog/index.json: 7 -> 15 posts. The 8 orphan posts are now listed, so every
  post is reachable from the homepage grid.
- llms.txt: removed the link to /blog/ (that URL returns 403) and added a
  "## Blog posts" section listing all 15 posts with date and summary.

Not changed on purpose: FAQPage on support.html, the homepage "price": ">950.00",
the bootcamp start-date conflict, and the blog post chrome (15 files).
2026-10-27 18:48:06 +00:00

251 lines
9.3 KiB
HTML

<!doctype html>
<html lang="en-US">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>
Install Custom Odoo Modules via Git &ndash; A Practical How-To |
ODOO4projects
</title>
<meta
name="description"
content="Learn how to install and manage custom Odoo modules directly from Git repositories on your ODOO4projects instance."
/>
<link
rel="canonical"
href="https://odoo4projects.com/blog/posts/howto-custom-module.html"
/>
<meta
property="og:title"
content="Install Custom Odoo Modules via Git &ndash; A Practical How-To"
/>
<meta
property="og:description"
content="Learn how to install and manage custom Odoo modules directly from Git repositories on your ODOO4projects instance."
/>
<meta property="og:type" content="article" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="../../images/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=Inter+Tight:wght@500;600;700;800&display=swap"
rel="stylesheet"
/>
<link
rel="stylesheet"
href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css"
/>
<link rel="stylesheet" href="../../style.css" />
<style>
:root {
--primary: #714b67;
--border: #e5e3e0;
--radius: 0.6rem;
--dark: #212529;
--light: #f8f9fa;
--bg: #ffffff;
}
* {
box-sizing: border-box;
}
body {
margin: 0;
font-family: Inter, sans-serif;
font-size: 1rem;
line-height: 1.7;
background: var(--bg);
color: var(--dark);
}
.container {
width: 80%;
max-width: 800px;
margin: 0 auto;
padding: 0 20px;
}
@media (max-width: 768px) {
.container {
width: 100%;
}
}
.blog-header {
padding: 2rem 0;
border-bottom: 1px solid var(--border);
}
.blog-header a {
color: var(--primary);
text-decoration: none;
font-size: 0.85rem;
}
.blog-header a:hover {
text-decoration: underline;
}
.post-title {
font-family: "Inter Tight", sans-serif;
font-size: clamp(1.5rem, 3vw, 2.2rem);
font-weight: 700;
margin: 1.5rem 0 0.5rem;
color: var(--dark);
}
.post-meta {
color: rgba(33, 37, 41, 0.5);
font-size: 0.85rem;
margin-bottom: 2rem;
}
.post-content h2 {
font-family: "Inter Tight", sans-serif;
font-size: 1.3rem;
margin-top: 2rem;
color: var(--dark);
}
.post-content p {
margin: 1rem 0;
color: rgba(33, 37, 41, 0.7);
line-height: 1.7;
}
.post-content ul,
.post-content ol {
padding-left: 1.5rem;
}
.post-content li {
margin: 0.5rem 0;
}
.post-content a {
color: var(--primary);
}
.post-content code {
background: var(--light);
color: var(--dark);
padding: 0.2rem 0.4rem;
border-radius: 4px;
font-size: 0.9em;
}
.post-content pre {
background: var(--light);
color: var(--dark);
padding: 1rem;
border-radius: var(--radius);
overflow-x: auto;
border: 1px solid var(--border);
font-size: 0.82rem;
}
.pro-tip {
border-left: 3px solid var(--primary);
background: rgba(113, 75, 103, 0.04);
padding: 1rem 1.25rem;
margin: 1.5rem 0;
border-radius: 0 0.6rem 0.6rem 0;
}
.pro-tip strong {
color: var(--primary);
}
.cta-box {
border: 1px solid var(--border);
background: var(--bg);
padding: 1.5rem;
margin: 2rem 0;
border-radius: var(--radius);
text-align: center;
}
.cta-box h3 {
margin: 0 0 0.5rem;
color: var(--dark);
}
.cta-box p {
margin: 0 0 1rem;
color: rgba(33, 37, 41, 0.7);
font-size: 0.9rem;
}
.cta-box .btn {
display: inline-block;
padding: 0.6rem 1.5rem;
background: var(--primary);
color: #fff;
text-decoration: none;
border-radius: 0.5rem;
font-weight: 600;
font-size: 0.85rem;
transition: opacity 0.2s;
}
.cta-box .btn:hover {
opacity: 0.85;
}
.post-footer {
padding: 2rem 0;
border-top: 1px solid var(--border);
margin-top: 2rem;
}
.post-footer a {
color: var(--primary);
text-decoration: none;
}
.post-footer a:hover {
text-decoration: underline;
}
</style>
</head>
<body>
<div class="container">
<div class="blog-header">
<a href="../../index.html#blog">&larr; Back to Blog</a>
</div>
<article>
<h1 class="post-title">
Install Custom Odoo Modules via Git &ndash; A Practical
How-To
</h1>
<div class="post-meta">June 17, 2026 &middot; How-To</div>
<div class="post-content">
<p>
One of the most powerful features of Odoo is its modular
architecture. With ODOO4projects' On the Rise plan and
above, you can install custom modules directly from Git
repositories. Here's how.
</p>
<h2>Step 1: Connect Your Git Repository</h2>
<p>
From your dashboard, navigate to the
<strong>Modules</strong> tab and click
<strong>Connect Git Repo</strong>. Enter your repository
URL and authentication credentials if required. We
support GitHub, GitLab, and Bitbucket.
</p>
<div class="pro-tip">
<strong>Pro Tip:</strong> Use a private repository with
a deploy token for secure, automated access. Never store
personal access tokens in your Odoo configuration files.
</div>
<h2>Step 2: Deploy the Module</h2>
<p>
Once connected, select the module from the list and
click <strong>Deploy</strong>. The system will clone the
repository, install any dependencies, and make the
module available in your Odoo apps list.
</p>
<pre><code>git clone https://github.com/your-org/odoo-custom-module.git
# ODOO4projects handles the rest automatically</code></pre>
<h2>Step 3: Install in Odoo</h2>
<p>
Go to the Odoo Apps menu, search for your module, and
click <strong>Install</strong>. That's it. Your custom
module is now live.
</p>
<div class="cta-box">
<h3>Need Module Support?</h3>
<p>
Upgrade to On the Rise for full module installation
and customization support.
</p>
<a href="../../index.html#pricing" class="btn"
>View Plans</a
>
</div>
</div>
</article>
<div class="post-footer">
<a href="../../index.html#blog">&larr; Back to all posts</a>
</div>
</div>
<script defer src="/static/agent-odoo4projects/agent.js"></script>
</body>
</html>