While recently checking the ads on my blog, I happened to click on a promotional ad for Adsterra.
I originally just wanted to see what platform it was, but since it is also an ad network for publishers, I went ahead with an idea:
Now that the blog is already using Google AdSense, could Adsterra serve as a second ad platform to bring in some extra revenue?
So this time, instead of stopping at the “looking at materials” stage, I went directly ahead and completed:
- Registering as an Adsterra Publisher;
- Adding the Chinese site and the English site;
- Creating Native Banners;
- Integrating it into WordPress using WPCode;
- Loading independent ad codes for
wwwandenrespectively; - Handling W3 Total Cache page caching;
- Troubleshooting the
403 Forbiddenofinvoke.js; - Ultimately confirming that the issue was highly correlated with the local VPN network environment;
- Successfully loading ads after turning off the VPN, and starting to generate the first batch of impressions and revenue data.
The results of this test were much more optimistic than seeing the 403 Forbidden on the first day.
But at the same time, the actual ad content and initial CPM also made me realize:
An ad platform being “able to display ads” and being “worth using long-term” are two completely different questions.
This article records the entire process and serves as the first-phase baseline for the subsequent evaluation of Adsterra’s revenue performance.
1. Why I Started Testing Adsterra
This time, I didn’t actively search for an “AdSense alternative platform.”
I saw Adsterra’s promotion among my blog’s existing ads, and after clicking, I entered its Chinese landing page.
The page had two main entry points:
- Register as an advertiser;
- Register as a publisher.
What my blog needed was the latter, namely a Publisher.

My goal was quite clear from the start:
Not to replace AdSense, but to test Adsterra purely as a supplementary ad channel.
Therefore, in the first round, I didn’t try more aggressive ad formats like Popunder, Smartlink, or Social Bar. Instead, I prioritized the one that is relatively easy to integrate into content pages:
Native Banner.
Adsterra’s current official Publisher guide also lists various monetization formats such as Native Banner, Display Banner, Popunder, Social Bar, and Smartlink, and supports different billing models including CPM, CPC, and CPA. (Adsterra)
2. Registering as an Adsterra Publisher
The Publisher registration page requires you to fill in:
- E-mail;
- First and Last Name;
- Login;
- Password;
- Messenger;
- Country.

This time, I used the website’s corporate email instead of a personal email.
After all, this account is part of the blog’s commercialization system and may subsequently involve:
- Reviews;
- Ad notifications;
- Payments;
- Security alerts;
- Platform communication.
Using a unified website operations email makes it easier to maintain long-term.
After submitting the registration, Adsterra sends a verification email.

After confirming the email, I officially entered the Publisher Dashboard.
According to Adsterra’s official instructions updated in June 2026, after logging in, a Publisher first enters the Websites page, then adds a website, selects an ad format, waits for website review, and obtains the ad code. (Adsterra)
3. The Chinese and English Sites Need to Be Added Separately
My WordPress currently has two frontend sites:
www.shuijingwanwq.com
en.shuijingwanwq.com
Among them:
www: Chinese site;en: English site.
When adding the Chinese site, I submitted:
https://www.shuijingwanwq.com
The Adsterra dashboard ultimately displayed it as:
shuijingwanwq.com
In other words, it performed domain normalization on www.

This raised a question:
Since it is already displayed as
shuijingwanwq.com, isen.shuijingwanwq.comautomatically included?
Later, I directly verified this by actually adding the English site.
Result:
en.shuijingwanwq.com
It can be added normally as another independent Website.
The final dashboard structure became:
shuijingwanwq.com
en.shuijingwanwq.com

This is actually quite valuable.
Because later on, you can separately view:
Chinese site
Impressions
Clicks
CTR
CPM
Revenue
English site
Impressions
Clicks
CTR
CPM
Revenue
For a website with significantly different Chinese and English traffic structures, this is more suitable for revenue analysis than mixing both sites into a single ad unit.
4. A Tech Blog Can Ultimately Only Choose the Other Category
When adding a website, Adsterra requires you to select a Website Category.
But the actual categories provided include:
Social
Adult Social
Movies
Adult
URLShortener
MP3
Sport Streaming
Videohosts
Converter
Filehosts
Torrents
Anime
Downloads
Faucet
Books
Other
There are no:
Technology
Programming
Software
IT
Blog
options that are more suitable for a tech blog.

Therefore, both the Chinese and English sites ultimately chose:
Other
In addition, the page also has:
Show adult ads
And it prompts that enabling this might increase CPM.
I kept this option disabled.
The reason is simple:
My goal is to increase blog revenue, not to sacrifice the content positioning and ad quality of the tech blog itself for a little more CPM.
5. The First Round Only Created Native Banners
The ad formats offered by Adsterra at the time included:
Popunder
Smartlink
Native Banner
Social Bar
Banner
In the first round, I only selected:
Native Banner

