Skip to content
Analytics

How to test GA4 ad blocker recovery: a practical checklist

Does your GA4 ad blocker recovery work? Use Brave to compare one event with Shields off, Shields on, and recovery enabled. Check the browser requests and the event in GA4.

By Introtrace··11 min read
Three panels show an analytics test, a verified event, and a blocked request

In this article

  1. 1. The three checks, in screenshots
  2. 2. What you'll need
  3. 3. Set up your view of the event
  4. 4. Test 1: confirm analytics works without blocking
  5. 5. Test 2: see what Brave blocks
  6. 6. Test 3: enable recovery and repeat
  7. 7. Our Brave test on Introtrace
  8. 8. Check that the recovered data is useful
  9. 9. Repeat with consent declined
  10. 10. If the result isn't clear
  11. 11. Your testing checklist

The three checks, in screenshots

Here’s what to look for in Brave’s Network panel. These are fresh browser captures from our October 3 test on introtrace.net, with analytics consent accepted in every run. The filter shown is /gtag|collect|relay/, which keeps the Google tag, collection requests, and relay requests in view. Identifier values are hidden in these captures. The full instructions follow below.

1. Shields off, recovery off: find a working baseline

Open developer tools, select Network, then reload your test page and trigger one event. Find the GA4 collect request and check its status. Our test request received 204. Next, confirm the event in GA4 DebugView.

Brave Network panel from the baseline test, showing the Google tag and GA4 collection requests with Shields and recovery off.
Baseline: look for the collect request and its 204 response. Open any screenshot to read it at full size.

2. Shields on, recovery off: check what changes

Turn Shields on for the same site, leave recovery off, and repeat. In this run, the Google tag did not initialise and no GA4 collection request appeared. The red script row still shows 200, so its status alone would have been misleading. A missing collect request needs context: we already had a working baseline, used the same event, and kept consent accepted.

Brave Network panel from the Shields-on, recovery-off test; no GA4 collect request was observed.
Blocking: no collect request was observed after the test event. This browser screenshot alone does not establish absence from GA4.

3. Shields on, recovery on: follow the relay

Keep Shields on, enable recovery, and repeat once more. Our direct collect requests were blocked; the subsequent requests through Introtrace’s relay received 204. The relay rows use long request names, so open a row and check its hostname if you’re unsure which request you’re looking at.

Brave Network panel showing blocked direct GA4 collection requests and successful Introtrace relay responses with Shields and recovery on.
Recovery: compare the blocked collect rows with the relay rows returning 204. A successful relay response still needs an event check in GA4.

Finish in GA4 DebugView

Select the device used for your test, then open the matching event and check its parameters. If a manual debug event appears but your test event doesn’t, check the device selector first. We had several devices listed during testing, and selecting the right one resolved that confusion.

The earlier GA4 verification below includes a screenshot of both control events with no blocked-test event in the summary. It belongs to the earlier test, not these fresh browser captures.

For this walkthrough, we sent introtrace_walkthrough_test with a different test_run value for each run. Recovery was disabled only in our test browsers by replacing the loader response with empty JavaScript; the public site stayed unchanged. On your own test page, use your installation’s normal on/off control.

Read the fresh browser observations (JSON). These captures verify browser behavior; they do not add a new GA4 receipt check or a WooCommerce purchase test.

Download the screenshot walkthrough (Markdown).

Ready to try it? Get the Introtrace script, then use the three runs below to check your setup.

What you'll need

Use a test page where you can turn recovery on and off without changing the rest of your analytics setup. A staging site connected to a test GA4 property is a good choice, provided it uses the same relevant analytics and consent configuration as your live site.

You'll also need access to that property's DebugView and a desktop copy of Brave. We recommend Brave for this walkthrough because its tracking protection is built in. You don't need to install an extra browser extension.

Choose an action you already track: opening a page, submitting a test form, or completing a test purchase. Write down the event you expect. For a first check, a single page_view is usually easiest to follow.

Record the page URL, GA4 measurement ID, Brave version, test date, and Shields settings. Keep those settings the same during the two blocked tests.

Set up your view of the event

