1\section{Data: snapshot, cleaning, provenance and representativeness}\label{sec:data}23\subsection{Snapshot and samples}4The research copy is a read-only backup of the Fabri-Ka production database taken on 1 November 2026 at 17:38 UTC (application commit \texttt{689c7bb}); the only tables containing personal data (two user accounts, one self-registration) and the derived full-text index were dropped on the production node before the copy left it. The copy holds 465{,}388 product rows, of which 390{,}108 are active and published by the platform's own rules --- gift cards, workshops, subscriptions, tickets and price-out-of-bounds quarantines are excluded upstream --- in 1{,}569 enabled stores, plus 577{,}773 synchronisation events. Table~\ref{tab:sample_flow} and Figure~\ref{fig:attrition} trace the path to the two analysis samples. We drop one store flagged out of mission by the platform, keep one representative listing per (store, normalised title) because many merchants publish colour or format variants as separate products (19{,}245 non-representative listings), and remove eleven \emph{mirror domains} --- language or top-level-domain twins of the same business, detected by domain stem or by a title overlap of at least 90\% of the smaller catalogue --- which would double-count assortments and manufacture within-firm ``cross-merchant'' price pairs. The \textbf{assortment sample} has 370{,}054 listings in 1{,}557 stores and twenty categories. The \textbf{price sample} further requires a Canadian-dollar store and listing, a positive posted price not ``on request'' and at most 50{,}000~CAD (9{,}635 listings have no posted price, 729 are in foreign currency, 78 exceed the cap): 359{,}612 listings. Within the assortment sample, 13.1\% of listings are marked sold out by the merchant, 8.7\% carry a strike-through price, 27.8\% have several variants, 76.7\% carry a merchant SKU and 75.6\% a brand field.56\input{tables/sample_flow}78\begin{figure}[htbp]\centering9\includegraphics[width=0.95\textwidth]{\FR{attrition.pdf}}10\caption{Sample flow from database rows to the assortment and price samples. Source: Fabri-Ka research snapshot (2026-11-01).}\label{fig:attrition}11\end{figure}1213\subsection{Merchant geography}\label{sec:data_geo}14The platform assigns a region from the discovery source (regional directories), from region mentions on the site, or from a map of forward sortation areas (FSA, the first three characters of the postal code); coordinates are FSA centroids obtained from a public geocoder, never civic addresses. At the snapshot 346 of the 1{,}569 live stores had no region, including the four largest catalogues (a book retailer, a souvenir printer, a trailer-parts seller and a pet-supply retailer). We recovered regions from official geography: for urban FSAs the sector label is matched to the MRNF municipality table (393 stores, 95.9\% agreement with the point-in-polygon of the centroid where both exist), then the platform's own label is kept (865 stores), then the FSA centroid is located in the MRNF administrative-region polygons (82 stores). The order was amended after preregistration (A-001): a first attempt with the Statistics Canada 2021 economic-region layer produced 229 apparent conflicts between platform labels and polygons, of which 99 were a spelling artefact and most of the rest the Brome-Missisquoi/Haute-Yamaska transfer from Montérégie to Estrie that the 2021 layer predates; with the current MRNF layer the platform label and the polygon containing the centroid agree for 89.1\% of the 1{,}118 stores that have both (124 disagreements); the disagreements are mostly rural FSAs whose centroids fall near a border, which is why the platform label is preferred to the centroid, with one exception: platform labels that place a store in Montérégie while its centroid lies in the Brome-Missisquoi or La Haute-Yamaska MRCs predate the 28 July 2021 transfer of those MRCs to Estrie and are overridden to Estrie (16 stores). Every store whose final region differs from the polygon containing its centroid is flagged, and a point-in-polygon-first assignment is one of the robustness variants. After recovery, 229 live stores (226 in the assortment sample; 71{,}692 listings, 19\% of it) remain without a location; they come mainly from gift directories and search sweeps, are reported as a separate ``Inconnue'' row in descriptive tables, and are excluded from all regional inference. One further caveat: the telephone field of 250 stores is the switchboard of the certification directory that listed them (212 carry the number of Les Produits du Québec); telephones are therefore never used for geography. Table~\ref{tab:region_summary} summarises the regional sample.1516\TM{region_summary}1718\subsection{Category labels: audit and classifier (Amendment A-002)}\label{sec:data_categories}19The platform assigns one of twenty categories by keyword rules on the merchant's product type, tags, title and option names. We audited these labels on a stratified random sample of 500 listings (25 per category) annotated independently by two large language models (claude-opus-5-5 and gpt-5.5) given the platform's own taxonomy definitions; the two annotators agree with each other on 94.8\% of listings but with the rule label on only 45.2\% and 44.6\% respectively, so the precision of the rule label against annotator consensus is 0.46 (Table~\ref{tab:cat_audit}). Errors are structured: the ``other'' bin is almost entirely resolvable into industrial, art or home goods; ``art'' absorbs industrial and craft supplies; beverages, alcohol, pets and outdoor goods are frequently mislabelled fashion or art when a merchant's tags are generic. Jewellery, garden and fashion are the most reliable rule labels.2021Because a 46\% label precision would make every category-based statistic largely noise, Amendment A-002 introduced a supervised classifier whose primacy rule was fixed before any result was computed under it: it replaces the rule labels as the primary labelling only if its accuracy on the held-out audit exceeds the rule labelling by at least twenty points. The classifier is a multinomial logistic regression on a 512-dimension text embedding of the listing (title, merchant product type, merchant category path, brand and tags; OpenAI \texttt{text-embedding-3-small}) plus the one-hot rule label, trained on 6{,}481 listings sampled in proportion to category size (floor 150) and labelled by a third model (claude-sonnet-5-5), which agrees with the rule labels on 43.8\% of its sample --- the same order as the two audit annotators. Five-fold cross-validation against these single-annotator training labels gives 0.69; on the independent audit consensus (474 listings never used in training) the classifier reaches 0.88 (0.91 when the stratified audit is reweighted to the assortment's category shares) against 0.46 for the rule labels, so the model labelling is primary and every category-based result is also reported under the preregistered rule labelling. Per-category precision on the audit is at least 0.80 for all categories but maple, fine grocery and meat (0.70--0.74); the residual ``other'' bin disappears (0.0\%) and the largest shifts are from ``other'' and ``fine grocery'' into industrial, art and fashion goods. The classifier relabels 52.3\% of listings; its median confidence is 0.88 and its tenth percentile 0.44, and low-confidence listings are concentrated in the food categories whose boundaries (grocery versus chocolate, bakery, beverages) are genuinely ambiguous.2223\subsection{Cross-merchant matching: candidates and validation}\label{sec:data_matching}24Tier-A (shared SKU) and tier-B (same brand, identical title) candidates number 1{,}837 and 457 pairs in different stores, of which 1{,}683 and 381 have a comparable variant structure; fuzzy tier C adds 446 (324 comparable) and identical-title-only tier D 2{,}713. On a validation sample of 60 pairs per tier, two independent annotators agree on 87.5\% of pairs; among the pairs with consensus the share judged the same product is 0.98 for tier A, 1.00 for tier B, 0.89 for tier C and 0.21 for tier D (Table~\ref{tab:match_val}); counting non-consensus pairs as failures gives lower bounds of 0.92, 0.90, 0.77 and 0.17. These are the precision figures we carry into the hedonic analysis (a first draft reported the lower bounds as point estimates); the tier-D figure confirms that identical titles across artisanal shops (``savon à la lavande'') are not the same product.2526\input{tables/match_validation}2728\subsection{External data}\label{sec:data_external}29Regional covariates and geography were downloaded from their official sources with a manifest of URLs, licences, vintages and checksums (Appendix~\ref{app:source}): ISQ population at 1 July 2025, ISQ business locations with employees in December 2025 (all industries, retail NAICS 44--45, manufacturing 31--33), ISQ disposable income per capita 2024 and regional GDP 2024, Statistics Canada Census 2021 land area and density, the MRNF administrative-region and municipality layers (version 2026-10) and the Statistics Canada 2021 FSA boundaries. No recent regional (as opposed to provincial) measure of household or business e-commerce adoption exists; the only regional split of household internet access is the 2012 ISQ survey, which we do not use.3031\subsection{Representativeness}\label{sec:data_repr}32Fabri-Ka's store counts track the regional business base closely in levels --- Spearman correlations with ISQ business locations of 0.91 (all), 0.89 (retail) and 0.93 (manufacturing), and 0.84 with population --- but coverage per thousand business locations varies six-fold across regions (1.8 to 11.1, coefficient of variation 0.43; Table~\ref{tab:external}), with the agri-food and craft regions covered by dedicated directories (Saguenay--Lac-Saint-Jean, Bas-Saint-Laurent, Gaspésie) over-represented relative to Montréal and Laval. This is a discovery artefact, not a feature of the regional economies, and it is the main threat to every regional comparison below; Section~\ref{sec:robust} re-estimates the results on stores discovered through certification and association sources only and without Montréal.3334\input{tables/external_coverage}35