The English site subsequently also had an independent Native Banner created.
The final structure:
shuijingwanwq.com
└── Native Banner
└── Active
en.shuijingwanwq.com
└── Native Banner
└── Active

Adsterra’s official description of Native Banners is that they typically consist of a block of 3 to 4 ads with images and titles, and you can adjust the font, color, and ad combination to fit your webpage layout. (Adsterra)
6. Using the Default 4:1 Native Banner
After entering GET CODE, you can see the ad style settings.
In the first round, I kept the defaults:
Widget layout: 4:1
Font size: Inherit
Font color: Inherit

I didn’t rush to adjust the font, color, or layout here.
The most important thing in the first phase wasn’t beautification, but verifying three questions:
- Can it load normally?
- What ads does it actually display?
- How much revenue does it generate?
If the platform can’t even pass these three basic questions, spending more time optimizing the style is meaningless.
7. Integrating into WordPress Using WPCode
My WordPress itself has long used WPCode to manage custom code.
Therefore, this time I didn’t modify Twenty Twenty-Five or directly edit theme files. Instead, I created a new PHP Snippet:
Adsterra Native Banner – End of Post
Insertion method:
Auto Insert
Location:
Insert After Content

Conditional Logic enabled:
Post type
Is
Post

This way, ads won’t appear on:
- Standalone pages;
- The homepage;
- Category pages;
- Tag pages;
- Search result pages.
I ultimately also didn’t write the following myself in PHP:
add_filter( 'the_content', ... );
Because since WPCode already handles the insertion position, manually registering the the_content Filter would be redundant implementation.
The responsibilities are clearly divided:
WPCode
↓
Decides where ads appear
PHP
↓
Determines if the current visit is www or en
↓
Outputs the corresponding Adsterra ad code
The actual PHP structure is as follows.
To avoid exposing specific ad unit identifiers, the real URLs and Container ID are omitted below:
/**
* Adsterra Native Banner
*
* www.shuijingwanwq.com -> 中文站广告单元
* en.shuijingwanwq.com -> 英文站广告单元
*
* 插入位置和文章类型由 WPCode 控制。
*/
$host = '';
if ( isset( $_SERVER['HTTP_HOST'] ) ) {
$host = strtolower(
preg_replace(
'/:\d+$/',
'',
sanitize_text_field(
wp_unslash( $_SERVER['HTTP_HOST'] )
)
)
);
}
// 中文站。
if (
'www.shuijingwanwq.com' === $host ||
'shuijingwanwq.com' === $host
) {
echo '<script async="async" data-cfasync="false" src="中文站 invoke.js"></script>
<div id="中文站 container ID"></div>';
return;
}
// 英文站。
if ( 'en.shuijingwanwq.com' === $host ) {
echo '<script async="async" data-cfasync="false" src="英文站 invoke.js"></script>
<div id="英文站 container ID"></div>';
}
This way, only one Snippet needs to be maintained.
8. After First Enabling: No Ads on the Page
After enabling WPCode, I opened a Chinese article for testing.
Result:
No Native Banner at the end of the page.
My first reaction was naturally caching.
My WordPress is currently not a simple single-host environment, but involves:
www.shuijingwanwq.com
en.shuijingwanwq.com
admin.shuijingwanwq.com
Previously, W3 Total Cache had already encountered caching-related issues in a multi-host environment.
Therefore, this time I didn’t continue to rely on the backend’s Purge Current Page. Instead, I directly cleared the W3TC page cache for the target URL precisely on the server.
Test article:
https://www.shuijingwanwq.com/2026/07/24/20084/
Execute:
cd /data/wwwroot/www.shuijingwanwq.com
wp --allow-root --url=https://www.shuijingwanwq.com eval '
$url = "https://www.shuijingwanwq.com/2026/07/24/20084/";
if ( ! function_exists( "w3tc_flush_url" ) ) {
fwrite( STDERR, "错误:未找到 w3tc_flush_url()\n" );
exit( 1 );
}
w3tc_flush_url( $url );
echo "已清理 W3TC 页面缓存:{$url}\n";
'
Ultimately returned:
W3TC page cache cleared:
https://www.shuijingwanwq.com/2026/07/24/20084/
This step only refreshed the target URL and didn’t directly clear the entire site’s cache.
9. The Page Source Code Already Has the Ad, Proving WordPress Is Fine
After refreshing the cache, I checked the webpage source code again.
This time, I could already search for:
effectivecpmnetwork.com
As well as the corresponding ad unit Container ID.
This indicates that:
WPCode
↓
Conditional Logic
↓
PHP Host check
↓
Ad code
↓
HTML
The entire chain is normal.
Therefore, I didn’t continue clearing the Object Cache.
This is a very important dividing line during troubleshooting:
If the HTML doesn’t have the ad code at all, then continue looking at WordPress and caching.
But if the HTML is already correct:
You should stop tinkering with PHP and caching, and instead look at whether the browser is actually loading the third-party script.
10. The Real Problem Appears: invoke.js Returns 403 Forbidden
Then I opened Firefox Developer Tools:
F12
→ Network
Searched for Adsterra’s ad domain.
The result showed that:
invoke.js
Returned:
HTTP 403 Forbidden

