Preferenze sui cookie

Scegli cosa possiamo usare. I cookie strettamente necessari ti mantengono connesso e non si possono disattivare; tutto il resto lo decidi tu e non cambia nulla nel funzionamento del sito. Puoi cambiare idea in qualsiasi momento dal piè di pagina.

Bundles of blue wires hanging loose in an equipment cabinet, each ending in a black connector that is plugged into nothing.

Your UTM tags work. The source just never reaches the sale

Photo by cnrdmroglu (opens in a new tab) on Pexels

UTM parameters tell your analytics where a visit came from, and nothing else. The source falls off on redirects, between pages and domains, at forms with no hidden fields, on every phone call and whenever staff retype a lead, and inconsistent naming splits what survives. Here is a setup that carries it to the CRM, and the backstop for when it does not.

Contents
  1. What a UTM parameter actually records
  2. Five places the source falls off
  3. Naming: facebook, Facebook and fb are three channels
  4. A naming convention that survives five people
  5. Capturing UTMs into hidden fields
  6. Keep the first source and the latest, separately
  7. Why a phone and email match is the backstop
  8. Measuring how much source you are losing
  9. What to fix first

UTM parameters tell analytics where a visit came from. They reach the lead and the sale only if something copies them there; most setups lose them on redirects, at forms without hidden fields, on calls and in retyped leads. Use one lowercase convention, capture first and latest source in hidden fields, and match sales to leads by phone and email.

A marketing manager tags every ad in a spring campaign: utm_source=facebook, utm_medium=paid-social, utm_campaign=spring-tuneup. Analytics shows the visits arriving exactly as labeled. Three months later the owner asks how much revenue the campaign produced, and the CRM has 412 leads from that period with a lead source of "Website", 96 with "Phone", 61 blank and 38 that say "facebook". The tags worked. The source just never made it past the landing page.

This is the most common gap in small-business attribution, and it is not an analytics problem. It is a plumbing problem: a parameter in a URL is not a field on a lead, and every step between the click and the closed sale is a chance for it to fall off. This post walks through where it falls off, a setup that keeps it, and what to do about the leads it never reaches, which for a business that sells by phone is many of them.

What a UTM parameter actually records

A UTM parameter is a label added to the end of a link, such as ?utm_source=newsletter&utm_medium=email. It records what the person who wrote the link said about the click. Analytics reads it from the page URL; nothing else in your stack sees it unless you copy it somewhere.

Two things follow from that page that matter for revenue, not just for traffic reports. First, a UTM value is free text written by a person, so it is exactly as consistent as the people writing links. Second, it describes the click, not the customer. It lives in the address bar for one page load. If the visitor's next action is to fill in a form on another page, call the number in the header or come back next week by typing your name into a search box, the label is gone unless your site stored it.

The five parameters worth writing, and what each should hold
ParameterWhat it should answerExample value
utm_sourceWhich site or sender sent the click?facebook, google, bing, mailchimp
utm_mediumWhat kind of placement was it?paid-social, cpc, email, display
utm_campaignWhich campaign, in your own name for it?2026-spring-tuneup
utm_contentWhich ad, creative or link in the email?video-15s, header-button
utm_termWhich paid keyword, if any?emergency-plumber

Five places the source falls off

Between a tagged click and a closed sale, a UTM source is usually lost in one of five places: a redirect that drops the query string, a move to another page or domain, a form with no hidden fields, a phone call that never carried it, or a person who retypes the lead. Inconsistent naming splits whatever survives.

1. Redirects that drop the query string

A UTM parameter is part of the query string, everything after the question mark. Redirects are written to move people from one address to another, and many are written without any thought for what was after the question mark: an old campaign landing page pointed at a new one, http to https, a vanity URL on a billboard, a link shortener, a CMS rule that tidies trailing slashes.

That is one server, and every platform has its own version of the same trap. The test takes two minutes and nobody runs it: paste a tagged link into a private browser window, follow it, and read the address bar on the page where you land. If the parameters are gone, so is your attribution for every click on that link, and analytics will usually file the visit as direct or referral without complaint.

2. Between pages and domains

Even when the parameters survive to the landing page, people rarely convert there. They read the service page, check the pricing page, and fill in the form on /contact, whose URL has no UTM on it. Analytics copes because it remembers the session; a form that reads only its own page URL does not. The same gap exists for chat widgets, and our post on live chat leads covers carrying the source into a conversation.

