---
title: Replacing a hosted LMS with a training academy inside Odoo | Orbital Objectives
description: A full migration from a hosted learning platform to Odoo eLearning, with custom modules to play SCORM courses and control who can see them.
image: https://orbitalobjectives.com/hubfs/oo-social-share.png
---

[Skip to content](https://orbitalobjectives.com/work/lms-migration-odoo#main)

[rbital bjectives](https://orbitalobjectives.com/?hsLang=en)

- [Services](https://orbitalobjectives.com/services?hsLang=en)
- [Our Work](https://orbitalobjectives.com/work?hsLang=en)
- [About](https://orbitalobjectives.com/about?hsLang=en)
- [Insights](https://orbitalobjectives.com/insights?hsLang=en)

[Discuss Your Project](https://orbitalobjectives.com/contact?hsLang=en)

1. [Our Work](https://orbitalobjectives.com/work?hsLang=en)
2. Manufacturing

# Replacing a hosted LMS with a training academy inside Odoo

A full migration from a hosted learning platform to Odoo eLearning, with custom modules to play SCORM courses and control who can see them.

## The problem

The company wanted its customer training off a separate learning platform and inside Odoo, next to its customers and subscriptions. The courses were SCORM packages, which Odoo eLearning does not play. Staff without admin rights also needed to grant customers access to bundles of courses.

## The approach

I extracted and reconciled everything first, so nothing depended on the old platform staying available. Then I built the two missing pieces as modules that inherit from standard eLearning, loaded production from a runbook, and audited access the same day.

## What I built

- A resumable extraction from the old platform’s API into 33 normalized tables, with reconciliation reports
- A SCORM module: each package is stored once and its files are streamed on demand, with per-learner tracking and resume
- A course entitlement module: course bundles, a Course Access tab on contacts, and a grant-and-notify action for non-admin staff. Revoking access archives the enrollment, so progress is never lost
- An idempotent loader for courses, SCORM, quizzes and video, plus a user runbook for onboarding customers
- A patch across every course package to remove a navigation lock compiled in by the authoring tool, verified by checksum

## Outcome

- 65 courses went live in Odoo with no load errors.
- Every customer was invited at launch without a failed send.

#### Industry

Manufacturing

#### Platform

Odoo

#### Technology

- Odoo 19 eLearning
- SCORM 1.2
- Python
- LMS API
- Odoo.sh

#### Related services

- [Salesforce Integrations & Data Migration](https://orbitalobjectives.com/services#salesforce-integrations-data-migration)
- [Odoo ERP Consulting & Integrations](https://orbitalobjectives.com/services#odoo-erp-consulting-integrations)

[Discuss Your Project](https://orbitalobjectives.com/contact?hsLang=en)

### [Salesforce Manufacturing Financing and multilingual quotes in Salesforce CPQ A lender’s rate table turned into a lookup-driven price rule, and EU quotes that print in four languages with the right brochure attached. →](https://orbitalobjectives.com/work/cpq-financing-quote?hsLang=en)

Next step

## Tell me what is stuck.

A first conversation is 30 minutes with the person who would do the work. You will leave knowing whether I am the right fit and roughly what it would take.

[Discuss Your Project →](https://orbitalobjectives.com/contact?hsLang=en) [Explore Our Work](https://orbitalobjectives.com/work?hsLang=en)

[rbital bjectives](https://orbitalobjectives.com/?hsLang=en)

Everything orbits your objective

Independent Salesforce, HubSpot and Odoo consulting. Massachusetts.

#### Services

- [Consulting & Development](https://orbitalobjectives.com/services#salesforce-consulting-development)
- [CPQ & Revenue Operations](https://orbitalobjectives.com/services#salesforce-cpq-revenue-operations)
- [Service Cloud & Automation](https://orbitalobjectives.com/services#service-cloud-automation)
- [Experience Cloud & Partner Portals](https://orbitalobjectives.com/services#experience-cloud-partner-portals)
- [Integrations & Data Migration](https://orbitalobjectives.com/services#salesforce-integrations-data-migration)
- [All services](https://orbitalobjectives.com/services?hsLang=en)

#### Practice

- [Our Work](https://orbitalobjectives.com/work?hsLang=en)
- [About](https://orbitalobjectives.com/about?hsLang=en)
- [Insights](https://orbitalobjectives.com/insights?hsLang=en)
- [Contact](https://orbitalobjectives.com/contact?hsLang=en)

#### Contact

- [info@orbitalobjectives.com](mailto:info@orbitalobjectives.com)
- [Discuss Your Project](https://orbitalobjectives.com/contact?hsLang=en)

© 2026 Orbital Objectives LLCSalesforce and Odoo are trademarks of their respective owners.

```json
{
  "@context" : "https://schema.org",
  "@type" : "Article",
  "about" : [ "Odoo 19 eLearning", "SCORM 1.2", "Python", "LMS API", "Odoo.sh" ],
  "articleSection" : "Case study",
  "author" : {
    "@id" : "https://orbitalobjectives.com/#organization"
  },
  "description" : "A full migration from a hosted learning platform to Odoo eLearning, with custom modules to play SCORM courses and control who can see them.",
  "headline" : "Replacing a hosted LMS with a training academy inside Odoo",
  "publisher" : {
    "@id" : "https://orbitalobjectives.com/#organization"
  },
  "url" : "https://orbitalobjectives.com/work/lms-migration-odoo"
}
```

```json
{
  "@context" : "https://schema.org",
  "@type" : "BreadcrumbList",
  "itemListElement" : [ {
    "@type" : "ListItem",
    "item" : "https://orbitalobjectives.com/",
    "name" : "Home",
    "position" : 1
  }, {
    "@type" : "ListItem",
    "item" : "https://orbitalobjectives.com/work",
    "name" : "Our Work",
    "position" : 2
  }, {
    "@type" : "ListItem",
    "item" : "https://orbitalobjectives.com/work/lms-migration-odoo",
    "name" : "Replacing a hosted LMS with a training academy inside Odoo",
    "position" : 3
  } ]
}
```