HV Curalytics extracts pharmacy data from Curant's reporting portal and delivers it to Healthvana, unlocking patient visibility, accurate renewals, and shipment tracking.
Healthvana patients get their medications through Curant Health, a specialty pharmacy. Curant verifies prescriptions, packages medications, and ships them.
Curant's reporting portal, Curalytics, holds all of this data: who received what, when shipments went out, tracking numbers, package contents. Healthvana needs every bit of it.
There is no API between the two systems. The data sits behind a login screen. Until now, getting it out meant copy-pasting or running fragile console scripts with no way to verify the output.
Running this 2–3 times a day enables four things that were impossible before:
100+ patients have valid prescriptions but haven't been sent medication. They're waiting and we didn't know.
See when patients actually received meds, not when the Rx was written. The gap can be weeks.
Time renewals to actual receipt, not Rx date. No more early or late reminders.
Patients and CS can see where their medication is: courier, tracking number, delivery date.
Click Download Data to watch the pipeline run against simulated data.
Interactive demo
2/4/2026 → 2/11/2026
Curalytics splits its data across three reports:
The tool pulls all three, deduplicates, joins by prescription number and shipment ID, and produces one CSV.
These numbers are from a real run. The whole process takes about 10 seconds.
Clicking the bookmarklet on Curalytics loads bootstrap.js from our server. It does two things:
rx.hvna.dev/client.postMessage.The panel handles UI and processing, but can't call Curalytics APIs directly because it's on a different domain. So it asks the parent page (Curalytics, where you're logged in) to fetch on its behalf. The parent makes the authenticated call and sends the result back.
The panel handles logic. The parent handles authentication. Both validate message origins.
The bookmarklet never changes. All code lives on our server. Deploy to Vercel, and every user gets the update on their next click.
The panel runs a five-phase pipeline:
POST with date range. Returns shipments: patient info, ship dates, courier, tracking.
POST for the same range. Returns prescriptions: drug names, quantities, providers.
One GET per shipment for box contents. Runs 12 at a time, cached locally. Repeat runs skip known shipments.
Remove duplicate summaries (same RxNumber + CompletedDate), then join: summaries → packages by Rx number, packages → shipments by shipment ID.
Compare API fields against baseline from the previous run. Warn if anything changed. Export as a 26-column CSV.
About 10 seconds for a week of data. Progress is shown in real time.
Curalytics' API has no documentation. If Curant renames a field or removes a column, the data just changes.
The tool records field names from each response as a baseline and compares on the next run:
The first person to hit a changed API sees it immediately instead of days later when imports look wrong.
This feeds into production. The test suite has three layers:
bootstrap.js, creates the real iframe, intercepts API calls. Six scenarios: Normal, Empty, Error, Expired Session, Schema Change, Partial Failure.71 tests total. Unit tests run in under a second; the full suite in about 10.