Migration · 10 min read
GA4 vs Admaxxer for DTC Ecommerce: When to Switch and Why
Google Analytics 4 is free. It is also sampled, capped at 14 months of event-level retention, and has no built-in ad-spend joining. For DTC brands spending >$10k/month on ads, GA4's free tier becomes the most expensive analytics layer they own — measured in misattributed campaigns, not dollars. This playbook compares GA4 vs Admaxxer head-to-head on the 8 metrics that decide DTC budget allocation.
The promise vs the reality of GA4 free tier
Google Analytics 4 markets itself as the universal free analytics layer for ecommerce. For most direct-to-consumer brands, the headline is technically true: you can install the gtag.js snippet, fire Enhanced Ecommerce events, and pull a dashboard for zero dollars per month. That is where the free story ends and the hidden-cost story begins.
DTC analytics is not a single dashboard; it is the chain of measurements that turns ad spend into reported ROAS, then into a budget reallocation decision. GA4 on the free tier collects events, but the moment you need to (a) compute blended MER across Meta plus Google plus TikTok plus Pinterest plus Amazon, (b) measure cohort LTV at the campaign and creative level, (c) reconcile pixel revenue against Shopify Orders, or (d) audit attribution credit assignment per touchpoint, the free tier stops providing answers and starts providing inputs to a BigQuery pipeline that has to be built, maintained, and queried by a data engineer.
The hidden cost of GA4 free is not the GA4 subscription. It is the BigQuery storage bill, the Looker Studio Pro seat, the LookML model maintenance, and the data engineer's salary, plus the misallocated ad spend that arises when sampled reports drive campaign-level decisions during peak season. For a DTC brand that ships above ten thousand dollars per month in ad spend, that line item lands between two and fifteen thousand dollars per month — making the free tier the most expensive analytics layer in the stack, measured in misattributed campaigns rather than dollars.
Admaxxer publishes this playbook as an honest head-to-head, not as a hit piece. GA4 still has a role for DTC brands — specifically Google Search Console integration for organic search queries. The argument is narrower than "GA4 is bad". The argument is: GA4 is the wrong primary analytics layer for DTC ad attribution after Universal Analytics' deprecation, and the migration window is shorter than most teams treat it.
The sampling cliff — 200,000 events per day flips reports from measurement to estimate
GA4 free tier samples reports when the underlying query touches more than approximately ten million events in the lookback window, and Explore reports begin sampling on the free tier at much lower thresholds for any custom event-level analysis. For a high-cardinality cut — say source by medium by campaign by landing page by device — the sample size shrinks further. Google does not document the exact sample percentage in the UI; the user sees a small triangle icon indicating "this report is based on a sample" and a confidence interval that ranges as wide as plus or minus fifteen percent.
On a typical Black Friday afternoon, a five-million-dollar DTC store crosses the daily event volume threshold by 11 AM Pacific. Every report a marketing operator opens after that point — the top-converting campaign view, the source-medium attribution breakdown, the conversion path report — is a sampled estimate, not a measurement. The bidding decisions made off those reports during the peak revenue window are decisions made on noisy data.
Two compounding properties make GA4 sampling worse than the documentation suggests. First, the sample is not uniform across dimensions; high-cardinality dimensions get sampled harder, which means the dimension you care most about (campaign-level ROAS) is the one with the widest confidence interval. Second, the sample interacts with GA4's default thresholding rule — Google suppresses dimension values that fall below a privacy threshold, which compounds the missing-data problem at exactly the granularity DTC teams need.
Admaxxer does not sample. Every pixel event is written to self-hosted ClickHouse at ingest, and the analytics surface queries the raw event table directly. A Black Friday afternoon report shows the actual top-converting campaign, not an estimate. The architectural difference is structural — we control the OLAP layer end-to-end, so there is no economic incentive to sample on the free tier.
The 14-month retention cap kills year-over-year cohort analysis
GA4 caps event-level data retention at fourteen months on both the free tier and GA4 360. This is not a typo. The same fourteen-month cap that applies to a single-store hobby site also applies to a Fortune 500 enterprise paying tens of thousands of dollars per month for GA4 360. After fourteen months, event-level data is aggregated and the row-level detail is permanently deleted.
For DTC brands, the implication is direct: year-over-year cohort retention analysis is impossible in GA4. A cohort of customers acquired in February 2025 has its day-365 retention data permanently aggregated by April 2026. If you want to compare February 2025 acquisition cohort retention to February 2026 acquisition cohort retention — the single most useful seasonality lens in DTC — you need to have exported the data to BigQuery before the fourteen-month window closed. Most teams discover this constraint after the data is already gone.
Admaxxer's retention policy by plan tier is thirteen to thirty-six months at the event level, never aggregated, never pruned unless a workspace explicitly opts in. Even the entry-tier nine-dollar plan retains thirteen months of event-level data — three months longer than GA4 360's plus-six-month upgrade option that Google charges hundreds of dollars per month for. The Pro tier retains thirty-six months, which covers the full three-year retention window most ecommerce finance teams require for subscription cohort math.
The ad-spend joining gap — GA4 only natively joins Google Ads
GA4 joins Google Ads cost data natively when the two properties are linked. That is the entire scope of GA4's first-party cost-data joining. For every other ad platform — Meta Ads, TikTok Ads, Pinterest Ads, Amazon Ads, Microsoft Ads, Snapchat Ads, LinkedIn Ads — GA4 does not import spend data. To compute blended ROAS or platform-level MER, you must either (a) export GA4 events to BigQuery, ingest each ad platform's API into a separate BigQuery table, and write SQL that joins the two on UTM parameters, or (b) buy a third-party connector like Supermetrics or Fivetran (typical cost: 150 to 500 dollars per month per platform) that does the same join in a SaaS UI.
The SQL is not trivial. Click identifiers are inconsistent — Google Ads uses gclid, Meta uses fbclid, TikTok uses ttclid, each with its own scrubbing rules — and UTM parameters are user-authored, so a 5 percent typo rate is normal. The join keys drift; the data engineer ends up writing a fuzzy match layer with a campaign-name lookup table. The downstream report (blended MER per channel) becomes a brittle SQL artifact that a marketing operator cannot self-serve.
Below is a representative Looker SQL snippet — the same query Admaxxer customers used to maintain before migrating. It is fourteen lines, but every one of those lines is a maintenance burden when a campaign naming convention changes or a new ad platform launches. Note specifically that Meta spend lives in a separate BigQuery table than GA4 events; the join is on a derived campaign_name string that has to be normalized identically on both sides.
-- Blended MER: GA4 sessions JOIN Meta Ads cost JOIN Shopify orders
-- (the SQL most DTC teams end up maintaining in Looker after
-- GA4 deprecated Universal Analytics)
WITH ga4_sessions AS (
SELECT
PARSE_DATE('%Y%m%d', event_date) AS d,
traffic_source.source AS source,
traffic_source.medium AS medium,
LOWER(
REGEXP_REPLACE(
(SELECT ep.value.string_value FROM UNNEST(event_params) ep
WHERE ep.key = 'campaign'),
r'\s+', '_')
) AS campaign_norm,
COUNT(DISTINCT user_pseudo_id) AS sessions
FROM `proj.analytics_123456789.events_*`
WHERE _TABLE_SUFFIX BETWEEN '20260401' AND '20260430'
GROUP BY 1, 2, 3, 4
),
meta_cost AS (
SELECT
date_start AS d,
'facebook' AS source,
'cpc' AS medium,
LOWER(REGEXP_REPLACE(campaign_name, r'\s+', '_')) AS campaign_norm,
SUM(spend) AS spend
FROM `proj.meta_ads.campaign_daily`
WHERE date_start BETWEEN '2026-04-01' AND '2026-04-30'
GROUP BY 1, 2, 3, 4
),
shop_rev AS (
SELECT
DATE(order_created_at) AS d,
LOWER(REGEXP_REPLACE(utm_campaign, r'\s+', '_')) AS campaign_norm,
SUM(total_price_usd) AS revenue
FROM `proj.shopify.orders`
WHERE order_created_at BETWEEN '2026-04-01' AND '2026-04-30'
GROUP BY 1, 2
)
SELECT
s.d,
s.source,
s.campaign_norm,
s.sessions,
COALESCE(m.spend, 0) AS spend,
COALESCE(r.revenue, 0) AS revenue,
SAFE_DIVIDE(COALESCE(r.revenue, 0), NULLIF(m.spend, 0)) AS mer
FROM ga4_sessions s
LEFT JOIN meta_cost m USING (d, source, campaign_norm)
LEFT JOIN shop_rev r USING (d, campaign_norm)
ORDER BY s.d DESC, mer DESC;
Admaxxer ships this join out of the box. The paste-token model imports spend from Meta, Google, TikTok, Pinterest, Amazon, and Microsoft directly into the same store as the pixel events; blended MER, channel-level ROAS, and cross-platform creative comparison all query a single ClickHouse table with consistent click-identifier keys. The marketing operator opens a dashboard, not a SQL editor.
Attribution model — GA4's data-driven attribution is a black box
GA4 defaults to data-driven attribution (DDA), a machine-learning model that Google trains on aggregate click-stream data and applies to your account. The model distributes credit across touchpoints in the conversion path according to weights that are not inspectable. You cannot answer the question "why did the Meta video creative receive 35% credit for this order?" — the answer lives inside Google's training pipeline, not your account.
For DTC budget allocation, that opacity is a problem. The fundamental marketing operator question is not "what is my ROAS today" but "if I shift one thousand dollars from Meta video to Google PMax, what happens to blended revenue." Answering that question requires understanding the attribution credit weights so you can simulate the shift. A black box model cannot be simulated; it can only be obeyed.
Admaxxer ships six attribution models, all transparent and all toggleable per workspace. Each model is documented with its credit-assignment formula on the methodology page; each can be applied to the same order table; each produces a comparison report that lets you see how budget reallocation would shift under different attribution assumptions.
- Last-non-direct click — Shopify default. Credit goes to the most recent non-direct touchpoint.
- First-touch — credit goes to the first known touchpoint in the conversion path.
- Linear — equal credit split across every touchpoint.
- Position-based — 40% first-touch, 40% last-non-direct, 20% split across middle touches.
- 40-30-30 — heavier on first and last with a flatter middle weight.
- Markov chain — incrementality-aware. Estimates the probability that removing a touchpoint would have broken the conversion path; credit follows the marginal contribution.
The toggle is the load-bearing feature. A DTC operator can run a full attribution audit by viewing the same order under all six models in side-by-side columns; campaigns that look great under last-click and terrible under Markov are the campaigns where last-click is over-crediting late-funnel touches. That kind of audit is impossible in GA4's DDA because the credit weights are not exposed.
Cohort LTV at the campaign × creative level — GA4 has no native report
Cohort LTV is the single most useful metric in DTC analytics, because it answers the question that first-order ROAS systematically misleads: how much revenue does this campaign actually generate over the customer lifetime, not just on the day of acquisition. For subscription brands the gap between first-order AOV and 180-day LTV is often eight to twelve times; for repeat-purchase one-time brands the gap is two to four times. A campaign that looks like it has a 1.5x first-order ROAS may have a 4.5x 180-day LTV ROAS — which is the number that should drive budget allocation.
GA4 has no native cohort LTV report at the campaign or creative level. The Explore module has a "cohort exploration" panel that lets you build retention curves on selected dimensions, but it does not join ad cost, it does not compute revenue per cohort member, and it is limited to event-level dimensions you have set up as custom dimensions. To get campaign-level cohort LTV in GA4, you export to BigQuery, write a stored procedure that joins GA4 events to Shopify orders by user_pseudo_id, computes the cohort at the campaign granularity, and feeds the result into Looker — a build that typically takes one to two engineering weeks per brand and an ongoing maintenance commitment.
Admaxxer ships campaign-level and creative-level cohort LTV at the 7-day, 30-day, 60-day, 90-day, and 180-day windows as a first-class surface. The pixel attributes the first touch, the order webhook captures the conversion, and the ClickHouse pipe computes the cohort over each window automatically. A marketing operator can see, for the campaign that ran two weeks ago, what the 14-day actual LTV is and what the 180-day projected LTV is — and toggle the projection to a different cohort to compare.
This surface is in turn the foundation for the AI Maxxer agent's budget reallocation recommendations. The agent reads cohort LTV from the same pipe, compares it across campaigns, and surfaces "this campaign has 3x the projected 180-day LTV of your top-spend campaign" as a chat-stream insight. Without cohort LTV at the campaign granularity, that recommendation cannot be generated — which is why GA4's lack of a native report is not just an analyst inconvenience; it limits the agent layer downstream.
Sales mismatch reconciliation — GA4 doesn't reconcile against Shopify Orders
Every DTC analytics layer reports a revenue number. The pixel reports a number; Shopify Orders reports a number; Meta Ads Manager reports a third; TikTok reports a fourth. These four numbers will never match exactly — the pixel misses ad-blocker traffic, Shopify Orders includes refunds in a different way than the pixel, Meta CAPI deduplicates against the pixel using event_id hashes that can drift, and TikTok's attribution window is asymmetric with Meta's.
The question "are these numbers close enough to trust" is the sales mismatch reconciliation question. Healthy DTC analytics layers reconcile all four sources daily and surface drift as an alert when any pair exceeds a configurable threshold (Admaxxer's default is 2%). GA4 does not reconcile against Shopify Orders. The two systems are separate; the GA4 revenue and the Shopify revenue are reported on separate dashboards, and any drift between them is invisible until a finance team manually checks both totals at month-end.
Admaxxer ships the three-datasource ingest model — Shopify Orders (source of truth), pixel events (client-side attribution surface), and order webhooks (server-side mirror with full click identifier capture) — and reconciles the three daily. The /attribution/health page surfaces the parity numbers in real time; the /alerts page emits a notification when drift exceeds the threshold. This is documented in the revenue tracking architecture deep-dive.
Cross-link: Revenue Tracking — the three-datasource ingest model. The architecture is what makes daily reconciliation cheap; the reconciliation is what makes the dashboard numbers trustworthy.
The total cost comparison — free tier plus BigQuery plus Looker plus engineer time
The honest comparison is not GA4 free versus Admaxxer's nine to nine hundred ninety-nine dollar tier. It is the production DTC analytics stack on GA4 versus the production DTC analytics stack on Admaxxer.
| Layer | Cost on a GA4-centered stack |
|---|---|
GA4 free tier | $0 / month |
BigQuery storage + queries | $30–200 / month (sampling on free tier forces export) |
Looker Studio Pro (per seat) | $30–60 / month / seat |
LookML model maintenance | 5–10 hours / month of engineer time |
Third-party ad-spend connector (Meta + TikTok + Pinterest) | $150–500 / month / platform |
Data engineer (fractional, for the join SQL) | $2,000–10,000 / month |
Attribution / cohort SQL maintenance | Embedded in engineer cost |
Sales reconciliation tooling | Not included; manual finance work |
For a five-million-dollar DTC brand, the GA4 stack lands between two thousand and fifteen thousand dollars per month in fully-loaded cost, depending on whether the data engineer is fractional or full-time. Admaxxer's equivalent tier — currently AD_PRO at seventy-nine dollars per month for up to seven hundred fifty thousand events per month — covers the same analytical surface, plus the AI agent, plus the BFCM-mode safeguards, plus the cohort LTV at the campaign granularity.
The cost difference is not the headline. The headline is that the GA4 stack requires a data engineer; the Admaxxer stack does not. For a DTC brand without a data engineer on staff, the GA4 stack is either underbuilt (the marketing operator works off sampled estimates) or overbuilt (the brand hires a fractional data engineer at significantly higher cost than the analytics SaaS itself). Admaxxer collapses the staffing requirement.
When GA4 still makes sense — organic search and the Search Console integration
This playbook is not an argument to delete GA4. There is one specific use case where GA4 is irreplaceable: the Google Search Console integration. GA4 properties linked to a verified Search Console property surface the actual search queries that brought a visitor to your site, including impression counts, click-through rates, and ranking positions. That data is not available in Admaxxer because Admaxxer does not ingest the Search Console API.
DTC brands that care about SEO performance — organic landing page conversion rates, branded versus non-branded search share, keyword-level traffic by landing page — should keep GA4 installed alongside Admaxxer for the Search Console integration specifically. The two pixels do not conflict (GA4 uses gtag.js, Admaxxer uses an isolated first-party pixel namespace), and the cost of keeping a GA4 property linked to Search Console is zero ongoing dollars.
The recommendation is: keep GA4 as a single-purpose Search Console viewer; do not let it remain the primary attribution surface. The split saves you the BigQuery and Looker stack while preserving the one piece of unique data GA4 provides.
The 30-day overlap migration pattern
Migrating off GA4 as the primary attribution layer is straightforward in theory and slightly more involved in practice. The recommended pattern is a thirty-day overlap: install Admaxxer alongside GA4, run both pixels in parallel for thirty days, parity-check the numbers daily, then formally retire GA4 dashboards on day thirty-one. The thirty-day window matters because it is roughly one DTC reporting cycle — a marketing operator and a finance lead will both have seen a full month of side-by-side numbers before the decision to retire.
- Day 0 — Install Admaxxer pixel on the storefront (Shopify app, WordPress plugin, or copy-paste snippet). Paste Meta long-lived user token + Pixel ID + CAPI access token in /settings/connections. Paste Google Ads developer token + refresh token. The two pixels coexist without conflict.
- Day 1–3 — Admaxxer backfills Shopify order history from order #1 to today. Pixel-side click identifier capture starts immediately; backfilled orders are matched by email hash to the historical attribution we can reconstruct.
- Day 4–14 — Parity check phase. Both teams (marketing + finance) review GA4's daily revenue and Admaxxer's daily revenue side-by-side. Expected drift: 2–5% (Admaxxer reports higher because the first-party pixel captures ad-blocked traffic GA4 misses). Drift above 8% indicates a setup issue — typically a Shopify webhook misconfiguration.
- Day 15–25 — Side-by-side campaign-level review. The marketing operator opens GA4's source-medium report and Admaxxer's source-medium report for the same week. The campaign ordering will differ — Admaxxer's attribution model is transparent and reconciled; GA4's DDA model is black-box. Confirm the top-five campaigns by attributed revenue match in both tools (they typically do; the long tail differs more).
- Day 26–29 — Decision and stakeholder communication. Marketing lead, finance lead, and ops lead each sign off on the new attribution numbers. Internal documentation is updated to reference Admaxxer's metric definitions (see /methodology). Any external reporting (investor decks, board reports) is migrated to the Admaxxer numbers.
- Day 30 — Formal retirement. GA4 stays installed as a Search Console viewer; the marketing operator removes GA4 dashboards from the team's weekly review. Looker Studio reports are archived. The data engineer's GA4-related maintenance work ends.
Admaxxer ships a guided migration wizard in /admin/migration that automates the parity check phase — the wizard pulls Admaxxer's daily revenue, prompts the operator to paste GA4's daily revenue export, computes drift, and flags any day where drift exceeds the configured threshold. The wizard exports a parity report on day thirty that you can share with finance to close the migration formally.
Frequently asked questions
- Is GA4 free for DTC brands? What's the catch?
- GA4 is free at the surface. The hidden cost is twofold. (1) Event-level data is sampled when daily traffic exceeds 200K events on the free tier; the sample size shrinks further for high-cardinality reports (e.g., source/medium × campaign × landing page). For a DTC brand on a sale day, that means the 'top-converting campaign' report is a guess, not a measurement. (2) GA4 does not join ad spend — you see traffic and conversions, but to compute ROAS you need to export to BigQuery and write SQL to JOIN Google Ads + Meta Ads cost. That's $30-200/month in BigQuery query cost plus a data engineer. Admaxxer joins Meta + Google + TikTok + Pinterest + Amazon spend with revenue out of the box.
- How does GA4's attribution model differ from Admaxxer's?
- GA4 defaults to data-driven attribution (DDA), a Google-trained ML model that distributes credit across touchpoints. It is a black box — you cannot inspect why a touchpoint received credit. Admaxxer ships 6 attribution models: last-non-direct (Shopify default), first-touch, linear, position-based, 40-30-30, and Markov chain (incrementality-aware). All are transparent — you can see the credit weight assigned to each touchpoint per order. For DTC brands, the model matters less than the ability to swap and compare; Admaxxer lets you toggle models in /attribution and see budget reallocation recommendations side-by-side.
- Can GA4 be a single source of truth for DTC analytics?
- Not without significant glue. GA4 lacks: (1) blended MER (you'd compute outside of GA4), (2) cohort LTV at the campaign × creative level, (3) CAPI match rate visibility, (4) marketing mix modeling (MMM), (5) incrementality testing, (6) sales-mismatch reconciliation vs Shopify Orders. Admaxxer ships all six as first-class surfaces. You can keep GA4 alongside Admaxxer for Google's organic search reports (GA4 is integrated with Google Search Console at the property level) — Admaxxer customers typically use GA4 for Search Console + GSC and Admaxxer for ad attribution + revenue.
- Will I lose data if I migrate from GA4 to Admaxxer?
- You can run both side-by-side indefinitely; Admaxxer's pixel does not conflict with the GA4 tag. Most DTC migrations follow a 30-day overlap: install Admaxxer pixel + connectors, leave GA4 firing, compare numbers daily for 30 days, then archive GA4 reports to BigQuery and stop checking GA4 dashboards. Admaxxer imports your historical Shopify orders going back to year 1 so your cohort LTV is immediately usable.
- How does Admaxxer pricing compare to a GA4 + BigQuery + Looker stack?
- Admaxxer is $9-999/mo flat depending on event volume; GA4 itself is free but the production stack (GA4 360 + BigQuery storage + Looker Studio Pro + a data engineer's time to maintain the SQL) typically runs $2-15k/month for a $5M+ DTC brand. Admaxxer is built for DTC out of the box — the SQL is written; the LookML equivalents are pre-built dashboards.
Run this playbook in your own dashboard
Admaxxer ships the pixel + Meta CAPI + Google Enhanced Conversions + Maxxer AI agent + cohort analytics out of the box. The playbook above becomes a live surface in your account after a 5-minute setup.