If your booking form, quote tool or payment page lives on a vendor's domain, the visit that arrives there starts fresh, and its source is your own website. That is the lead the vendor's system records, and often the one that gets exported to your CRM.

3. Forms with no hidden fields

A form sends what is in its fields. If no field holds the UTM values, the lead is created with whatever the form tool or CRM fills in by default, which is how 412 leads end up with a source of "Website". Most form builders support hidden fields; they have to be added, populated by a script or a URL setting, and mapped to a CRM property, and all three steps are easy to skip. Our post on organic search makes the same case for leads that arrive with no campaign at all.

4. Phone calls, which never had a UTM

A phone call is not a page view. It carries the caller's number, the number they dialed and the time, and nothing about the link that put that number in front of them. For many local businesses calls are most of the leads, so a UTM setup that covers forms perfectly can still leave the majority of revenue without a source.

So there are three kinds of call. A call to a number swapped in for one website visitor can inherit that visit's UTMs. A call to a fixed tracking number, printed on a mailer or set on a listing, carries whatever source you configured for it, which is accurate if the configuration is. A call to your main line carries nothing. Our post on call tracking covers which to use where.

5. Leads that staff retype

The last loss is human. A form lead arrives by email notification, a coordinator creates a new record in the CRM by hand, and the source field gets whatever the dropdown defaults to, or "Phone" because that is how the customer was eventually reached. An import from a spreadsheet does the same at scale. The original record, with its UTMs, may still exist, which is how one customer ends up as two leads with two sources; our post on duplicate leads covers untangling them.

Naming: facebook, Facebook and fb are three channels

Because UTM values are free text and case sensitive, the same channel tagged by three people in three ways becomes three rows in every source report, CRM view and spreadsheet that groups by the value. The channel looks smaller than it is, and nobody notices because each row looks plausible on its own.

Read those rules with a real campaign in mind. A paid Facebook ad tagged utm_medium=paid-social matches the paid pattern and lands in Paid Social. The same ad tagged utm_medium=boosted, a perfectly reasonable thing for a person to type, matches no paid rule, and because facebook is a social site it is reported as Organic Social. Your ad spend has just made your unpaid posts look brilliant. And because channel rules ignore case while source reports do not, facebook and Facebook sit together in the channel view and apart everywhere else, including in the CRM.

Here is what that does to one month of leads. The figures are illustrative; run the same count on your own export.

One month's lead file, grouped by the source column as written (illustrative)
Source valueLeadsShare
google31031.0%
Google858.5%
facebook16016.0%
Facebook606.0%
fb404.0%
Website707.0%
Phone454.5%
(blank)23023.0%
Total1,000100.0%

The arithmetic. Facebook's three spellings add up to 160 + 60 + 40 = 260 leads, 26% of the month, but its largest row shows 16%, so anyone reading the top line undercounts it by 10 points. Google's two rows are 310 + 85 = 395, or 39.5%. "Website" and "Phone" describe how the lead arrived, not what marketing caused it, so together with the blanks 70 + 45 + 230 = 345 leads, 34.5%, have no usable source at all. If those leads close at the same 12% as the rest and the average sale is $1,500, that is 345 × 12% = 41.4, about 41 sales, and 41 × $1,500 = $61,500 of revenue a month with no channel attached.

A UTM convention is only as good as the least careful person writing links. Count your source column by exact value once a month; every extra spelling of a channel is revenue reported somewhere it does not belong.

A naming convention that survives five people

A workable convention is short, lowercase, written down in one shared place, and enforced by a link builder or a spreadsheet rather than by memory. It fixes the allowed values for source and medium, gives campaigns a dated pattern, and uses the ad platforms' dynamic parameters wherever they exist.

  • Lowercase everything, with hyphens. No spaces, no capitals, no underscores in one place and hyphens in another. Spaces become %20 or + in a URL and break half the spreadsheets that read it.
  • Fix the source list. One value per platform: facebook, instagram, google, bing, linkedin, nextdoor, mailchimp. Write separate values for platforms you want to compare, such as facebook and instagram, and never abbreviate.
  • Fix the medium list, and make it match Google's rules. cpc for paid search, paid-social for paid social, email, display, affiliate, sms. A medium outside the list is a typo until somebody adds it on purpose.
  • Date the campaign. year-month-name, such as 2026-10-furnace-check, so that next year's campaign with the same idea does not merge with this year's.
  • Use dynamic values where the platform offers them. Most ad platforms can fill in the campaign or ad name in the link automatically. A value the platform writes cannot be mistyped, provided the campaign names themselves follow the convention.
  • Build links in one place. A shared sheet with dropdowns for source and medium, and a formula that assembles the URL, prevents more errors than any training session.
  • Never tag internal links. A UTM on a banner on your own homepage starts a new campaign mid-visit and overwrites the real source with "homepage".

