Portfolio · ad-heavy publishers · 9 named engagements · 2019 to today

Ad-heavy does not mean slow.

Your ads pay the bills and eat your Core Web Vitals. This page is the dataset that says both can win: 646 optimization passes across 635 WordPress publishers from the white-label era, most of them running heavy ad scripts, 643 still monitored, and 94 still passing mobile Core Web Vitals years later. Every number on this page carries its source file and measurement date. Nobody can fake that on a sales call.

01 · provenance

The work was done with the ads on.

The ledger's constraint column is what makes this dataset honest. These were not lab-condition optimizations on a staging copy with ad code stripped out; they are the recorded conditions the 646-row body of work was delivered under.

  • 8"Can't turn off (ads) while we work"the revenue stays on while the optimization happens
  • 5"Must use LiteSpeed Cache, host requirement"the cache plugin is chosen by the host, not us
  • 17"Need to replace WP Rocket"license or stack change folded into the job

Constraint counts read from the ads/notes columns of the white-label ledger CSV (30 constraint rows of 646). The ad flags are site-level notes from the same file: 33 Mediavine, 20 AdThrive.

02 · the measurement gap

Why your PSI score drops and your rankings don't.

The PageSpeed Insights lab test loads your site once, cold, in a throttled simulated browser, so every ad script executes in full before paint. CrUX field data is the 75th percentile of what real Chrome visitors experienced over 28 days: warm caches, settled auctions, and ad slots below the fold that never delay the metric. Google ranks on the field data. On these five ad-network sites from the monitor, the lab run reports LCP up to 2.4 times what real visitors experience, and four of the five cross the lab threshold doing it. All five pass mobile CWV where Google is looking.

SiteNetworkPSI mobileLab LCP (Lighthouse)Field LCP (CrUX p75)Verify
nospoonnecessary.comAdThrive893,216 ms1,371 msre-run ↗
happyfoodstube.comMediavine903,528 ms1,938 msre-run ↗
handylittleme.comMediavine883,407 ms1,422 msre-run ↗
savoryexperiments.comMediavine972,400 ms1,442 msre-run ↗
allthingsmamma.comAdThrive952,656 ms1,342 msre-run ↗

Measured July 2026 from the monitor scan; all bars share one scale, and the dashed tick marks the 2,500 ms LCP "good" threshold. The gap cuts both ways: on delicious-audio.com (The Deli Magazine), the lab CLS passed while Search Console field validation kept failing, because the previous NitroPack setup traded real-visitor stability for lab wins. Field data first, always.

03 · anatomy

What each ad script costs, and what we do about it.

Mediavine, Raptive (AdThrive), Ezoic, and GAM stacks all tax the same three vitals. The fixes below are the ones already shipped in the cases on this page.

LCPLargest Contentful Paint

What the ad stack does

Header-bidding wrappers and bidder JavaScript load before or alongside the article image. In a cold lab run every ad script executes from scratch and pushes the paint later.

What we do

Defer everything that is not the LCP element, preload the content image, and clean the host path. On thefelthub.com, dropping host-side mod_pagespeed alone improved average TTFB by about 0.3 s within 24 hours; Raptive scripts on bolde.com moved to delayed loading.

CLSCumulative Layout Shift

What the ad stack does

Ad containers render collapsed, then jump when the creative fills. Consent banners, translation bars, and anchor ads each add their own movement after load.

What we do

Reserve final slot dimensions up front, and use the ad network's own guards: on ballershoesdb.com that meant AdThrive deferred ad loading plus the CLS-optimization toggle in their WordPress plugin. On airlinegeeks.com the cookie-prompt wrapper got sized and the multilingual banner stabilized.

INPInteraction to Next Paint

What the ad stack does

Auction and refresh code runs on the main thread between the reader's taps. On bolde.com, ad-refresh scripts re-froze the page mid-read, a 118 ms stall every few seconds.

What we do

Retime or delay refresh, break up long tasks, and cut rendering work after interactions. On airlinegeeks.com, containment and lazy rendering around article content, nav, and footer addressed the presentation-delay half of a 50/50 INP split.

04 · the named engagements

9 publishers, opened up.

