Analytics

    UTM Parameters and Canonicals for Clean Local SEO Reporting

    TP
    thinkprofits.com

    Local reporting falls apart in a predictable way. A business runs a Google Business Profile for each location, a few paid campaigns, an email list and some directory listings. Six months later nobody can say which location's profile drove which leads, the analytics shows an implausible amount of direct traffic, and Search Console and Analytics disagree about which pages exist.

    Almost always, the cause is not the reporting tool. It is three infrastructure decisions made separately and never reconciled: which host is preferred, whether redirects preserve query strings, and what the canonical tag points at. Get those three right and local reporting becomes straightforward. Get any one wrong and no amount of dashboard work will fix it.

    Start with one preferred host

    Every site has more variants than its owners think: http:// and https://, www and non-www, trailing slash and no trailing slash, uppercase and lowercase paths, index filenames. Each combination is a distinct URL to a crawler and to most analytics implementations.

    Pick one canonical form and enforce it absolutely:

    • Protocol: HTTPS only, with HSTS.
    • Host: one of www or apex — the choice matters far less than the consistency.
    • Trailing slash: one convention, applied to every internal link.
    • Case: lowercase paths, with redirects for mixed case.

    Enforce with single-hop 301 redirects. A request to http://example.com/Page should reach https://www.example.com/page/ in one redirect, not three. Redirect chains lose parameters, slow crawling, and are a common reason tagged campaign traffic arrives untracked.

    Then make sure every internal link, every sitemap entry, every canonical tag and every campaign URL uses that exact form. Inconsistency here is what creates the phantom duplicate pages that show up later in Search Console's page indexing report.

    A UTM dictionary for local campaigns

    UTM parameters only produce clean reporting if everyone uses the same values. A dictionary — a short document listing permitted values for each parameter — is the entire discipline.

    The five parameters, used consistently:

    • utm_source — the platform. google, bing, facebook, yelp, newsletter. Lowercase, no spaces, never a URL.
    • utm_medium — the channel type. organic_local, cpc, email, referral, social. Keep this list very short; it is what channel groupings key off.
    • utm_campaign — the initiative. gbp_profile, spring_promo_2026, brand_always_on.
    • utm_content — in local setups, the location identifier. vancouver_homer, burnaby_metrotown.
    • utm_term — keyword or link placement where relevant.

    Google Business Profile tagging

    Business Profile is the single highest-value place to tag, because untagged profile clicks routinely land as direct or organic and disappear into an unattributable bucket. Each profile has several linkable surfaces, and each deserves its own value:

    • Website link: ?utm_source=google&utm_medium=organic_local&utm_campaign=gbp_profile&utm_content=vancouver_homer
    • Appointment or booking link: utm_campaign=gbp_booking, same source, medium and content.
    • Menu, services or products links: utm_campaign=gbp_services.
    • Posts and offers: utm_campaign=gbp_post_<month>.

    Two things to be careful about. Use organic_local rather than organic as the medium — some analytics platforms will reprocess a literal organic medium in ways that overwrite your attribution. And keep the destination a real, indexable page in your preferred host form, not a redirect and not a parameterized variant of another page.

    Directories, review sites and offline

    Apply the same dictionary to every listing you control: industry directories, chamber of commerce pages, association listings, review platforms. For print, signage and vehicle wraps, use a short, memorable redirect path that appends the UTM server-side rather than printing a parameter string nobody will type.

    Make redirects preserve the query string

    This is where most local tagging quietly fails. A perfectly constructed Business Profile URL is worthless if the www-to-apex redirect strips everything after the question mark.

    Most server and CDN redirect rules discard the query string unless told otherwise. On Apache, that is the QSA flag. On Nginx, appending $is_args$args. On most hosting platforms and CDNs, a query-string forwarding option that is not always on by default.

    The test takes two minutes per redirect:

    1. Take a tagged URL and deliberately request the wrong host and protocol variant.
    2. Follow the redirect chain with a tool that shows every hop.
    3. Confirm there is exactly one hop, and that the parameters are intact at the destination.
    4. Confirm the landing page's analytics records the campaign, not direct.

    Run this test for every location's Business Profile URL, not just one. Location pages are often added later by different people and end up on paths that hit different redirect rules.

    Keep canonicals clean and self-referencing

    The canonical tag's job here is simple: tell Google that the clean URL is the one to index, regardless of how many tagged variants exist.

    Rules that hold in almost every local setup:

    • Self-reference every indexable page. The location page at /locations/vancouver/ carries a canonical pointing to its own absolute URL in the preferred host form.
    • Never include UTM parameters in a canonical. The canonical is the clean URL, always.
    • Use absolute URLs. Relative canonicals resolve unpredictably when the host varies.
    • One canonical tag per page. A CMS plugin and a template both emitting one is a frequent and confusing fault.
    • Do not point location pages at each other or at a hub. Canonicalising every location to the main services page is the fastest way to remove your locations from local search.
    • Match canonical, sitemap, internal links and redirects. All four should name the same URL, character for character.

    Check the rendered canonical, not just the raw HTML. Where JavaScript rewrites head tags, the two can differ, and Google uses what it renders.

    Search Console and Analytics measure different things

    A recurring source of confusion in local reporting is that the two systems will never agree, and should not be expected to.

    Search Console reports organic search performance against canonical URLs. It does not break out UTM parameters, because those are not part of the search result — a click from a tagged Business Profile link is not an organic search click at all in Search Console's model. Your analytics platform reports sessions against the actual landing URL, parameters included, attributed to whatever the UTM says.

    So Business Profile clicks appear in Business Profile insights and in analytics under your organic_local medium, but not in Search Console's search performance report. Organic search clicks appear in Search Console against the canonical, and in analytics as organic without any UTM at all. Neither system is wrong; they are answering different questions.

    Report them side by side with the difference stated, rather than trying to reconcile them into one number. A local report that shows search impressions and clicks from Search Console, profile actions from Business Profile, and tagged sessions and conversions from analytics is honest. One that adds them together is not.

    Governance for multi-location businesses

    Everything above scales badly without governance, because location profiles get edited by location staff.

    • Maintain a single URL registry. One row per location per surface: the profile, the intended destination, the full tagged URL, the location identifier, and who owns it.
    • Standardise location identifiers once. vancouver_homer forever, not van_homer in one place and Vancouver-Homer in another. Analytics is case-sensitive and will split them.
    • Audit profile links quarterly. Links get replaced during profile edits, by suggestions Google applies, or by staff pasting a shorter URL.
    • Give every location a real page. Sending several locations to one page makes both the local ranking and the reporting worse.
    • Lock the dictionary. New values get added by request, not invented at campaign launch.

    Common mistakes worth checking today

    • Internal links containing UTM parameters — this rewrites the visitor's session attribution mid-visit and creates crawlable tagged URLs.
    • Tagged URLs in the XML sitemap.
    • UTMs on links inside your own emails pointing to your own site, then a second set applied by the email platform.
    • Redirect chains between the tagged link and the destination.
    • Canonical tags pointing to http or the wrong host after a migration.
    • Mixed case in UTM values producing duplicate rows in analytics.
    • Business Profile links pointing to a page that no longer exists and 301s to the homepage — which reports as a homepage session with the location's campaign, quietly overstating homepage performance.
    • Parameters other than UTMs — session IDs, filters, tracking IDs — creating indexable variants without canonicals.

    Technical QA checklist

    • One preferred host, enforced with single-hop 301s from every variant.
    • Query strings preserved through every redirect rule, verified with a live tagged URL.
    • Self-referencing absolute canonical on every indexable page, verified in the rendered DOM.
    • No UTM parameters in canonicals, sitemaps or internal links.
    • Every Business Profile surface tagged from the dictionary, with a stable location identifier.
    • Analytics channel grouping recognises organic_local as its own channel.
    • Conversions attributed at the location level and reconciled with profile insights monthly.
    • URL registry current, with an owner per location.

    Where this fits

    None of this is glamorous work, and all of it compounds. Clean hosts, preserved parameters and correct canonicals are what make local performance measurable per location — which is what makes it improvable per location.

    It is foundational to our local SEO services, and the measurement side is set up as part of our marketing reporting service. If you want the wider organic program alongside it, that sits under SEO services.

    For a fast read on how your canonicals and technical foundations currently look, run the site through the tool below.

    One host, one canonical per page, one dictionary of campaign values, and redirects that carry the query string through. Four decisions, and local reporting stops being an argument about numbers.

    Google Ads Language Targeting Changes: A 2026 Checklist for Canadian Advertisers

    You May Also Like

    Ready to Grow Your Profits?

    Join the 3,500+ businesses across Vancouver, Canada, and the USA who trust ThinkProfits.com to deliver predictable revenue growth. Vancouver's longest-running digital marketing agency. Since 1996.