Open Brave's developer tools and select Network before loading the test page. Enable Preserve log if your action navigates to another page, and Disable cache while developer tools are open. Clear the log before each run.

You'll be looking for two things: the analytics script loading and the event request leaving the browser. They're separate steps. A script can load successfully while its event requests are blocked.

For a direct GA4 setup, Google's troubleshooting guide points to requests such as google-analytics.com/g/collect and analytics.google.com/g/collect. With recovery enabled, the request may use a different hostname or path. Search for collect first, then inspect the requests used by your recovery setup rather than filtering only for Google's domains. Google's setup troubleshooting guide

In GA4, open Admin → Data display → DebugView. Enable debug mode for your test device using Google's web-based Tag Assistant or GTM Preview; no debugger extension is required. Confirm the baseline event appears before relying on this view for the blocked tests. Google's DebugView guide

If blocking prevents the preview connection from working, record that too. On a controlled test page, you can instead configure debug_mode: true for the test events, following Google's guide. Keep that configuration consistent across all three runs and remove it when you're done.

Test 1: confirm analytics works without blocking

Turn recovery off on your test page. Click Brave's lion icon in the address bar and turn Shields off for this site, then reload. Brave lets you change protection for an individual site through this panel. Brave's Shields settings guide

Accept analytics consent through your site's normal banner. Perform your chosen action once.

Check the Network panel for the script and event request. Then check DebugView for the expected event, choosing your test device if several are listed. Open the event and inspect its parameters.

For a page view, does the page location match? For a form submission, is it the event your setup is meant to send?

If the event is missing here, resolve that first. Check the measurement ID, event trigger, consent state, and any browser errors. You need a working baseline before you can tell whether recovery changes anything.

Test 2: see what Brave blocks

Keep recovery off. Turn Shields back on for the site and note the selected tracking-protection level. Reload, check that analytics consent is still accepted, and repeat the same action once.

Compare this run with the baseline. Does an analytics script fail to load? Is the event request marked as blocked or failed? Does the event disappear from DebugView?

Save the relevant request details and the time of the action. Brave's blocked-item count alone won't tell you whether your particular GA4 event was affected.

You may find the event still arrives. That's useful information: this configuration hasn't reproduced a loss for the event you're testing. Don't count the next run as proof of recovery unless you've first observed something that needs recovering.

Test 3: enable recovery and repeat

Leave Shields on with the same settings. Enable recovery on the test page, reload, confirm the same consent choice, and perform the action again.

Follow the script and event requests in Network. A recovery setup may serve the script through a proxy, forward the event through another endpoint, or do both. Look at the actual request path used by your installation.

Then check GA4 for the event and its parameters. If you're using Introtrace, the GA4 ad blocker recovery guide explains how blocked scripts and event requests are handled.

What a successful recovery test looks like

The useful result is a clear comparison: the event arrived in the baseline, was missing when blocking was enabled, and arrived again with recovery enabled. A successful response from a recovery endpoint is only part of that check; verify the corresponding event in GA4 as well.

Keep a small record as you go:

RunShieldsRecoveryRequest observationGA4 observation
BaselineOffOffRecord what happenedRecord what happened
BlockingOnOffRecord what happenedRecord what happened
RecoveryOnOnRecord what happenedRecord what happened

These are fields for your own results, not expected outcomes for every site.

Our Brave test on Introtrace

We ran this comparison on introtrace.net on October 3, 2026, using desktop Brave 1.94.117 (Chromium 152.0.7977.64). Each run used a separate temporary profile, accepted analytics consent, and the same test event: introtrace_recovery_test.

For the two recovery-off runs, we replaced the recovery loader with empty JavaScript in the test browser. The public site stayed unchanged. Blocking came from Brave’s built-in Shields, with its filter components loaded; we added no blocking extension or custom rules.

RunWhat we observed in the browserGA4 DebugView result
Shields off, recovery offThe Google tag initialised. The test event request to Google’s collection endpoint received HTTP 204.Baseline parameters received in a repeat test
Shields on, recovery offThe Google tag did not initialise. The test event stayed queued, and no GA4 collection request was observed.Not present in the repeat test’s DebugView summary; both control events received
Shields on, recovery onThe Google tag initialised. Direct GA4 requests failed with ERR_BLOCKED_BY_CLIENT; relay requests then received HTTP 204.Recovery-run parameters received

