Skip to content

MedSpa

Aesthetic charting on a dosing ledger that appends every injection and never overwrites.

The short answer

MedSpa is an Odoo module for aesthetic clinics that inject. Under a face and body treatment map sits an append-only dosing ledger: each administration keeps its own product, lot number, quantity, expiry and date, and a mistaken dose is voided with a reversing entry rather than erased. It also holds prepaid packages, consent forms, and a retreatment list built from how long each product class lasts.

Request this module

Last updated

What it is for

Most aesthetic charting keeps a single row per zone and writes over it. That is fine until somebody asks which lot went into a client's glabella in the spring, when the only answer available is whatever was injected most recently. A spa also runs on money taken now for treatment owed later, so the clinical record and the liability sit in the same conversation. Each has to survive being read back under pressure.

Platform
Odoo
Category
Clinical records
Works with
Odoo 18 · Odoo 19
Technical name
medspa
Status
Direct from webbox
Pricing
Paid

What is inside it

  1. 01

    The treatment map

    Thirty-nine zones over two anatomical charts, face and neck plus a body front and back, with each charted zone's quantity painted on the anatomy. Clicking a zone opens its history and writes nothing at all.

  2. 02

    Lot traceability

    The ledger groups by lot, client, injectable, zone or region, so a recall notice becomes one screen. Entries refuse edits and deletions; a void posts a reversing entry with the quantity negated.

  3. 03

    The recall

    The module knows the interval for each product class, so it can name the zones that have come due on clients with nothing in the diary. A daily job raises one activity per client.

  4. 04

    The board

    Prepaid value not yet delivered leads, then zones due with nothing booked. The rest measure that liability, the money behind it, or the day's work burning it down, and each tile opens its own rows.

What it looks like in practice

  1. One zone, treated twice, with two different lots

    A client's glabella has been injected on two separate visits. A chart holding a single row per zone would show the later lot and lose the earlier treatment entirely.

    Every administration appends to the ledger with its own product, lot, quantity, expiry and treatment date, so the zone reads as a running total with both lots intact and the map paints the quantity on the anatomy.

    Charted on the glabella across 2 doses
    40
    Lots still on the record
    C88120, C95634

    Figures from the module's own demo data, on a fresh install. Install with demo data, open a client and click the glabella on the treatment map.

    The treatment mapLot traceability

  2. A recall notice names a batch number

    A lot is withdrawn and the clinic has to say which clients received it, quickly, without reading through files.

    The dosing ledger holds every dose across every client and groups by lot, so that answer is one grouping on one screen. Each entry also keeps who recorded it and which visit it belonged to.

    Lot on the demo ledger
    C54081

    Figures from the module's own demo data, on a fresh install. Install with demo data, open the dosing ledger and group by lot.

    Lot traceabilityThe board

  3. A toxin dose is charted on a site that is also a filler site

    The jaw takes filler and it is also the masseter injection site, so a millilitre ceiling applied there would flag an ordinary toxin dose as an overdose.

    The product decides which figures apply, never the zone, and units are converted before comparison so an equivalent dose of a different toxin reads as equivalent. Unusual doses and expired lots both warn, and neither blocks, because refusing an entry does not stop the injection.

    Charted on the jaw
    25 units of Botox

    A default you can change.

    The treatment mapLot traceability

What it deliberately does not do

It is not an EMR
No e-prescribing, no lab integration, no HL7. It charts aesthetic treatment and the products used to deliver it.
The recall is per client, not per zone
An appointment names a treatment and no zones, so nothing booked means the client has no visit outstanding. Tightening it needs planned zones on the appointment, which is not built.
It does not manage stock
Lot numbers are recorded as they are read off the box. Nothing is deducted from inventory or reordered, and the module does not pretend the two jobs are one.
History starts where you start
Upgrading from an earlier version carries every charted zone's last dose into the ledger. What was overwritten before that cannot be recovered, and the module does not invent it.
The dose table is not a dosing authority
Every zone carries a typical range, a ceiling and a note on where those figures came from. It is a sanity check on data entry, and nothing in it ever refuses an entry.

Questions

Can I install this on Odoo Online?
No. Odoo Online cannot install modules that contain Python, so this runs on Odoo.sh or a self-hosted instance. Check the versions listed above for the series and edition it is verified against.
Does it deduct injectables from inventory?
No. Lot numbers are recorded as they are read off the box, and nothing here decrements stock, reorders or values what is left in the fridge. Traceability and inventory are two jobs and this module does the first one. If you need stock movements, keep them in Odoo Inventory alongside it.
Can a dose recorded in error be deleted?
No, and that is deliberate. The ledger refuses edits and deletions outright. A mistaken dose is voided, which posts a reversing entry carrying the same product and lot with the quantity negated, so the running total comes right while the fact that something was administered and then withdrawn stays visible.
Does anything leave my server?
No. There are no external calls and no external services. It depends on base, mail, contacts and sale management, all of which ship with Odoo, so the clinical record and the dosing ledger stay in your own database. Being paid, it also has no activation form to fill in.

Have something to build?

Tell us the problem. We'll come back with a plan, a price, and who'd actually build it.

  • Free scoping call
  • Reply within 1 business day
  • No lock-in