# Test Shopify Canada localization

Source: https://ipvolt.com/guides/shopify-canada-localization
Markdown: https://ipvolt.com/guides/shopify-canada-localization.md

[Home](https://ipvolt.com/index.md) / [Guides](https://ipvolt.com/guides.md) / [Countries](https://ipvolt.com/guides/countries.md) / [Test Shopify Canada localization](https://ipvolt.com/guides/shopify-canada-localization.md)

Category: Country
Reviewed: 2026-09-27
Reading time: 9 minutes
Author: ipvolt

Use a configuration snapshot and paired visits to test Shopify Canada localization. Separate IP, URL, language, saved choice and shipping-address effects.

Start with your Shopify Online Store’s configuration, then compare a Canadian and non-Canadian first visit to the **same neutral URL**. Keep language, browser state and the product fixed. An explicit Canada URL answers a different question, so test it separately.

The downloadable worksheet provides six comparison pairs and twelve empty visit records. Choose the pairs relevant to your problem; you do not need to run all six. The local checker catches missing declarations and specified control mistakes. No Shopify or proxy behaviour has been measured in these files.

Download the [JSON worksheet](/downloads/canada-localization/shopify-canada-worksheet.json), [Python checker](/downloads/canada-localization/validate_shopify_canada.py) and [README](/downloads/canada-localization/README.md). For a spreadsheet view, keep the [configuration CSV](/downloads/canada-localization/shopify-canada-configuration.csv) and [visits CSV](/downloads/canada-localization/shopify-canada-visits.csv) together. The checker reads JSON; editing the CSV does not update it.

## Capture the configuration before the visit

Save a copy of the JSON and fill `configuration` from the store you control. Give the snapshot an ID, UTC timestamp and private evidence reference. Record:

- Active markets and currencies; whether market URLs use shared, dedicated or mixed domains.
- Actual country and language redirection settings, published languages by market, selectors and saved-choice behaviour.
- Shipping rules and any third-party routing, or `none`.
- Product/cart fixture, browser version, viewport, time zone and a short test window.

Use a signed-out browser with location permission denied. An account or granted coordinates would introduce additional inputs into this protocol. Keep configuration and stock stable during the pair; record a new snapshot when they change.

Read the shipping setup actually present in your store. Shopify is gradually moving shipping profiles and rates to shipping options by market. Its state/province sub-region markets are currently **early access**, with independent customization limited to shipping options. Neither feature is a prerequisite for this worksheet. [Shipping setup](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/setting-up-shipping-rates), [market types](https://help.shopify.com/en/manual/markets/getting-started/market-types).

For each relevant pair, set `applicable` to `true`, write the `expected_rule` and its evidence, and give both visits an `expected_outcome` before execution. Retain unused pairs as `applicable: false` with an `inapplicable_reason`. A correct result may be unchanged when the configured rule maps both inputs to the same experience.

## Run the same-URL IP comparison first

Map `neutral_entry_url` to the agreed first-visit entry for testing location selection. Do not substitute a preselected Canada domain or path. If your setup has no suitable common entry, mark this pair inapplicable and explain why.

Fill `exits.CA` and `exits.control` from your authorized IP observations. The control must be outside Canada. Record the checking service or target, UTC timestamp, observed country and an `egress_id`: a private reference or digest identifying the observed exit address. A separate IP checker’s country result does not establish Shopify’s own location decision; Shopify warns that IP geolocation can be inaccurate. [Localization considerations](https://help.shopify.com/en/manual/markets/getting-started/localization).

| Visit | Entry | Exit | Language | Browser state | Shipping address |
| --- | --- | --- | --- | --- | --- |
| `ip-A` | Same neutral URL | Observed CA | `en-CA` | Fresh, signed out | None entered |
| `ip-B` | Same neutral URL | Observed non-CA control | `en-CA` | Separate fresh context, signed out | None entered |

Open a new isolated context for each visit, without reused storage state, cart or old profile. Record the first landing before entering an address, then close the context. Shopify documents automatic redirection as first-page behaviour, so navigating around in an existing session is a different comparison. [First-page redirection](https://help.shopify.com/en/manual/markets/getting-started/localization).

Record final URL, selected country, market, language and currency separately. Shared-domain markets can change displayed content without changing the URL; dedicated market domains can redirect it. URL change alone is therefore an unsuitable universal pass condition. [Domain-dependent redirection](https://help.shopify.com/en/manual/international/automatic-redirection).

For market evidence, capture the relevant selector state and configuration mapping, or an authorized storefront diagnostic. A country and a market need not map one-to-one: a market can include multiple countries. CAD or HTTP 200 alone does not establish which market was selected. Shopify’s [Liquid localization object](https://shopify.dev/docs/api/liquid/objects/localization) exposes selected country, language and the applicable country-region market; the download supplies no tested Liquid instrumentation. [Country and region market scope](https://help.shopify.com/en/manual/markets/getting-started/market-types).

## Add the comparison that matches the symptom

Keep the snapshot, product/cart and browser settings fixed. Each fresh visit gets its own context; the saved-choice comparison deliberately retains only the prepared choice.

| Pair | Change between visits | Keep fixed | What it helps diagnose |
| --- | --- | --- | --- |
| `url` | Neutral entry → configured Canada entry | CA exit, `en-CA`, fresh contexts | Interaction between entry URL and configured redirection. |
| `language` | Browser preference `en-CA` → `fr-CA` | Canada entry, CA exit, fresh contexts | Whether the configured French experience appears. |
| `saved` | Fresh context → deliberately retained manual choice | Canada entry, CA exit, `fr-CA` | Whether the recorded selector choice is respected on return. |
| `province` | Approved Ontario → Quebec delivery address | Canada entry, CA exit, `en-CA`, equivalent fresh carts | Delivery outcomes for those two destinations. |
| `cross_border` | Approved non-CA → Ontario delivery address | Control-market entry, non-CA exit, `en-CA`, equivalent fresh carts | Checkout changes after the destination changes. |

If the neutral and Canada entries are identical on a shared domain, the `url` contrast is inapplicable. The `ip` pair can still inspect content at that shared entry. For distinct URLs, observe the interaction in your setup instead of assuming a universal URL-versus-IP precedence order.

For the language pair, verify the browser’s actual language preference. French redirection requires language redirection to be active and French to be added, assigned to the relevant market, translated and published. Shopify illustrates a configured `.ca` storefront redirecting to `.ca/fr`; that is a documentation example, not a URL pattern to impose on every store. [Language requirements](https://help.shopify.com/en/manual/international/automatic-redirection).

For `saved-B`, start clean, manually choose the intended country and English using the store’s selectors, then revisit in that same context. Record the exact steps. Importing an unrelated old profile adds unknown state. Shopify documents retention of manual choices on later visits. [Saved selector preferences](https://help.shopify.com/en/manual/markets/getting-started/localization).

For the address pairs, reference approved **complete test addresses** kept privately. Reset cart and checkout between visits and stop at your authorized observation point without placing an order. Ontario versus Quebec compares two destinations; it does not isolate province from postal, street or radius rules. For local delivery, also preserve inventory, fulfillment and checkout conditions. [Local-delivery eligibility](https://help.shopify.com/en/manual/fulfillment/setup/delivery-methods/local-delivery).

Inspect the checkout experience again after entering the address. Shopify documents shipping destination as determining the final experience, including an example of a US visitor entering a Canadian address. A successful first landing therefore does not finish the cross-border comparison. [Checkout localization](https://help.shopify.com/en/manual/markets/getting-started/localization).

## Interpret what changed—and what did not

Write actual inputs and observations into each visit, then set `observation.status` to `observed`. Preserve the final URL, selected country, market evidence, language, currency, UTC time and evidence reference. Include delivery options for address comparisons, recording `none` if absent.

Use `match`, `mismatch` or `inconclusive` against the expectation you wrote before the visit. If one of `selected_country`, `market`, `market_evidence`, `language` or `currency` is unavailable, record `unavailable`, choose `inconclusive` and explain the gap. `final_url` still requires an observed HTTP(S) URL; without it the record remains incomplete. Keep failed and inconclusive records.

**Invented interpretation example:** suppose a recorded shared-domain configuration assigns Canadian visitors to a Canada market and US visitors to a US market. Both visits finish at the same URL. Authorized market evidence identifies Canada for `ip-A` and the US for `ip-B`. That would match the declared rule even without a redirect. If the only evidence were a CAD price, market selection would remain inconclusive. This example contains no observed merchant result.

If both inputs should select the same market, identical output can match. If the declared rule predicts different markets but both observations identify the same one, retain the mismatch and inspect settings, actual entry, fresh state and Shopify’s location decision. A different URL plus a different language cannot isolate the exit’s effect.

Compare `actual_inputs` with the plan. If the exit rotates, the product changes or an old session is reused, restore the control and repeat the pair. Preserve the original record. Use a new worksheet record when a later pair uses a different observed egress ID; the earlier IP evidence does not cover the new address.

## Check the record locally

Place the checker beside the JSON. Python 3.10 or later uses only the standard library:

```sh
python3 validate_shopify_canada.py shopify-canada-worksheet.json
```

The blank download returns `INCOMPLETE_RECORD` and exit `2`. A filled plan can return `PLAN_COMPLETE` with exit `0`: only its declarations and paired inputs passed the local checks. This is not a Shopify pass.

After entering observations:

```sh
python3 validate_shopify_canada.py shopify-canada-worksheet.json --observations
```

`RECORD_COMPLETE` means the declared observation fields and controls passed the checker. It can contain `mismatch` and `inconclusive` outcomes; it does not verify that the store works or that the observations are true.

To export the visit view after editing JSON:

```sh
python3 validate_shopify_canada.py shopify-canada-worksheet.json --export-csv shopify-canada-visits.csv
```

Keep the configuration with that export. Read the returned `errors` when the checker reports an incomplete record; do not fill missing observations with expected values just to make the command succeed.

## Method and scope

The worksheet was derived from the linked Shopify documentation, checked on 26 September 2026 UTC. Its checker passed **28 of 28 offline tests with invented records** on Python **3.14.7**, macOS **15.7.4 arm64**. Those tests include missing market evidence, changed egress, mixed IP/language inputs, signed-in state, granted location permission and an address entered during the first-visit IP pair. Python 3.10 syntax was checked; runtime execution used 3.14.7.

These results establish the tested record checks. No Shopify store, browser, proxy, checkout or address eligibility was tested. The protocol targets a configured Shopify Online Store; headless storefronts, B2B and custom routing need their own rules. The checker cannot establish IP-location accuracy, hidden app behaviour, tax correctness or actual delivery eligibility.

For a network exit requirement, use the [Canada proxy selection page](/proxies/canada). The guide and downloads are available without signup. ipvolt has not confirmed Canadian proxy availability. [Get early access](https://ipvolt.com/proxies#waitlist-closing). One email when access opens. Nothing else.


## Sources & further reading

- [Shopify market localization](https://help.shopify.com/en/manual/markets/getting-started/localization)
- [Shopify domain and language redirection](https://help.shopify.com/en/manual/international/automatic-redirection)
- [Shopify market types and early-access sub-region markets](https://help.shopify.com/en/manual/markets/getting-started/market-types)
- [Shopify shipping configuration](https://help.shopify.com/en/manual/fulfillment/setup/shipping-rates/setting-up-shipping-rates)
- [Shopify local-delivery eligibility](https://help.shopify.com/en/manual/fulfillment/setup/delivery-methods/local-delivery)
- [Shopify Liquid localization object](https://shopify.dev/docs/api/liquid/objects/localization)

## Related guides

- [Configure a proxy in Playwright](https://ipvolt.com/guides/playwright-proxy-setup.md)
- [France proxies: networks, regions and local testing](https://ipvolt.com/guides/france-proxies.md)

## Know when access opens.

ipvolt · Early access

Join the ipvolt early-access list for one email when access opens.

[Explore Canada proxy workflows](https://ipvolt.com/proxies/canada)

Consent: One email when access opens. Nothing else.

[Get early access](https://ipvolt.com/guides/shopify-canada-localization#waitlist-closing). Use the email form on this page to join the interest list.

[Privacy](https://ipvolt.com/privacy)

