How long is a reconstituted vial good for? The clock starts at mixing
The clock starts when powder met water, and the label of the product you mixed sets the window: chorionic gonadotropin ships under two labels, one giving 30 days refrigerated and the other 60. Peptrend saves that moment to the minute, alongside strength in mg, water in mL and an optional label. It has no expiry field. Deleting a vial untags its doses rather than deleting them.

What does a saved vial store?
Save a mix and Peptrend writes the medication name, the strength in milligrams, the bacteriostatic water in millilitres, the date and time you mixed it, an optional label, and an active flag. Behind those sit an identifier you never see, a demo-mode flag, and a pair of timestamps.
Concentration is not among them. It is computed on demand from two of the fields:
var concentrationMgPerML: Double {
diluentML > 0 ? strengthMg / diluentML : 0
}
So the two-decimal figure is produced fresh each time it appears; the record keeps 6 mg and 0.7 mL, never 8.57. Reconstitution maths works through that division.
Saving is a toggle, on by default, sitting under the result with a date picker and a label field. Turn it off and the calculator still divides; nothing is kept. Leave the label blank and the vial names itself from its own contents — an unlabelled 6 mg Retatrutide mix displays as “6.0mg Retatrutide”.
The label is the whole of the free text; a notes property exists on the model with no editor anywhere in the sheet. The closing instruction is not about the app at all: “That’s what this vial holds once mixed. Write it on the vial so you don’t have to remember.”
How long is a reconstituted vial good for?
For as long as the label of the product you mixed says, counted from the moment you mixed it. Strength is printed on the box and the water is in front of you. The moment powder met liquid leaves no trace in the vial, and every in-use window a manufacturer publishes is measured from exactly that moment.
Chorionic gonadotropin ships as a lyophilised powder with a diluent of “Bacteriostatic Water for Injection preserved with benzyl alcohol 0.9%”; on the Novarel label the reconstituted solution “should be refrigerated and used within 30 days”, while Pregnyl states in capitals that “THE RECONSTITUTED SOLUTION IS STABLE FOR 60 DAYS WHEN REFRIGERATED”. One molecule, two products, a factor of two between them — and both clocks start at reconstitution.
Bacteriostatic water is built for that kind of life. Its own label describes “a multiple-dose container from which repeated withdrawals may be made”, with benzyl alcohol added as a bacteriostatic preservative — 0.9% (9 mg/mL) or 1.1% (11 mg/mL), depending on the fill. Repeated withdrawals over time are the designed behaviour, which is what makes a start date worth having.
Peptrend takes no position on any of this. It stores a timestamp to the minute and shows it back to you. There is no expiry field, no countdown and no warning colour, because the app cannot see the vial and has no business guessing at it.
How do you tell which vial a dose came from?
Open the dose editor on an injection and there is a section headed “Which vial?”, holding a picker that defaults to “Not recorded” and lists your saved mixes by name and mix date, newest first. Choose one and a row appears underneath it:
This vial — 8.57 mg/mL
That row echoes the vial’s own strength. Change the dose above it and the row does not move: the app never converts milligrams into a volume to draw, and why a calculator should refuse sets out the App Review boundary behind that.
A new injection arrives with the picker already filled, pointing at the newest vial still flagged active. Nothing in the app turns that flag off, so on your own library that is the newest mix. Three rules keep the tag honest:
- Only an injection gets the pre-fill, and only an injection shows the picker at all. Pick Oral and the site, vial and pain fields disappear. The comment beside the pre-fill gives the reason: auto-tagging every new dose meant “a swallowed tablet came out attached to a bottle of bacteriostatic water”.
- Switching an existing dose to oral clears all three rather than leaving them attached invisibly, which would let a vial keep counting a tablet against its own draw total.
- The picker lists only the vials currently on screen, so a real dose can never be tagged to a demo one while you are trying the app out.
What to log with every dose covers the other eight fields the same editor writes.
Where does the vial tag show up?
Tag a dose and the link reads back in the dose history, in the vial history, and in the mix chart.
In your dose history, a tagged injection carries a fourth line under the medication and the site: a droplet icon, the vial’s display name, and the date it was mixed. It answers “which batch was that?” without opening the row.
The vial history card runs the other direction. Each vial prints its name, then 6.0mg + 3.0mL · 2.00 mg/mL, then the mix date followed by a count — “12 shots drawn”. Vials sort newest first, and the count is a plain filter over your doses on the vial’s identifier.
The mix chart plots one bar per vial: height is the water you added, colour is the concentration that resulted, mapped onto the same gradient that shades doses elsewhere in the app. There is no range picker on it, because every vial you have ever saved is always in the domain. The chart and the calculator are Pro. The vial history card is not, and the reason is written into the source beside the gate: “Taking away a record someone already saved is not a paywall, it’s a hostage.” What stays free draws that line across the rest of the app.
How many doses come out of one vial?
That depends on the strength in the vial and the milligrams you draw. This user’s data ships four 6 mg vials transcribed from a real log, mixed from 3.0 mL down to 0.7 mL, alongside thirty weekly Retatrutide injections titrating 1.2 → 2.0 → 3.0 → 3.5 mg and then holding there. Retatrutide sits behind an in-app disclosure headed “Not FDA approved, research use only.”
Each demo dose is tagged to the newest sample vial mixed on or before it, which is the rule a person follows at the fridge. The result is not evenly spread:
| Mixed | Water | Concentration | Label | Doses drawn |
|---|---|---|---|---|
| 26 Dec | 3.0 mL | 2.00 mg/mL | First vial | 12 |
| 30 Mar | 1.0 mL | 6.00 mg/mL | — | 1 |
| 12 Apr | 0.7 mL | 8.57 mg/mL | Tightest mix | 8 |
| 4 Jun | 1.0 mL | 6.00 mg/mL | — (active) | 9 |
Twelve weekly doses came out of the first vial, eleven weeks of them. The second fed one dose and was replaced thirteen days later by a tighter mix, which fed eight. The fourth is the one still in use, and nine doses have come out of it so far.
Those are the dates written into the seeder. Demo data shifts forward in whole weeks every time it is rebuilt, so the app will show later dates than the table; the intervals and the water are what hold still.
The third row shows why the app stores an hour. That vial was mixed at 19:00 and the dose that evening was logged at 21:25, so the dose lands on the new vial by two hours and twenty-five minutes. Store dates alone and the tie has to be broken by a guess.
The demo dose sequence is also a titration, and the same thirty doses read on the Dose Over Time chart as a climb over the first fourteen and then a long flat run at 3.5 mg — charting a titration covers what that looks like.
What happens to your doses if you delete a vial?
They stay. The trash button on a vial row does two things, in this order:
untagShots(from: vial)
modelContext.delete(vial)
The first pass walks every dose pointing at that vial and clears the pointer:
for shot in shots where shot.vialID == vial.id {
shot.vialID = nil
shot.updatedAt = Date()
}
Relational databases have named these two options for decades. PostgreSQL’s foreign-key documentation describes ON DELETE CASCADE as specifying “that when a referenced row is deleted, row(s) referencing it should be automatically deleted as well”, and ON DELETE SET NULL as causing “the referencing column(s) in the referencing row(s) to be set to nulls”. Peptrend picks the second. Nothing forces the choice, either: vialID is a bare optional identifier with no modelled relationship behind it, so the store has no delete rule of its own and the untag is written by hand at the button.
The asymmetry underneath is what settles it. A dose is a record of something that happened to you — a date, a time, milligrams, a site, whether you actually took it — and several of those feed the level model and the next-dose countdown. The vial link is an annotation on top. Cascading would let a tidy-up of old mixes rewrite your injection history and move the curve on the Doses tab months after the fact.
There is no confirmation sheet and no undo, and the change syncs to every device through CloudKit as soon as it saves. Nielsen’s third usability heuristic, published in 1994 and still on that list at its January 2024 review, asks for a clearly marked “emergency exit” and for undo support. Peptrend offers neither here, so it keeps the blast radius to a single field instead.
Switch the demo vials off and the same sweep runs, under the comment “Leave no shot pointing at a vial that no longer exists.”
Does the vial’s concentration feed anything else?
No. It never becomes a volume. Concentration is a fact about the liquid in the vial — what you would write on the label — and the app treats it as a display value that stops at the picker.
It also never enters the pharmacokinetics. The “Estimated Dose In Your System” figure runs on milligrams, a published half-life and a Tmax, through a one-compartment model that reports a decayed milligram amount and not a blood concentration of any kind. Whether those milligrams came out of a 2.00 mg/mL mix or an 8.57 mg/mL one makes no difference to the curve; reading the absorption curve covers what that shape does and does not carry.
And it does not leave in the export. The JSON export writes weigh-ins, doses and goals, which is a subset of your data and will not restore a library: no vials, no vial links, no schedules, no sites, no settings. There is no CSV import or export anywhere in the app. Behind the vial history is your own private CloudKit database, with no account, no login and no server of the app’s own, which the privacy page sets out in full.
Every number above describes something you already did. If something here does not match what you are seeing, support is the place to say so.

