[{"data":1,"prerenderedAt":1017},["ShallowReactive",2],{"guide-url-parsing-analytics-tracking":3},{"id":4,"title":5,"body":6,"date":1008,"description":1009,"extension":1010,"meta":1011,"navigation":1012,"path":1013,"readingTime":256,"seo":1014,"stem":1015,"__hash__":1016},"guides\u002Fguides\u002Furl-parsing-analytics-tracking.md","URL Parsing for Analytics and Tracking: What You Need to Know",{"type":7,"value":8,"toc":982},"minimark",[9,14,18,21,25,28,143,146,156,161,326,330,371,375,382,406,410,464,467,471,474,544,548,607,610,614,618,627,789,793,802,806,813,817,821,824,839,856,860,867,907,911,914,918,941,945,966,970,978],[10,11,13],"h2",{"id":12},"how-urls-drive-analytics","How URLs Drive Analytics",[15,16,17],"p",{},"Every web analytics platform relies on URL parsing to answer fundamental questions: Where did this visitor come from? Which campaign brought them? What content are they viewing? URLs carry this information in query parameters, path segments, and referrer headers.",[15,19,20],{},"Understanding how URL parsing works in analytics helps you instrument your tracking correctly and avoid common data quality problems.",[10,22,24],{"id":23},"utm-parameters-campaign-tracking-standard","UTM Parameters: Campaign Tracking Standard",[15,26,27],{},"UTM parameters are the industry standard for tracking marketing campaigns. They are query parameters appended to URLs that analytics tools read to attribute traffic:",[29,30,31,47],"table",{},[32,33,34],"thead",{},[35,36,37,41,44],"tr",{},[38,39,40],"th",{},"Parameter",[38,42,43],{},"Purpose",[38,45,46],{},"Example",[48,49,50,74,95,110,125],"tbody",{},[35,51,52,59,62],{},[53,54,55],"td",{},[56,57,58],"code",{},"utm_source",[53,60,61],{},"Traffic origin",[53,63,64,67,68,67,71],{},[56,65,66],{},"google",", ",[56,69,70],{},"newsletter",[56,72,73],{},"twitter",[35,75,76,81,84],{},[53,77,78],{},[56,79,80],{},"utm_medium",[53,82,83],{},"Marketing medium",[53,85,86,67,89,67,92],{},[56,87,88],{},"cpc",[56,90,91],{},"email",[56,93,94],{},"social",[35,96,97,102,105],{},[53,98,99],{},[56,100,101],{},"utm_campaign",[53,103,104],{},"Campaign name",[53,106,107],{},[56,108,109],{},"spring_sale_2026",[35,111,112,117,120],{},[53,113,114],{},[56,115,116],{},"utm_term",[53,118,119],{},"Paid search keywords",[53,121,122],{},[56,123,124],{},"running+shoes",[35,126,127,132,135],{},[53,128,129],{},[56,130,131],{},"utm_content",[53,133,134],{},"Creative variant",[53,136,137,67,140],{},[56,138,139],{},"hero_banner",[56,141,142],{},"sidebar_link",[15,144,145],{},"Example tagged URL:",[147,148,153],"pre",{"className":149,"code":151,"language":152},[150],"language-text","https:\u002F\u002Fexample.com\u002Fproduct?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale&utm_content=hero_banner\n","text",[56,154,151],{"__ignoreMap":155},"",[157,158,160],"h3",{"id":159},"parsing-utm-parameters","Parsing UTM parameters",[147,162,166],{"className":163,"code":164,"language":165,"meta":155,"style":155},"language-javascript shiki shiki-themes github-light github-dark","function extractUTM(urlString) {\n  const url = new URL(urlString)\n  const params = url.searchParams\n  return {\n    source: params.get('utm_source'),\n    medium: params.get('utm_medium'),\n    campaign: params.get('utm_campaign'),\n    term: params.get('utm_term'),\n    content: params.get('utm_content'),\n  }\n}\n","javascript",[56,167,168,192,214,227,236,254,269,284,299,314,320],{"__ignoreMap":155},[169,170,173,177,181,185,189],"span",{"class":171,"line":172},"line",1,[169,174,176],{"class":175},"szBVR","function",[169,178,180],{"class":179},"sScJk"," extractUTM",[169,182,184],{"class":183},"sVt8B","(",[169,186,188],{"class":187},"s4XuR","urlString",[169,190,191],{"class":183},") {\n",[169,193,195,198,202,205,208,211],{"class":171,"line":194},2,[169,196,197],{"class":175},"  const",[169,199,201],{"class":200},"sj4cs"," url",[169,203,204],{"class":175}," =",[169,206,207],{"class":175}," new",[169,209,210],{"class":179}," URL",[169,212,213],{"class":183},"(urlString)\n",[169,215,217,219,222,224],{"class":171,"line":216},3,[169,218,197],{"class":175},[169,220,221],{"class":200}," params",[169,223,204],{"class":175},[169,225,226],{"class":183}," url.searchParams\n",[169,228,230,233],{"class":171,"line":229},4,[169,231,232],{"class":175},"  return",[169,234,235],{"class":183}," {\n",[169,237,239,242,245,247,251],{"class":171,"line":238},5,[169,240,241],{"class":183},"    source: params.",[169,243,244],{"class":179},"get",[169,246,184],{"class":183},[169,248,250],{"class":249},"sZZnC","'utm_source'",[169,252,253],{"class":183},"),\n",[169,255,257,260,262,264,267],{"class":171,"line":256},6,[169,258,259],{"class":183},"    medium: params.",[169,261,244],{"class":179},[169,263,184],{"class":183},[169,265,266],{"class":249},"'utm_medium'",[169,268,253],{"class":183},[169,270,272,275,277,279,282],{"class":171,"line":271},7,[169,273,274],{"class":183},"    campaign: params.",[169,276,244],{"class":179},[169,278,184],{"class":183},[169,280,281],{"class":249},"'utm_campaign'",[169,283,253],{"class":183},[169,285,287,290,292,294,297],{"class":171,"line":286},8,[169,288,289],{"class":183},"    term: params.",[169,291,244],{"class":179},[169,293,184],{"class":183},[169,295,296],{"class":249},"'utm_term'",[169,298,253],{"class":183},[169,300,302,305,307,309,312],{"class":171,"line":301},9,[169,303,304],{"class":183},"    content: params.",[169,306,244],{"class":179},[169,308,184],{"class":183},[169,310,311],{"class":249},"'utm_content'",[169,313,253],{"class":183},[169,315,317],{"class":171,"line":316},10,[169,318,319],{"class":183},"  }\n",[169,321,323],{"class":171,"line":322},11,[169,324,325],{"class":183},"}\n",[157,327,329],{"id":328},"utm-best-practices","UTM best practices",[331,332,333,349,359,365],"ul",{},[334,335,336,340,341,344,345,348],"li",{},[337,338,339],"strong",{},"Lowercase all values"," — ",[56,342,343],{},"Spring_Sale"," and ",[56,346,347],{},"spring_sale"," create separate campaigns in Google Analytics",[334,350,351,354,355,358],{},[337,352,353],{},"Use underscores instead of spaces"," — Spaces encode as ",[56,356,357],{},"%20",", making URLs harder to read",[334,360,361,364],{},[337,362,363],{},"Keep values short and consistent"," — Define a naming convention and enforce it across teams",[334,366,367,370],{},[337,368,369],{},"Never tag internal links"," — UTM parameters on links between your own pages overwrite the original source",[10,372,374],{"id":373},"referrer-based-tracking","Referrer-Based Tracking",[15,376,377,378,381],{},"The ",[56,379,380],{},"document.referrer"," property tells you which page linked to the current page. Analytics platforms use this as a fallback when UTM parameters are absent:",[147,383,385],{"className":163,"code":384,"language":165,"meta":155,"style":155},"const referrer = document.referrer\n\u002F\u002F 'https:\u002F\u002Fwww.google.com\u002Fsearch?q=css+gradient+tool'\n",[56,386,387,400],{"__ignoreMap":155},[169,388,389,392,395,397],{"class":171,"line":172},[169,390,391],{"class":175},"const",[169,393,394],{"class":200}," referrer",[169,396,204],{"class":175},[169,398,399],{"class":183}," document.referrer\n",[169,401,402],{"class":171,"line":194},[169,403,405],{"class":404},"sJ8bj","\u002F\u002F 'https:\u002F\u002Fwww.google.com\u002Fsearch?q=css+gradient+tool'\n",[157,407,409],{"id":408},"referrer-limitations","Referrer limitations",[29,411,412,422],{},[32,413,414],{},[35,415,416,419],{},[38,417,418],{},"Issue",[38,420,421],{},"Impact",[48,423,424,432,442,452],{},[35,425,426,429],{},[53,427,428],{},"HTTPS → HTTP referrer stripped",[53,430,431],{},"Browser security policy hides referrer on downgrade",[35,433,434,439],{},[53,435,436],{},[56,437,438],{},"Referrer-Policy: no-referrer",[53,440,441],{},"Server can instruct browsers to send no referrer",[35,443,444,447],{},[53,445,446],{},"Direct visits",[53,448,449,451],{},[56,450,380],{}," is empty string",[35,453,454,457],{},[53,455,456],{},"Mobile apps",[53,458,459,460,463],{},"Often empty or generic (",[56,461,462],{},"com.apple.Safari",")",[15,465,466],{},"Because of these gaps, UTM parameters remain the reliable choice for campaign tracking.",[10,468,470],{"id":469},"path-based-analytics","Path-Based Analytics",[15,472,473],{},"URL paths encode content hierarchy. Analytics tools parse paths to generate content reports:",[147,475,477],{"className":163,"code":476,"language":165,"meta":155,"style":155},"\u002F\u002F Group pageviews by section\nconst url = new URL(window.location.href)\nconst section = url.pathname.split('\u002F')[1] || 'home'\n\u002F\u002F '\u002Ftools\u002Fcss-gradient' → 'tools'\n\u002F\u002F '\u002Fguides\u002Fcss-gradient-tutorial' → 'guides'\n",[56,478,479,484,499,534,539],{"__ignoreMap":155},[169,480,481],{"class":171,"line":172},[169,482,483],{"class":404},"\u002F\u002F Group pageviews by section\n",[169,485,486,488,490,492,494,496],{"class":171,"line":194},[169,487,391],{"class":175},[169,489,201],{"class":200},[169,491,204],{"class":175},[169,493,207],{"class":175},[169,495,210],{"class":179},[169,497,498],{"class":183},"(window.location.href)\n",[169,500,501,503,506,508,511,514,516,519,522,525,528,531],{"class":171,"line":216},[169,502,391],{"class":175},[169,504,505],{"class":200}," section",[169,507,204],{"class":175},[169,509,510],{"class":183}," url.pathname.",[169,512,513],{"class":179},"split",[169,515,184],{"class":183},[169,517,518],{"class":249},"'\u002F'",[169,520,521],{"class":183},")[",[169,523,524],{"class":200},"1",[169,526,527],{"class":183},"] ",[169,529,530],{"class":175},"||",[169,532,533],{"class":249}," 'home'\n",[169,535,536],{"class":171,"line":229},[169,537,538],{"class":404},"\u002F\u002F '\u002Ftools\u002Fcss-gradient' → 'tools'\n",[169,540,541],{"class":171,"line":238},[169,542,543],{"class":404},"\u002F\u002F '\u002Fguides\u002Fcss-gradient-tutorial' → 'guides'\n",[157,545,547],{"id":546},"clean-urls-vs-parameter-based-urls","Clean URLs vs. parameter-based URLs",[29,549,550,562],{},[32,551,552],{},[35,553,554,557,559],{},[38,555,556],{},"URL Style",[38,558,46],{},[38,560,561],{},"Analytics Advantage",[48,563,564,577,594],{},[35,565,566,569,574],{},[53,567,568],{},"Clean path",[53,570,571],{},[56,572,573],{},"\u002Ftools\u002Fcss-gradient",[53,575,576],{},"Each tool appears as distinct page in content reports",[35,578,579,582,587],{},[53,580,581],{},"Query-based",[53,583,584],{},[56,585,586],{},"\u002Ftool?id=css-gradient",[53,588,589,590,593],{},"All tools aggregate under ",[56,591,592],{},"\u002Ftool"," — harder to compare",[35,595,596,599,604],{},[53,597,598],{},"Hash-based",[53,600,601],{},[56,602,603],{},"\u002Ftools#css-gradient",[53,605,606],{},"Hash never reaches server — won't appear in server logs",[15,608,609],{},"For analytics clarity, prefer clean path URLs over query or hash-based routing.",[10,611,613],{"id":612},"url-parameter-pitfalls-for-analytics","URL Parameter Pitfalls for Analytics",[157,615,617],{"id":616},"parameter-ordering","Parameter ordering",[15,619,620,344,623,626],{},[56,621,622],{},"?a=1&b=2",[56,624,625],{},"?b=2&a=1"," resolve to the same page, but some analytics tools treat them as different URLs. Normalize parameter order before sending data:",[147,628,630],{"className":163,"code":629,"language":165,"meta":155,"style":155},"function normalizeUrl(urlString) {\n  const url = new URL(urlString)\n  const sorted = new URLSearchParams()\n  const keys = [...url.searchParams.keys()].sort()\n  for (const key of keys) {\n    url.searchParams.getAll(key).forEach(val => sorted.append(key, val))\n  }\n  url.search = sorted.toString()\n  return url.toString()\n}\n",[56,631,632,645,659,676,705,724,755,759,774,785],{"__ignoreMap":155},[169,633,634,636,639,641,643],{"class":171,"line":172},[169,635,176],{"class":175},[169,637,638],{"class":179}," normalizeUrl",[169,640,184],{"class":183},[169,642,188],{"class":187},[169,644,191],{"class":183},[169,646,647,649,651,653,655,657],{"class":171,"line":194},[169,648,197],{"class":175},[169,650,201],{"class":200},[169,652,204],{"class":175},[169,654,207],{"class":175},[169,656,210],{"class":179},[169,658,213],{"class":183},[169,660,661,663,666,668,670,673],{"class":171,"line":216},[169,662,197],{"class":175},[169,664,665],{"class":200}," sorted",[169,667,204],{"class":175},[169,669,207],{"class":175},[169,671,672],{"class":179}," URLSearchParams",[169,674,675],{"class":183},"()\n",[169,677,678,680,683,685,688,691,694,697,700,703],{"class":171,"line":229},[169,679,197],{"class":175},[169,681,682],{"class":200}," keys",[169,684,204],{"class":175},[169,686,687],{"class":183}," [",[169,689,690],{"class":175},"...",[169,692,693],{"class":183},"url.searchParams.",[169,695,696],{"class":179},"keys",[169,698,699],{"class":183},"()].",[169,701,702],{"class":179},"sort",[169,704,675],{"class":183},[169,706,707,710,713,715,718,721],{"class":171,"line":238},[169,708,709],{"class":175},"  for",[169,711,712],{"class":183}," (",[169,714,391],{"class":175},[169,716,717],{"class":200}," key",[169,719,720],{"class":175}," of",[169,722,723],{"class":183}," keys) {\n",[169,725,726,729,732,735,738,740,743,746,749,752],{"class":171,"line":256},[169,727,728],{"class":183},"    url.searchParams.",[169,730,731],{"class":179},"getAll",[169,733,734],{"class":183},"(key).",[169,736,737],{"class":179},"forEach",[169,739,184],{"class":183},[169,741,742],{"class":187},"val",[169,744,745],{"class":175}," =>",[169,747,748],{"class":183}," sorted.",[169,750,751],{"class":179},"append",[169,753,754],{"class":183},"(key, val))\n",[169,756,757],{"class":171,"line":271},[169,758,319],{"class":183},[169,760,761,764,767,769,772],{"class":171,"line":286},[169,762,763],{"class":183},"  url.search ",[169,765,766],{"class":175},"=",[169,768,748],{"class":183},[169,770,771],{"class":179},"toString",[169,773,675],{"class":183},[169,775,776,778,781,783],{"class":171,"line":301},[169,777,232],{"class":175},[169,779,780],{"class":183}," url.",[169,782,771],{"class":179},[169,784,675],{"class":183},[169,786,787],{"class":171,"line":316},[169,788,325],{"class":183},[157,790,792],{"id":791},"case-sensitivity","Case sensitivity",[15,794,795,344,798,801],{},[56,796,797],{},"?utm_source=Google",[56,799,800],{},"?utm_source=google"," are different strings. Always lowercase UTM values before processing.",[157,803,805],{"id":804},"session-ids-in-urls","Session IDs in URLs",[15,807,808,809,812],{},"URLs like ",[56,810,811],{},"\u002Fpage?sid=abc123"," create unique pageviews for every session. Strip session identifiers before sending URLs to analytics, or use analytics platform features to exclude query parameters.",[10,814,816],{"id":815},"privacy-and-compliance","Privacy and Compliance",[157,818,820],{"id":819},"pii-in-urls","PII in URLs",[15,822,823],{},"Never put personally identifiable information in URL parameters. Names, email addresses, and user IDs in URLs are:",[331,825,826,829,832],{},[334,827,828],{},"Visible in browser history and address bars",[334,830,831],{},"Logged by proxies, CDNs, and server access logs",[334,833,834,835,838],{},"Passed to third parties via the ",[56,836,837],{},"Referer"," header when users click external links",[147,840,844],{"className":841,"code":842,"language":843,"meta":155,"style":155},"language-diff shiki shiki-themes github-light github-dark","- https:\u002F\u002Fexample.com\u002Fwelcome?name=John&email=john@example.com\n+ https:\u002F\u002Fexample.com\u002Fwelcome?user_id=42\n","diff",[56,845,846,851],{"__ignoreMap":155},[169,847,848],{"class":171,"line":172},[169,849,850],{},"- https:\u002F\u002Fexample.com\u002Fwelcome?name=John&email=john@example.com\n",[169,852,853],{"class":171,"line":194},[169,854,855],{},"+ https:\u002F\u002Fexample.com\u002Fwelcome?user_id=42\n",[157,857,859],{"id":858},"referrer-leakage","Referrer leakage",[15,861,862,863,866],{},"When a user navigates from your site to an external link, the browser sends your URL as the referrer. Use ",[56,864,865],{},"Referrer-Policy"," to control what gets shared:",[147,868,872],{"className":869,"code":870,"language":871,"meta":155,"style":155},"language-html shiki shiki-themes github-light github-dark","\u003Cmeta name=\"referrer\" content=\"origin\">\n\u003C!-- Sends only the origin: https:\u002F\u002Fexample.com (no path or parameters) -->\n","html",[56,873,874,902],{"__ignoreMap":155},[169,875,876,879,883,886,888,891,894,896,899],{"class":171,"line":172},[169,877,878],{"class":183},"\u003C",[169,880,882],{"class":881},"s9eBZ","meta",[169,884,885],{"class":179}," name",[169,887,766],{"class":183},[169,889,890],{"class":249},"\"referrer\"",[169,892,893],{"class":179}," content",[169,895,766],{"class":183},[169,897,898],{"class":249},"\"origin\"",[169,900,901],{"class":183},">\n",[169,903,904],{"class":171,"line":194},[169,905,906],{"class":404},"\u003C!-- Sends only the origin: https:\u002F\u002Fexample.com (no path or parameters) -->\n",[157,908,910],{"id":909},"cookie-consent","Cookie consent",[15,912,913],{},"In many jurisdictions, UTM parameter tracking requires consent. Check your legal requirements before implementing campaign tracking.",[10,915,917],{"id":916},"key-takeaways","Key Takeaways",[331,919,920,923,926,929,932,935],{},[334,921,922],{},"UTM parameters are the standard for campaign attribution — use consistent, lowercase naming",[334,924,925],{},"Referrer tracking has gaps — UTM parameters are more reliable for campaign measurement",[334,927,928],{},"Clean path URLs produce clearer analytics than query or hash-based URLs",[334,930,931],{},"Normalize parameter order and case before sending data to analytics platforms",[334,933,934],{},"Never include PII in URL parameters — they leak through referrers, logs, and history",[334,936,937,938,940],{},"Use ",[56,939,865],{}," headers to control what URL information leaves your site",[10,942,944],{"id":943},"related-guides","Related Guides",[331,946,947,954,960],{},[334,948,949],{},[950,951,953],"a",{"href":952},"\u002Fguides\u002Furl-structure-explained","URL Structure Explained",[334,955,956],{},[950,957,959],{"href":958},"\u002Fguides\u002Fquery-parameters-guide","Query Parameters Guide",[334,961,962],{},[950,963,965],{"href":964},"\u002Fguides\u002Furl-security-best-practices","URL Security Best Practices",[10,967,969],{"id":968},"try-it-yourself","Try It Yourself",[15,971,972,973,977],{},"Parse and inspect any URL — including UTM parameters — with our free ",[950,974,976],{"href":975},"\u002Ftools\u002Furl-parser","URL Parser",". Paste a URL and see every component broken down instantly.",[979,980,981],"style",{},"html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .s4XuR, html code.shiki .s4XuR{--shiki-default:#E36209;--shiki-dark:#FFAB70}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}",{"title":155,"searchDepth":194,"depth":194,"links":983},[984,985,989,992,995,1000,1005,1006,1007],{"id":12,"depth":194,"text":13},{"id":23,"depth":194,"text":24,"children":986},[987,988],{"id":159,"depth":216,"text":160},{"id":328,"depth":216,"text":329},{"id":373,"depth":194,"text":374,"children":990},[991],{"id":408,"depth":216,"text":409},{"id":469,"depth":194,"text":470,"children":993},[994],{"id":546,"depth":216,"text":547},{"id":612,"depth":194,"text":613,"children":996},[997,998,999],{"id":616,"depth":216,"text":617},{"id":791,"depth":216,"text":792},{"id":804,"depth":216,"text":805},{"id":815,"depth":194,"text":816,"children":1001},[1002,1003,1004],{"id":819,"depth":216,"text":820},{"id":858,"depth":216,"text":859},{"id":909,"depth":216,"text":910},{"id":916,"depth":194,"text":917},{"id":943,"depth":194,"text":944},{"id":968,"depth":194,"text":969},"2026-05-28","Learn how URL parsing powers analytics — UTM parameters, referrer tracking, campaign measurement, and privacy considerations.","md",{"immutable":1012},true,"\u002Fguides\u002Furl-parsing-analytics-tracking",{"title":5,"description":1009},"guides\u002Furl-parsing-analytics-tracking","TbtQ8Y7WArTO-QJnO_-Xqf-QJtKiVoS7YZFbgMt-UOo",1780401338036]