Inspiration

In July 2026, DocUpdate published an article titled "Prescription Abandonment: The Prescription Was Sent. The Patient Still Never Started It." Surescripts reports that 27% of new prescriptions are never dispensed, and a patient who never started looks exactly like a drug that doesn't work.

The person who can fix it usually isn't the doctor. It's the practice's access coordinator or medical assistant: about 467,000 medical assistants work in doctors' offices (BLS). Yet DocUpdate's own FAQ says "Staff accounts and practice-level profiles aren't live yet, but they're on our roadmap." Nobody hands that person the stuck prescription, the reason, and the fix.

The scale of the work (our calculation, from AAMC and AMA figures):

$$\frac{866{,}460 \text{ physicians} \times 13\ \text{h/week of prior-auth work}}{40\ \text{h/week}} \approx 280{,}000 \text{ full-time jobs of access work, every week}$$

What it does

FirstDose is a concept for a new Impiricus Ascend skill inside DocUpdate. Impiricus Spark fires when a prescription is written. FirstDose fires when it isn't filled.

  1. The doctor prescribes in DocUpdate. The drug label is shown verbatim from DailyMed.
  2. The pharmacy reports the fill didn't happen. For example, the patient declined at a $410 quote.
  3. Gemini reads the messy pharmacy or hub note and returns one reason code from a fixed list, or unknown, which goes to a person.
  4. A rule, not AI, picks the one fix. Options are re-send the copay card, a bridge sample, or access support. Medicare and Medicaid patients never get a manufacturer copay card.
  5. The doctor gets one alert. It appears in DocUpdate and buzzes their watch through ntfy. One tap sends the case to their coordinator. The first time, the doctor approves the coordinator as a staff account, the way CoverMyMeds delegation works.
  6. The coordinator works a desktop queue (Needs you, Waiting, Fill confirmed) and sends the fix. The patient gets their card through a QR code, plus an optional practice message voiced by ElevenLabs in English or Spanish.
  7. The patient's tap is only an acknowledgment. A case says Fill confirmed only when the pharmacy confirms the fill. The doctor hears about it twice: when it broke, and when it was fixed.
  8. Market Access sees counts only: confirmed first fills, time to first fill and stuck reasons, never a name. The business model is pay per confirmed first fill, never per prescription.

Everything FirstDose adds to DocUpdate's screens carries a New · FirstDose tag. We didn't rebuild anything Impiricus or DocUpdate ships. Wallet, Concierge, QPharma and Medvantx are the fixes we route to. There's no SMS anywhere.

How we built it

  • Frontend (Next.js 16, React 19, Tailwind, shadcn/ui on Vercel):
    • a coordinator desktop app;
    • a DocUpdate-style doctor phone view (also wrapped for iOS);
    • the patient card;
    • a Market Access dashboard;
    • a simulator.
  • Workflow backend (Supabase Postgres): run and revision fencing keeps the doctor's phone, the coordinator's desktop and the patient's phone consistent. Approvals are idempotent, and resets are race-safe.
  • AI with hard limits:
    • the Gemini API only classifies a note into an allowed reason code or null;
    • Grok speech-to-text lets the doctor say "send Maria to my coordinator", and the handoff happens only after they tap Confirm;
    • no model writes drug or patient text; patient and doctor wording comes from fixed templates.
  • Verified labels: Otezla and Humira labels come from RxNorm and DailyMed, rendered verbatim and checked against the saved source at build time.
  • Analytics: committed events are projected into a Tiger Data (TimescaleDB) hypertable with hashed case IDs, and the Market Access view reads a run-scoped summary from it.
  • Real public data: CMS Medicare Part D prescribing and formulary figures for Georgia, and NADAC drug costs, each shown with its source and year. Patients and pharmacy activity are synthetic.
  • Alerts: ntfy push to the doctor's watch (tested on a Garmin Forerunner 55).
  • Tests: 728 unit tests, plus PostgreSQL integration and multi-browser smoke tests.
  • The demo video is code too: a HyperFrames composition built from our talking-head clips and real app screens, with whisper.cpp captions.

Challenges we ran into

  • Honest outcomes. "The patient tapped the card" is not a fill, and a fill is not a first dose. We built the workflow and every sentence on screen around that line.
  • Keeping AI out of clinical text while still using it where it helps. The model names the reason, a rule picks the fix, and labels stay verbatim.
  • Three devices, one truth. Keeping the phone, desktop and patient views consistent through resets and double taps took real concurrency work.
  • Building inside someone else's product without rebuilding it, and making that visible to a judge in seconds (hence the New · FirstDose tags).
  • No real patient data. We used synthetic patients alongside real, sourced public reference data.

Accomplishments that we're proud of

  • The full loop works live across a desktop, a phone and a watch.
  • Nothing overclaims: verbatim labels, a clear who-sees-what boundary, and disclosures on every screen.
  • The demo video is reproducible, rendered from code.

What we learned

  • The operator is the medical assistant, not the doctor. The doctor's role is to approve and to be told only when it matters.
  • Bounded AI plus deterministic rules is what makes a healthcare workflow trustworthy.
  • Wording is product: "Fill confirmed" and "first fill pending" say exactly what we know.

What's next for FirstDose

-Hopefully working at Impiricus in the future to make this real

Disclosure

This is a concept: FirstDose is shown inside DocUpdate and is not affiliated with DocUpdate or Impiricus. The patients and pharmacy activity are synthetic, and Impiricus, Wallet and partner names are shown as a concept.

Built With

Share this project:

Updates

Submission history