cybermax / utm-builder /index.html
CyberMax-tools's picture
Add/update privacy-friendly view counter on 144 page(s)
60ebfb4 verified
Raw History Blame Contribute Delete
16.7 kB
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>Free UTM Builder — Bulk Campaign URL Builder + QR Code</title>
<meta name="description" content="Free UTM builder: tag campaign URLs for Google Analytics 4, build hundreds at once from a list or CSV, make a QR code, and decode tagged links. No sign-up.">
<meta name="keywords" content="utm builder, utm generator, campaign url builder, bulk utm builder, utm qr code generator, google analytics utm, ga4 utm parameters">
<meta name="theme-color" content="#3056d3">
<link rel="canonical" href="https://cybermax-tools-cybermax.static.hf.space/utm-builder/index.html">
<link rel="manifest" href="manifest.webmanifest">
<link rel="icon" href="icon.svg" type="image/svg+xml">
<link rel="apple-touch-icon" href="icon-192.png">
<meta property="og:type" content="website">
<meta property="og:title" content="Free UTM Builder — bulk links + QR codes">
<meta property="og:description" content="Tag one link or a thousand for GA4, with QR codes and a link decoder. Free, private, no sign-up.">
<meta property="og:url" content="https://cybermax-tools-cybermax.static.hf.space/utm-builder/index.html">
<meta property="og:image" content="https://cybermax-tools-cybermax.static.hf.space/utm-builder/og.png">
<meta name="twitter:card" content="summary_large_image">
<script type="application/ld+json">
{"@context":"https://schema.org","@graph":[
{"@type":"WebApplication","name":"CyberMax UTM Builder","url":"https://cybermax-tools-cybermax.static.hf.space/utm-builder/index.html","applicationCategory":"BusinessApplication","operatingSystem":"Any","description":"Free UTM campaign URL builder with bulk mode, QR codes and a UTM decoder.","offers":{"@type":"Offer","price":"0","priceCurrency":"USD"},"publisher":{"@type":"Organization","name":"CyberMax"}},
{"@type":"FAQPage","mainEntity":[
{"@type":"Question","name":"What are UTM parameters?","acceptedAnswer":{"@type":"Answer","text":"UTM parameters are tags added to a link (utm_source, utm_medium, utm_campaign, utm_term, utm_content, utm_id) that tell analytics tools like Google Analytics 4 where a visit came from."}},
{"@type":"Question","name":"Which UTM parameters are required?","acceptedAnswer":{"@type":"Answer","text":"Google Analytics only needs utm_source, but you should always set utm_source, utm_medium and utm_campaign so GA4 can assign the visit to the right channel and campaign."}},
{"@type":"Question","name":"Should UTM values be lowercase?","acceptedAnswer":{"@type":"Answer","text":"Yes. UTM values are case-sensitive, so Facebook and facebook show up as two different sources. This builder lowercases values by default."}},
{"@type":"Question","name":"Is my data sent anywhere?","acceptedAnswer":{"@type":"Answer","text":"No. Every link is built in your browser. Nothing is uploaded or stored on a server."}}]}
]}
</script>
<link rel="stylesheet" href="style.css">
</head>
<body>
<header class="top"><div class="wrap">
<div class="brand"><span class="dot">?u</span> UTM Builder <small>by CyberMax</small></div>
<a class="btn ghost" href="#faq">FAQ</a>
</div></header>
<main class="wrap">
<h1>Free UTM Builder: campaign URLs, bulk tagging and QR codes</h1>
<p class="lede">Tag links for Google Analytics 4 in seconds. Build one link or hundreds at once, catch mistakes that break your reports, and download a QR code. Everything runs in your browser.</p>
<div class="tabs" role="tablist">
<button class="tab" role="tab" aria-selected="true" data-tab="single" id="tab-single">Builder</button>
<button class="tab" role="tab" aria-selected="false" data-tab="bulk" id="tab-bulk">Bulk</button>
<button class="tab" role="tab" aria-selected="false" data-tab="decode" id="tab-decode">Decode a link</button>
<button class="tab" role="tab" aria-selected="false" data-tab="history" id="tab-history">History</button>
</div>
<section class="panel" id="panel-single" role="tabpanel">
<div class="grid">
<div class="card">
<h2>1. Your link and campaign</h2>
<label for="f-url">Website URL</label>
<input type="url" id="f-url" placeholder="https://example.com/landing-page" autocomplete="url" inputmode="url">
<label>Quick presets</label>
<div class="chips" id="presets"></div>
<div class="row2">
<div><label for="f-utm_source">Source <span class="opt">utm_source</span></label><input type="text" id="f-utm_source" placeholder="google, newsletter"></div>
<div><label for="f-utm_medium">Medium <span class="opt">utm_medium</span></label><input type="text" id="f-utm_medium" placeholder="cpc, email, social" list="mediums"></div>
</div>
<datalist id="mediums"><option value="cpc"><option value="email"><option value="social"><option value="paid_social"><option value="display"><option value="affiliate"><option value="referral"><option value="video"><option value="sms"><option value="print"></datalist>
<label for="f-utm_campaign">Campaign name <span class="opt">utm_campaign</span></label>
<input type="text" id="f-utm_campaign" placeholder="spring_sale_2026">
<div class="row3">
<div><label for="f-utm_id">Campaign ID <span class="opt">optional</span></label><input type="text" id="f-utm_id" placeholder="abc.123"></div>
<div><label for="f-utm_term">Term <span class="opt">optional</span></label><input type="text" id="f-utm_term" placeholder="running shoes"></div>
<div><label for="f-utm_content">Content <span class="opt">optional</span></label><input type="text" id="f-utm_content" placeholder="hero_button"></div>
</div>
<label class="check"><input type="checkbox" id="o-lower" checked> Force lowercase (recommended)</label>
<label for="o-space">Replace spaces with</label>
<select id="o-space"><option value="-">Hyphen (spring-sale)</option><option value="_">Underscore (spring_sale)</option><option value="keep">Keep spaces (%20)</option></select>
</div>
<div class="card">
<h2>2. Your tagged link</h2>
<div class="out" id="out" aria-live="polite">Fill in the URL, source, medium and campaign.</div>
<div class="warn" id="warn"></div>
<div class="btns">
<button class="btn" id="btn-copy" disabled>Copy link</button>
<a class="btn ghost" id="btn-open" target="_blank" rel="noopener" aria-disabled="true">Test link ↗</a>
<button class="btn ghost" id="btn-reset">Clear</button>
</div>
<h2 style="margin-top:18px">QR code</h2>
<canvas id="qr" width="220" height="220" aria-label="QR code for the tagged link" style="background:#fff;border-radius:10px;border:1px solid var(--line);max-width:100%"></canvas>
<div class="btns"><button class="btn ghost" id="btn-qr" disabled>Download QR (PNG)</button></div>
<p class="hint">Tip: for printed QR codes use source = where it's printed (poster, flyer) and medium = print.</p>
</div>
</div>
</section>
<section class="panel" id="panel-bulk" role="tabpanel" hidden>
<div class="card">
<h2>Bulk UTM builder</h2>
<p class="hint">One URL per line, or CSV columns <code>url,source,medium,campaign,term,content</code> (a header row is optional). Blank columns use the values from the Builder tab. Up to 5,000 rows.</p>
<textarea id="bulk-in" placeholder="https://example.com/pricing&#10;https://example.com/blog/post,linkedin,social,launch_week&#10;example.com/docs,newsletter,email,october_digest,,footer_link"></textarea>
<div class="btns">
<button class="btn" id="btn-bulk">Build links</button>
<button class="btn ghost" id="btn-bulk-copy" disabled>Copy all</button>
<button class="btn ghost" id="btn-bulk-csv" disabled>Download CSV</button>
</div>
<div class="table-wrap" style="margin-top:12px"><table id="bulk-table" hidden><thead><tr><th>#</th><th>Tagged URL</th><th>Notes</th></tr></thead><tbody></tbody></table></div>
</div>
</section>
<section class="panel" id="panel-decode" role="tabpanel" hidden>
<div class="card">
<h2>Decode a tagged link</h2>
<label for="dec-in">Paste any URL</label>
<input type="url" id="dec-in" placeholder="https://example.com/?utm_source=google&utm_medium=cpc&utm_campaign=brand">
<div class="table-wrap" style="margin-top:12px"><table id="dec-table"><tbody></tbody></table></div>
<label>Clean URL (UTM tags removed)</label>
<div class="out" id="dec-clean"></div>
<div class="btns"><button class="btn ghost" id="btn-dec-edit">Edit in builder</button></div>
</div>
</section>
<section class="panel" id="panel-history" role="tabpanel" hidden>
<div class="card">
<h2>Recent links</h2>
<p class="hint">Your last 25 copied links, saved only in this browser.</p>
<div class="table-wrap"><table id="hist-table"><tbody></tbody></table></div>
<div class="btns"><button class="btn ghost" id="btn-hist-clear">Clear history</button><button class="btn ghost" id="btn-hist-csv">Export history CSV <span class="pro-tag">PRO</span></button></div>
</div>
</section>
<aside class="related">
<h2>Plan the campaign, not just the link</h2>
<p>Pick <b>utm_term</b> and ad keywords from real searches with <a href="https://apify.com/cybermax/keyword-ideas" target="_blank" rel="noopener">Keyfern keyword ideas</a> (Google, YouTube and Amazon autocomplete), and time launches with <a href="https://apify.com/cybermax/google-trends" target="_blank" rel="noopener">Swellmeter Google Trends</a>. Both are paid CyberMax tools on the Apify Store, charged per result, and a first run costs under $0.01.</p>
</aside>
<section class="seo" id="faq">
<h2>How to build a UTM link</h2>
<p>Paste the page URL, choose where the link will be shared (source), the type of traffic (medium) and a campaign name. The builder adds <code>utm_source</code>, <code>utm_medium</code> and <code>utm_campaign</code> to your link. Existing query parameters and #anchors are kept.</p>
<h3>What are UTM parameters?</h3>
<p>Tags on a link that tell Google Analytics 4, Matomo, Plausible and other analytics tools where a visitor came from: <b>utm_source</b> (google, newsletter), <b>utm_medium</b> (cpc, email, social), <b>utm_campaign</b> (spring_sale), and optionally <b>utm_term</b> (the keyword), <b>utm_content</b> (which button or ad variant) and <b>utm_id</b> (a campaign ID).</p>
<h3>Why do my UTM visits show as "Unassigned" in GA4?</h3>
<p>GA4 sorts traffic into channels using the medium. Values it doesn't recognise, like "newsletter" as a medium or "Paid-Social", can land in "Unassigned". The builder warns you when a medium probably won't match GA4's default channel groups.</p>
<h3>Should UTM values be lowercase?</h3>
<p>Yes. UTM values are case-sensitive, so "Facebook" and "facebook" count as two sources. Lowercase is on by default.</p>
<h3>Can I build UTM links in bulk?</h3>
<p>Yes. Open the Bulk tab and paste a list of URLs, or a CSV with a source, medium and campaign for each row. You'll get a table you can copy or download as CSV for a spreadsheet.</p>
<h3>Is it private?</h3>
<p>Yes. The links are built in your browser. Nothing is uploaded, and the history stays on your device. The app works offline once loaded.</p>
</section>
<section class="seo" id="privacy">
<h2>Privacy policy</h2>
<p>UTM Builder (this page and the CyberMax UTM Builder Chrome extension) collects no personal data. Links are built in your browser; the last 25 links you copy are kept only in your browser's local storage, and you can clear them any time in the History tab. There are no accounts, analytics cookies or ads in the tool. The Chrome extension uses <b>activeTab</b> only to read the address of the tab you are on when you click its button, and <b>contextMenus</b> to add "Build a UTM link for this link" to the right-click menu. It never reads page content, keeps no browsing history and sends nothing to CyberMax. This web page counts anonymous page views; the extension does not.</p>
<p>Questions: <a href="mailto:cybermax.tools@gmail.com">cybermax.tools@gmail.com</a>. Last updated 28 Sep 2026. © 2026 CyberMax.</p>
</section>
<footer class="more">
<div class="more-title">More from CyberMax</div>
<div class="more-links">
<a href="https://cybermax-tools-cybermax.static.hf.space/profit-margin-calculator/index.html" target="_blank" rel="noopener">Profit Margin Calculator</a>
<a href="https://cybermax-tools-cybermax.static.hf.space/salary-to-hourly-calculator/index.html" target="_blank" rel="noopener">Salary to Hourly Calculator</a>
<a href="https://cybermax-tools-cybermax.static.hf.space/sumbloom/index.html" target="_blank" rel="noopener">Sumbloom · daily number puzzle</a>
<a href="https://cybermax-tools-cybermax.static.hf.space/honeyfold/index.html" target="_blank" rel="noopener">Honeyfold · idle bee game</a>
<a href="https://huggingface.co/spaces/CyberMax-tools/cybermax" target="_blank" rel="noopener">All CyberMax tools</a>
<a href="https://cybermaxtools.com/store/?utm_source=utm-builder&amp;utm_medium=more-from" target="_blank" rel="noopener">CyberMax Store · paid products, API plans &amp; bundles</a>
</div>
<div class="copy">© 2026 CyberMax. All rights reserved. QR codes by qrcode-generator (MIT, Kazuhiko Arase). "QR Code" is a registered trademark of DENSO WAVE INCORPORATED.</div>
</footer>
</main>
<div class="toast" id="toast" role="status" aria-live="polite"></div>
<script>window.CMX_PRO={"id": "utm-builder", "name": "UTM Builder", "price": "$5", "perks": ["History of your last 500 links instead of 25", "Export your link history as CSV", "Supports new features from CyberMax"], "offer": "st-utm-builder-pro-pro"};</script>
<script src="pro.js"></script>
<script src="vendor/qrcode.js"></script>
<script src="utm.js"></script>
<script src="app.js"></script>
<script>(function(){function proGo(){var b=document.getElementById("cmx-pro");if(b)b.scrollIntoView({behavior:"smooth",block:"center"});CMXPro.toast("That is a Pro feature: one payment unlocks it.");}
document.getElementById("btn-hist-csv").onclick=function(){if(!CMXPro.isPro())return proGo();CMXPro.download("utm-link-history.csv",CMXPro.csv([{el:document.getElementById("hist-table")}]));};
})();</script>
<!-- cybermax-count:start --><script>(function(){try{var D="https://data.cybermaxtools.com",P=location.host+location.pathname,H=navigator.webdriver||!(navigator.languages&&navigator.languages.length)||!screen.width?"&h=1":"",Z=function(x){navigator.sendBeacon?navigator.sendBeacon(x):(new Image).src=x},V=null,K="cmx-visit";if(navigator.doNotTrack!=="1")try{var o=JSON.parse(sessionStorage.getItem(K)||"null"),t=Date.now();if(!o||t-o.t>18e5)o={e:P,n:0};o.n++;o.t=t;sessionStorage.setItem(K,JSON.stringify(o));V=o}catch(e){}var u=D+"/v?p="+encodeURIComponent(P)+"&r="+encodeURIComponent((function(r){var h=r.split("/")[2]||"";return h===location.host?r.split(/[?#]/)[0]:h})(document.referrer||""))+H+(function(){var q=new URLSearchParams(location.search),s=q.get("utm_source"),t=(q.get("s")||"").toLowerCase().replace(/[^a-z0-9-]/g,"-").slice(0,80);return s?"&us="+encodeURIComponent(s)+"&uc="+encodeURIComponent(q.get("utm_campaign")||""):t?"&us=s&uc="+encodeURIComponent(t):""})()+(V?"&vn="+V.n+(V.n>1?"&ve="+encodeURIComponent(V.e):""):"");Z(u);if(!V)return;var B="a[data-count],a[href*=\"buy.stripe.com\"],a[href*=\"data.cybermaxtools.com/buy/\"],a[href*=\".workers.dev/buy/\"],a[href*=\"buy.polar.sh\"],a[href*=\"polar.sh/checkout\"],[data-cmx-buy]",E=function(k){try{var o=JSON.parse(sessionStorage.getItem(K)||"null");if(!o||o[k])return;o[k]=1;sessionStorage.setItem(K,JSON.stringify(o));Z(D+"/v?p="+encodeURIComponent(P)+"&ev="+k+"&ve="+encodeURIComponent(o.e)+H)}catch(e){}};document.addEventListener("click",function(x){var a=x.target&&x.target.closest&&x.target.closest(B);if(a){E("seen");E("click")}},true);var S=V.seen,C=function(){if(S)return;var l=document.querySelectorAll(B),w=innerWidth,h=innerHeight;for(var i=0;i<l.length;i++){var r=l[i].getBoundingClientRect();if(r.width>0&&r.height>0&&r.bottom>0&&r.right>0&&r.top<h&&r.left<w){S=1;E("seen");return}}},T0=Date.now(),I=setInterval(function(){C();if(S||Date.now()-T0>6e5)clearInterval(I)},1500),R=0;addEventListener("scroll",function(){if(!R&&!S){R=1;setTimeout(function(){R=0;C()},250)}},{passive:true});document.readyState=="loading"?document.addEventListener("DOMContentLoaded",C):C()}catch(e){}})()</script><!-- cybermax-count:end --></body>
</html>