We checked both delivery cases in GA4 DebugView. The original recovery entry at 09:18:48 showed test_run set to recovery. A repeat baseline test at 09:49:47 showed test_run set to baseline. Both screenshots showed debug_mode set to 1 and page_location set to https://introtrace.net/. Times are in Berlin local time.

Checking the blocked event with two controls

To check absence, we repeated the blocking test between two control events in the same temporary Brave profile, with recovery off throughout. The first control reached DebugView at 10:01:43. We enabled Shields and triggered introtrace_absence_blocked at 10:05:25. It stayed queued in the browser, with no GA4 collection request observed.

After a five-minute observation window, we disabled Shields and sent the final control at 10:10:49. The DebugView screenshot captured at 10:18:26 lists both controls in its last-30-minute summary, with no blocked-test event. All three reported events are accounted for: one earlier recovery-test event and one of each control.

English GA4 DebugView summary lists one earlier test event and both absence-test controls, with no introtrace_absence_blocked event.
GA4 DebugView on October 3, 2026, at 10:18:26 Berlin time. Both control events appear in the 30-minute summary; the blocked-test event does not. Open the image to read the full-size screenshot.

This supports a bounded result: no blocked-test event was recorded during our five-minute test window. It does not prove permanent absence from every report or guarantee recovery across other browsers. Declined consent, attribution, and duplicate handling remain outside this recorded example.

One testing detail mattered: our initial headless runs triggered the site’s bot detection, which disables fetch requests. We excluded those runs and used desktop Brave for the comparison above.

View the recorded test observations (JSON). Request identifiers and visitor data are omitted.

Check that the recovered data is useful

Once the event arrives, check its contents. Recovery isn't much help if a purchase loses its value or a form submission appears twice.

Compare the event name and relevant parameters with your baseline. Perform a single deliberate action and look for unexpected duplicate events. Count events rather than raw requests: one action can involve several requests, including a blocked attempt and a relay.

For ecommerce, check transaction_id, value, currency, and item details. Use a different synthetic order ID for each new test order. Reusing an ID can make a valid test purchase disappear through deduplication. Google documents purchase deduplication for web streams; it isn't a general safeguard for every event. Google's transaction ID guidance

An event in DebugView confirms receipt for this test. It doesn't establish complete attribution or prove that every production event will arrive.

If the result isn't clear

What you seeWhat to check next
No event in the baselineMeasurement ID, consent, event trigger, and browser errors.
The event arrives with Shields on and recovery offWhether this configuration blocks the script or event at all.
The script loads, but the event is missingThe event trigger and outgoing request; script loading alone isn't enough.
The recovery endpoint responds, but GA4 is emptyDestination property, forwarding errors, debug mode, and report filters.
One action produces duplicate eventsMultiple tag installations or overlapping event and relay handling.
DebugView works, but ordinary reports differReport filters and processing time; standard reports aren't an immediate test.

Google's setup troubleshooting guide covers destination IDs, filters, and reporting delays.

Your testing checklist

Download the checklist (Markdown) to keep a copy of your results.

  • Record the test date, page, browser version, Shields settings, and GA4 property.
  • Choose one action and write down its expected event.
  • Confirm the event arrives with Shields and recovery off.
  • Repeat with Shields on and recovery off; record what is actually blocked.
  • Repeat with Shields and recovery on; verify receipt in GA4.
  • Compare event parameters and check for duplicates.
  • Repeat with consent declined and verify the intended behavior.
  • Save the observations and remove temporary debug settings.

Keep this record so you can repeat the test after changes to your tags, consent banner, or recovery installation. Passing it gives you evidence for the browser, settings, and events you tested. Broader coverage takes additional tests with other browsers and blockers.

If you're setting up Introtrace, the recovery guide explains installation. Once it's in place, use the comparison above to check what happens on your own site.