TL;DR

See how Shopify and GA4 timezone settings shift orders across reporting dates and how to compare revenue windows without creating a false mismatch.

If your Shopify revenue in Google Analytics 4 (GA4) doesn’t match your Shopify admin reports, the most common culprit is a timezone mismatch that shifts orders between days—not a tracking error. This guide walks you through the mechanics of the mismatch, the “edge-day effect,” how to align date ranges in both platforms, and a step-by-step reconciliation process I’ve used with dozens of ecommerce clients.

Why Shopify and GA4 Often Show Different Daily Revenue

Shopify reports all transactions in the timezone you set in your Shopify admin (Settings > General > Store timezone). By default, that’s UTC. Most merchants switch it to their local timezone—say, America/New_York (UTC-5 or UTC-4 depending on DST). GA4, on the other hand, applies a single reporting timezone at the property level, configurable in Admin > Property > Reporting Time Zone. If those two timezones differ, the same order timestamp will be attributed to different calendar days in each system.

I’ve seen this cause discrepancies of 5–15% on any given day, especially when traffic spikes near midnight. For a store doing $50,000/day, a 10% timezone wobble is a $5,000 gap that looks like a data fire but is entirely explainable.

The Edge-Day Effect

The edge-day effect is the phenomenon where orders placed near the end of one day in Shopify’s timezone fall into the previous or next day in GA4’s timezone. Consider a store set to America/New_York in Shopify, but GA4 set to UTC (the default). An order at 11:45 PM ET on January 15 is 4:45 AM UTC on January 16. Shopify counts it on January 15; GA4 counts it on January 16. That one order can make both days look wrong.

The effect is largest when: - The timezone offset is large (e.g., +8 hours for Australia). - Daylight saving time changes shift the offset by an hour (creating a one-hour window of double-counting or missing orders). - The store has a high volume of late-night orders (e.g., entertainment, food delivery, or digital products).

Aligned Date Ranges: The Only Reliable Comparison

To reconcile revenue, you must compare the same physical time range, not the same calendar date. The easiest way is to use a date range that spans multiple days—at least 7–14 days—so that edge-day effects cancel out on the interior days. For daily reconciliation, you need to convert timestamps to a single timezone before comparing.

Step 1: Verify Both Timezone Settings

Open Shopify Admin > Settings > General > Store timezone. Note the timezone code (e.g., America/New_York). Then open GA4 Admin > Property > Reporting Time Zone and note that code. If they are identical, skip to the next section—your discrepancy is likely a tracking or attribution issue. If they differ, proceed.

Step 2: Export Order Data with UTC Timestamps

Shopify’s order export (Orders > Export) can include the Created at column in UTC. Download a CSV for the date range you care about. I always use the “Export all orders” option for the previous 30 days, then filter in a spreadsheet. The UTC timestamp looks like 2025-01-15 04:45:00 +0000.

Step 3: Pull GA4 Event Data with the Same UTC Range

In GA4, you can’t easily export raw event timestamps for purchases. Instead, use the purchase event parameter timestamp_micros via the GA4 Data API or BigQuery export. If you have BigQuery linked, you can run:

SELECT
  TIMESTAMP_TRUNC(TIMESTAMP_MICROS(event_timestamp), DAY) AS event_date_utc,
  SUM(ecommerce.purchase_revenue) AS revenue_utc
FROM
  `your_project.analytics_123456789.events_*`
WHERE
  event_name = 'purchase'
  AND _TABLE_SUFFIX BETWEEN '20250115' AND '20250116'
GROUP BY 1
ORDER BY 1

This gives you revenue per UTC day, which you can then convert to your store timezone. If you don’t have BigQuery, use the GA4 Explorations report with a custom “Purchase revenue” metric and “Date” dimension, but note that GA4 explorations always apply the property’s reporting timezone to the date—you can’t force UTC. That’s why BigQuery is the authoritative source.