The convention should also decide what the CRM's lead source field says for leads that did not come through a link: "phone-main-line", "walk-in", "referral", "unknown". Writing "unknown" on purpose is better than leaving the field blank, because a blank could mean the plumbing failed and "unknown" means somebody checked.

Capturing UTMs into hidden fields

To get a UTM from the URL onto a lead, a script reads the parameters on the first page of the visit, stores them in first-party storage, and writes them into hidden fields on whichever form the visitor submits. The form tool maps those fields to CRM properties, and the CRM export includes them as columns.

  1. Read the parameters on arrival, on every page. Any page can be a landing page. If the URL carries utm_source, read all five values and the page path.
  2. Store two copies: first and latest. The first copy is written once and never replaced. The latest copy is replaced whenever a new tagged visit arrives. Keep both in a first-party cookie or local storage with an expiry that matches your sales cycle, such as 90 days.
  3. Populate hidden fields on submit. Add hidden fields for first source, first medium, first campaign, latest source, latest medium, latest campaign and landing page to every form, including quote and booking forms. Fill them when the form loads and again just before it submits.
  4. Map each field to its own CRM property. Do not map a hidden field into the CRM's built-in lead source if a workflow or a salesperson can overwrite it. Create read-only properties for the captured values and leave the editable one to the sales team.
  5. Export the columns. Check that the captured properties appear in the lead export you actually use for reporting. Our guide to the CRM export covers what else that file needs.
  6. Test it every month. Click a tagged link in a private window, browse two pages, submit a test lead with a test name, and look at the CRM record. Then delete the test lead so it never reaches a report.

A form whose visitor arrived untagged should still submit something. Write the referrer's domain into the source field if there is one, and "direct" if there is not, so that the column has no blanks you cannot explain. That way a blank in the CRM always means the capture failed, which is a bug you can find, rather than a visit with no source, which is just a fact.

Keep the first source and the latest, separately

The first source is the channel that found the person; the latest is the one that brought them back before they converted. They are often different, and they answer different questions. Store both on every lead and choose which one credits a sale in reporting, not at capture time, where the choice is permanent.

If your CRM is HubSpot those two properties exist already, though the same article recommends a separate record-source property for how records were created, which is a reminder that imported and hand-made contacts are a different kind of record. Other CRMs, including Salesforce, usually need the fields added. Either way, the pattern is the same, and it is easiest to see on one customer.

One customer's path, and what each field holds at the end
DateWhat happenedFirst sourceLatest source
3 SepClicks a paid social ad, reads two pages, leavesfacebook / paid-socialfacebook / paid-social
19 SepOpens the newsletter, clicks throughfacebook / paid-socialmailchimp / email
2 OctClicks a search ad and submits a quote formfacebook / paid-socialgoogle / cpc
9 OctSigns a $4,200 contractfacebook / paid-socialgoogle / cpc

Credited to the first source, the $4,200 is paid social's; credited to the latest, it is paid search's. Neither is wrong, and the choice is the subject of our post on attribution models. What is wrong is a setup that stores one field and overwrites it, so that the record silently changes its answer depending on which visit happened last before somebody looked.

Why a phone and email match is the backstop

Even a well-built UTM setup misses calls to untracked numbers, leads retyped by staff, visitors whose storage was cleared and anyone who was never tagged. Matching closed sales to leads on normalized phone number and email does not need a UTM: it finds the lead a buyer came from and reads whatever source that lead carries.

This is where the hidden fields pay off a second time. A sale in your invoicing system has a customer phone number and email and no idea what a UTM is. A lead in your CRM has a phone number, an email and, if the plumbing works, a captured source. Joining the two on the contact details, after normalizing the phone numbers so (555) 555-0142 and +1 555-555-0142 are the same person, credits the sale to the source on the lead, with no tracking pixel and no cookie involved at the point of sale.

