TRACKING SPECIALIST — BARIS ASA · LONDON
Synctag
Start the check → TRACKING SPECIALIST — BARIS ASA · LONDON
F-603
F-603 · CONFIGURATION & DATA INTEGRITY · FILED 2026 · REVISED 3 NOV 2026 · FREQ ▮▮▯▯▯

Email addresses (PII) leaking into GA4

Also filed as “PII email addresses showing in GA4 page URLs”“email address in page URL GA4”“how to remove PII from GA4”“GA4 data redaction email query parameters”“delete personal data from Google Analytics 4”“form GET request putting email in the URL”

Email addresses in GA4 page URLs come from your own site: a sign-up form that puts the typed address into the next page's URL (it submits with GET), a redirect that passes it to the thank-you page, or an email link carrying ?email=. Google's policy bans PII in Analytics. To check, filter Page location in Explore for @. Fix the source, turn on GA4's Data redaction, then delete what is stored. Filed as F-603.

Symptom and cause

Symptom
Customer email addresses sitting in GA4 page URLs and event parameters, splitting your page reports and breaking Google's PII policy.
Cause
Forms passing email or phone into the URL on submit; success pages carrying PII in query strings; other tags on the same page reading the same URL.
Where it's caught
Page reports with @ in the URL; query parameters like ?email=; Data redaction switched off on a property created before the feature, or no query parameters listed.

How an email address ends up in a GA4 page URL

GA4 records the full address of every page it sees, query string included, in a parameter called page_location. If the URL carries an email address, so does GA4. Nothing warns you. The standard Pages and screens report shows the page title or the path without the query string by default, so a search for @ there can come back clean while page_location is full of addresses.

Five routes put it there. I check them in this order.

A form with no method. An HTML form without method="post" submits with GET, the browser's default, and GET appends every field to the URL after a ?. A newsletter box built that way sends the visitor to /[email protected], and the tag on the thank-you page reads the whole thing. Forms that normally submit by JavaScript do it too when the handler does not load, or fails before it cancels the browser's own submit.

A redirect that hands the address on. The form posts correctly, then the server redirects to a confirmation page with ?email= so the page can say "we sent a link to [email protected]". Account, booking and password-reset flows do this.

Email links. Email platforms can put the subscriber's address into a link through a merge field, to pre-fill a form or identify the click. Every visitor from that campaign lands with their address in the URL. UTM values built from a name or an address do the same, and Google names campaign parameters as a risk.

Page titles and site search. A title like "Order confirmed for Jane Smith", or an address typed into the search box, reaches GA4 as page_title or search_term.

Your own tags. A form event that pushes the typed address into the dataLayer, or a user_id set to the customer's email, sends it on purpose. Register that parameter as a custom dimension (F-601) and it sits in reports for anyone with access.

Why it matters. Google's policy says no data may be passed to Google that Google could use or recognise as personally identifiable information, and email addresses are on its list. It also splits your own reporting: every address makes a unique URL, so one thank-you page shows up as hundreds of rows. Other tags that read the page URL, such as ad pixels and chat widgets, will usually have received the same address; the fourth diagnostic step shows which. GA4 settings do nothing about those.

What Data redaction does. It is a setting on the web data stream that strips matching text in the browser, before the hit is sent. Email redaction removes anything that looks like an address, best effort, from every event parameter. Query parameter redaction removes the parameter names you list. New properties have email redaction on by default; older properties have to switch it on. It cleans new data only, and only what goes to GA4.

Removing what is stored. A data deletion request replaces matching values with "(data deleted)" and leaves the event counted. It only reaches data more than 12 days old and takes up to 63 days. You cannot delete page_location on its own: Google only offers Delete all parameters on all events for it, so a text filter such as @ does the narrowing (fix step 5).

One thing looks like this fault and is not: an @ that is not a customer. A link_url of mailto:[email protected] is your own published address, and a path like /@yourbrand is a handle. The tell is whose address it is. A customer's email in a URL is F-603.

GA4 Page location containing @ · one ecommerce property, 30 days · reconstructed · client data anonymised
Page location (masked)RouteViewsStatus
/thank-you?email=[address]newsletter form, GETa few hundredleaking
/account/reset?e=[address]password reset email linka few dozenleaking
/search?q=[address]typed into site searcha handfulleaking
Redact data: emailoff, older propertyn/anever switched on

