Build and deploy on Odoo Website:
struxio.ai/services — hero, problem, solution, pricing, CTAstruxio.ai/services/comply — 5 steps matching MVP Blueprint §4.3/api/v1/preview → display watermarked BEP previewThis is the customer-facing front door. The BEP/EIR engine (TICKET_044) is live at 89.167.96.154:8010 — this ticket connects users to it.
89.167.96.154:8010/api/v1/generate and /api/v1/previewUser visits struxio.ai/services (Odoo Website)
│
├── Reads landing page → clicks "Try It Free"
│
▼
struxio.ai/services/comply (Odoo Website — 5-step wizard)
│
├── Step 1: Organization Profile
├── Step 2: Project Details
├── Step 3: Stakeholder Matrix
├── Step 4: Information Requirements
├── Step 5: Delivery Timeline
│
▼ POST wizard data as JSON
Odoo Controller → HTTP call to 89.167.96.154:8010/api/v1/preview
│
▼
Display watermarked BEP/EIR preview in browser
│
├── "Download Full Report" → (Stripe paywall — future ticket)
└── "Book a Demo" → CRM lead creation in Odoo
Before starting, complete these from TICKET_044 open items:
source ~/.nvm/nvm.sh to ~/.zshrc so npx is always availablenpx ccusage@latest daily --compact works from any new terminalCreate a new Odoo module for the website pages. This is separate from struxio_iso19650 (which is data/config). This module handles the website UI.
Module: STRUXIO_App/odoo_erp/struxio_website/
struxio_website/
├── __init__.py
├── __manifest__.py # depends: website, website_sale, struxio_iso19650
├── controllers/
│ ├── __init__.py
│ └── main.py # Routes: /services, /services/comply, /services/comply/submit
├── static/
│ └── src/
│ ├── css/
│ │ └── struxio_theme.css # Brand colors, typography, wizard styling
│ └── js/
│ └── wizard.js # Multi-step form logic (vanilla JS or jQuery)
├── views/
│ ├── landing_page.xml # QWeb: /services marketing page
│ ├── wizard_form.xml # QWeb: /services/comply 5-step wizard
│ ├── preview_result.xml # QWeb: BEP/EIR preview display page
│ └── templates.xml # Asset bundle registration
├── data/
│ └── website_pages.xml # Register pages in Odoo Website menu
└── tests/
└── test_controllers.py # HTTP test for each route
Build views/landing_page.xml as a QWeb template:
Sections:
Styling: Use STRUXIO brand colors. Dark mode preferred (matches the Odoo.sh dark theme users already see).
Build views/wizard_form.xml + static/src/js/wizard.js:
5 Steps matching MVP Blueprint §4.3:
Step 1: Organization Profile
Step 2: Project Details
Step 3: Stakeholder Matrix
Step 4: Information Requirements
Step 5: Delivery Timeline
Form behavior:
/services/comply/submitBuild controllers/main.py:
@http.route('/services', type='http', auth='public', website=True)
def landing_page(self):
return request.render('struxio_website.landing_page')
@http.route('/services/comply', type='http', auth='public', website=True)
def wizard(self):
return request.render('struxio_website.wizard_form')
@http.route('/services/comply/submit', type='json', auth='public', methods=['POST'])
def wizard_submit(self, **kwargs):
# 1. Validate wizard data
# 2. Call BEP/EIR engine: POST http://89.167.96.154:8010/api/v1/preview
# 3. Create CRM lead in Odoo (lead capture even for free trials)
# 4. Return preview data for rendering
@http.route('/services/comply/preview', type='http', auth='public', website=True)
def preview(self, generation_id=None):
# Render the watermarked BEP/EIR preview
return request.render('struxio_website.preview_result', {...})
Engine URL configuration: Store the engine URL in ir.config_parameter:
<record id="iso_engine_url" model="ir.config_parameter">
<field name="key">struxio.iso_engine_url</field>
<field name="value">http://89.167.96.154:8010</field>
</record>
This way the URL is configurable without code changes.
Build views/preview_result.xml:
tests/test_controllers.py — HTTP tests for each route/services renders landing page with pricing cards and CTA/services/comply renders 5-step wizard with all fields from MVP §4.3# V1: Landing page renders
curl -s -o /dev/null -w "%{http_code}" https://struxio-platform-main-29729723.dev.odoo.com/services
# Expected: 200
# V2: Wizard renders
curl -s -o /dev/null -w "%{http_code}" https://struxio-platform-main-29729723.dev.odoo.com/services/comply
# Expected: 200
# V3: Build status
# Use /verify-build skill
# V4: CRM lead created after submission
odoo-bin shell -c "print('LEADS:', env['crm.lead'].search_count([('name','like','%ISO 19650%')]))"
# Expected: >= 1 after test submission
Remove struxio_website from depends, git revert, push. Landing page disappears, core module unaffected.
STRUXIO_App/odoo_erp/struxio_website/ (entire new module)STRUXIO.ai // Confidential & Proprietary // © 2026