fix: repair contact flow and buy flow targets

- Buy Now product IDs aligned to the Odoo shop (54/55/56), matching odoo/upsell.html
- support.html contact form: rewire from dead ODOO4projects.com/website/form endpoint to n8n CRM webhook; remove /web/csrf_token prefetch; show success only on res.ok (previously always showed 'submitted' even when nothing was delivered)
- /contactus links (footer nav, Schema contactPoint, order widget fallback, trial email) retargeted to support.html#contact; canonical/og:url corrected to /support.html
- Custom Quote and footer contact handlers hardened with res.ok checks
- buyNow basket target verified: 20.odoo4projects.com/shop/post_basket (200)
This commit is contained in:
Reef committed 2026-10-12 15:41:11 +00:00
1 parent 04d39157b8
commit 354799b9ca
5 files changed
+31 -22

No files matched your search

+1 -1
View File
@@ -24,7 +24,7 @@ Enterprise-grade Odoo Community hosting without the enterprise price tag. Commun
- Static site (index.html, support.html, legal.html, blog/) deployed via git push to git.odoo4projects.com; auto-deploys on every change.
- Order flow: inline order widget on the homepage opens Stripe checkout; coupon FREE TRIAL = 1 month free; yearly billing saves roughly 8-10%; "Satisfied or reimbursed" guarantee; server location chosen at checkout (US, Brazil, India, Australia, Netherlands, UK).
- Support: AI support bot (agent.js from static.odoo4projects.com) plus human team; email support@odoo4projects.com; /contactus route.
- Support: AI support bot (agent.js from static.odoo4projects.com) plus human team; email support@odoo4projects.com; contact form on support.html#contact.
- Blog with guides and news (10 posts); homepage renders it with search and pagination.
## Capabilities and Constraints
+1 -1
View File
@@ -190,7 +190,7 @@
<p>
<a href="https://odoo4projects.com/legal/privacy">Privacy</a> &bull;
<a href="https://odoo4projects.com/legal/terms">Terms</a> &bull;
<a href="https://odoo4projects.com/contactus">Contact</a>
<a href="https://ODOO4projects.com/support.html#contact">Contact</a>
</p>
<p class="unsubscribe">
<a href="https://odoo4projects.com/unsubscribe?token=USER_TOKEN">Unsubscribe</a> from these emails
+6 -6
View File
@@ -20,7 +20,7 @@
"url": "https://ODOO4projects.com/",
"description": "Odoo hosting with fully managed infrastructure. Deploy in 5 minutes with automatic backups, SSL, and Git-based modules.",
"foundingDate": "2020",
"contactPoint": { "@type": "ContactPoint", "contactType": "customer support", "url": "https://ODOO4projects.com/contactus" },
"contactPoint": { "@type": "ContactPoint", "contactType": "customer support", "url": "https://ODOO4projects.com/support.html#contact" },
"sameAs": ["https://www.linkedin.com/company/odoo4projects/"],
"offers": [
{ "@type": "Offer", "name": "Side Hustle", "price": "214.00", "priceCurrency": "USD", "url": "https://ODOO4projects.com/#pricing" },
@@ -386,7 +386,7 @@
<div class="price-save">Save 8%</div>
</div>
<p class="desc">"ODOO Standard .. that is all my business needs"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="6">Buy Now</a>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="54">Buy Now</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Launch Odoo CE in 5 minutes</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic backups — no remembering</li>
@@ -405,7 +405,7 @@
<div class="price-save">Save 9%</div>
</div>
<p class="desc">"I need some modules and professional reports"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="4">Buy Now</a>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="55">Buy Now</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Launch Odoo CE in 5 minutes</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic backups — no remembering</li>
@@ -425,7 +425,7 @@
<div class="price-save">Save 10%</div>
</div>
<p class="desc">"ODOO Enterprise is a must have!"</p>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="5">Buy Now</a>
<a href="javascript:void(0)" class="btn btn-brass btn-buy" data-id="56">Buy Now</a>
<ul>
<li><i class="fas fa-check" style="color: var(--success)"></i> Launch Odoo CE in 5 minutes</li>
<li><i class="fas fa-check" style="color: var(--success)"></i> Automatic backups — no remembering</li>
@@ -489,7 +489,7 @@
</div>
<p class="ow-coupon-status" id="orderCouponStatus">&#10003; Coupon applied</p>
</div>
<a id="orderBuyBtn" href="/contactus" class="btn btn-brass ow-buy">Continue to Stripe &rarr;</a>
<a id="orderBuyBtn" href="/support.html#contact" class="btn btn-brass ow-buy">Continue to Stripe &rarr;</a>
<p class="ow-note">&#128274; Secure Stripe checkout &middot; Credit card required</p>
</div>
</div>
@@ -614,7 +614,7 @@
<li><a href="index.html">Home</a></li>
<li><a href="support.html">Support</a></li>
<li><a href="legal.html">Legal</a></li>
<li><a href="/contactus">Contact us</a></li>
<li><a href="/support.html#contact">Contact us</a></li>
</ul>
</div>
<div>
+4 -2
View File
@@ -846,7 +846,8 @@ var si = 0,
requirements: requirements,
area: 'quote'
}))
}).then(function() {
}).then(function(r) {
if (!r.ok) throw new Error('bad status ' + r.status);
customQuoteForm.style.display = 'none';
document.getElementById('customQuoteSuccess').style.display = 'block';
submitBtn.textContent = 'Submit Request';
@@ -904,7 +905,8 @@ var si = 0,
requirements: text,
area: 'message'
}))
}).then(function () {
}).then(function (r) {
if (!r.ok) throw new Error('bad status ' + r.status);
form.reset();
submitBtn.disabled = false;
showStatus("Thanks! We'll get back to you shortly.", false);
+19 -12
View File
@@ -8,11 +8,11 @@
content="Support and FAQ for ODOO4projects hosting. Get help with your Odoo instance, modules, backups, domains, and more."
/>
<title>Support | ODOO4projects</title>
<link rel="canonical" href="https://ODOO4projects.com/support" />
<link rel="canonical" href="https://ODOO4projects.com/support.html" />
<meta property="og:title" content="Support | ODOO4projects" />
<meta property="og:description" content="Support and FAQ for ODOO4projects hosting." />
<meta property="og:type" content="website" />
<meta property="og:url" content="https://ODOO4projects.com/support" />
<meta property="og:url" content="https://ODOO4projects.com/support.html" />
<meta name="twitter:card" content="summary_large_image" />
<link rel="icon" href="images/favicon.ico" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
@@ -474,8 +474,7 @@
<section class="contact-section" id="contact">
<div class="container">
<h2>Still questions? Contact our support.</h2>
<form class="contact-form" id="supportForm" action="https://ODOO4projects.com/website/form/" method="POST" enctype="multipart/form-data">
<input type="hidden" name="csrf_token" id="csrfToken" value="" />
<form class="contact-form" id="supportForm">
<div class="form-group">
<label>Your Name <span class="required">*</span></label>
<input type="text" id="contactName" name="contact_name" required placeholder="Your Name" />
@@ -528,23 +527,31 @@
var form = document.getElementById("supportForm");
var submitBtn = form.querySelector(".btn");
var successDiv = document.getElementById("formSuccess");
fetch("https://ODOO4projects.com/web/csrf_token")
.then(function (r) { return r.json(); })
.then(function (data) {
document.getElementById("csrfToken").value = data.result || data.csrf_token || "";
}).catch(function () {});
form.addEventListener("submit", function (e) {
e.preventDefault();
var name = document.getElementById("contactName").value.trim();
var email = document.getElementById("contactEmail").value.trim();
var uuid = document.getElementById("contactUuid").value.trim();
var subject = document.getElementById("contactSubject").value.trim();
var question = document.getElementById("contactQuestion").value.trim();
if (!name || !email || !subject || !question) { alert("Please fill in all required fields."); return; }
submitBtn.disabled = true;
submitBtn.textContent = "Submitting...";
fetch(form.action, { method: "POST", body: new FormData(form) })
.then(function () { submitBtn.style.display = "none"; successDiv.classList.add("visible"); })
.catch(function () { submitBtn.disabled = false; submitBtn.textContent = "Submit"; alert("Could not submit. Please try again."); });
var payload = { name: name, email: email, subject: subject, requirements: question, area: "support" };
if (uuid) payload.uuid = uuid;
fetch("https://n8n.odoo4projects.com/webhook/ODOO4projects/crm", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(payload)
}).then(function (r) {
if (!r.ok) throw new Error("bad status " + r.status);
submitBtn.style.display = "none";
successDiv.classList.add("visible");
}).catch(function () {
submitBtn.disabled = false;
submitBtn.textContent = "Submit";
alert("Could not submit. Please try again.");
});
});
</script>