What does a WordPress plugin load from third-party servers?
We installed 72 WordPress plugins one by one and recorded what they load from third-party servers: once on a plain page view, once in the dashboard. This page keeps the method, our own failed attempts and every measurement, so that anyone can check the numbers.
Measured on 15 and 16 September 2026 · hafenstudios, Hamburg
The question
Which WordPress plugins load something from third-party servers on a plain page view?
This is the question agencies have to answer for their clients, and it is usually answered with guesses. No measurement existed.
The method
One dedicated WordPress Playground in the browser per plugin. The plugin is installed from the directory and activated; nothing else is configured. Then, logged out, the home page and a post are opened, the way a visitor would. Every network request is recorded and grouped by host.
Four decisions are what make the result hold up, plus the sample.
Subtract the baseline
First a run with no plugin at all. Result: zero third-party hosts. WordPress with its bundled theme fetches nothing from outside on its own. Everything that shows up after that was installed by someone.
What counts is the frame a request comes from
Only what comes out of the WordPress frame is counted. Requests from the Playground shell are measurement environment. Why a blocklist of hosts is useless for this is shown below in the false alarms.
Measure logged out, and only start counting after the logout
The question is about a page view, so: front end, not signed in. The cut-off from which requests are counted sits behind the logout. Why that matters is shown by the second false alarm.
Configure nothing
What is measured is the state straight after activation. That is reproducible and it is the state most installations stay in.
This limit belongs in every sentence about the result. A plugin that only fetches data once an account is connected sits at zero here for good reason, and it would be wrong to conclude that it never fetches anything. The statement is: out of the box it fetches nothing.
The sample
All 67 plugins with at least one million installations from the Plugin Directory Census 01/2026, plus our own six. That makes the selection defined rather than picked: anyone above one million installations is in.
One plugin dropped out: litespeed-cache. The Playground failed to come up in four attempts, in neither of the two modes. That leaves 72 measured.
Our own plugins sit in the same table as everyone else. They are six of the 72 slugs: hafen-core, hafenstudios-ads, heckgalerie, linkjet, wellenbrecher, wimpel.
The self-test: why a zero is worth anything at all
A quiet result only says something if the instrument can prove that it moves. The self-test uses a mu-plugin to hang a known third-party request into the front end:
$img = '<img src="https://example.com/hs-selbsttest.png" width="1" height="1" alt="" />';
add_action( 'wp_footer', function () { echo $img; } );Measured on 16 September 2026, with no plugin at all. Our measuring tool speaks German, so this is its output as it came, with the English reading next to it:
Grundlinie messen (ohne Plugin) ... 1 fremde Gastgeber ohne Plugin: example.com measuring the baseline (no plugin) ... 1 third-party host without a plugin: example.com
So the chain holds: home page loaded, logged out, frame filter permeable, request captured. A zero in the table is a real zero.
Two false alarms, both of our own making
Both are here because a measurement without its failed attempts cannot be checked.
Elementor and Google Analytics
The first run reported a hit on region1.google-analytics.com for elementor. The address gives itself away:
dl=https%3A%2F%2Fplayground.wordpress.net%2F%3Fmode%3Dseamless dt=WordPress%20Playground en=error&ep.source=bootSiteClient
That was the analytics of playground.wordpress.net reporting a boot error of its own. A blocklist entry for google-analytics.com would have been the wrong way out: a plugin that really does load analytics into the front end is exactly the finding we are after. Since then the frame a request comes from is what decides. After that, elementor sits at zero.
wps-hide-login and Gravatar
The second run reported a hit on secure.gravatar.com for wps-hide-login. The frame in the log:
https://playground.wordpress.net/scope:happy-quiet-valley/wp-login.php?action=logout
That was the admin bar on the logout page, so WordPress core on a page no visitor ever sees. The counting cut-off sat before the logout instead of after it. After the fix: zero.
The rule that came out of it
A finding about someone else’s product is measured twice before it is spoken.
Result, front end
Of 72 measured plugins exactly one loads something from a third-party server on a plain page view: hostinger-reach loads js/embed.js from cdn-reach.hostinger.com, twice, on the home page.
That finding was measured twice independently, on 15 and 16 September 2026, in both runs with the home page as the frame and logged out.
All 72 measured plugins in the front end, logged out, straight after activation. Sorted by number of requests, then alphabetically.
| Plugin slug | Third-party hosts | Requests |
|---|---|---|
hostinger-reach | cdn-reach.hostinger.com | 2 |
advanced-custom-fields | none | 0 |
akismet | none | 0 |
all-in-one-seo-pack | none | 0 |
all-in-one-wp-migration | none | 0 |
all-in-one-wp-security-and-firewall | none | 0 |
astra-sites | none | 0 |
better-search-replace | none | 0 |
classic-editor | none | 0 |
classic-widgets | none | 0 |
code-snippets | none | 0 |
complianz-gdpr | none | 0 |
contact-form-7 | none | 0 |
cookie-law-info | none | 0 |
custom-post-type-ui | none | 0 |
disable-comments | none | 0 |
duplicate-page | none | 0 |
duplicate-post | none | 0 |
duplicator | none | 0 |
elementor | none | 0 |
elementskit-lite | none | 0 |
essential-addons-for-elementor-lite | none | 0 |
ewww-image-optimizer | none | 0 |
google-analytics-for-wordpress | none | 0 |
google-site-kit | none | 0 |
google-sitemap-generator | none | 0 |
hafen-core | none | 0 |
hafenstudios-ads | none | 0 |
header-footer-elementor | none | 0 |
heckgalerie | none | 0 |
hostinger | none | 0 |
image-optimization | none | 0 |
imagify | none | 0 |
insert-headers-and-footers | none | 0 |
instagram-feed | none | 0 |
jetpack | none | 0 |
limit-login-attempts-reloaded | none | 0 |
linkjet | none | 0 |
loco-translate | none | 0 |
loginizer | none | 0 |
mailchimp-for-wp | none | 0 |
maintenance | none | 0 |
one-click-demo-import | none | 0 |
optinmonster | none | 0 |
really-simple-ssl | none | 0 |
redirection | none | 0 |
regenerate-thumbnails | none | 0 |
safe-svg | none | 0 |
seo-by-rank-math | none | 0 |
sg-ai-studio | none | 0 |
sg-cachepress | none | 0 |
sg-security | none | 0 |
svg-support | none | 0 |
tinymce-advanced | none | 0 |
ultimate-addons-for-gutenberg | none | 0 |
updraftplus | none | 0 |
wellenbrecher | none | 0 |
wimpel | none | 0 |
woocommerce | none | 0 |
wordfence | none | 0 |
wordpress-importer | none | 0 |
wordpress-seo | none | 0 |
worker | none | 0 |
wp-fastest-cache | none | 0 |
wp-file-manager | none | 0 |
wp-mail-smtp | none | 0 |
wp-multibyte-patch | none | 0 |
wp-optimize | none | 0 |
wp-smushit | none | 0 |
wp-super-cache | none | 0 |
wpforms-lite | none | 0 |
wps-hide-login | none | 0 |
The question assumes that many plugins phone home on a page view. Measured, they do not, as long as they are not configured. Site Kit with no Google account connected loads nothing. Instagram Feed with no account loads nothing.
The risk arrives with the setup. Installation alone does not create it. Anyone reviewing data protection therefore looks at the configured plugins, one by one.
Result, dashboard
Of 72 measured plugins, nine load something from third-party servers as soon as the operator opens their own dashboard. Every finding was measured twice independently, on 16 September 2026, and both runs agree.
The baseline in the dashboard is above zero: when signed in, WordPress loads secure.gravatar.com by itself for the avatar in the admin bar. That is subtracted and counts for no plugin.
The nine dashboard findings, with where they occur and what kind of request it is.
| Plugin slug | Third-party hosts | Where | What |
|---|---|---|---|
google-analytics-for-wordpress | connect.monsterinsights.com, static.cloudflareinsights.com | redirect on first opening | document, ping, XHR |
optinmonster | app.optinmonster.com, optinmonster.com, use.typekit.net, p.typekit.net | own page page=optin-monster-dashboard&onboarding=1 | redirect, Adobe Fonts, tracking pixel |
all-in-one-wp-security-and-firewall | www.gstatic.com (12×), www.google.com, Google Fonts | own page page=aiowpsec | Google Charts, jsapi, fonts |
custom-post-type-ui | emailoctopus.com | own page page=cptui_main_menu | script and stylesheet of a newsletter provider |
elementor | Google Fonts, assets.elementor.com | dashboard | fonts and its own assets |
wp-smushit | fonts.bunny.net | the WordPress plugin list | fonts |
google-site-kit | Google Fonts | dashboard | fonts |
ultimate-addons-for-gutenberg | Google Fonts | dashboard | fonts |
image-optimization | Google Fonts | dashboard | fonts |
google-analytics-for-wordpress (MonsterInsights) and optinmonster are the two cases in which the operator themselves is sent away, before anything is configured. MonsterInsights lands on connect.monsterinsights.com, and the address carries along: site_url=…, rest_url=…/wp-json/monsterinsights/v1, onboarding_key=…, return_url=…. OptinMonster lands on app.optinmonster.com/wp-welcome, and the address carries along: connectionToken=…, wpUrl=…. Both plugins come from the same house.
On top of that, OptinMonster loads Adobe Fonts on its page (use.typekit.net, eight requests) and a tracking pixel p.typekit.net/p.gif that sends along the host name of the website (h=…).
Five of the nine cases are fonts from Google Fonts. wp-smushit loads its fonts from fonts.bunny.net, and it happens on the WordPress plugin list.
All 72 measured plugins in the dashboard, signed in, straight after activation. The WordPress baseline is subtracted. Sorted by number of requests, then alphabetically.
| Plugin slug | Third-party hosts | Requests |
|---|---|---|
all-in-one-wp-security-and-firewall | www.gstatic.com, fonts.googleapis.com, fonts.gstatic.com, www.google.com | 17 |
optinmonster | use.typekit.net, app.optinmonster.com, p.typekit.net, optinmonster.com | 12 |
elementor | fonts.googleapis.com, fonts.gstatic.com, assets.elementor.com | 7 |
image-optimization | fonts.googleapis.com, fonts.gstatic.com | 7 |
google-analytics-for-wordpress | connect.monsterinsights.com, static.cloudflareinsights.com | 4 |
google-site-kit | fonts.gstatic.com, fonts.googleapis.com | 4 |
ultimate-addons-for-gutenberg | fonts.googleapis.com, fonts.gstatic.com | 3 |
custom-post-type-ui | emailoctopus.com | 2 |
wp-smushit | fonts.bunny.net | 2 |
advanced-custom-fields | none | 0 |
akismet | none | 0 |
all-in-one-seo-pack | none | 0 |
all-in-one-wp-migration | none | 0 |
astra-sites | none | 0 |
better-search-replace | none | 0 |
classic-editor | none | 0 |
classic-widgets | none | 0 |
code-snippets | none | 0 |
complianz-gdpr | none | 0 |
contact-form-7 | none | 0 |
cookie-law-info | none | 0 |
disable-comments | none | 0 |
duplicate-page | none | 0 |
duplicate-post | none | 0 |
duplicator | none | 0 |
elementskit-lite | none | 0 |
essential-addons-for-elementor-lite | none | 0 |
ewww-image-optimizer | none | 0 |
google-sitemap-generator | none | 0 |
hafen-core | none | 0 |
hafenstudios-ads | none | 0 |
header-footer-elementor | none | 0 |
heckgalerie | none | 0 |
hostinger | none | 0 |
hostinger-reach | none | 0 |
imagify | none | 0 |
insert-headers-and-footers | none | 0 |
instagram-feed | none | 0 |
jetpack | none | 0 |
limit-login-attempts-reloaded | none | 0 |
linkjet | none | 0 |
loco-translate | none | 0 |
loginizer | none | 0 |
mailchimp-for-wp | none | 0 |
maintenance | none | 0 |
one-click-demo-import | none | 0 |
really-simple-ssl | none | 0 |
redirection | none | 0 |
regenerate-thumbnails | none | 0 |
safe-svg | none | 0 |
seo-by-rank-math | none | 0 |
sg-ai-studio | none | 0 |
sg-cachepress | none | 0 |
sg-security | none | 0 |
svg-support | none | 0 |
tinymce-advanced | none | 0 |
updraftplus | none | 0 |
wellenbrecher | none | 0 |
wimpel | none | 0 |
woocommerce | none | 0 |
wordfence | none | 0 |
wordpress-importer | none | 0 |
wordpress-seo | none | 0 |
worker | none | 0 |
wp-fastest-cache | none | 0 |
wp-file-manager | none | 0 |
wp-mail-smtp | none | 0 |
wp-multibyte-patch | none | 0 |
wp-optimize | none | 0 |
wp-super-cache | none | 0 |
wpforms-lite | none | 0 |
wps-hide-login | none | 0 |
What the measurement does not say
- Nothing about the configured state. Connect an account and the numbers change.
- Nothing about requests made by the server instead of the browser. A plugin that calls a third-party API server-side does not show up here. That is worth a measurement of its own.
- Nothing about the contents of the requests. What was measured is that something is fetched, and from whom.
Raw data for checking the numbers
For each plugin and each run there is a JSON file. It records the host, the number of requests, the request type, the full addresses and the frame the request came from. Alongside that sit the baseline with no plugin and the list of measured slugs.
Both tables on this page are generated from exactly those files, row by row. The column “Requests” is the sum of requests across all third-party hosts of a plugin.
The instrument is a script of our own (fremdanfragen.mjs) that drives the WordPress Playground and evaluates the network log. If you want the files to check the numbers, write to moin@hafenstudios.com.
Measured by
Measured on 15 and 16 September 2026 by hafenstudios, Hamburg.
Corrections and objections to moin@hafenstudios.com. A documented correction will be added to this page.