invoke.js returns HTTP 403 Forbidden for the first time.Looking at the Response:
No specific error message.

At this point, the chain can be explicitly written as:
WordPress ✅
WPCode ✅
Conditional Logic ✅
W3TC page cache ✅
HTML output ✅
Browser initiates request ✅
Adsterra invoke.js
403 Forbidden ❌
So the judgment at the time was:
There is no need to continue troubleshooting on the WordPress side.
11. Firefox Private Window Also Created an AdSense Distraction
While troubleshooting, I also saw Google AdSense errors in the Firefox console.
Firefox indicated that Enhanced Tracking Protection blocked:
pagead2.googlesyndication.com
This temporarily made the problem somewhat confusing:
Is it not just Adsterra that has a problem, but AdSense as well?
Later, after returning to a normal Firefox window for retesting:
AdSense was normal.
Therefore, that set of Google errors was only because the Firefox private window was used during testing, not because the site’s AdSense configuration was malfunctioning.
But Adsterra was different.
Even when switching to a normal Firefox window:
invoke.js
Still returned:
403 Forbidden
So at that point, it could be confirmed that:
Google AdSense
→ Caused by private window tracking protection
→ Normal in regular window
Adsterra
→ Still 403 in regular window
→ Another cause
12. Adsterra Support First Suggested Checking VPN, Proxy, and Network Environment
I subsequently contacted Adsterra backend support.
The suggestions given by the AI Agent included:
- Switch to a different network;
- Turn off VPN;
- Turn off Proxy;
- Turn off Ad blocker;
- Switch browsers;
- Switch devices;
- Check Cloudflare Rocket Loader;
- Wait for sync time after ad code installation.

Among them, Cloudflare Rocket Loader wasn’t applicable to the main Chinese site, and Adsterra’s official code itself already included:
data-cfasync="false"
So at that time, I didn’t continue with a full suite of browser, device, and mobile hotspot tests.
My thinking was simple:
I’m integrating an ad platform to make money, not to help the ad platform test its ad servers for free.
Therefore, I decided to wait for a while first.
13. Day Two: Turned Off VPN, 403 Directly Became 200
On July 27, I checked again.
This time, I turned off the VPN that my local computer was using.
The result was very direct:
Chinese site:
pl30541505.../invoke.js
HTTP 200
English site:
pl30541606.../invoke.js
HTTP 200

invoke.js returns 200.
invoke.js returns 200 and successfully returns the JavaScript Payload.This basically explained the previous day’s 403.
Adsterra’s official Publisher documentation from 2026 explicitly mentions that anonymous traffic such as VPN, Proxy, and Tor may not be counted as valid ad impressions, partly because some advertisers reject such anonymous traffic. (Adsterra)
So, combining the actual results:
VPN enabled
→ invoke.js 403
VPN disabled
→ invoke.js 200
The most reasonable conclusion currently is:
The previous 403 was highly likely related to the local VPN exit IP or anonymous network filtering, rather than an error in WordPress, WPCode, W3TC, or the ad code.
This also means that if I had continued spending time modifying WordPress the previous day, it would likely have been wasted effort.
14. Native Banner Finally Displays Properly
After invoke.js became 200, the Native Banner also actually rendered.
What I saw this time was a row of 4 ad cards, which perfectly matched the previously set:
4:1
configuration.

There is a potentially confusing point here.
At the bottom of the page, there also appeared a:
Stable Connection / High-Speed Connection 365VPN
This is not from Adsterra.
It is the existing:
Google AdSense ad.
Adsterra is the row of 4 Native Banners displayed at the end of the article content.
This time, it can finally be confirmed that:
WPCode
↓
Adsterra invoke.js
↓
HTTP 200
↓
Native Banner actual rendering
The entire ad delivery chain is working.
15. But the Ad Content Quality Didn’t Particularly Satisfy Me
Although the ads displayed successfully, the first batch of ad content I saw roughly included:
- 《Dune: Part Two》
- VPN
- 《Fast & Furious 9》
- “Do you like me? Text me now!”

