What is raw data? Definition, examples and what aggregation loses
Raw data is record-level data as the source produced it. See examples, what an aggregated report can never give back, and how analysts store and clean it.
Raw data is data at the grain the source recorded it: one row per event, order line, ad click or survey answer, before anyone grouped, filtered or cleaned it. It is also called source data, primary data or atomic data. Aggregated data is what you get after you group those rows and keep only the totals.
The practical difference is what you can still ask. From raw rows you can count, re-slice and re-define anything. From an aggregate you can only re-read the totals someone already chose, and some of them cannot even be added up.
Note: Originally published in July 2023. Fully updated in October 2026 with two runs on Google’s public GA4 sample, a raw-to-report layering, and current storage options.
What raw data is
Raw data is the record a system writes when something happens. A web analytics tag writes an event. A store writes an order line. An ad platform’s API returns one row per campaign per day.
Three properties define it:
- Grain. Each row is one thing that happened, with its own timestamp and keys (user, session, order, campaign).
- No decisions applied yet. Nobody has chosen which statuses count as revenue, which visits count as a session, or which duplicates to drop.
- Not clean. Raw data carries duplicates, missing keys and test records. “Raw” describes the stage, not the quality.
“Raw” is also relative. The daily campaign rows an ad platform returns are already a summary of its click logs, but they are the rawest data you can get from that platform, so for your warehouse they are raw.
Raw data vs aggregated data
| Raw data | Aggregated data | |
|---|---|---|
| One row is | one event, order line or API record | a total for a group (a day, a channel) |
| You can | count, filter and group any way you want | read the totals that were kept |
| Distinct counts | correct for any period | correct only for the period they were computed on |
| A new metric definition | recompute it from the rows | impossible without going back to the rows |
| Size | large | small |
What aggregation loses: users that do not add up
What aggregation loses: users that do not add up
Most pages describe raw data as “more detailed”. The concrete loss is sharper than that: some numbers cannot be rebuilt from totals at all. We ran the numbers on Google’s public GA4 sample, the obfuscated event export of the Google Merchandise Store for November 2020 to January 2021 (bigquery-public-data.ga4_obfuscated_sample_ecommerce, 4.3 million events).
A common shortcut is to export a daily users report and sum the days to get users for the quarter. On this sample:
| Method | Users, Nov 2020–Jan 2021 |
|---|---|
| Sum of 92 daily user counts | 319,066 |
| Sum of 3 monthly user counts | 278,526 |
| Distinct users over the whole period | 270,154 |
Summing daily counts overstates users by 18.1%, because everyone who came back on a second day is counted again. Summing monthly counts is closer (3.1% high) and still wrong. Only the raw event rows give the real figure, because only they still carry user_pseudo_id:
WITH events AS (
SELECT event_date, user_pseudo_id
FROM `bigquery-public-data.ga4_obfuscated_sample_ecommerce.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20201101' AND '20210131'
),
daily AS (
SELECT event_date,
COUNT(DISTINCT user_pseudo_id) AS users
FROM events
GROUP BY event_date
)
SELECT
(SELECT SUM(users) FROM daily) AS sum_of_daily_users,
(SELECT COUNT(DISTINCT user_pseudo_id) FROM events)
AS actual_users
How far off the shortcut lands depends on how often the same people come back on another day:
| Distinct count, GA4 sample, Nov 2020–Jan 2021 | Sum of daily counts | Real number | Overstated by |
|---|---|---|---|
| Users | 319,066 | 270,154 | 18.1% |
| Buyers | 4,794 | 4,419 | 8.5% |
| Sessions | 360,974 | 360,129 | 0.2% |
Sessions barely move, because a session rarely spans two days (only the ones that cross midnight count twice). Users and buyers move a lot, because they return. The rule: the more a thing recurs across days, the less its daily counts add up.
It is not a quirk of one dataset. On the [Demo] E-commerce shop data (owox-demo.ecommerce.sessions) for July to September 2026, summing daily visitors gives 78,528 against 65,191 distinct visitors, 20.5% high. If all you kept was the daily report, the quarterly number is gone.
Raw data is not clean data
The opposite mistake is to treat raw rows as correct. In the same GA4 sample, 5,692 purchase events carry only 4,451 distinct transaction IDs, and 906 have none. Counting events as orders would overstate orders by 28%. Duplicate transactions in Google Analytics walks through the query and the fix.
The lesson runs in both directions. You need raw data to get distinct counts right. And raw data needs written rules (deduplicate on transaction ID, decide what to do with rows that have none) before any number built on it is safe to share.
OWOX Data Marts
See your first report built in real time. 15 minutes.
- Connect your data warehouse
- Pick your metrics
- Get a live Google Sheets report
In the time it takes to write a ticket. Then imagine never writing that ticket again.
Book a DemoWe'll use your actual use case
Examples of raw data in analytics
Examples of raw data in analytics
The textbook examples are survey answers and sensor readings. In a marketing or analytics team, raw data usually means these tables:
- Web and app events. The GA4 export to BigQuery writes one row per event with nested parameters. See the GA4 export schema for how its tables and dates work.
- Ad platform rows. Spend, clicks and impressions per campaign, ad group or ad per day, pulled from each platform’s API.
- Order lines. One row per product per order from the store or ERP, with price, quantity, cost and status.
- CRM records. Leads, deals and their stage changes, each with a timestamp.
- Server logs. One line per request: IP, time, path, status code.
- Survey and form answers. One row per respondent per question, before anyone tallies them.
Each of these comes with its own keys and its own grain. Most analytics work is making two of them meet at the same grain, which is where raw data stops being optional.
Why analysts keep raw data
An aggregated report answers the questions it was built for. Raw data is what you need for the next question. Keep it when you will ever need to:
- Count distinct things over a new period. Users and buyers do not add up across days (see above).
- Re-define a metric. “Revenue” with or without returns, “new customer” by first order or by registration. A new definition needs the rows.
- Re-slice. A segment nobody thought of when the report was built.
- Reconcile two numbers. When two dashboards disagree, only the rows show which one is right. That is data lineage in practice.
- Check quality. Duplicates, missing keys and late rows are visible only at row level. See data quality checks for the tests.
- Train a model. Forecasts and propensity scores learn from rows, not totals.
A simple rule: if a number will be defended in front of someone, keep the rows it was made from. The aggregate is a cache; the rows are the evidence.
Where to store raw data
Raw data belongs in a warehouse you control, not in the tool that collected it and not in a spreadsheet. A spreadsheet has a hard cell limit, a quarter of web events is already millions of rows, and a sheet keeps no record of what changed.
Layers: raw, cleaned, published
Most teams keep three layers in the warehouse:
| Layer | What it holds | Rule |
|---|---|---|
| Raw | Tables exactly as loaded from the source | Append only. Never edit in place, so any number can be rebuilt. |
| Cleaned | Deduplicated, typed, keys fixed | One row per real thing (one order, one session) |
| Published | Business entities and metrics people report on | One definition per metric, with an owner |
The raw layer is what lets you replay history when a definition changes. The published layer is what keeps two people from computing “orders” two different ways from the same raw rows.
Practical rules
- Partition by date so queries read only the days they need, and cost follows.
- Set a retention policy. Decide how long raw rows are kept and say it in writing.
- Restrict access to personal data. Raw tables often hold emails, IPs and user IDs that the published layer does not need.
- Keep the load time. A column that records when each row arrived tells you how fresh a number is. See data freshness.
Any of the major warehouses works for this: Google BigQuery, Snowflake, AWS Redshift, AWS Athena, Databricks. The choice matters less than keeping raw and published data separate.
From raw data to a number people can use
From raw data to a number people can use
Both examples above end the same way: someone writes a rule once (count distinct users over the whole period, count distinct transaction IDs), and every report should use that rule instead of reinventing it.
In OWOX Data Marts that rule is a Data Mart. The analyst writes the SQL over the raw or cleaned tables in your warehouse, for example a deduplicated orders query, and publishes it with a description and an owner. Related Data Marts join through relationships the analyst defines, which together form the model. The raw data never leaves your warehouse.
Business users then get reports on the Data Mart in Sheets, Microsoft Excel or Data Studio, refreshed on a schedule. They see “orders” with one definition, and the analyst can show the SQL behind it when the number is questioned. The raw rows stay the source of truth, and nobody has to touch them to get an answer.
You can start with OWOX Data Marts on your own warehouse.
Turn your data into decisions.
Governed data marts give you the clean foundation ML needs to actually work.
- No AI hallucinations
- Analyst-governed definitions
- Every number traces to SQL
Frequently Asked Questions
What is wrong with raw data?
Nothing is wrong with it, but it is not clean. Raw data carries duplicates, missing keys and test records. In Google's public GA4 sample, 5,692 purchase events map to only 4,451 distinct transaction IDs, and 906 events have no transaction ID at all. Raw data needs written rules, such as deduplicating on transaction ID, before a number built on it is safe to share.
Why use raw data instead of reports?
Because a report only answers the questions it was built for. Raw data lets you count distinct users or buyers over any period, re-define a metric, build a new segment, reconcile two dashboards that disagree and train a model. None of that is possible from totals alone.
What is the difference between raw data and processed data?
Raw data is record-level data as the source produced it, before anyone cleaned, filtered or grouped it. Processed data has had rules applied: duplicates removed, keys fixed, statuses chosen, rows grouped into totals. Processed data is easier to read; raw data is the only thing you can recompute from.
Where should raw data be stored?
In a data warehouse you control, kept apart from the cleaned and published tables. Keep the raw layer append-only so any number can be rebuilt, partition it by date, set a retention policy and restrict access to personal data. Google BigQuery, Snowflake, AWS Redshift, AWS Athena and Databricks all work for this.
Can you rebuild raw data from an aggregated report?
No. Aggregation is one-way. Distinct counts are the clearest case: summing 92 daily user counts from Google's public GA4 sample gives 319,066 users, while the real number of distinct users over the same period is 270,154. Without the raw rows there is no way to get from the first number to the second.
What is raw data and aggregated data?
Raw data has one row per event, order line or API record. Aggregated data has one row per group, such as a day or a channel, and keeps only the totals. You can always build an aggregate from raw data, but never the other way round.
Is the data in GA4 reports raw data?
No. GA4 reports show aggregated and sometimes thresholded or sampled figures. The raw data is the event-level export GA4 writes to BigQuery when you link the property, with one row per event and its parameters.
How do you get raw data out of GA4?
Link the GA4 property to a BigQuery project in GA4 Admin under Product links. GA4 then writes one table per day of event-level data, and optionally a streaming table. From there you can clean it in SQL and publish the result to the people who report on it.