Common questions
How do I tell which vial a dose came from?
Tag it while you log it. The dose editor carries a section headed "Which vial?" whose picker lists your saved mixes by name and mix date, and the row underneath prints that vial's concentration in mg/mL. The tag then shows up on the dose in your history, marked with a droplet icon, with the vial's name and the date it was mixed.
What happens to my doses if I delete a vial?
They stay. Deleting a vial clears the vial link on every dose that pointed at it and then removes the vial, so the doses keep their date, milligrams, site, taken flag and pain level. They lose one label and nothing else.
How long is a reconstituted vial good for?
That comes from the label of the product you mixed, counted from the moment powder met water — chorionic gonadotropin ships under two labels, one giving 30 days refrigerated and the other 60. Peptrend saves that moment to the minute and nothing more: no expiry field, no countdown and no warning, because the app does not know what is in your vial or how you have stored it.
How many doses will one vial give me?
The app counts the doses you actually drew rather than predicting a number ahead of time. In this user's log, four 6 mg vials fed 12, 1, 8 and 9 doses, because a vial gets replaced when the next mix is ready rather than when it runs dry.
Sources
- DailyMed — NOVAREL (chorionic gonadotropin) for injection, FDA label
- DailyMed — PREGNYL (chorionic gonadotropin) for injection, FDA label
- DailyMed — Bacteriostatic Water for Injection, USP (FDA label)
- Jakob Nielsen — 10 Usability Heuristics for User Interface Design (1994, last reviewed 30 January 2024)
- PostgreSQL documentation — Constraints, ON DELETE actions for foreign keys