In terms of ad format:
The 4:1 Native Banner itself doesn’t look bad.
The real problem is:
The relevance of the content to a tech blog is low.
VPN can at least establish some connection with tech users.
But:
- Movies;
- Entertainment content;
- Dating-style ads;
Are clearly inconsistent with the context of technical articles about WordPress, PHP, Go, servers, CDN, and AI.
Especially ads like:
Do you like me? Text me now!
Even with Adult Ads disabled, I still feel there is a clear gap between this kind of ad and the overall commercial feel of a tech blog.
So from now on, the focus of testing Adsterra is no longer:
Can it display?
But rather:
Is the revenue generated by these ads worth the decline in ad quality?
16. First Batch of Real CPM: Only About $0.315
After the ads started displaying normally, the first batch of statistics appeared in the dashboard.
July 27, 2026:
Impressions: 24
Clicks: 0
CTR: 0%
CPM: $0.315
Revenue: $0.01

Calculated roughly based on CPM:
24 × $0.315 ÷ 1000
≈ $0.00756
The dashboard shows:
$0.01
Which is reasonable.
But:
24 impressions are completely unqualified to represent the real CPM.
The sample is simply too small.
Adsterra itself also explains that CPM is affected by multiple factors such as GEO, ad format, traffic quality, device, browser, and advertiser bidding; moreover, if the Native Banner is located far down the page and the user doesn’t scroll deep enough, it may result in significantly fewer ad impression statistics than page views. (Adsterra)
Therefore, you cannot currently conclude that:
CPM = $0.315
Directly means:
Adsterra CPM is very low.
I will at least wait until there are:
Several thousand valid Impressions
Before judging whether it has long-term value.
17. An Anomalous Data Point: 0 Impressions but $0.20 Revenue
A very interesting piece of data also appeared in the dashboard.
July 26, 2026:
Impressions: 0
Clicks: 0
CTR: 0%
CPM: $0
Revenue: $0.20
That is to say:
0 impressions, 0 clicks, but $0.20 Revenue appeared.
I currently haven’t found sufficient evidence to determine the source of this revenue.

