E-COMMERCE ANALYTICS

Canadian e-commerce analytics needs Quebec's Law 25 consent requirements built into the tag management setup — the GDPR-style rules apply to Quebec visitors and most Shopify analytics setups ignore them

Quebec's Law 25 (formerly Bill 64) introduced opt-in consent requirements for analytics cookies that took effect from September 2023. If your Shopify store serves Quebec visitors and your CMP does not geofence Quebec IP addresses for an opt-in consent flow, you are collecting analytics data non-compliantly from a significant portion of the Canadian market. The rest of Canada operates under PIPEDA's more permissive implied consent standard, but Quebec requires explicit opt-in — the same standard as GDPR.

This is for you if

Who This Is For

Canadian Shopify brands with bilingual French/English stores serving Quebec and the rest of Canada, running Google Ads or Meta Ads, where revenue figures differ between Shopify and GA4 and French-language performance is not separately measurable.

What's broken

The Problems We Fix

Quebec Law 25 (Bill 64) consent not implemented

Quebec's privacy law requires opt-in consent for analytics cookies for Quebec visitors, enforceable since September 2023. Most Canadian Shopify stores use a cookie banner that applies uniform implied consent across Canada, without geofencing Quebec visitors for an opt-in flow. A CMP with IP-based geofencing can serve a GDPR-style opt-in banner to Quebec visitors while continuing to apply implied consent logic for visitors from other provinces, maintaining analytics coverage outside Quebec while respecting Law 25.

French/English session attribution not segmented

French-language Quebec buyers and English-language buyers across the rest of Canada behave differently — different product preferences, different checkout completion rates, different device mix. GA4 aggregates these two audiences by default. Without language or region segmentation in GA4, conversion rate optimisation decisions for French-language pages are made on data that includes English-language sessions, making the French-language performance invisible. GA4 user properties and custom dimensions for browser language and geographic region separate these audiences.

Cross-border attribution gap

Canadian buyers see Google Ads on both Google.ca and Google.com depending on device, VPN usage, and campaign geo-targeting settings. A Canadian buyer who clicks a Google.ca Shopping ad and then returns via a Google.com search will have two separate GA4 sessions attributed to different campaigns. If CA and US Google Ads campaigns have overlapping geo-targeting for border cities (Vancouver, Windsor, Niagara), the attribution is further confused. Campaign geo-targeting exclusions and UTM parameter audits across CA and US campaigns resolve the overlap.

Shopify CAD revenue vs GA4 revenue discrepancy

Multi-currency Shopify stores presenting prices in both CAD and USD record the purchase event in the session currency — the currency the buyer saw at checkout. GA4 receives mixed CAD and USD purchase values and does not convert them to a base currency unless currency conversion is configured in GA4's data settings. The result is a GA4 revenue figure that adds CAD and USD values together as if they were the same currency, creating a systematic discrepancy against Shopify's CAD-base revenue reports.

What we engineer

What We Build

CMP configuration with Quebec IP geofencing

CMP configuration with Quebec IP geofencing for Law 25 opt-in consent, separate from rest-of-Canada implied consent flow

GA4 custom dimensions for browser language and province/territory

GA4 custom dimensions for browser language and province/territory so French-language and English-language conversion rates are separately measurable

Google Ads geo-targeting audit

Google Ads geo-targeting audit for CA/US campaign overlap and UTM parameter standardisation across Canadian and US campaigns

GA4 currency configuration

GA4 currency configuration to report in CAD as base currency with session currency conversion enabled

Looker Studio dashboard

Looker Studio dashboard segmented by language, province, and channel with CAD as the reporting currency

Conversion tracking health check

Conversion tracking health check covering GA4 event parity against Shopify order data by province

What changes

What you can measure after the analytics infrastructure is in place

Before
After
Before Purchase, add-to-cart, and checkout events are not firing in GA4. Campaign performance cannot be measured against revenue. There is no way to identify which product pages are converting and which are not. Shopify's built-in analytics records that a sale happened but does not tell you which Google or Meta campaign produced it, which keyword the buyer searched, or which product page they landed on before purchasing. Without GA4 e-commerce events configured through Google Tag Manager, your paid campaigns are running blind.
After GA4 shows revenue by acquisition channel — organic search, paid Google, paid Meta, direct, and email are separated into distinct channel groups with revenue attributed to each
Before The Shopify Meta Pixel integration and a manually added Pixel code are both firing on the order confirmation page. Meta is reporting double the actual purchase volume, which inflates your ROAS. This is a common error on Shopify stores that installed the Meta Pixel through Shopify's native integration and then added a second Pixel code snippet directly to the theme. Both tags fire on the thank-you page and Meta counts two purchase events for one transaction. The result is that your Meta dashboard shows a ROAS that is mathematically impossible to reconcile with Shopify revenue.
After Meta purchase events are deduplicated — one purchase in Shopify equals one purchase event in Meta; ROAS calculations are based on actual transaction volume, not inflated event counts
Before Buyers who pay through eSewa or Khalti are redirected away from your Shopify store to an external payment page, then returned to the order confirmation page. The GA4 purchase event on the confirmation page fires correctly for buyers who return through the standard redirect URL. Buyers who use a different return path — or whose browser blocks the event after the redirect — are not measured. This creates a domestic revenue gap in your GA4 data: eSewa and Khalti transactions appear at a lower volume than they actually occur.
After eSewa and Khalti transactions are measured — domestic payment completions are captured in GA4 at the highest rate the payment redirect path allows
Before Klaviyo is sending email and flow campaigns with no click tracking enabled. Email-attributed revenue is not visible in Klaviyo reports. The relationship between lifecycle email sends — welcome flows, abandoned cart sequences, post-purchase campaigns — and actual Shopify revenue is not measurable. You cannot tell whether your email list is driving repeat purchases or whether those buyers were returning regardless of the emails.
After Klaviyo email revenue is visible — each email campaign and flow shows attributed Shopify revenue, click rate, and revenue per recipient
How it works

