Revenue is not the number that keeps a practice open.

Vesyra attaches the cost of every vial, syringe and pellet to the sale it was used on. What each service line actually earns stops being an estimate somebody reconstructs at the end of the quarter.

An example month

Revenue
$128,400
Product cost
$31,180
Waste & shrink
$2,940
Gross margin
73.4% of revenue
$94,280

Four numbers, defined once

Every figure in the application comes from one definition of margin. The Ledger, the reports and the CSV export are the same arithmetic, so two people never arrive at two answers.

Revenue
What was rung up, split across your service lines — IV therapy, peptides, weight loss, HRT, general medicine.
Product cost
The cost of what actually left the shelf, taken from the lot it came out of and frozen at the moment of the sale. A later price change does not rewrite last month's margin.
Waste & shrink
Expired vials, spillage and recount losses, held apart from cost of goods so they cannot quietly hide inside it.
Gross margin
What is left — by service line, by provider, by month. The number the rest of this exists to defend.

One entry, three consequences

Nobody keeps a second inventory spreadsheet current. So the sale is the only thing anyone types, and everything else follows from it.

  1. 1

    Ring the sale on the Register

    Choose the service and the product draw comes with it — the units, the vial, the price. Anything optional starts at zero, so adding it is a decision somebody made.

  2. 2

    Stock draws down by lot

    Oldest expiry first, at the price you paid for that particular delivery. On-hand is summed from open lots, so there is no stored total that can drift away from the ledger.

  3. 3

    The Ledger answers

    Margin by service line, by provider and by month, with every figure traceable back to the sale that produced it. Export any of it as CSV.

What Vesyra does not store

No patient names. No dates of birth. No addresses, phone numbers, email addresses or chart notes. A visit is linked to a reference code your practice assigns and keeps on your side — the database has no column for anything else, and rejects a value that looks like a name or an email address.

This is a description of the schema, not a legal conclusion. How it maps to your obligations is a question for your counsel, and we will give them the data model in writing — the data protection statement sets out column by column what is and is not there. Each practice is isolated at the database level: workspaces share no inventory, no patients and no reporting, and the isolation is enforced by row-level security rather than by application code remembering to filter.