# Methodology

Filtered the registered chain-location asset to `CareVet` (205 rows).

**Source class:** public location finder: <https://www.carevet.com/wp-content/uploads/site-scrape/output/search.json>. The class comes from the URL the rows were read from (`locator_url_resolved`, else `source_url`).

**Whole crawl:** 23 chains from public location finders (including 1 from a host retailer's store locator) and 4 chains from careers/office listings (1,857 of 7,894 rows).

**Groupings:** state, city, contact, host and overlap values are deterministic groupings of the rows. A website counts as a chain website only when it differs from the row's source and locator URL and is not a job or careers URL; otherwise the page shows it as the locator page.

**Overlap:** City key: Unicode-fold to ASCII and lower-case; read '&' as 'and'; treat a word 'st', 'st.' or 'saint' as 'saint', 'ft'/'ft.' as 'fort' and 'mt'/'mt.' as 'mount'; then drop every character that is not a letter or digit. Two rows share a city when their city keys and two-letter states are equal; rows without a city are left out.

**Registry ratios:** exact matches only (normalized name plus city, or normalized street plus five-digit ZIP), so match counts are a lower bound. Ratio: `chain rows / registry rows * 100`.

**Cleaning:** Doubled apostrophes carried over from SQL-style escaping ('') become one apostrophe. A city value that begins with a street fragment ending in Rd, Road, Ave, Avenue, Blvd, Dr, Drive, Hwy, Pkwy or Ln moves that fragment to the street field. A street value that ends with ', <city>, <state> <ZIP>' (the row's own city, state and ZIP) drops that repeated suffix. Cells changed for this chain: 0 (listed in provenance.json).

**Excluded rows:** A row that repeats an earlier row of the same chain with the same normalized name, street and five-digit ZIP is a duplicate; empty city or phone values of the kept row are filled from the repeat. In a careers/office listing, a row named only with a state code (optionally ' - region'), a row whose name contains 'Corporate', and a row whose name ends in 'Remote' are offices or remote-role listings, not practices. A row whose location name ends with the chain's own 'CLOSED' label is a closed location. Excluded rows are left out of every count, share, directory and download, and are listed in excluded-rows.csv and each chain's provenance.json. Rows excluded for this chain: 0.

**City-and-state counts** use the city key above.

**Shares:** chain listed locations ÷ 7,894 listed chain locations × 100 (the crawl has 7,965 rows; 71 are excluded (5 duplicate GoodVets rows, 10 office or remote-role rows in careers feeds, 56 rows labelled closed by the chain), leaving 7,894 listed chain locations; the veterinary chain locations report counts 7,961, removing 4 GoodVets repeats only).

**Change log:** 0 added, 0 removed since 28 Sep 2026 (crawl of 2 Oct 2026); 0 listed locations with a changed name, phone or website.

**Owner and review:** Owner: Rome (Vettica). Review trigger: the next quarterly recrawl (due by 2026-12-28) or a correction report; figures are re-derived from the new crawl.

National HTML shows at most 10 directory rows; state pages and files contain all rows.

## Technology scan

- **Unit and scope:** one website host. The hosts are the chain websites listed on this page (1), the same set as the "website hosts" figure; the scan's own chain tags are not used.
- **Pages read:** the home page plus at most one linked same-site booking or portal page. A linked page on a third-party vendor host is fetched but not used, because it carries the vendor's own code. The scan does not run JavaScript, so widgets added by scripts can be missed.
- **Crawl rules:** robots.txt is respected on every host and redirect target (an unavailable robots.txt counts as an error); at most one request per second per host; 10-second timeout; user agent `VetticaResearchBot/0.1`.
- **Signature set:** `m75-2026-10-03-v4`, fetched 2026-10-03T20:06:27Z to 2026-10-03T20:06:27Z (UTC). Every host on this page was scanned with this one set.
- **What counts:** a vendor's code or link in an accepted evidence class: script or iframe embed, vendor link, stylesheet or script asset, image, logo alt text, generator tag, JSON-LD value, page text with the required wording, or inline analytics code. Never counted: CSS selectors and style rules, analytics or monitoring configuration (except as analytics evidence), social- and listing-profile data, CMS panel names alone, customer-review text, HTML comments and class names, resource hints, links to the site's own pages, and the Birdeye review-showcase embed. One piece of evidence supports one category. An appointment button without a vendor link is page design and is reported in a note, not in the table.
- **Counts:** location websites (hosts) with at least one detection in a category, out of the fetched hosts. Non-detection is unknown. The table needs at least 10 fetched hosts; with fewer, the page shows the coverage paragraph only. Zero rows are kept only for chat and online booking, the categories most often added by scripts. This page has 1 fetched host, so it shows the coverage paragraph only.
- **Shared platform:** for every fetched host the scan records its asset fingerprint (stylesheets and scripts), its Google Tag Manager containers and its most common CMS class prefix (plugin and framework prefixes excluded). The page's shared-platform figure is the most common of three signals: the same GTM container with the same class prefix, the same asset set, or the same class prefix (ties in that order). The paragraph is shown when that signal covers at least half of the fetched hosts. The paragraph is not shown, because this page has no table.
- **Coverage on this page:** 1 hosts; 1 fetched (1 home page only, 0 with a same-site linked page), 0 blocked by robots.txt, 0 errored; template test unknown on 0.
- **Data:** `dataset.json` → `technology_scan` has the figures, every host's status and coverage (`host_coverage`), and every counted detection with its evidence class, evidence URL, vendor target and fetch time (`detections`). The scan database's sha256 is in `provenance.json` (`f3d35ea65111…`).
