You want to know whether your ad integration survives the network your users actually have. A VPN is the easiest way to reproduce a distant exit. The mistake is treating that experiment as a revenue experiment.

Changing the exit country does not create a new audience, and it does not turn your own taps into eligible traffic. It changes the path of a request.

So run it as a connectivity test with a documented sequence, and keep live inventory out of it entirely. The steps below are the ones worth repeating on every build.

Decide what the test is for

Two questions get mixed up. The first is whether a request is served at all from a given network path, which is an integration and connectivity question. The second is what real users in that country would earn, which is a reporting and business question the SDK cannot answer for you.

Only the first is testable from a development device. Estimated earnings can also change before a reporting period is finalised, so a number observed during a self-generated experiment is neither evidence of eligible revenue nor a forecast for anyone else.

Write the question down before you connect: for example, does a banner request return a fill when the device exits through Germany on this build. If the answer you want is a revenue figure, stop here, because no VPN configuration produces one.

Pre-flight: register the device, not the address

Google's test-ad documentation offers two supported routes. Use the demo ad units for the format you are integrating, or use your own units with the physical device registered as a test device. Both are documented per platform and per SDK generation, and the Next-Gen and Legacy guides are not interchangeable.

Registration is a device identifier, and it has nothing to do with the network address. Changing where the phone's traffic exits does not register anything. On Android the identifier is logged by the SDK, and you apply it in code:

RequestConfiguration.Builder().setTestDeviceIds(Arrays.asList("YOUR_TEST_DEVICE_ID"))

Confirm the registration before you change networks, otherwise you cannot tell a failed fill from a live ad served to a device that was never registered. If the ad shows the Test Ad label, the request went through test inventory; if it does not, you are looking at something else and should not tap it.

Run the sequence in a fixed order

Keep everything constant except the network. Same build, same ad unit, same placement, same app state. Change two variables and you learn nothing.

Baseline first. With the VPN disconnected, load the placement and confirm a test ad appears. Capture the request in logcat with adb logcat | grep -i ads and note the response code. A no-fill on the baseline is not a VPN problem.

Then connect and repeat. Same build, same unit, same placement, VPN on. Capture the same log lines. What you are looking for is a difference: a fill that becomes a timeout, a request that never leaves, an error code that changes. A fill that stays a fill tells you the integration is fine on that path and the test is over.

Record the environment. SDK version, adapter versions, build type, ad format, exit country, and the observed result. Without that record, the next person repeats the experiment from scratch and reaches a different conclusion from the same evidence.

Mediation is a separate test

Mediated ads do not carry Google's Test Ad label, which makes them the easiest place to click something you should not. Each network in the mediation stack has its own test mode and its own setup, and Google's test configuration does not extend to them.

Check the adapters one at a time, with the adapter's own test mode enabled, and confirm from the log which network served the ad. If you cannot tell which adapter filled and whether it was a test creative, treat the impression as live inventory and leave it alone.

This is also where the invalid-traffic policy matters. Self-clicks, repeated impressions, automated interactions and deceptive traffic are all covered, and an uncertain click to see what happens is exactly the pattern those rules describe.

Rollback and the release gate

Test configuration must not ship. Before a release build, replace demo ad units with production units, remove the test device list, and delete any development-only flags. Grep the release variant for the test identifiers rather than trusting memory; a stray entry is a silent failure that only shows up as missing revenue.

Then verify the other direction: install the release build on a registered test device and confirm the request is no longer treated as test traffic. If it still shows the label, something in the configuration survived.

Keep one documented test path afterwards so the next network question can be answered without touching live inventory. Test ads never appear in account reports, so a clean separation costs nothing in reporting accuracy and buys you a repeatable diagnostic.

Amanqephe ahlobene