Site Health Monitor · a digital platform case study by Mohammad Uzair Khan: automated Lighthouse audits of public pharmaceutical websites
MSD’s WordPress pages beat the peer median on mobile performance (41 against 29) but trail it on accessibility (90 against 97), and the main content takes 9.5 s to appear on a mid-range phone
3 pages of msd.com and the home pages of 9 peers, audited with Lighthouse on its mobile setting on 19 Oct 2026. Every failing audit on MSD’s pages becomes a ranked fix, written for a WordPress site. The job reruns every week, so a fix shows up as a better score.
- MSD median, performance · accessibility
- 41 · 90
- Peer median, performance · accessibility
- 29 · 97
- MSD page weight, median
- 1.0 MB (peers 4.1 MB)
- Fixes in MSD’s backlog
- 24
Lighthouse scores, mobile
Scores run from 0 to 100; 90 and above is good. Performance is the hardest on a phone: Lighthouse loads the page as a mid-range phone on a slow 4G connection.
Performance score by page
How long until the main content appears
Largest Contentful Paint: when the biggest image or text block is drawn. Google counts 2.5 seconds or less as good. Hover a bar for page weight and blocking time.
Largest Contentful Paint, mobile
MSD’s fix backlog: 24 failing audits, ranked
Each failing audit on MSD’s pages, ranked by the share of MSD pages it affects and how badly it fails, with the remedy written for a WordPress site. The first 12 are shown; the workbook has all of them.
| Issue | Area | MSD pages | Fix |
|---|---|---|---|
| Render blocking requests | Performance | 3 of 3 | Defer or inline the CSS and scripts the first screen does not need (theme enqueue settings or a performance plugin). |
| Reduce JavaScript execution time | Performance | 3 of 3 | Cut the JavaScript run on load (fewer plugins and tags on the page). |
| Minimize main-thread work | Performance | 3 of 3 | Cut the JavaScript run on load (fewer plugins and tags on the page). |
| Reduce unused JavaScript | Performance | 3 of 3 | Load each plugin's scripts only on the pages that use it; remove plugins nobody uses. |
| Reduce the impact of third-party code | Performance | 3 of 3 | Review third-party tags (analytics, consent banner, chat) in the tag manager; load what can wait after the first interaction. |
| Preconnect to required origins | Performance | 3 of 3 | Preconnect to the other origins the first screen needs (fonts, CDN, tag manager). |
| Network dependency tree | Performance | 3 of 3 | Shorten chains of requests; preconnect to the origins the first screen needs. |
| Use efficient cache lifetimes | Performance | 3 of 3 | Give static files a long cache lifetime at the host or CDN. |
| Buttons do not have an accessible name | Accessibility | 3 of 3 | Give every icon button an accessible name (aria-label) in the theme or block markup. |
| Links do not have descriptive text | Accessibility | 3 of 3 | Replace links that say only "read more" or "click here" with text that says where they go. |
| Legacy JavaScript | Performance | 3 of 3 | Stop shipping old-browser polyfills to modern browsers (update the theme build or the plugin). |
| Avoid serving legacy JavaScript to modern browsers | Performance | 3 of 3 | Stop shipping old-browser polyfills to modern browsers (update the theme build or the plugin). |
What each site runs on
Read from each page’s own public markup (file paths a platform leaves behind), not from any private source.
| Page | Address | Platform |
|---|---|---|
| AstraZeneca | www.astrazeneca.com/ | Adobe Experience Manager |
| Bristol Myers Squibb | www.bms.com/ | Adobe Experience Manager |
| GSK | www.gsk.com/en-gb/ | Nuxt (Vue) |
| Lilly | www.lilly.com/ | not readable (the site blocks scripted requests) |
| MSD company overview | www.msd.com/company-overview/ | WordPress |
| MSD home | www.msd.com/ | WordPress |
| MSD product pipeline | www.msd.com/research/product-pipeline/ | WordPress |
| Novartis | www.novartis.com/ | Drupal |
| Novo Nordisk | www.novonordisk.com/ | Adobe Experience Manager |
| Pfizer | www.pfizer.com/ | not readable (the site blocks scripted requests) |
| Roche | www.roche.com/ | not identified |
| Sanofi | www.sanofi.com/en | not identified |
Checks on each audit run
- PassEvery listed page was audited12 pages · rule: one result file per page in audit/pages.json
- InfoPages that blocked the auditnone · rule: a bot wall or error page is recorded as blocked, not scored
- InfoRuns per pageAstraZeneca Home: 1, Bristol Myers Squibb Home: 1, GSK Home: 1, Lilly Home: 1, MSD Company overview: 3, MSD Home: 3, MSD Product pipeline: 1, Novartis Home: 1, Novo Nordisk Home: 1, Pfizer Home: 1, Roche Home: 1, Sanofi Home: 1 · rule: the run with the median performance score is kept
- PassMSD pages detected as WordPress3 of 3 · rule: the backlog's remedies are written for WordPress
Method, downloads and limits
- Audit. Lighthouse in a fresh headless Chromium for each run (no profile, no login, nothing kept), mobile setting, performance, accessibility, best practices and SEO. A page that shows a bot wall is recorded as blocked.
- Report. The median run per page, MSD against peers, the platform from public markup, and a backlog of MSD’s failing audits with WordPress remedies; written to this page and an Excel workbook, with each week appended to a history file.
- Automate. A scheduled GitHub Actions job reruns the audits every week and commits the result, so the effect of a fix shows up as a trend.
- Light touch. A few page loads per site per week, about what one visitor makes: no crawling, no forms, no login.
Download the Excel workbook (.xlsx)
Limits. Lab measurements from one machine in Dubai on one day, not the experience of real visitors (Google’s field data needs an API key). Performance scores move by several points between runs, which is why runs are repeated. Home pages compared with MSD’s inner pages are a rough peer comparison. An independent audit of public pages, not produced or endorsed by MSD or any company named.