Skip to content
ShipFastDev
All work

Case study

OptiVision: a white-labeled Odoo ERP for opticians

, 5 min read

OptiVision ERP is ShipFastDev's white-labeled Odoo 16 setup for opticians and eyewear shops: an eyewear catalogue with frame, lens and contact-lens specifications, a point of sale, stock management and sales reporting by eyewear category, all under the shop's own name and logo. It runs on Odoo Community with two custom modules. It is not public; a demo is available on a call.

What an optician can do

  • Keep an eyewear catalogue. Frames, prescription lenses, contact lenses, sunglasses, accessories and lens care, each product with an "Optician Details" tab next to Odoo's usual sales, purchase and inventory tabs.
  • Record frame specifications: material, style, colour, frame width, bridge width, temple length, and lens width and height.
  • Record lens and contact-lens specifications: lens type (single vision, bifocal, progressive), material, index and prescription ranges; coatings (UV protection, blue-light filter, anti-reflective, photochromic); base curve, diameter, water content and oxygen permeability for contact lenses; and prescription values (SPH, CYL, AXIS, ADD, prism).
  • Flag what a product needs: whether a prescription is required, whether it is a prescription lens, whether it needs in-house fitting, and its warranty.
  • Start with real brands. The sample data includes frame brands (Ray-Ban, Oakley, Gucci, Tom Ford, Persol), lens makers (Essilor, ZEISS, Hoya) and contact-lens brands (Acuvue, CooperVision, Bausch + Lomb).
  • Sell at the counter with Odoo's point of sale, products grouped as frames, lenses, contact lenses, sunglasses, lens care and accessories. Odoo documents that its Point of Sale works on any device with a web browser, even if you are temporarily offline.
  • See what sells. A sales analysis report shows revenue by eyewear category, for example prescription lenses against frames and sunglasses.
  • Scan barcodes for stock adjustments, picking and receiving, with a USB scanner or a phone camera.

What was built

  • Odoo 16 Community in Docker. Odoo and PostgreSQL run with Docker Compose, with a production Nginx configuration alongside. Stock and replenishment come from Odoo's standard Inventory app.
  • An optician module. A custom module adds the eyewear fields, a brand model, an API-key model, the optician views and sample data. Like any Odoo module, it declares its dependencies and data in a manifest, so it installs and upgrades on its own, with one documented command to upgrade it.
  • A white-label module. A second module removes Odoo's branding from the interface and gives the shop its own login page, colours, headers and footers, PDF report branding and email templates. A Branding settings page holds the brand name, tagline, support contact, colours and logos, and each company can set its own login logo, email header logo, PDF logo, favicon and footer text. Its latest version also hides the Enterprise upgrade prompts.
  • A REST API for other apps. Endpoints list products (filtered by type, brand or in-stock status), return product details with images, list brands, check stock by SKU and update stock levels. They are built as Odoo web controllers. API keys are managed in Inventory settings, one per app, each read-only or read-write, with usage tracking (last used, request count) and the option to regenerate or deactivate a key.
  • Community modules instead of Enterprise features. Modules from the Odoo Community Association (OCA) cover barcode scanning, barcode generation and multiple barcodes per product, SQL and visual BI reports, Excel and CSV exports, and approval workflows. For the till, OCA's point-of-sale modules add margin on POS orders, the discount amount on the cashier screen and ticket, order-line editing, customer comments, lot selection and a default customer.

How it is kept reliable

  • Rate limits. The production Nginx configuration allows 10 API requests per second (burst of 20) and 5 login attempts per minute (burst of 5).
  • Security headers and filtering. HSTS, X-Frame-Options, X-Content-Type-Options and a Content-Security-Policy, plus rules that block SQL-injection patterns, cross-site scripting attempts, vulnerability scanners and path traversal.
  • Caching. Static files are cached for 7 days and images for 1 day.
  • API access. Every endpoint except the health check requires an API key, and updating stock requires a key with write permission. The health check lets monitoring tools see whether the service is up.
  • A production checklist. The README lists what to do before go-live: change the master and database passwords, enable HTTPS, configure the firewall, schedule backups, review API-key permissions and turn on two-factor authentication for admins. Backup, restore and module-upgrade commands are documented.
  • Standard Odoo underneath. The changes live in separate modules rather than in Odoo's code, so the base system stays standard Odoo 16 Community.

Recent releases

The repository's four commits are all dated 25 January 2026:

  • The initial project: Docker setup, the optician and white-label modules, the OCA modules and the documentation.
  • Docker Compose exposes an additional Odoo port and includes a commented Nginx service for a local reverse proxy.
  • The white-label module moved to version 16.0.2, with a fuller debranding description and scripts and styles that hide Enterprise features and upgrade prompts.
  • Documentation on where to find the OCA barcode scanner, how to install the alternatives and which Enterprise features they replace.

When Odoo fits

For the wider question of whether an ERP like this suits your business, see Odoo ERP for small businesses, and No-code vs custom development for when configuration is enough and when custom modules are worth it. More projects are in the portfolio, including the Driveway Morocco case study.

Frequently asked questions

Is OptiVision a separate product from Odoo?

No. It is Odoo 16 Community with two custom modules (optician fields and white-label branding) and a set of OCA modules. Staff see the shop's brand instead of Odoo's in the back office, on the login page and in reports and emails.

Can it connect to an online shop or other apps?

Yes, through its REST API: products, brands, stock checks by SKU and stock updates, each app with its own key set to read-only or read-write.

Does it need Odoo Enterprise?

No. It runs on Odoo Community, and OCA modules provide the barcode scanning, reporting, exports and approval workflows that would otherwise come from Enterprise.

Can I see it?

OptiVision is not public. A demo is available on a call.

Sources

  1. Point of Sale (Odoo 16.0 documentation), Odoo S.A., accessed October 2026
  2. Inventory (Odoo 16.0 documentation), Odoo S.A., accessed October 2026
  3. Module manifests (Odoo 16.0 developer documentation), Odoo S.A., accessed October 2026
  4. Web controllers (Odoo 16.0 developer documentation), Odoo S.A., accessed October 2026
  5. OCA/pos, branch 16.0, Odoo Community Association (GitHub), accessed October 2026
  6. OCA/stock-logistics-barcode, Odoo Community Association (GitHub), accessed October 2026

Want this kind of work on your product?

Tell Adil what you’re building. You get a reply within 1 business day with times for a 15-minute video call.