How the analytics engagement works

  1. 01

    Audit

    Days 1-3

    We review your current GA4 property, GTM container, Meta Pixel, and Klaviyo account. We document every tracking gap, every duplicate event, and every configuration error in a written audit report. You receive the report before any implementation begins.

  2. 02

    Implementation plan review

    Day 4

    We walk through the audit findings and the proposed implementation plan. You confirm the scope before work starts.

  3. 03

    GTM configuration and GA4 e-commerce setup

    Days 5-8

    We build the GTM container with the GA4 e-commerce event layer, the Meta Pixel tag, and the Conversions API configuration. We test each event using GTM Preview mode and GA4 DebugView before publishing.

  4. 04

    Payment gateway testing

    Days 8-10

    We run test transactions through eSewa and Khalti to verify the GA4 purchase event fires correctly after the payment redirect. We document any gaps in the post-redirect firing and implement the best available workaround.

  5. 05

    Klaviyo configuration and handover

    Days 10-12

    We configure UTM tracking on Klaviyo links, verify revenue attribution is active, and deliver a handover document covering every tag, trigger, and variable in the GTM container.

Common questions

Frequently Asked Questions

How do I implement Quebec Law 25 compliant consent for GA4 on a Canadian Shopify store?

A CMP that supports geographic consent rules (Cookiebot, Usercentrics, or OneTrust) can be configured to detect Quebec IP addresses and serve an opt-in consent flow to those visitors, while applying implied consent logic to visitors from other Canadian provinces. In GTM, GA4 tags are conditional on the consent signal from the CMP — no analytics data fires for Quebec visitors until they accept. This configuration satisfies Law 25's opt-in requirement for Quebec while preserving analytics collection for the rest of Canada under PIPEDA.

How do I segment French-language and English-language buyer sessions in GA4 for Canada?

Create a GA4 custom dimension using the `browser_language` event parameter, which is available on all GA4 events. Visitors with `fr` or `fr-CA` browser language are French-language sessions; `en` or `en-CA` are English-language. In Looker Studio, add this custom dimension as a filter or breakdown dimension on conversion rate, add-to-cart rate, and revenue metrics to compare the two language groups directly. Geographic region (Quebec vs other provinces) provides a second segmentation layer for cross-validation.

How do I fix the currency discrepancy between Shopify CAD revenue and GA4 reported revenue?

In GA4 Admin > Data Settings, set the reporting currency to CAD. Enable the currency conversion option so that purchase events sent in non-CAD currencies (USD, EUR) are converted to CAD using daily exchange rates. In the GTM purchase event tag, confirm that the `currency` parameter is being passed correctly from the Shopify checkout object — multi-currency Shopify stores pass the session currency in the cart object, which must be read by the GTM variable and forwarded to GA4.

How do I attribute purchases correctly when a Canadian buyer saw an ad on both Google.ca and Google.com?

GA4's default last-click attribution within a session will credit the final click before purchase. For cross-session attribution across Google.ca and Google.com touchpoints, GA4's data-driven attribution model (available in GA4 for properties with sufficient conversion volume) distributes credit across multiple touchpoints. In Google Ads, applying geographic exclusions to prevent CA campaigns from showing on Google.com (and US campaigns from showing to Canadian IP addresses) reduces the overlap and simplifies attribution.

What Canadian privacy laws (PIPEDA and Quebec Law 25) affect GA4 data collection?

PIPEDA (federal) applies to all provinces except those with substantially similar provincial legislation. PIPEDA operates on implied consent for analytics data collection where the purpose is disclosed in the privacy policy and collection is limited to what is necessary. Quebec's Law 25 is stricter: it requires opt-in consent for any technology that identifies, locates, or profiles individuals — which covers GA4 cookies and identifiers. Alberta (PIPA) and British Columbia (PIPA) also have provincial privacy laws, but neither currently requires opt-in consent for analytics cookies at the GDPR standard.

Our team

The people behind the work

Not a black box. Real specialists you can call, with their names on the work.

Niraj Raut

Niraj Raut

Founder — Ecommerce SEO
Keshab Joshi

Keshab Joshi

PPC Expert
Hawrry Bhattarai

Hawrry Bhattarai

Google Ads Expert
Arogya Rijal

Arogya Rijal

SaaS SEO Expert
Start here

Request an Analytics Audit

Canadian Shopify brands with bilingual French/English stores serving Quebec and the rest of Canada, running Google Ads or Meta Ads, where revenue figures differ between Shopify and GA4 and French-language performance is not separately measurable.