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
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
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
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
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.