Why GA4's user numbers don't add up across days

Add up a month of daily users and you get more people than GA4 shows for the month. Users are counted once per period, so they cannot be summed. Here is why, and how to get the right number.

Kosmas Botsis, Founder of Glancely · 4 October 2026 · 4 min read

In short

  • Users are counted once per period. A sum of daily, weekly, channel or device user counts is too high.
  • The more people come back, the bigger the error.
  • Take the total GA4 reports for the whole range, or count distinct visitors in BigQuery.
  • Sessions, conversions and revenue add up fine; only counts of people do not.

Export a month of daily figures from Google Analytics 4, add up the Users column, and you get a bigger number than GA4 shows for the month. Do the same with the users per channel and they add up to more than the total too. Nothing is broken. Users are a count of different people, and that kind of number cannot be added up.

It matters because the sum looks entirely believable. It turns up in spreadsheets, in client reports and in dashboards built on daily data, usually on the most prominent card, and nobody questions it because it is never obviously wrong. It is just too high.

A small example

Three people visit a site over one week:

DayWho visitedUsers that day
MondayAnna, Ben2
TuesdayChloe1
WednesdayAnna1
FridayAnna1
SaturdayChloe1

Add up the daily figures and the week had 6 users. It had 3. Anna is counted three times because she came back three times, and Chloe twice. Each day's number is right; the sum is not, because nothing in the daily numbers says that Monday's Anna and Friday's Anna are the same person.

The more people come back, the bigger the error. A site with loyal, returning visitors — a shop people reorder from, a tool used every week — is exactly the one whose summed user count is furthest from the truth.

Where the wrong number comes from

  • Daily rows added up in a spreadsheet. The most common case: a report exported by day, with a total row underneath that someone wrote as =SUM().
  • Weekly or monthly rows added up. The same mistake one level up. Twelve monthly user counts do not add up to the year's users either.
  • Channels, devices or countries added up. Someone who found you through Google search on Monday and came back through an email on Thursday is a user of both channels. The rows are right; their sum counts that person twice. The same goes for someone who visits on a phone and a laptop.
  • Several properties added up. If you run more than one site or app, a person who uses two of them is in both counts, and GA4 cannot de-duplicate across properties at all.

Sessions, page views, conversions and revenue can be added up: each one happened once. It is only the counts of people — users, new users, active users — that cannot.

How to get the right number

Ask GA4 for the whole period at once. When you choose a date range, GA4 counts each person once across all of it, and that is the only place the right answer exists.

  • In GA4's reports, the total at the top of a table is the de-duplicated figure for the whole range. Use that, not a sum of the rows beneath it.
  • In an exploration, the same is true of the Totals row. If you export the rows, copy the total across rather than recalculating it.
  • Through the Data API or a connector, request users for the period without a date dimension. Add the date and you get one count per day, which brings you back to the problem.
  • In BigQuery, count distinct visitors over the whole range rather than adding up daily counts:
SELECT COUNT(DISTINCT user_pseudo_id) AS users
FROM `your-project.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260901' AND '20260930'

Expect that figure to be close to GA4's but not identical. GA4 counts users with an approximation Google documents (HyperLogLog++), and its reports can include things the export does not, so small differences between the two are normal. Large ones are not, and usually mean a filter or date range differs.

Check it on your own property

It takes two minutes and shows how big the gap is on your site. In GA4, open Explore, start a Free form exploration, add Date as a row and Total users as a value, and pick the last 28 days. Note the figure in the Totals row, then export the table and add up the daily rows. The difference between the two is how much a summed user count would overstate your audience.

How Glancely handles it

We got this wrong ourselves at first: Glancely's Users card once added up the daily rows behind the chart, like the spreadsheet above. Now it asks GA4 for the whole period in a separate request, so the figure on the card is the one GA4 shows for the range. When you view a chart by week or month, Glancely leaves user counts out of it instead of adding days together, because the daily figures cannot say who came back.

Kosmas Botsis

Kosmas Botsis · Founder of Glancely

Kosmas Botsis is the founder and lead data engineer of KB Analytics, an analytics engineering practice in Athens working with clients across Europe and the US: more than 250 projects for over 194 clients, and in Toptal's top 3% of talent. Glancely is what came out of that work.

More from the blog

  • Why your return on ad spend counts sales your ads didn't make

    Divide all of your revenue by your ad spend and the ads take credit for every organic, direct and email sale. Here is how to work out the return on the channels you actually pay for, and why it can be five times lower.

  • Why your Google Ads campaigns don't line up with GA4's

    Put Google Ads spend beside GA4 revenue by campaign and half the rows often come back empty, because the join is on a name and the names don't agree. Here is where GA4's campaign name comes from, and how to match them without hiding your best campaign.

  • Where Performance Max shows up in GA4

    GA4 files Performance Max visits under a channel called Cross-network, not Paid Search or Paid Shopping. Put its spend anywhere else and every channel's return is wrong; here is where it belongs and how to read it.