Therefore, I don’t intend to force an explanation here as:
- Conversion;
- Bonus;
- Adjustment;
- Referral;
- Delayed statistics;
or any of the above.
The most honest record right now is:
This $0.20 revenue exists, but its source is currently unclear.
It also caused another statistical phenomenon.
Combined for the two days:
Impressions: 24
Revenue: $0.21
Thus, the Total CPM became:
$8.750
Because:
$0.21 ÷ 24 × 1000
= $8.75
So:
This $8.75 Total CPM absolutely cannot be used to judge the true earning power of the Native Banner.
It was severely inflated by that $0.20 of currently unclear origin.
The only data that can truly serve as the first valid batch is still from July 27:
24 Impressions
$0.315 CPM
$0.01 Revenue
It’s just that the sample is still too small.
18. How Should Adsterra Be Evaluated Now
At the end of the first day of testing, my judgment was actually quite pessimistic.
Because at that time:
invoke.js
→ 403 Forbidden
I even considered:
If it’s still 403 tomorrow or the day after, I’ll just drop this platform.
But on the second day, after turning off the VPN:
403
↓
200
Cannot display
↓
Normal display
Therefore, the current evaluation needs to be adjusted.
Technical Integration Aspect
It has been proven completely feasible:
Adsterra
+
WordPress
+
WPCode
+
www / en dual domains
+
W3 Total Cache
There are no structural obstacles.
Stability Aspect
Currently found:
The VPN network environment may cause ad requests to be rejected or not counted as valid impressions.
This is consistent in direction with Adsterra’s official explanation regarding VPN, Proxy, and Tor traffic. (Adsterra)
Revenue Aspect
Currently:
CPM ≈ $0.315
But with only 24 impressions.
It temporarily has no analytical value.
Ad Quality Aspect
This is the aspect I am actually more worried about now.
The relevance of the first batch of ads was clearly inferior to AdSense.
19. Placing Native Banners at the End of Articles Might Have an Inherent Limitation
I am currently using:
Insert After Content
Which means:
The Native Banner only appears after the main text of the article ends.
The advantages of doing this are obvious:
- It doesn’t interrupt reading;
- It doesn’t pollute the main text;
- It doesn’t affect code blocks;
- It doesn’t affect the structure of technical articles;
- It’s easy to disable with one click.
But the disadvantages are equally obvious:
Many users might not scroll to the end of the article.
Adsterra officially also points out that if a Native Banner is placed near the Footer and the user doesn’t scroll deep enough, it may cause the ad to fail to meet the conditions for an impression, resulting in fewer Impressions in the statistics than page views. (Adsterra)
So in the future, if:
High page PV
But very few Native Banner Impressions
It’s not necessarily the platform missing statistics.
It might just be that:
Users simply didn’t read to the bottom of the article.
However, I currently still don’t plan to immediately move the ads to the middle of the text.
Prioritizing user experience first.
20. What I Really Need to Observe Next
There’s no longer a need to continue troubleshooting the code.
From now on, I’ll only look at real data.
I will focus on observing:
1. Impressions
Exactly how much of a difference there is between article visits and Native Banner impressions.
2. CPM
Wait until the sample reaches several thousand impressions before judging the true level.
3. Revenue
Ultimately, the most important thing is still:
How much money can it bring in per month?
4. Differences Between the Chinese and English Sites
Since ad units were created separately for the two sites, it’s possible to further determine:
Mainland China traffic
vs.
English / Overseas traffic
Which side has higher Adsterra value.
5. Ad Content Quality
This is a problem that has already been exposed.
Even if revenue increases, if there is a long-term, high volume of:
- Movies;
- Dating;
- Low-relevance entertainment ads;
Then I’ll need to consider whether this kind of revenue is worth sacrificing the site’s professional feel.
21. The Biggest Lesson from This Test: Confirm the Failure Layer First, Then Modify the Site
The process from 403 to 200 this time actually gave me a very practical reminder.
Initially, there were no ads on the page.
If I had kept troubleshooting in the direction of:
WordPress
W3TC
WPCode
CDN
PHP
It would have been easy to get stuck.
But the actual situation was:
Adsterra code already in HTML
↓
Browser also successfully initiated request
↓
Server returned HTTP 403
From that moment on:
Troubleshooting on the WordPress side was basically over.
What ultimately caused the result to change wasn’t modifying the website:
But rather:
Turning off the local VPN.
Therefore, when encountering similar problems in the future, a more reasonable order is:
First layer
Is there code in the HTML?
↓ Yes
Second layer
Did the browser send a request?
↓ Yes
Third layer
What status did the request return?
↓ 403
Fourth layer
Check external environments like ad platform, network, IP, VPN, Proxy, etc.
Instead of repeatedly doing the following just because ads aren’t displaying:
Clearing cache
Modifying PHP
Changing WPCode configuration
Changing CDN
22. Phased Conclusion: Adsterra Has Moved from “Unusable” to “Worth Continued Observation”
As of now, my judgment of Adsterra has changed.
Day one:
The ad script kept returning 403, and I was even ready to give up.
Day two:
After turning off the VPN, it directly recovered to 200, the Native Banner displayed normally, and it started generating impressions and revenue.
So currently, I can no longer say:
Adsterra is unusable.
The accurate statement should be:
Adsterra has been successfully integrated, and has now entered the observation phase for real revenue and ad quality.
But at the same time, there is absolutely no reason to believe that successful integration equals commercial success just because ads are already displaying.
The only real data seen right now is:
24 Impressions
0 Clicks
$0.315 CPM
$0.01 Revenue
And a temporarily unconfirmed source of:
$0.20 Revenue
The sample is far from sufficient.
Furthermore, the relevance of the first batch of ad content to a tech blog was also less than ideal.
Therefore, the most reasonable strategy moving forward is still:
Don’t tinker.
Maintain the current:
Native Banner
4:1
End of article
Adult Ads OFF
www / en independent ad units
Let it continue running naturally.
After there are enough real Impressions, then answer the most important question:
Can Adsterra actually bring incremental revenue worth keeping for this tech blog?
If CPM, revenue, and ad quality are ultimately acceptable:
Continue using it.
If revenue is very low, and ad quality clearly degrades the website experience:
Just disable the WPCode Snippet.
The value of an ad platform is ultimately not about how high the CPM is written in the dashboard, nor how many advertisers are on the promotional page.
But rather:
Real revenue ÷ actual maintenance costs ÷ impact on user experience.
This is the data I am truly prepared to observe next.
需要长期技术维护或远程问题排查?
我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。
如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:
- ✅ PHP / Laravel / Yii2 老项目无人维护
- ✅ Go / Gin 后端接口需要排查或优化
- ✅ WordPress 网站访问慢、报错或插件冲突
- ✅ Nginx / MySQL / Redis / Linux 服务器异常
- ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
- ✅ 需要长期远程技术支持或兼职维护
更多介绍请查看:关于我 & 合作
微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan


发表回复