How to catch it

  1. (Anyone with report access) Start here. In Explore, build a free-form exploration with Page location as rows and Views as values, over the longest range your data retention allows. Filter Page location contains @, then run it again with %40 (the URL-encoded @) and with email=. Pages and screens drops the query string unless you switch its dimension to Page path + query string. If the table folds rows into (other), shorten the range. Any row with a customer's address is the fault. Note the paths: they tell you the route.
  2. (Anyone with report access) Repeat the search on Page title, Search term, Link URL and every custom dimension. Then on Page referrer: an address there and never in Page location usually means one of your own pages carries it in its URL without sending GA4 a page view itself, such as an untagged confirmation page or a redirect hop.
  3. (Anyone with report access) Find the route for each leaking path. A /thank-you or /confirm path points at a form or a redirect. Add Session source / medium: if every row comes from your email platform, the link is the source. A /search path is your site search box.
  4. (Whoever owns the site) Reproduce it. Submit each suspect form with a test address and watch the address bar. If the address appears after submit, read the form's HTML for a method attribute; none means GET. Then open the browser's network tab, search all requests for the test address and its %40 form, and list every vendor that received it.
  5. (GA4 Editor) Open Admin → Data collection and modification → Data streams → your website → Redact data. Check whether email redaction is on and which query parameters are listed. Paste one real leaking URL into Test data redaction and press Preview redacted data. If the address survives, the setting does not cover that route.
  6. (Whoever owns GTM) In GTM Preview, submit a test form and read the dataLayer and every GA4 event parameter. Look for the typed address in form events, in user_id and in any custom parameter. A tag that sends it on purpose is a tag to rewrite, not one to redact.

What putting it right involves

  1. (Whoever owns the site) Close the source. Give every form method="post". Stop redirects passing the address on: keep it in the server session, or pass a random token and look the address up. Ask whoever runs your email platform to identify subscribers by ID, not by address, in links. Take names and addresses out of page titles. Do this first: every later step only limits the damage. Four owners touch this fix (site, email platform, GTM, GA4), and leaks usually survive because nobody holds the whole list.
  2. (GA4 Editor or above) Switch on Data redaction for the web stream: email redaction, plus the query parameter names your site actually uses (email, e, phone, name, whatever the diagnostic found). Test each leaking URL in Test data redaction before you save. Redaction is best effort, works on new data only, and does not cover Measurement Protocol or Data Import.
  3. (Whoever owns GTM) Clean the URL for every tag, not just GA4. Strip the named parameters from page_location in a variable the Google tag reads, clean page_referrer the same way, and give other vendors' tags the same cleaned URL where they allow it. A server-side container can remove fields before they reach any vendor, but it is a second line, not the fix.
  4. (Whoever owns GTM) Rewrite tags that send PII on purpose. Remove the address from dataLayer pushes and form events. Google says a user ID must not contain anything a third party could use to identify the person, so user_id is your own customer number, never an email. If you want email for matching, GA4's user-provided data collection hashes it (F-402). It is in open beta, needs the visitor's consent, and is not offered to Health-category properties.
  5. (GA4 Editor or above) Delete what is stored: Admin → Data collection and modification → Data deletion requests. page_location is collected automatically, and Google only lets you delete those with Delete all parameters on all events. The text filter is what stops that wiping the property: it limits the deletion to values containing the text you give, such as @. Run a second request for %40 if the diagnostic found encoded addresses (a property can have 12 active at once). Use the 7-day preview to check that only the leaking values go: an @ filter also catches your own mailto: links and @handles in that range. Expect some campaign data in that range to go too, so later sessions may show as Direct; for a policy breach that is the right trade. Data from the last 12 days cannot be deleted yet: repeat once it is old enough.
  6. (Whoever owns the tracking documentation) Record what leaked, where, for which dates, the deletion request and the date the source was fixed (F-501). Rerun the first diagnostic check after a week. Zero new rows closes the case.
How I'd fix this

Sources on file

Cited in these case files

F-603 turns up as evidence across the archive. It is cited in:

Questions on this file

Why are email addresses showing in my GA4 page URLs?

Because the URL carried them. GA4 records the full page URL, query string included. The usual sources are a form without method="post" (GET puts every field in the URL), a redirect that passes the address to a thank-you page, and email links with ?email= in them. Find which by checking the paths and the session source of the rows that contain @.

Is it against Google's policy to have email addresses in GA4?

Yes. Google's Analytics policy says no data may be passed to Google that Google could use or recognise as personally identifiable information, and email addresses are on its list.

Does GA4 data redaction remove email addresses already collected?

No. Data redaction runs in the browser before a hit is sent, so it only cleans new data, and only on web data streams. Data already stored needs a data deletion request in Admin.

How do I delete PII from GA4?

Admin → Data collection and modification → Data deletion requests. Because page_location is collected automatically, choose Delete all parameters on all events and narrow it with a text filter such as @, plus a second request for %40 if addresses are URL-encoded. Data must be more than 12 days old, you get 7 days to preview and cancel, and processing takes up to 63 days. Fix the source first, or new data keeps arriving.

Do I have to report this under UK GDPR?

That is a call for whoever handles data protection in your business, not for a tracking fix. The ICO has a self-assessment for personal data breaches, and where a report is due it expects one within 72 hours of becoming aware. The diagnostic gives them what they need: which data, which vendors, which dates.

Can I send a hashed email address to GA4?

Not as user_id: Google says a user ID must not contain anything a third party could use to identify the person. Google's PII guidance does not mention hashing as a way to make an email acceptable in ordinary event parameters. The supported route is user-provided data collection, which hashes with SHA256 and needs consent.

Is an IP address PII in GA4?

Not under Google's definition: Google lists IP addresses and pseudonymous cookie IDs as not PII. Google also says data outside its definition can still be personal data under GDPR, so that is a policy answer, not a legal one.