Skip to main content

GLP-1 Dosage Calculator - assumptions and limitations

What this calculator does, what it does not do, and the arithmetic behind every output. Each assumption below documents its source and limitations. Read this before using any number with a real medication.

Assumptions

  • Per-injection mg = weekly mg / doses per week

    The injection-mass split is dimensional: what you put in the syringe is what reaches the SC tissue. Steady-state body load is computed separately from mean_load = (mg_per_injection × F) / (k × tau), where F is the published subcutaneous bioavailability per drug (semaglutide 0.89, tirzepatide 0.80, dulaglutide 0.60, liraglutide 0.55) - see formulas list.

  • Schedule math assumes consistent intervals

    doses_per_week = 7 / interval_days assumes the chosen cadence is followed exactly across the week (a planning default). Real adherence has missed/late doses; the steady-state PK output makes the cost of a missed dose explicit via `trough × e^(-k × tau)`.

  • U-100 syringe units (definitional)

    U-100 insulin syringes are defined by USP <1601> and ISO 8537:2016 as 100 units = 1 mL (so 1 unit = 0.01 mL). The conversion units = volume_mL * 100 is dimensional, not modelled. Confirm the markings on your specific device before drawing.

  • Vial usage rounds down (conservative policy)

    Doses per vial floors to whole doses; days of supply counts full doses only. Floor is the tightest bound that does not overstate supply - the partial-dose remainder is surfaced separately as 'Leftover' so nothing is hidden. This is a documented rounding policy, not a model.

  • Blood-level chart is relative (population-mean t1/2)

    The 'Estimated drug levels' chart uses a one-compartment terminal-half-life model with population-mean t1/2 and a published 90% CI per drug: semaglutide 165 h (124-218), tirzepatide 120 h (96-150), retatrutide 150 h (130-175), dulaglutide 120 h (96-156), liraglutide 13 h (10-18). All values from each drug's USPI clinical pharmacology section. Y-axis is mg-equivalent body load - NOT absolute plasma concentration. Subcutaneous absorption (t_max ~24-72 h for the long-acting GLP-1s) is collapsed into the decay term, so the early rise after the first dose is faster than the real plasma curve; at steady state for weekly drugs the simplification is small. A two-compartment Bateman simulator with per-drug ka / V_d / F is wired and tested in `glp1/pk.ts` for a future µg/L axis swap.

  • Steady state ≈ 4.32 × half-life (closed form)

    The 95%-of-steady-state marker uses t_95 = 4.32 × t_half (≈ -ln(0.05) / ln(2)). The accumulation ratio per interval is 1 / (1 - e^(-k × tau)). Both are exact closed-form identities for one-compartment dosing at constant interval (Rowland & Tozer, Clinical Pharmacokinetics and Pharmacodynamics, 4th ed., §6.3; Gibaldi & Perrier, Pharmacokinetics, 2nd ed., §3.5). Dosing interval changes the *number of doses* needed but not the time. A `numericalT95FromCurve` helper (lib/calculators/glp1/pk.ts) is wired in for the future two-compartment Bateman swap, where the closed form becomes an approximation.

  • Missed-dose recommendation restates the labelled rule

    The 'Did you miss a dose?' panel applies a per-drug cutoff sourced from each brand's prescribing info (Ozempic/Wegovy, Mounjaro/Zepbound, Trulicity, Victoza/Saxenda) and the conservative default for retatrutide. The decision is a closed-form take-now-vs-skip rule based on hours-late vs the labelled cutoff: it does not consult plasma levels, individual half-life, or interaction risks. This restates labelled guidance verbatim - it is not personalised clinical advice.

  • Drug-switching maps trial-mean weight-loss effect (NOT equipotency)

    The 'Considering a switch?' card maps source vs target by approximate trial-mean weight-loss % at each dose tier - NOT receptor equipotency, NOT a clinical conversion factor. Tier weights come from STEP-1/2/3 (semaglutide), SURMOUNT-1 (tirzepatide), AWARD (dulaglutide), SCALE (liraglutide), and TRIUMPH-1 phase 2 (retatrutide). The starter dose recommendation always uses the target's labelled titration tier, regardless of source dose. Inter-individual variability is large (interquartile range often ±5pp around the trial mean). This card is an illustrative comparison only - real equivalent doses depend on indication, comorbidities, response history, and prescriber judgement.

  • Refill timeline is arithmetic only (no shipping / approval logic)

    The Refill timeline projects per-vial coverage dates and an order-by date by anchoring `vialFills.{first,last}DoseNumber` on `schedule.startDate` + N × intervalDays. The 'Order by' line subtracts a default 7-day lead time from the inventory-depletion date. It does not account for prescription-approval delays, shipping windows, refrigeration constraints, or per-pharmacy lead times - it's a planning hint, not a guaranteed deadline.

  • GI-tolerance forecast is a population pattern (NOT a personal prediction)

    The 'GI tolerance forecast' projects each dose-up in a titration plan as a rough-patch window: peak day +5 from the dose-up, resolves by day +14. Intensity is bucketed from the relative dose increase: <50% = mild, 50-100% = moderate, ≥100% = rough. These offsets reflect the population pattern of GLP-1 GI side effects reported in the STEP and SURMOUNT trial families. Inter-individual variability is enormous (interquartile range often spans 'barely noticed' to 'had to pause titration'); the forecast is a population pattern, not a personal prediction.

  • Cost calculator assumes a fixed per-vial price

    The Refill cost card divides cost-per-vial by vial mg capacity to produce $/mg, then multiplies by weekly mg to project $/week, $/month, and $/year. It assumes the same vial price across the full year of refills - it does not model insurance reimbursement, manufacturer coupons, bulk-order discounts, or compounded vs. branded pricing differences. The $/year number is `$/week × 52` exactly (no leap-week handling).

