Files
ODOO4projects.com/blog/posts/howto-custom-module.html
T
oliver 0cd0fa1af1 feat(analytics): Plausible snippet on every page, FAQ marked on the bootcamp
The snippet was on 10 of 40 pages, so the Trial / FAQ / Buy / Custom Quote /
search posts / Project Plan goals were inert everywhere else. It now sits
verbatim, in the same <head> position as index.html, on all 39 visitor-facing
pages. email/trial-confirmation.html is deliberately left out (email template).

FAQ: the five <details class="bc-faq"> <summary> elements on the bootcamp page
and its DE/ES twins now carry plausible-event-name=FAQ, and the 15
.faq-question buttons on de/es/support.html get the marking they were believed
to already have. No goal renamed: one FAQ goal across all languages.

No markup, copy or behaviour change, and no third-party request beyond the
snippet itself. verify-html.py PROBLEMS 0; check-links.py OK; event checker
59 PASS / 0 FAIL; impeccable detector +0/-0 findings on the changed files.
2026-10-28 21:50:53 +00:00

280 lines
10 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!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>
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "BlogPosting",
"headline": "Install Custom Odoo Modules via Git – A Practical How-To",
"datePublished": "2026-06-17",
"url": "https://odoo4projects.com/blog/posts/howto-custom-module.html",
"author": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/"
},
"publisher": {
"@type": "Organization",
"name": "ODOO4projects",
"url": "https://odoo4projects.com/",
"logo": {
"@type": "ImageObject",
"url": "https://odoo4projects.com/images/logo.png"
}
}
}
</script>
<!-- Privacy-friendly analytics by Plausible -->
<script async src="https://plausible.office.odoo4projects.com/js/pa-NhA7Rf-79VopXFQXhSS4e.js"></script>
<script>
window.plausible=window.plausible||function(){(plausible.q=plausible.q||[]).push(arguments)},plausible.init=plausible.init||function(i){plausible.o=i||{}};
plausible.init()
</script>
</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>