How PlainMeds is made
Every figure on PlainMeds comes from a public FDA or CMS file. Each section names its file and the date it was read, and the label sections link the label itself on DailyMed, so you can check a figure where it came from.
Updated
Which files does it read?
- NDC Directory (FDA, through openFDA's downloads; the FDA's directory page): every marketed human drug product, its active ingredients, labeler, dosage form, route, marketing category and DEA schedule. It defines which medicines have a record: 112,822 finished products in this build.
- Drug labels (FDA Structured Product Labeling, through openFDA; each label is linked on DailyMed): 2,165 labels supply the indications, boxed warnings, adverse reactions, drug interactions, contraindications and warnings quoted on the pages.
- Drugs@FDA (the FDA page) and the Orange Book (the FDA page): 26,011 applications give each medicine's first approval, its brand and generic approvals, and the patents and exclusivity periods listed against them.
- NADAC (CMS, data.medicaid.gov): the National Average Drug Acquisition Cost survey, what retail pharmacies paid per unit; the latest week in this build is October 7, 2026.
- Drug shortages (the FDA page) and the Enforcement Report (the FDA page) (FDA, through openFDA): 1,590 shortage entries and 7,672 recall entries.
- FAERS (FDA Adverse Event Reporting System, through openFDA): counts of reports naming each medicine, by year, outcome and reaction, through July 30, 2026.
How do the files become one record per medicine?
A medicine is its set of active ingredients. Salt and water forms are removed from the ingredient names (atorvastatin calcium trihydrate is atorvastatin), but parts that make a different medicine are kept (isosorbide mononitrate and dinitrate stay apart, as do tenofovir disoproxil and alafenamide). Every product with the same set shares one record, so Lipitor and each generic atorvastatin appear together. For the label quoted on the page, the pipeline prefers the label of the reference product named in the Orange Book in the most common dosage form and the application holder's own label before a repackager's copy, then a brand label, a prescription label before an over-the-counter Drug Facts label, then the most recent one; the page names the label it used and its date. When openFDA holds no copy published by the application holder itself (Eliquis, for one), the newest copy published under the same application by a repackager is quoted, and the source line names both.
Prices are matched through the 11-digit package code, shortages and recalls through product codes and names, and FAERS through the generic and brand names openFDA attaches to each report. Interaction pairs come from one label naming another medicine, or its brand, in its drug interactions, contraindications, warnings or boxed warning sections; the sentence that names it is quoted as written. Where the quoted label is an over-the-counter Drug Facts label, the interaction sections of the medicine's prescription label are read too and named as such. Names that labels use for a mechanism or a class (“norepinephrine reuptake”, “angiotensin II receptor blockers”) and brand names that are ordinary words are not counted as the medicine. A medicine named only as an ingredient of a fixed-dose product that contains the label’s own medicine (“abacavir/dolutegravir/lamivudine”) is not counted either: it is a co-ingredient, not a medicine the label warns about.
A medicine is listed under a condition only when the condition is the object of an indication phrase in its label (“indicated for the treatment of”, “to reduce the risk of”): not when it names the patients (“in patients with chronic anemia”), a cause, an example, a history, a gene (“anaplastic lymphoma kinase”) or respiratory depression, and not after a negation (“not for the treatment of type 1 diabetes”). Diagnostic agents and test kits are left out. The side-effects pages quote the adverse-reaction table of the label as printed, row for row, where the label has one.
What does the pipeline check?
The pipeline builds a copy of the database and never writes to the live one. Every stage records its counts, and a rebuild in which any count falls by more than a tenth stops and is not released until the cause is found, such as a file cut short or a changed format. Every page is drawn in the same build; if one page fails, the whole build stops rather than publishing a site with gaps. Every build also checks the joins against a hand-checked list: for the main conditions, the medicines whose labels are indicated for them (allopurinol for gout, warfarin for atrial fibrillation) must be on the condition's page, and medicines a past build listed wrongly (a weight-loss drug under high blood pressure because its label names hypertension as a risk factor) must not be; one miss stops the build. Every condition list was read against its labels by hand when it was built (October 7, 2026), and every wrong member found then is on the list. Recall entries matched by product code must also name the medicine. Interaction sentences that name a medicine only inside a mechanism or a class (“norepinephrine reuptake inhibitors”) are not counted. Pages carry the date their data was read.
Which pages are offered to search engines?
Every content page is open to every search engine and listed in both sitemaps: 14,694 data pages and the site's own pages (about, methodology and the like) as of October 8, 2026. Nothing is hidden from one engine for quality. A row that has too little for a page of its own is a section of a fuller page instead, and its old address leads there. An interaction between two medicines has its own page when a label sentence says what happens or what to do; otherwise it is a row, with the label's words, in the "other medicines" section of the record whose label names it. A combination product or a biosimilar whose label repeats its ingredient's sentence is listed on the ingredient's pair page. Alternatives, shortage history and side effects below their bar are sections of the medicine's record; a class with one medicine is part of that medicine's record; a condition with one or two labeled medicines is a row of the conditions index; a medicine with no current label, or a label and nothing else on file, is a row of the A to Z index. A medicine record has its own page with its label and one more file, or two files without a label. An address that already brought readers from Google or Bing keeps its own page. Internal search results and error pages are offered to no engine. The same rule runs at every data load, so a row that a new file lifts over the bar gets its page in that release.
Who checks the pages, and how?
Every page type has the same three layers: automated checks at every build, a review before every release, and the indexing read every 90 days. What each layer covers, per page type, as done (last build and review: October 8, 2026):
| Page type | Checked automatically at every build | Reviewed before release (publisher and AI review agents) |
|---|---|---|
| Medicine records | counts of products, labels, prices and approvals against the last build (a fall of more than a tenth stops it); patents per product (apixaban's must read 3); a price from the wrong form stops it; no empty value printed | three figures per page type re-computed from the raw FDA and CMS files; search quality, competitor and answer-engine review |
| Side effects | the label's adverse-reaction table parsed only with named columns; the anticoagulants' lead must name bleeding | FAERS totals re-read from openFDA; quality and competitor review |
| Side effects across medicines | each listing read clause by clause (a patient group, an indication, a stopping or overdose list, or a phrase such as "erythema multiforme" does not count); named medicines must be listed (aspirin's tinnitus, gentamicin's injection label) and named misreadings must stay out, or the build stops | answer-engine review row by row in nine rounds, with random samples read against the label text; spam review |
| Interactions | a page only where a label sentence says what happens or what to do; flattened label tables rebuilt from the label's own table or not quoted | spam, competitor and answer-engine review of the sentences quoted |
| Alternatives and comparisons | same route only; a hand-checked list of conditions and their medicines must hold or the build stops | quality, spam and answer-engine review |
| Shortages, conditions, classes | shortage status from the FDA file of the day; class members from the NDC Directory | competitor and answer-engine review; the hand-kept files (market actions, shortage history) checked against the FDA's pages every 90 days |
| Research and rankings | each analysis re-computed from the build; its CSV is the same rows | method and limits read by the publisher; quality review |
Every report sent to hello@plainmeds.com is checked against the source file by the data editor; fixes are listed in the editorial policy. No pharmacist or physician reviews the pages: PlainMeds publishes the federal record, quoted and dated, and gives no medical advice.
How is AI used?
PlainMeds' publisher uses AI tools to write the code, the page designs, the six guides and the text of the research write-ups. The sentences on a medicine's page are the label's own words, in quotation, or fixed wording filled with that medicine's figures, with one exception: the dated notes on FDA actions that are not in the data files (a withdrawal request, a withdrawn approval, a proposed order, a resolved shortage) were drafted with AI from the FDA's announcement, checked against that announcement, and link it. The numbers come from database queries, and each analysis states its method and what it cannot show. Instead of reading each of the 14,696 pages, the data is checked by automated tests against the source files, which is why every section shows where it came from.
Where do these files stop short?
- FAERS counts are not rates. Anyone can send a report, a report does not show that the medicine caused the event, and widely used medicines collect more reports. The counts say what was reported, not how likely an effect is.
- A label lists what its studies and reports found. A label that does not name another medicine does not make the two safe together, and the order and wording of labels differ between companies.
- NADAC is what pharmacies paid, not what you pay. Your price depends on your insurance, the pharmacy and discounts; NADAC covers drugs bought by retail pharmacies that answer the survey.
- Shortage and recall entries describe products and lots, not every package of a medicine; a recall is not a ban, and a shortage of one strength may leave others available.
- The NDC Directory lists what companies report as marketed. A medicine missing from it may still be sold for a while, and its record then says so with a dated status page.
Who answers for it?
The about page names who publishes PlainMeds. Its data editor reads every report sent to hello@plainmeds.com, checks it against the source file, fixes what is wrong in the next build and lists the fix in the editorial policy. The data behind the medicine records can be downloaded as one CSV file under a CC BY 4.0 licence.