Formulas used

Each output is derived from one of the formulas below. They run client-side, so what you see in the calculator is what the math actually does.

  1. 1. Doses per week

    doses_per_week = 7 / interval_days
  2. 2. Mg per injection

    mg_per_injection = weekly_mg / doses_per_week
  3. 3. Volume per dose

    volume_mL = mg_per_injection / concentration_mg_per_mL
  4. 4. Weekly mL

    weekly_mL = weekly_mg / concentration_mg_per_mL
  5. 5. U-100 syringe units (estimate)

    units = volume_mL * 100
  6. 6. Vial volume (mL)

    vial_volume_mL = vialSize (when unit = mL) OR vialSize / concentration_mg_per_mL (when unit = mg)
  7. 7. Doses per vial

    doses_per_vial = floor(vial_volume_mL / volume_mL)
  8. 8. Days of supply

    days_of_supply = doses_per_vial * interval_days
  9. 9. Decay constant

    k = ln(2) / t_half
  10. 10. Concentration over time

    C(t) = sum over past doses of dose_mg * e^(-k * (t - t_dose))
  11. 11. Time to ~95% steady state

    t_95 = 4.32 * t_half
  12. 12. Accumulation ratio per interval

    ratio = 1 / (1 - e^(-k * tau))
  13. 13. Steady-state mean body load (companion)

    mean_load_mg = mg_per_injection / (k * tau)
  14. 14. Steady-state systemic mean (bioavailability-adjusted)

    systemic_mean_mg = mg_per_injection * F / (k * tau)
  15. 15. Missed-dose trough sensitivity

    trough_drop_fraction = 1 - e^(-k * tau)
  16. 16. Missed-dose decision (per-drug cutoff)

    action = hours_late <= drug.rescheduleIfHoursLateAtMost ? 'take-now' : 'skip'
  17. 17. Drug-switch equivalent dose (weight-loss-effect mapping)

    to_equivalent_mg = nearest_tier(toDrug.tiers, interpolate_pct(fromDrug.tiers, fromWeeklyMg))
  18. 18. Refill order-by date

    order_by = startDate + (lastDoseNumber + 1) × intervalDays - leadTimeDays
  19. 19. GI-tolerance window per dose-up

    window = { start: phaseStart, peak: phaseStart + 5d, end: phaseStart + 14d }
  20. 20. Cost breakdown

    cost_per_mg = cost_per_vial / vial_mg_capacity ; cost_per_week = cost_per_mg × weekly_mg

Back to the calculator

Open the GLP-1 Dosage Calculator