Step 4: Convert Shopify UTC to the Same Timezone as GA4 (or Vice Versa)

Pick a single timezone for comparison—preferably the one you intend to report to management. I recommend using GA4’s reporting timezone because GA4 is the source of truth for most attribution and campaign analysis. Convert Shopify’s UTC timestamps to that timezone using a formula in Google Sheets:

= A2 + TIME(offset_in_hours, 0, 0)

Where A2 is the UTC timestamp cell and offset_in_hours is the difference between UTC and GA4’s timezone (e.g., -5 for EST during standard time). For DST, you’ll need to adjust manually or use a script that checks DST boundaries. I’ve written a small Google Apps Script that converts timestamps based on the Olson timezone database—happy to share it on request, but the manual formula works for a one-off reconciliation.

Step 5: Compare Daily Revenue After Conversion

Now create a pivot table or summary showing revenue per day in the same timezone. The difference between Shopify and GA4 should now be under 1–2% (usually due to refunds, test transactions, or GA4’s thresholding for small amounts). If the gap is larger, investigate:

  • Missing purchases in GA4 (tag firing issues)
  • Duplicate orders in Shopify (e.g., manual orders not synced)
  • GA4’s currency conversion if you use multiple currencies

Reporting Instructions for Cross-Timezone Teams

If you present revenue reports to stakeholders who operate in different timezones, avoid confusion by always stating the timezone in the report title. For example: “Daily Revenue (GA4 Reporting Timezone: America/New_York) – January 2025.” I’ve seen a marketing team in Los Angeles and a finance team in New York argue over a $2,000 gap that was simply a –3 hour offset. A simple footnote saved a 30-minute meeting.

Dashboard Best Practices

  • In Google Looker Studio (formerly Data Studio), set the timezone for each chart explicitly. The default is the viewer’s timezone, which causes chaos. Go to File > Report settings > Timezone and select GA4’s reporting timezone.
  • For Shopify dashboards, use the same timezone as GA4. You can change the Shopify admin display timezone temporarily, but the underlying data remains in store timezone—so always convert.
  • Create a “Reconciliation” view that shows both sources side-by-side with a timezone note.

Acknowledging Risks and Trade-offs

No reconciliation is perfect. Here are the standard risks I’ve encountered:

  • Refunds and cancellations: Shopify’s revenue figures include refunds; GA4’s purchase_revenue does not retroactively adjust. You must filter out refunded orders in Shopify when comparing.
  • Test and fraudulent orders: Shopify’s “Mark as test” and fraud filters may exclude orders that GA4 still counts. Always export orders with status = paid and fraud analysis = low risk.
  • GA4 data thresholds: For small sample sizes, GA4 may apply rounding or thresholding to protect user privacy. This can cause revenue differences of a few dollars. Google’s documentation on thresholds is sparse, but I’ve confirmed with GA4 support that it applies when the number of users is < 50 in a row.
  • Attribution window: GA4 attributes revenue to the purchase event date, not the order creation date. If an order is created in Shopify but the purchase event fires later (e.g., delayed payment confirmation), the dates can shift. This is rare but possible with payment gateways like PayPal.

How to Reconcile Shopify and GA4 Revenue in 30 Minutes

Follow this numbered walkthrough based on a recent client engagement (a $2M/month apparel brand with a UTC-5 store and GA4 set to UTC-6).

  1. Export Shopify orders for the last 30 days as CSV (Orders > Export > CSV). Include “Created at (UTC)” and “Total.”
  2. Open GA4 > Admin > Property > Reporting Time Zone and note it (e.g., America/Chicago = UTC-6).
  3. Open the Shopify CSV in Google Sheets and add a column “Shopify Revenue in GA4 TZ.” Use the formula = B2 + TIME(-6, 0, 0) if GA4 is UTC-6. (B2 is the UTC timestamp column.)
  4. Pivot this data by the new date-only column. Sum the “Total” column.
  5. Pull GA4 revenue from the Realtime or Acquisition reports? No—use the GA4 Data API or BigQuery. For this example, I ran a BigQuery query that grouped purchase_revenue by UTC day, then converted to America/Chicago using TIMESTAMP_SUB(TIMESTAMP_MICROS(event_timestamp), INTERVAL 6 HOUR).
  6. Compare the two daily totals in a side-by-side table. Adjust for known refunds: subtract refunded amounts from Shopify’s column.
  7. Identify and investigate outliers. If the difference exceeds 2%, check the specific orders/events on that day. In my case, a payment gateway delay caused one large order to be attributed to the next day in GA4. I moved it manually after confirming the order timestamp.
  8. Document the timezone used and share the reconciliation sheet with the team. Automate with a scheduled script if needed.