Named clients, real domains, and outcomes from client-visible reports. The screenshot exhibits are ad-heavy blogs from the white-label era, optimized without touching a single revenue tag.

  • saltandflour.com

    Recipes and baking blog

    2791
    PageSpeed before 27, after 91 for saltandflour.com

    From red to green on mobile PageSpeed.

  • jcooks.net

    Food blog

    3985
    PageSpeed before 39, after 85 for jcooks.net

    Mobile score more than doubled.

  • thisblogisatreasure.com

    Food blog

    4089
    PageSpeed before 40, after 89 for thisblogisatreasure.com

    Ad-heavy publisher optimized without losing revenue tags.

  • gfcnieuws.com

    Dutch news publisher

    1k+/day lostRecovered

    Google Discover traffic recovered after a core update: 1k+ clicks/day fell to zero in Aug 2023; LCP image preload, icon-font diet (78 KB to 1 KB), and ad-shift CLS fixes brought mobile CWV green on Nov 1: Discover clicks returned within days.

    "Solved all the CWV issues I had and passed CWV."
    Publisher, gfcnieuws.com · Upwork 4.85
  • Sweetn (Bolde.com)

    Relationship and lifestyle media

    257ms INPINP green

    Google Discover CWV program (contract: "Optimizing WP Site Speed for Google Discover"): failing INP 257 ms and CLS 0.15 to GSC-validated green in six weeks. A tag-manager container was blocking the main thread for 440 ms at load and ad-refresh scripts re-freezing the page every few seconds; INP green March 1, 2026, with an ongoing Discover technical-SEO retainer.

    "Excellent work! We hired Milan to improve our core web vitals. He was super efficient and did an amazing job!"
    Upwork 5.0
  • thefelthub.com

    Craft-education publisher, Mediavine + MemberPress

    volatile TTFB3 projects from 1 audit

    One WordPress performance audit turned into three linked projects (Dec 2025 to Mar 2026): DebugBear RUM installed to see real-visitor CWV under Mediavine ads, LCP render-delay work on the ad-laden article template, host-side mod_pagespeed removal (average TTFB about 0.3 s better within 24 hours), then a full hosting and domain migration with Cloudflare APO enabled and logged-in members excluded from cache.

    "This contract originally started as a single WordPress performance audit and roadmap, but I was so impressed with his expertise and the way he works that I ended up hiring him for three projects in total."
    Sandy M, thefelthub.com · Upwork 5.0
  • airlinegeeks.com

    Aviation news publisher, Mediavine, multilingual

    CLS + INP failingimproving in GSC

    Core Web Vitals on an aviation news site running Mediavine in several languages: CLS from a translation banner that changes height per language and a cookie-prompt wrapper that grows after load; INP split roughly evenly between input delay and presentation delay, fixed with containment and lazy rendering around article content, nav, and footer. CLS and INP visibly improving in Search Console by July 2026; a six-page technical writeup handed to the in-house team at close.

    "Milan was fantastic to work with and resolved the Core Web Vitals issues we had been dealing with for a while. I would highly recommend him and work with him in the future."
    Raffaele Riconosciuto, Airline Geeks · Upwork 5.0
  • The Deli Magazine (delicious-audio.com)

    Music-gear publisher, Ezoic

    GSC CLS failingfield-first rebuild

    Contract titled "Fixing Search Console high CLS times": the PSI lab test showed passing CLS while Search Console field validation kept failing, the exact lab-vs-field gap ad scripts create. The prior NitroPack setup had bought lab wins with aggressive settings that made real-visitor shifts worse; Ezoic wrappers and ad-dependent galleries added load-order movement. Field-first remediation over a two-year relationship (Nov 2022 to Nov 2024).

  • ballershoesdb.com

    Sneaker database and content site, AdThrive (via Lucid Web Group)

    JS-bound mobileads deferred, CLS guarded

    JavaScript diet on an AdThrive-monetized basketball-shoe database whose weight was mostly ad and popup code, not content. Included the ad-network levers most developers miss: asking AdThrive support to enable deferred ad loading and switching on the CLS-optimization option in the AdThrive WordPress plugin.

    "If you need to speed up a slow site, Milan is the guy to do it!"
    Lucid Web Group (agency) · Upwork 5.0

How these numbers were captured.

Ledger counts come from the iMark Interactive white-label completed-work CSV: 646 site rows covering 635 unique domains (11 sites came back for a second pass), 2019-2020 era. The portfolio hub's "645 blogs optimized" line is the same program's long-published summary count. Monitor aggregates come from a full CrUX/PSI scan of the surviving sites, measured July 2026, with showcase entries re-verified September 2026. Lab-vs-field rows are single-scan pairs from that same measurement, mobile, LCP p75. Ad engagement narratives are paraphrased from project records; quotes are verbatim public Upwork feedback only.

One honest caveat: ad scripts grow. Lab PSI scores on ad-supported blogs drift down as networks add code, which is exactly why this practice measures field data first. The 94 passing sites are passing where Google is looking.

Your ads and your vitals can both win.

Free audit: I will map what your ad stack costs you in LCP, CLS, and INP, and tell you honestly what is recoverable.

Get a free audit