It also makes the gaps honest. A sale whose buyer appears in the lead file with a blank source is a plumbing failure you can see and count. A sale whose buyer is not in the lead file at all is a customer your marketing records never touched, as far as anyone can prove, and belongs in an unattributed bucket rather than in whichever channel had the best month.

CloseRev does the matching step and nothing upstream of it: it does not read URLs, set cookies or capture UTMs. You export closed sales and leads as two CSV files, and it matches each sale to a lead by normalized phone number or email, credits it to the source written in that lead's source column, and puts sales with no matching lead in Direct / Unknown. It reports the source column as written, so the naming in your lead file is the naming in the report.

Measuring how much source you are losing

The size of your UTM leak is two numbers: the share of leads with no usable source, and the share of closed revenue whose buyer matched a lead with no usable source. Both come from the lead export and the sales export you already have, and both should fall month on month once the fixes start.

  1. Export last quarter's leads with their source, medium and campaign columns, and count rows by exact source value, as in the table above.
  2. Mark each value as usable (a real channel in your convention) or not (blank, "Website", "Phone", "other", a spelling variant you have not merged).
  3. Merge spelling variants in the export, not in the CRM, and keep a list of what you merged so it can be checked.
  4. Match the quarter's closed sales to those leads on phone and email, and total the revenue whose matched lead has an unusable source.
  5. Split the unusable leads by how they arrived (form, call, chat, import) to see which of the five losses above is yours.

The split in the last step is usually decisive. If most unusable leads are form fills, the hidden fields are missing or unmapped. If most are calls, the forms may be fine and the phones are the problem. If most were created by a user rather than by a form, the leak is a process, and the fix is a CRM rule that stops manual leads being saved without a source.

What to fix first

Fix the losses in order of how much revenue sits behind them, which is usually phone calls, then forms without hidden fields, then naming, then redirects. Run the measurement above first, because the right order for your business is in your own lead file, not in a checklist.

  1. Write the naming convention down and build every new link from one shared sheet, starting today. It costs nothing and stops the problem getting worse.
  2. Add first and latest hidden fields to every form, mapped to read-only CRM properties, and test a lead end to end.
  3. Put tracking numbers on the channels that drive calls, and make sure calls appear in the lead file with the caller's number in a consistent format.
  4. Click every live tagged link in a private window and fix any redirect that drops the query string.
  5. Require a source on manually created leads, with "unknown" as an allowed answer, so a blank always means a bug.
  6. Match a quarter of sales to leads and compare the unattributed share before and after the fixes.

None of this is sophisticated, and that is the point. The campaigns were tagged correctly all along; the source was lost in ordinary places, to ordinary defaults, by people doing their jobs. A setup that carries the label to the lead, and a match that carries the lead to the sale, is what turns a traffic report into a revenue report.

A UTM is a label on a click, not a field on a sale. Name it consistently, catch it in hidden fields, keep the first and the latest, and let a phone and email match connect leads to revenue, with the leads it cannot source reported as unknown rather than guessed.

Questions people actually ask

Why do my UTM parameters show in Google Analytics but not in my CRM?
Because analytics reads the URL and your CRM does not. A UTM parameter only reaches a lead record if something on the page copies it into a form field, a chat attribute or a call tracker, and that field is mapped to a CRM property that is not overwritten later. If none of that plumbing exists, analytics has the source and the lead does not.
Are UTM parameters case sensitive?
The values are. Google Analytics' own help page says utm_source=google is different from utm_source=Google, so the two appear as separate rows in source reports. Its default channel rules are not case sensitive, which is why mixed spellings can look fine at channel level and be split everywhere else. Pick lowercase and enforce it.
Should I store the first or the latest UTM source on a lead?
Both, in separate fields. The first source tells you which channel found the person; the latest tells you which one brought them back before they converted. Write the first source once and never overwrite it, update the latest on every tagged visit, and decide in your reporting which one a sale is credited to.
Do phone calls carry UTM parameters?
Not by themselves. A call has a caller's number and the number they dialed, nothing more. A call tracker that swaps numbers per website visitor can record the visit's UTM values against the call; a fixed tracking number can only carry the source you configured for it; a call to your main line carries no source at all.
What should I do with leads that have no UTM source?
Keep them in the lead file with their phone number and email, and label the source as unknown rather than guessing. If the person later buys, matching the sale to the lead on phone or email still finds them, and whatever source the lead does carry is credited honestly. A guessed source is worse than a blank one.

See it on your own numbers.

Two exports and a few minutes. 14 days free, no card, nothing to install.