℈ Scruple
money lost a few dollars at a time.
Independent pharmacies get paid below what they paid for the drug, wait on Medicare refunds that never arrive, and watch wholesaler prices drift up, a few dollars per claim, in reports nobody has time to read. Scruple reads them.
In progress, with a design-partner pharmacy in Utah. Writing for owners.
Open a demo
- Live · runs in your browserDrug shortage checkPaste an NDC list, or load a made-up pharmacy. Joins FDA's shortage list, RxNorm and NADAC to show what's short and what the alternatives cost.Open the shortage check
- Sample · a made-up pharmacyMargin boardWhat a check turns up for three stores and 90 days of reports: refunds that never came, claims paid below cost, prices that drifted.Open the board
How it works
- One export in, a dollar figure out. A pharmacy sends a report it already has: wholesaler invoices, or a claims export with the patient columns deleted. The pipeline joins it to NADAC, CMS's weekly survey of what pharmacies actually pay, and flags cost drift, purchases above the national average, and claims paid below cost, each with its appeal deadline.
- Remittances, parsed from the raw format. A pure-Python X12 835 parser reads payer remittances, matches them to fills, and reconciles Medicare Drug Price Negotiation refunds: paid, short, or missing.
- Built to sit above the pharmacy system, not replace it. Six of the seven inputs (invoices, NADAC, 835s, refund files, contracts, statements) don't depend on which pharmacy software a store runs.
- A shortage check that refreshes itself. A GitHub Action rebuilds a bundle every morning from FDA's Drug Shortages list, RxNorm (which NDCs are the same clinical drug) and NADAC. Matching happens in the browser, so a pharmacy's product list never leaves the page.
- Synthetic data that can't be misread. The sample board uses invented numbers, so the build swaps every real payer and wholesaler name for a placeholder and fails if one survives. Invented figures next to a real PBM's name would read as a claim about that PBM.
Rules we hold to
- Never touch patient identifiers. The free check runs on files with none. Claim-level work waits for a business associate agreement.
- Every number has a source. Anything shown to a pharmacy traces back to a calculation or a cited document in the repo.
- Build against documented formats, then fix on contact with real files.
Python and uv for the pipeline; static HTML, Vercel Routing Middleware and a few functions for the site; Playwright for screenshot smoke tests.