Short answer: In a web address, the first ? starts the query string and each parameter after it is joined with &. If a link has a second ?, everything after it is read as part of the previous value, so the next UTM tag is lost. Replace the second ? with &.
What is a query string?
Query string: the part of a link after the first ? and before any #, made of name=value pairs joined by &, where UTM tags and other parameters live.
The web address standard, RFC 3986, says the query is "indicated by the first question mark" and ends at a # or at the end of the link. A second ? doesn't start anything new. It's just a character inside a value.
What happens when a link has two question marks?
The parameter straight after the second ? is swallowed by the one before it. Analytics tools see one long, odd value and no separate tag.
Take ?id=42?utm_source=newsletter. The tool reads one parameter, id, with the value 42?utm_source=newsletter. There is no utm_source at all, so the source shows as missing.
Why does this happen?
- Adding tags to a link that already has parameters: the page address is
example.com/product?id=42, and someone adds?utm_source=...to the end. - Spreadsheet formulas: a formula always joins the base link and tags with
?, even when the base link already has one. - Ad and email tools: a tool appends its own
?parameters to a link that already carries yours. - Copy and paste: a full tagged link gets pasted onto the end of another one.
Example
A product link with tags added using a second ?:
https://example.com/product?id=42?utm_source=newsletter&utm_medium=email&utm_campaign=oct
The fixed link, with & before the first UTM tag:
https://example.com/product?id=42&utm_source=newsletter&utm_medium=email&utm_campaign=oct
In the broken version, utm_medium and utm_campaign still come through, but utm_source is lost inside the id value. That's why this problem can be hard to spot: reports aren't empty, just missing one field.
How to fix it
- Paste the link into the link checker. It flags any link with more than one
?and lists what each parameter actually contains. - Keep the first
?. Change every later?that starts a new parameter into&. - If a tool adds its own parameters, check the link after the tool has changed it, not before.
- In spreadsheets, check whether the base link already contains
?and join with&if it does. - Use the UTM builder, which reads the existing link and adds tags with the right separator.
- Watch for a
#too. Parameters after a#have their own problem, covered in parameters after the #.