BFBambooForge Labs

Veterinary Practice Management

Veterinary practice management: the animal is the patient and the owner pays - species, breed, microchip, handling warnings, booster recalls.

Buy on the Odoo Apps StoreOpen the live demoIndustries€522Community & Enterprise

Available for Odoo 16.0, Odoo 17.0, Odoo 18.0, Odoo 19.0. Technical name bambooforge_veterinary.

Odoo 16.0Odoo 17.0Odoo 18.0Odoo 19.0
Full walkthrough on a live Odoo 19.0 database, with subtitles. It ends with what this app deliberately does not do.

Veterinary Practice Management

Why a vet cannot use clinic software

Because the patient and the payer are different creatures. Everything below follows from that one split.

Animal files

  • Name, species and breed as linked records - so "how many cats did we see last quarter" is a question with an answer, not a text search.

  • Sex, neutered, colour and markings, date of birth with the age read the way a vet reads it (4 y 3 mo, or 5 mo for a puppy).

  • Microchip number, unique across the practice - the number a shelter or another clinic will identify this animal by.

  • Insurer and policy number.

  • Handling warnings in red on every consultation. The nurse reading it is about to put their hands on this animal.

  • A date of death, which silences every reminder for that animal.

The owner is a normal clinic patient file, so the day sheet, invoicing and accounting keep working unchanged. A household with three dogs is three animal records and one bill.

Consultations

  • The visit records which animal was seen and bills the owner. Recording an animal against somebody else's file is refused - that is how an invoice reaches the wrong person.

  • Weight history is taken from the consultations themselves, with a per-species sanity check: a cat recorded at 45 kg is a typing mistake, not an obese cat.

  • Booking knows which animal is coming, and starting the consultation carries it onto the record.

Vaccinations and recall

  • Every dose records the batch number - the only way to trace a recalled batch back to the animals that received it - the vet who gave it, and the next-due date computed from the vaccine's own validity instead of typed by hand.

  • A vaccine that is not licensed for that species is refused, and a vaccination cannot be recorded in the future.

  • A daily job raises the recall: an activity for the practice, a "Boosters due" list to work from, and automatic lapsing a month past the date.

  • No reminder is ever sent for an animal that has died. Owners do not forgive that one.

  • A vaccination card PDF for the owner: what was given, by whom, with which batch, and when the next dose is due.

Requirements

Requires BambooForge Clinic. Odoo Community 16.0, 17.0, 18.0 or 19.0.

Support

support@bambooforge.dev - answered within two business days. OPL-1; one purchase covers one production database plus its staging copies. n What changed in 1.2 ===================

A second operations review, against the same practice a year on. Every finding was reproduced as a failing test first:

  • The household's phone call no longer disappears when one pet is boosted. One owner still gets one call, but the reminder now moves to the doses still outstanding when a sibling's dose is closed, archived or lost - and the nightly job raises it again if the task was deleted.

  • Suppressing a recall no longer claims a booster was given. A mistyped date of death, or an archive, closes the outstanding doses as Closed, not chased; clearing the date puts them back, and the animal's file records what was suppressed.

  • A cancelled or deleted visit leaves the dose chargeable again. "Already billed" is now a billing line that still stands rather than a tick nothing clears, and two people clicking Bill it at the same second still charge the owner once.

  • The status of a dose is a button. Boosted, Lapsed and Closed each mean something to the card the owner is handed, so they are recorded by the workflow - not typed into a list, imported or written by RPC.

  • The nightly job finishes. It runs per practice, in bounded batches, writing off old rows without a tracked message each, and re-arms itself if there is more to do than one run should attempt. It rings a manager of that practice, reads "today" in the practice's timezone, and says so in the log when there is nobody to assign.

  • An animal belongs to the practice that holds its owner's file, so it can no longer be stamped with whichever company the nurse happened to be in - which hid it from the vet and made its vaccines unbillable.

  • Correcting a dose moves its booster. Changing the date or the vaccine re-derives the next-due date; a date a vet typed by hand is still kept.

  • A history imported newest-first reads correctly: only the latest dose of a vaccine stays open, whatever order the rows arrived in, and Close superseded doses re-runs it safely on any selection.

  • A vaccine can be kept to one practice, and billing one whose product belongs to another company now says so instead of raising an access error; every practice gets its own file for strays, and each stray is its own reminder.

What changed in 1.1

An operations review against a real two-vet practice found ten things that bite in the first weeks. Each was reproduced on a running database before it was touched, and each fix has a test:

  • The primary course was invisible. A puppy's second DHPP dose, due in 21 days, was recalled as if it were an annual booster. The due date now follows the protocol: the primary-course interval for a first dose, the vaccine's validity afterwards.

  • Giving the booster now closes the previous dose and cancels its reminder. Before, the practice phoned owners whose animal had been vaccinated that same week, and a fully protected animal showed overdue in red.

  • A lapsed booster is the one most worth chasing, so it stays on the animal and in the overdue list instead of disappearing at day 31.

  • The first run after a data import no longer floods. Old rows are lapsed before reminders are raised, and nothing older than 30 days past its date raises an activity at all.

  • One owner, one phone call. Four animals due the same month now produce one activity listing them, not four tasks.

  • Death cancels reminders that were already scheduled - previously only future ones were suppressed, so the call still came.

  • The vaccine is charged on today's visit for that animal, never on a forgotten March draft, never twice, and with the same tax and fiscal position the consultation line uses.

  • An animal with history cannot be deleted, only archived: deleting took every batch number with it.

  • Two animals without a microchip can coexist (an empty chip is now stored as nothing at all, so a CSV import does not die on row two).

  • Two weights on one day: the later one is the one that counts.

  • Due dates are a snapshot: re-pricing a protocol next year no longer rewrites what was owed last year, and a date a vet adjusted by hand survives. A stray arriving at 22:00 has an "Unknown owner" file to go into, and the front desk can bill without touching clinical fields.

nSupportn=======n

Screens

Animal - bambooforge_veterinary
Animal
Recall - bambooforge_veterinary
Recall
Visit - bambooforge_veterinary
Visit