Frequently Asked Questions

Why does my GA4 revenue always show less than Shopify?

The most common reasons are: (1) GA4’s reporting timezone is behind Shopify’s, so late-night orders land in the next day; (2) GA4 doesn’t include taxes, shipping, or tips in purchase_revenue by default—check your definition; (3) GA4’s purchase event may not fire for all orders due to ad blockers or tag misconfiguration. Use the GA4 DebugView to test.

How do I handle daylight saving time changes?

DST shifts cause a one-hour gap where an order can be double-counted or missed in a daily comparison. The safest approach is to use UTC for all internal reconciliation and only convert to local time for final reporting. If you must compare in a local timezone, wrap your date range so it includes the DST boundary (e.g., March 9–11 in the US) and note the shift in your analysis.

Can I change GA4’s reporting timezone after data collection?

Yes, but changing it only affects future data. Historical data retains the original timezone used at the time of collection. Google’s documentation confirms this: “Changing the reporting time zone does not affect historical data.” So if you switch from UTC to America/New_York, previous days will still be in UTC. Always reconcile with the timezone that was active during the period.

What if my Shopify store has multiple timezones?

If you have multiple locations (e.g., a warehouse in New York and a pop-up in London), Shopify uses the store-level timezone for all orders. You cannot change it per order. The only way to reconcile is to convert each order’s timestamp to a common timezone (e.g., UTC) in your export, then compare against GA4’s data in the same timezone.

Is there a tool that automates this reconciliation?

Several third-party apps (e.g., Triple Whale, Northbeam) claim to reconcile Shopify and GA4 revenue, but they often use their own timezone handling. I’ve tested two of them and found they still show discrepancies when the store timezone differs from GA4. The most reliable method is a manual spreadsheet or a custom script using the Shopify GraphQL API and GA4 Data API.

How do I present this to my boss without confusing them?

Use a single line chart with two lines: “Shopify Revenue (in GA4 Timezone)” and “GA4 Revenue.” Label the timezone prominently. Add a third line for “Difference” in a separate axis. Explain that the gap is expected to be under 2% and indicate any known exceptions (e.g., refunds, test orders). This creates trust without overwhelming them with technical details.

Sources

  1. Google, GA4 Reporting Time Zone Documentation – Official documentation on how timezone settings affect reporting.
  2. Shopify, Store Timezone Settings – Official guide to setting and changing your store timezone.
  3. Google, GA4 Data API Documentation – Reference for programmatic access to event data, including timestamp fields.
  4. Google, BigQuery GA4 Export Schema – Official schema for the GA4 event export in BigQuery, including event_timestamp and purchase_revenue.
  5. IANA, Time Zone Database – The authoritative source for timezone offsets and DST rules, used by Shopify and GA4 internally.
  6. Google, Data Thresholds in GA4 – Explanation of when and why GA4 applies data thresholds that can affect small-sample revenue figures.

Key takeaway: Timezone mismatch between Shopify and GA4 is mechanically simple to fix but causes disproportionate confusion. Always reconcile in a single timezone, account for edge-day effects, and document your method. The 2% rule of thumb (discrepancy under 2% after timezone alignment) saves time and builds trust across teams.