Country9 min read

Test Shopify Canada localization

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

On this page

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, Python checker and README. For a spreadsheet view, keep the configuration CSV and 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, 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.

VisitEntryExitLanguageBrowser stateShipping address
ip-ASame neutral URLObserved CAen-CAFresh, signed outNone entered
ip-BSame neutral URLObserved non-CA controlen-CASeparate fresh context, signed outNone 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.

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.

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 exposes selected country, language and the applicable country-region market; the download supplies no tested Liquid instrumentation. Country and region market scope.

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.

PairChange between visitsKeep fixedWhat it helps diagnose
urlNeutral entry → configured Canada entryCA exit, en-CA, fresh contextsInteraction between entry URL and configured redirection.
languageBrowser preference en-CA → fr-CACanada entry, CA exit, fresh contextsWhether the configured French experience appears.
savedFresh context → deliberately retained manual choiceCanada entry, CA exit, fr-CAWhether the recorded selector choice is respected on return.
provinceApproved Ontario → Quebec delivery addressCanada entry, CA exit, en-CA, equivalent fresh cartsDelivery outcomes for those two destinations.
cross_borderApproved non-CA → Ontario delivery addressControl-market entry, non-CA exit, en-CA, equivalent fresh cartsCheckout 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.

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.

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.

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.

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. The guide and downloads are available without signup. ipvolt has not confirmed Canadian proxy availability. Get early access. One email when access opens. Nothing else.

Sources & further reading

Technical references used for this guide. Check the documentation for your installed version and your provider’s supported configuration.