If you sell to customers in Quebec, the French version of your storefront isn't a growth experiment. It's a legal obligation, and the bar is specific: the French version has to be available on terms at least as favourable as the English one. Not a machine-translated afterthought behind a language toggle nobody can find. Same catalogue, same content, same functionality. Setting up a Shopify French language store for Quebec is mostly a configuration job you can do inside Shopify's native language tooling, and this post maps each obligation onto the exact surface it lives in — theme locale files, metafields, checkout, notification emails, packing slips.
One caveat before anything else. We build stores; we are not Quebec counsel. The wording of your terms of sale and any subscription agreement should be reviewed by a lawyer licensed in Quebec. Everything below is about implementation.
The rule in one sentence, then the nuance
Quebec's Charter of the French Language treats a commercial website as a commercial publication, which means it has to exist in French. That part predates Bill 96 by years. What Bill 96 changed was the teeth: sharper enforcement by the Office québécois de la langue française, a private right of action so a consumer can go after a business directly, and a set of phased obligations that landed through 2023 and 2025.
The ones that touch a D2C store:
- Your site, catalogue, ads, newsletters and promotional material must be available in French.
- Contracts of adhesion — your terms of sale, your subscription terms, anything the customer accepts without negotiating — must be presented in French first. The customer can then expressly agree to continue in English. "Presented in French first" is doing real work in that sentence; a link at the bottom of an English page isn't presentation.
- From June 2025, product inscriptions and public signage have stricter rules around non-French trademarks. If a registered mark contains a generic or descriptive term, that term needs a French equivalent on the product itself. This is a packaging problem, not a Shopify problem, but it lands on the same desk.
- Businesses with 25 or more employees in Quebec have francization registration duties with the OQLF. If you're an Ontario or BC brand shipping into the province, you're almost certainly out of scope here.
Enforcement is largely complaint-driven. Someone in Montreal has a bad experience, files a complaint, and the OQLF writes to you. The realistic risk for an out-of-province seller isn't a dawn raid. It's a notice, a deadline, and a scramble.
Do I need a French website to sell in Quebec?
Practically, yes, and the interesting question is whether you'd want to skip it anyway. Quebec is roughly a fifth of Canada's population and a market where a meaningful share of shoppers will simply leave an English-only site. We've watched session recordings where a Quebec visitor lands on a product page, scrolls once, and bounces in under eight seconds. No add-to-cart, no search, nothing. You can't A/B test your way out of that.
The awkward case: a small brand doing, say, $4,000 a month into Quebec out of a $120,000 monthly total. Does a full bilingual build pay for itself? Maybe not on direct revenue. But the compliance exposure doesn't scale with your Quebec revenue, and neither does a complaint. If you genuinely can't fund the translation, the cleaner decision is to exclude Quebec from your shipping zones rather than serve it badly. Most founders hate that answer. It is still the honest one.
One store, one domain, /fr: the URL structure that works
The most expensive mistake we see in a bilingual Canada setup is a second Shopify store for French. It splits inventory, splits analytics, splits reviews, doubles your app bills and guarantees the French catalogue drifts out of date within two quarters.
Do this instead. One store, one primary domain, French published as an additional language through Shopify Markets. Shopify serves the alternate language on a subfolder — yourbrand.ca/fr/products/handle — and generates the hreflang tags between the two versions automatically. Google indexes both. Search Console reports both. Your product handles stay identical, which matters more than people expect when you're reconciling ad URLs.
A domain-level split (yourbrand.ca and fr.yourbrand.ca) is available if you want it. For a two-language Canadian store, it buys you nothing and costs you SSL, DNS and a support ticket you didn't need.
Do not auto-redirect Quebec IPs to /fr. Shopify's geolocation recommendation is a dismissible banner plus a persistent language selector in the header, and that's the right pattern. Forced redirects break crawling, and they infuriate the anglophone Montrealer who now has to hunt for the switch on every page load. Put the selector in the header, not buried in the footer next to the currency picker.
Shopify's native languages vs a translation app
For English and Canadian French on a single Shopify store, native wins in almost every case. Shopify's Translate & Adapt app is free, stores translations in the platform rather than in a third party's database, and renders server-side so there's no flash of untranslated content.
Third-party tools like Weglot or Langify earn their keep in two situations. One: you have app-injected content in the DOM that native translation can't reach — a reviews widget, a bundle builder, a subscription widget rendering its own labels. Two: your marketing team wants to edit translations without touching the admin. Both are real. Weigh them against a monthly fee that scales with word count and a JavaScript layer that has to load and run before the customer sees French text. If you go that route, watch what it does to your LCP on 4G in Quebec City; a translation script that adds 300ms is a bad trade for content you could have translated natively. Our SwiftStore app is what we use to keep an eye on the score after any change like that.
Our default recommendation: native Translate & Adapt, plus a per-app check on anything that renders text the platform doesn't own.
Product descriptions, metafields and the fields nobody remembers
Translate & Adapt covers product titles and descriptions, collection copy, pages, blog posts, theme content from your locale files, and metaobjects. The gap that bites: metafields are not translatable until the definition is marked as such. Go into Settings → Custom data, open each definition, and enable the translation option. Do it before you translate, not after, or you'll be re-entering French copy for every ingredient list, size guide and care instruction on the store.
The fields teams forget, in rough order of how often we find them still in English on a "finished" French site:
- SEO title and meta description on products and collections. Translate & Adapt exposes these; nobody scrolls down to them.
- Image alt text.
- Variant option names and values. "Size / Large" stays English unless you translate the option set.
- Theme section content hard-coded into the template instead of pulled from locales/fr.json. Any developer text typed straight into a Liquid file is invisible to the translation editor. This is the single most common reason a French page has three English strings on it.
- Shipping policy, refund policy, terms of service.
- Cart drawer strings and the free-shipping progress bar, which often come from an app.
If your theme was customised by a previous developer who wrote copy directly into sections, budget a day to lift those strings into the locale files. It's unglamorous and it's the difference between a French storefront and a French-ish one. This is straightforward work for a developer who knows Liquid; it just has to actually get done.
Checkout, emails and the packing slip
Checkout is the easy part. Shopify's own checkout strings ship localised in Canadian French, and checkout follows the language the customer was browsing in. So a shopper who switched to French on the PDP gets a French checkout, French Shop Pay prompts and a French order status page without you doing anything. Confirm it in Settings → Languages that French is published for the Canadian market, then place a test order in /fr and read every screen.
What doesn't come free:
- Checkout UI extensions. Custom fields, delivery instructions, gift messages, age gates — each extension needs its own localisation file. If yours has one language, it has one language.
- Notification emails. Shopify's default templates are localised to the customer's locale. Any custom Liquid or HTML you've added to the order confirmation or shipping confirmation is not. Wrap your custom blocks in a conditional on the customer's locale and write both versions. Tedious, but it's a two-hour job across the templates that matter: order confirmation, shipping confirmation, out for delivery, refund.
- Marketing email. Omnisend and Klaviyo don't inherit Shopify's language handling. Sync the locale onto the contact as a property and branch the welcome, abandoned cart and browse-abandon flows on it. A single bilingual template with both languages stacked is the cheap version and it looks cheap.
- Packing slips. Shopify's packing slip is one Liquid template. It has no notion of your customer's language. If you want French slips for Quebec orders, you edit the template and conditionally render on the shipping province — check for the QC province code and output the French labels. Same for any invoice app, which usually has its own template with its own quirks.
Carrier-generated content is outside your control, which matters more in Canada than elsewhere. When Canada Post service is disrupted and you fail over to Purolator or UPS, the tracking pages and any carrier-side notifications change with it. Your own shipping confirmation email is the one piece of that chain you own, so make sure the French version of it is the one that carries the useful information.
Quebec French, not Paris French
Run your catalogue through machine translation and you'll get serviceable French that reads as European. Quebec shoppers notice. Courriel rather than email. Magasinage. Panier is fine; chariot is not. Product categories in fashion, food and beauty diverge more than you'd expect.
The workflow that works: machine-translate everything to get a complete French site standing, then have a Quebec-based reviewer post-edit the pages that carry revenue — homepage, top 30 products, the collection pages that take paid traffic, the policy pages, the checkout extensions. The long tail can sit on post-edited machine output for a while. It cannot sit on nothing.
Search behaviour is its own problem. French keywords are not translations of English keywords, and the search volume distribution is different. If organic matters to you in Quebec, do the keyword research natively in French instead of translating your English target list and hoping.
What the bilingual build actually costs
Work the translation volume out before you get quotes. Take a 300-SKU store averaging 120 words of description per product: that's 36,000 words of product copy alone, before pages, policies, theme strings and email templates — call it 45,000 all in. Professional human translation in the range we typically see quoted lands around CAD 0.18 a word, so roughly $8,100. Post-editing machine output runs closer to half that, so about $4,000. Machine only, reviewed in-house by someone who actually speaks Quebec French: a few hundred dollars of credits and a week of somebody's attention.
Development time is smaller than most people assume. Publishing the language, configuring the market, wiring the switcher, enabling metafield translation, lifting hard-coded theme strings, conditionalising the notification templates and the packing slip — for a reasonably clean theme, that's two to four days. A heavily customised theme with six apps rendering their own text is where it stretches, and the stretch is almost entirely app-by-app investigation.
Separately, and often confused with the language question: Quebec sales tax. QST runs at 9.975% on top of the 5% GST, and out-of-province sellers hit a registration threshold based on sales into the province. Shopify's tax settings handle the collection once you're registered. Ask your accountant about the registration, not your developer.
Sequencing it around the peak
Don't launch French in the second week of November. The /fr pages need time to be crawled and indexed, your team needs time to catch the strings you missed, and Quebec runs Boxing Day hard on top of Black Friday. September is the right month to do this work for a store that wants French traffic converting in December.
Questions we get asked
Does a Google Translate widget satisfy the requirement? No. It produces a client-side rendering of an English page, it isn't indexable, and it doesn't give you a French version on terms as favourable as the English one. It also translates your terms of sale into something you never wrote, which is a worse problem than the one you were solving.
Do my ads need to be in French? Commercial advertising directed at Quebec falls under the same rules as the site. If you're running Meta or Google campaigns targeted at Quebec geography, the creative and the landing page should be French. Splitting the campaign by language is better for performance anyway.
What about the packaging on the products themselves? Prepackaged consumer goods sold in Canada already require bilingual labelling federally, so most brands are further along here than they think. The 2025 trademark rules are the new part — if your brand mark includes a descriptive English term, that term needs a French equivalent on the product.
Can I publish French only for Canada and keep the US store English? Yes. Markets lets you set which languages are published per market, so French Canadian shoppers on your .ca domain get the switcher and US visitors never see it.
If you want to know how much of this your current store already handles, the fastest way is to open a /fr page on mobile and read every string on it out loud. The ones in English are your scope. We also run a free technical review that includes the language and market configuration if you'd rather have someone else find them — start there, or read how we approach builds for Canadian merchants.


