(function(){var d=document.documentElement;d.setAttribute('data-product','ajans');d.setAttribute('lang','tr');})();
:root{
--brand:#2563EB;--brand2:#10B981;--brand3:#0F172A;--ink:#0F172A;--muted:#475569;--soft:#64748B;
--bg:#F8FAFC;--surface:#FFFFFF;--line:#E2E8F0;--wa:#075E54;--radius:22px;
--shadow:0 30px 74px -30px rgba(15,23,42,.34)
}
*{box-sizing:border-box;margin:0}
html{scroll-behavior:smooth;height:auto!important;overflow-y:auto!important}
body{min-height:100vh;height:auto!important;font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;background:linear-gradient(180deg,#fff,var(--bg));color:var(--ink);line-height:1.55;-webkit-font-smoothing:antialiased;overflow-x:hidden;overflow-y:auto!important}
html,body.elementor-page,body{background:#F8FAFC!important;overflow-y:auto!important}
h1,h2,h3{font-weight:900;line-height:1.05;letter-spacing:0;color:inherit!important}
p,li{overflow-wrap:break-word}
a{text-decoration:none!important;color:inherit}
button,input,select,textarea{font:inherit}
.wrap{width:min(1180px,calc(100vw - 48px));max-width:none;margin:0 auto;padding:0}
.nav-wrap{position:sticky;top:12px;z-index:50;padding:12px 12px 0}
.nav{width:min(1180px,calc(100vw - 24px));max-width:none;margin:0 auto;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 12px 10px 18px;border:1px solid rgba(226,232,240,.92);border-radius:999px;background:rgba(255,255,255,.90);box-shadow:0 12px 30px -24px rgba(15,23,42,.45);backdrop-filter:blur(16px)}
.logo{display:inline-flex;align-items:center;gap:10px;font-weight:900;min-width:0}
.logo img{height:34px;width:34px;border-radius:9px;object-fit:cover;display:block}
.logo span{font-size:1.02rem}
.nav-links{display:flex;align-items:center;gap:24px;font-size:.92rem;font-weight:760;color:var(--muted)}
.nav-links a:hover{color:var(--brand)}
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;min-height:46px;max-width:100%;border:0;border-radius:12px;padding:13px 20px;font-weight:850;cursor:pointer;transition:transform .18s ease,box-shadow .18s ease,background .18s ease,border-color .18s ease;color:inherit;white-space:normal;text-align:center}
.btn:hover{transform:translateY(-2px)}
.btn-primary{background:var(--brand3);color:#fff!important;box-shadow:0 18px 38px -20px rgba(15,23,42,.85)}
.btn-ghost{background:#fff;color:var(--ink)!important;border:1px solid var(--line)}
.btn-wa{background:var(--wa);color:#fff!important}
.hero{padding:58px 0 34px}
.hero-copy{max-width:930px;min-width:0}
.eyebrow{display:inline-flex;align-items:center;gap:8px;font-size:.76rem;letter-spacing:.12em;text-transform:uppercase;font-weight:900;color:var(--brand)}
.eyebrow::before{content:"";width:8px;height:8px;border-radius:999px;background:var(--brand2)}
.hero h1{font-size:clamp(2.45rem,5.4vw,4.35rem);margin:18px 0;max-width:100%;overflow-wrap:anywhere}
.hero h1 span{background:linear-gradient(120deg,var(--brand),#7C3AED,var(--brand2));-webkit-background-clip:text;background-clip:text;color:transparent}
.lead{font-size:1.15rem;color:var(--muted);max-width:58rem;font-weight:560}
.hero-ctas{display:flex;gap:12px;flex-wrap:wrap;margin-top:28px}
.trust{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;margin-top:28px;max-width:900px}
.trust span{background:#fff;border:1px solid var(--line);border-radius:14px;padding:12px 14px;font-size:.88rem;font-weight:820;color:var(--muted)}
.trust b{color:var(--brand)}
.tool{width:100%;max-width:100%;min-width:0;margin-top:30px;background:#fff;border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);overflow:hidden;color-scheme:light}
.tool-top{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:24px 30px;border-bottom:1px solid var(--line);background:linear-gradient(135deg,rgba(37,99,235,.10),rgba(16,185,129,.10))}
.tool-top h2{font-size:1.36rem;margin-top:4px}
.pill{display:inline-flex;align-items:center;justify-content:center;min-height:30px;padding:0 12px;border-radius:999px;background:rgba(16,185,129,.12);color:#047857;font-size:.78rem;font-weight:900;white-space:nowrap}
.tool-body{display:grid;grid-template-columns:minmax(330px,.92fr) minmax(450px,1.08fr);gap:0}
.tool-body>*{min-width:0}
.form-side{padding:30px;border-right:1px solid var(--line)}
.result-side{padding:30px;background:linear-gradient(180deg,#fff,#F9FCFF)}
.presets{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px;margin-bottom:16px}
.presets button{min-height:44px;border:1.5px solid var(--line);border-radius:14px;background:#fff;color:var(--muted);font-weight:900;cursor:pointer;padding:9px}
.presets button.active{border-color:var(--brand);background:rgba(37,99,235,.08);color:var(--brand)}
.field{margin-bottom:16px}
.field label{display:block;font-size:.86rem;font-weight:900;margin-bottom:7px;color:#0F172A!important}
.input,.select{width:100%;min-height:52px;border:1.5px solid var(--line)!important;border-radius:14px;background:#FFFFFF!important;color:#0F172A!important;-webkit-text-fill-color:#0F172A!important;caret-color:#2563EB!important;padding:0 14px;outline:none;box-shadow:none!important}
.input::placeholder{color:#64748B!important;-webkit-text-fill-color:#64748B!important;opacity:1}
.input:focus,.select:focus{border-color:var(--brand)!important;box-shadow:0 0 0 4px rgba(37,99,235,.12)!important}
.input-row{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.hint{font-size:.78rem;color:var(--soft);margin-top:6px}
.summary{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin-bottom:14px}
.metric{border:1px solid var(--line);border-radius:18px;background:#fff;padding:18px;min-width:0}
.metric span{display:block;font-size:.75rem;font-weight:900;text-transform:uppercase;letter-spacing:.10em;color:var(--soft);margin-bottom:10px}
.metric strong{display:block;font-size:clamp(1.16rem,2.1vw,1.55rem);line-height:1.08;letter-spacing:0;word-break:break-word}
.metric.main{background:linear-gradient(135deg,var(--brand3),var(--brand));color:#fff;border-color:transparent}
.metric.main span{color:rgba(255,255,255,.72)}
.output-box{display:grid;gap:12px;border:1px solid var(--line);border-radius:18px;background:#fff;padding:16px}
.result-label{font-size:.76rem;font-weight:900;text-transform:uppercase;letter-spacing:.10em;color:var(--soft)}
.output{min-width:0;min-height:84px;border-radius:13px;background:#F1F5F9;color:#172033;padding:12px;font-size:.92rem;font-weight:760;word-break:break-word;overflow-wrap:anywhere}
.plan{display:grid;gap:10px;margin-top:2px}
.plan-row{border-top:1px solid #EEF2F7;padding-top:10px}
.plan-row span{display:block;color:#0F766E;font-size:.74rem;font-weight:900;text-transform:uppercase;margin-bottom:4px}
.plan-row p{color:#334155;font-size:.92rem;font-weight:650}
.actions{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:10px;margin-top:16px}
.actions .btn{width:100%;min-width:0}
.notice{margin-top:16px;border:1px solid rgba(37,99,235,.16);border-radius:18px;background:rgba(37,99,235,.08);padding:15px;color:#274060;font-weight:650;font-size:.92rem}
.notice strong{color:var(--ink)}
.section{padding:76px 0}
.head{max-width:780px;margin:0 auto 34px;text-align:center}
.head h2{font-size:clamp(2rem,4vw,3rem);margin-bottom:14px}
.head p{color:var(--muted);font-size:1.08rem;font-weight:560}
.cards{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:18px}
.card{background:#fff;border:1px solid var(--line);border-radius:18px;padding:22px;box-shadow:0 14px 40px -30px rgba(15,23,42,.45)}
.card h3{font-size:1.12rem;margin-bottom:10px}
.card p{color:var(--muted);font-weight:560}
.cta-panel{display:grid;grid-template-columns:1fr auto;align-items:center;gap:24px;background:linear-gradient(135deg,#0F172A,#1E3A8A);color:#fff;border-radius:28px;padding:36px;box-shadow:var(--shadow)}
.cta-panel h2{font-size:clamp(1.8rem,3.5vw,2.7rem)}
.cta-panel p{color:rgba(255,255,255,.78);margin-top:10px;max-width:50rem}
.faq{max-width:900px;margin:0 auto;display:grid;gap:12px}
details{background:#fff;border:1px solid var(--line);border-radius:16px;padding:17px 19px}
summary{cursor:pointer;font-weight:900}
details p{margin-top:10px;color:var(--muted)}
footer{border-top:1px solid var(--line);padding:42px 0;color:var(--muted);font-weight:650}
.foot{display:flex;align-items:center;justify-content:space-between;gap:18px;flex-wrap:wrap}
.foot-brand{display:flex;align-items:center;gap:10px;font-weight:900;color:var(--ink)}
.foot-brand img{height:30px;width:30px;border-radius:8px;object-fit:cover}
.wa-float{position:fixed;right:18px;bottom:18px;z-index:80;width:56px;height:56px;border-radius:999px;background:#25D366;display:grid;place-items:center;color:#fff;box-shadow:0 18px 38px -16px rgba(37,211,102,.9)}
.wa-float svg{width:29px;height:29px}
@media(max-width:980px){
.tool-body,.cta-panel{grid-template-columns:1fr}
.form-side{border-right:0;border-bottom:1px solid var(--line)}
.trust,.cards,.summary{grid-template-columns:1fr}
}
@media(max-width:680px){
html,body{max-width:100vw!important;height:auto!important;overflow-x:hidden!important;overflow-y:auto!important}
.elementor,.elementor-section,.elementor-container,.elementor-column,.elementor-widget-wrap,.elementor-widget-container,.wp-block-html{max-width:100vw!important;height:auto!important;overflow-x:hidden!important;overflow-y:visible!important}
.wrap{width:calc(100vw - 48px)!important;max-width:calc(100vw - 48px)!important;padding:0;min-width:0}
.nav-wrap{padding:10px 10px 0}
.nav-links{display:none}
.nav{width:calc(100vw - 20px);min-width:0;padding:10px 14px;border-radius:22px}
.nav .btn{display:none}
.logo span{display:none}
.hero{padding-top:34px}
.hero-copy,.hero h1,.hero-ctas,.trust,.tool,.cards,.head,.faq,.cta-panel{width:100%!important;max-width:100%!important;min-width:0!important}
.hero-ctas,.trust,.tool{width:min(100%,320px)!important;max-width:320px!important;margin-left:0!important;margin-right:auto!important}
.hero h1{font-size:2.05rem;line-height:1.1}
.hero h1 span{display:block}
.lead{display:block;width:100%!important;max-width:32ch!important;font-size:.95rem;white-space:normal!important;overflow-wrap:anywhere!important;word-break:break-word!important}
.hero-ctas,.presets,.actions,.input-row{display:grid;grid-template-columns:1fr}
.hero-ctas .btn,.actions .btn{width:100%}
.tool-top,.form-side,.result-side{padding:18px}
.tool-top{align-items:flex-start;flex-direction:column}
.presets button{min-width:0;overflow-wrap:anywhere}
.wa-float{display:none}
}
.utm-workspace{margin-top:16px;border:1px solid var(--line);border-radius:18px;background:#fff;padding:18px}
.utm-workspace-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;margin-bottom:14px}
.utm-workspace-head h3{font-size:1.02rem;margin:0 0 5px}
.utm-workspace-head p{color:var(--muted);font-size:.86rem;font-weight:600}
.utm-workspace-actions{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:9px}
.utm-workspace-actions .btn{width:100%;min-width:0;padding-inline:12px}
.utm-history{margin-top:16px;padding-top:15px;border-top:1px solid var(--line)}
.utm-history-top{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:10px}
.utm-history-top strong{font-size:.86rem}
.utm-history-clear{border:0;background:transparent;color:var(--soft);font-size:.78rem;font-weight:800;cursor:pointer}
.utm-history-list{display:grid;gap:8px}
.utm-history-item{display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;align-items:center;border:1px solid var(--line);border-radius:12px;background:#f8fafc;padding:10px}
.utm-history-load{min-width:0;border:0;background:transparent;text-align:left;cursor:pointer}
.utm-history-load b,.utm-history-load span{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.utm-history-load b{color:var(--ink);font-size:.82rem}
.utm-history-load span{margin-top:3px;color:var(--soft);font-size:.74rem}
.utm-history-delete{width:34px;height:34px;border:1px solid var(--line);border-radius:9px;background:#fff;color:var(--soft);font-weight:900;cursor:pointer}
.utm-history-empty{color:var(--soft);font-size:.82rem;font-weight:650}
@media(max-width:680px){
.utm-workspace-actions{grid-template-columns:1fr}
.utm-workspace-head{display:block}
}
/* Mobile-first rendering budget: zero remote font dependency and no offscreen paint work. */
body{font-family:system-ui,-apple-system,"Segoe UI",Roboto,Arial,sans-serif;font-synthesis:none}
a,button,[role="button"]{touch-action:manipulation}
@media (max-width:767px){
html{scroll-behavior:auto!important}
[data-reveal]{opacity:1!important;transform:none!important;transition:none!important}
[data-parallax]{translate:none!important;transform:none!important}
.glow,.grain::before,.grain::after{display:none!important}
.nav,.sticky-cta{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
}
@supports (content-visibility:auto){
@media (max-width:767px){
main>section,main>.section{content-visibility:auto;contain-intrinsic-size:auto 900px}
main>section:first-child,main>.hero{content-visibility:visible}
}
}
MY Dijital ücretsiz araç
Ücretsiz UTM link oluşturucu.
Reklam, sosyal medya, e-posta ve WhatsApp kampanyalarınız için ölçülebilir link oluşturun. Hangi paylaşımın ziyaret, başvuru veya satış getirdiğini daha net takip edin.
Reklam linki
Sosyal medya paylaşımı
E-posta ve WhatsApp
Kampanya linki küçük görünür, raporu değiştirir.
Aynı kampanyayı farklı kanallarda paylaşıyorsanız, hangi linkin sonuç getirdiğini ayırmak gerekir. UTM linkleri bu ayrımı netleştirir.
Reklam kampanyaları
Google ve Meta reklamlarında tıklamanın hangi kampanya, görsel veya metinden geldiğini daha net izlersiniz.
Sosyal medya
Bio linki, hikaye linki, paylaşım açıklaması ve influencer linklerini birbirinden ayırabilirsiniz.
WhatsApp ve e-posta
Toplu mesaj, teklif, bülten veya kampanya duyurularının geri dönüşünü aynı raporda takip edebilirsiniz.
Linkler ölçülüyor ama satış görünmüyor mu?
Google Ads, Meta Ads, GA4 ve dönüşüm hedeflerinizi birlikte kontrol edip hangi kampanyanın gerçekten sonuç getirdiğini netleştirelim.
WhatsApp’tan Ölçüm Kontrolü Al
Sık sorulan sorular
UTM link nedir?
Paylaştığınız linkin sonuna eklenen ölçüm bilgisidir. Bu bilgi sayesinde ziyaretçinin hangi kampanya veya kanaldan geldiğini görebilirsiniz.
Bu link SEO’ya zarar verir mi?
Hayır. Kampanya linkleri genellikle reklam, sosyal medya, e-posta ve WhatsApp paylaşımlarında kullanılır. Ana sayfa linklerinizin yerini alması gerekmez.
UTM linki oluşturmak yeterli mi?
Hayır. Link doğru olsa bile Analytics ve dönüşüm hedefleri düzgün kurulmadıysa rapor eksik görünür. Bu yüzden ölçüm kurulumu ayrıca kontrol edilmelidir.
(function(){
var finalUrl = document.getElementById('finalUrl');
var source = document.getElementById('source');
var medium = document.getElementById('medium');
var campaign = document.getElementById('campaign');
var content = document.getElementById('content');
var term = document.getElementById('term');
var generate = document.getElementById('generate');
var statusOut = document.getElementById('statusOut');
var sourceOut = document.getElementById('sourceOut');
var mediumOut = document.getElementById('mediumOut');
var urlOut = document.getElementById('urlOut');
var whereOut = document.getElementById('whereOut');
var trackOut = document.getElementById('trackOut');
var noteOut = document.getElementById('noteOut');
var copyResult = document.getElementById('copyResult');
var shareWa = document.getElementById('shareWa');
var presetButtons = document.querySelectorAll('[data-preset]');
var saveUtm = document.getElementById('saveUtm');
var shareSetup = document.getElementById('shareSetup');
var downloadCsv = document.getElementById('downloadCsv');
var clearUtmHistory = document.getElementById('clearUtmHistory');
var utmHistoryList = document.getElementById('utmHistoryList');
var utmHistoryEmpty = document.getElementById('utmHistoryEmpty');
var currentPreset = 'google';
var lastUrl = '';
var storageKey = 'myd_utm_history_v1';
var presets = {
google:{url:'https://mydijital.com.tr/hizmetler/google-ads/', source:'google', medium:'cpc', campaign:'google_ads_analiz', content:'arama_reklami', term:'google_ads_ajansi', where:'Google reklamlarında nihai URL alanında kullanın.'},
meta:{url:'https://mydijital.com.tr/hizmetler/sosyal-medya-yonetimi/', source:'meta', medium:'paid_social', campaign:'meta_reklam_analiz', content:'reels_video', term:'sosyal_medya_reklami', where:'Meta reklamlarında web sitesi linki olarak kullanın.'},
instagram:{url:'https://mydijital.com.tr/iletisim/', source:'instagram', medium:'social', campaign:'instagram_bio', content:'bio_link', term:'', where:'Instagram bio, hikaye linki veya paylaşım açıklamasında kullanın.'},
whatsapp:{url:'https://mydijital.com.tr/iletisim/', source:'whatsapp', medium:'whatsapp', campaign:'whatsapp_duyuru', content:'toplu_mesaj', term:'', where:'WhatsApp kampanya mesajında veya teklif metninde kullanın.'},
email:{url:'https://mydijital.com.tr/hizmetler/', source:'email', medium:'email', campaign:'bulten_kampanyasi', content:'ana_buton', term:'', where:'E-posta bültenindeki buton veya metin linkinde kullanın.'},
influencer:{url:'https://mydijital.com.tr/iletisim/', source:'influencer_adi', medium:'referral', campaign:'influencer_kampanyasi', content:'story_link', term:'', where:'Influencer story, bio veya açıklama linkinde kullanın.'}
};
function clean(value, fallback){
var text = String(value || '').trim();
if(text.length > 0){ return text; }
return fallback;
}
function slugValue(value, fallback){
var text = clean(value, fallback).toLowerCase();
var map = {'ç':'c','ğ':'g','ı':'i','ö':'o','ş':'s','ü':'u','İ':'i','Ç':'c','Ğ':'g','Ö':'o','Ş':'s','Ü':'u'};
text = text.replace(/[çğıöşüİÇĞÖŞÜ]/g, function(letter){ return map[letter] || letter; });
if(text.normalize){
text = text.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
}
text = text.replace(/[^a-z0-9]+/g, '_').replace(/^_+|_+$/g, '').slice(0, 80);
if(text.length > 0){ return text; }
return fallback;
}
function normalizeUrl(value){
var raw = clean(value, 'https://mydijital.com.tr/');
if(!/^https?:\/\//i.test(raw)){
raw = 'https://' + raw;
}
try{
return new URL(raw);
} catch(error){
return new URL('https://mydijital.com.tr/');
}
}
function mediumLabel(value){
var labels = {
cpc:'ücretli reklam',
paid_social:'ücretli sosyal medya',
social:'organik sosyal medya',
email:'e-posta',
whatsapp:'WhatsApp mesajı',
referral:'iş birliği'
};
return labels[value] || value;
}
function pushEvent(name, extra){
window.dataLayer = window.dataLayer || [];
window.dataLayer.push(Object.assign({event:name, product:'ajans', tool:'utm_link_olusturucu'}, extra || {}));
}
function setPreset(key){
currentPreset = key;
var preset = presets[key] || presets.google;
finalUrl.value = preset.url;
source.value = preset.source;
medium.value = preset.medium;
campaign.value = preset.campaign;
content.value = preset.content;
term.value = preset.term;
presetButtons.forEach(function(button){
button.classList.toggle('active', button.getAttribute('data-preset') === key);
});
build();
}
function build(){
var preset = presets[currentPreset] || presets.google;
var url = normalizeUrl(finalUrl.value);
var sourceValue = slugValue(source.value, 'kaynak');
var mediumValue = clean(medium.value, 'cpc');
var campaignValue = slugValue(campaign.value, 'kampanya');
var contentValue = slugValue(content.value, '');
var termValue = slugValue(term.value, '');
url.searchParams.set('utm_source', sourceValue);
url.searchParams.set('utm_medium', mediumValue);
url.searchParams.set('utm_campaign', campaignValue);
if(contentValue.length > 0){
url.searchParams.set('utm_content', contentValue);
}
if(termValue.length > 0){
url.searchParams.set('utm_term', termValue);
}
lastUrl = url.toString();
statusOut.textContent = 'Hazır';
sourceOut.textContent = sourceValue;
mediumOut.textContent = mediumLabel(mediumValue);
urlOut.textContent = lastUrl;
whereOut.textContent = preset.where;
trackOut.textContent = 'Raporlarda kaynak "' + sourceValue + '", kullanım türü "' + mediumLabel(mediumValue) + '", kampanya adı "' + campaignValue + '" olarak ayrılır.';
noteOut.textContent = 'Linki yayına almadan önce bir kez tarayıcıda açın. Sayfa doğru açılıyorsa aynı linki reklam, sosyal medya, e-posta veya WhatsApp içinde kullanabilirsiniz.';
shareWa.href = 'https://wa.me/905437168747?text=' + encodeURIComponent('Merhaba, UTM link oluşturucu ile linkimi hazırladım: ' + lastUrl + ' Kampanya ölçümümü kontrol ettirmek istiyorum.');
pushEvent('utm_generate', {preset:currentPreset, source:sourceValue, medium:mediumValue});
}
function currentState(){
return {
preset:currentPreset,
finalUrl:finalUrl.value,
source:source.value,
medium:medium.value,
campaign:campaign.value,
content:content.value,
term:term.value,
url:lastUrl
};
}
function applyState(state){
if(!state){ return; }
currentPreset = presets[state.preset] ? state.preset : 'google';
finalUrl.value = clean(state.finalUrl, presets[currentPreset].url);
source.value = clean(state.source, presets[currentPreset].source);
medium.value = clean(state.medium, presets[currentPreset].medium);
campaign.value = clean(state.campaign, presets[currentPreset].campaign);
content.value = String(state.content || '');
term.value = String(state.term || '');
presetButtons.forEach(function(button){
button.classList.toggle('active', button.getAttribute('data-preset') === currentPreset);
});
build();
}
function savedItems(){
try{
var parsed = JSON.parse(localStorage.getItem(storageKey) || '[]');
return Array.isArray(parsed) ? parsed : [];
} catch(error){
return [];
}
}
function writeItems(items){
try{
localStorage.setItem(storageKey, JSON.stringify(items.slice(0, 20)));
return true;
} catch(error){
return false;
}
}
function renderHistory(){
var items = savedItems();
utmHistoryList.textContent = '';
utmHistoryEmpty.hidden = items.length > 0;
clearUtmHistory.hidden = items.length < 1;
items.forEach(function(item, index){
var row = document.createElement('div');
row.className = 'utm-history-item';
var load = document.createElement('button');
load.className = 'utm-history-load';
load.type = 'button';
var title = document.createElement('b');
title.textContent = clean(item.campaign, 'kampanya') + ' · ' + clean(item.source, 'kaynak');
var detail = document.createElement('span');
detail.textContent = clean(item.medium, 'medium') + ' · ' + clean(item.url, '');
load.appendChild(title);
load.appendChild(detail);
load.addEventListener('click', function(){
applyState(item);
document.getElementById('arac').scrollIntoView({behavior:'smooth', block:'start'});
pushEvent('utm_history_load', {index:index});
});
var remove = document.createElement('button');
remove.className = 'utm-history-delete';
remove.type = 'button';
remove.setAttribute('aria-label', 'Kaydı sil');
remove.textContent = '×';
remove.addEventListener('click', function(){
var next = savedItems();
next.splice(index, 1);
writeItems(next);
renderHistory();
pushEvent('utm_history_delete', {index:index});
});
row.appendChild(load);
row.appendChild(remove);
utmHistoryList.appendChild(row);
});
}
function saveCurrent(){
build();
var state = currentState();
state.savedAt = new Date().toISOString();
var items = savedItems().filter(function(item){ return item.url !== state.url; });
items.unshift(state);
if(writeItems(items)){
saveUtm.textContent = 'Kaydedildi';
window.setTimeout(function(){ saveUtm.textContent = 'Linki Kaydet'; }, 1500);
renderHistory();
pushEvent('utm_save', {preset:currentPreset});
} else {
saveUtm.textContent = 'Kaydedilemedi';
window.setTimeout(function(){ saveUtm.textContent = 'Linki Kaydet'; }, 1600);
}
}
function setupUrl(){
var state = currentState();
var link = new URL(window.location.href);
['ft_preset','ft_url','ft_source','ft_medium','ft_campaign','ft_content','ft_term'].forEach(function(key){
link.searchParams.delete(key);
});
link.searchParams.set('ft_preset', state.preset);
link.searchParams.set('ft_url', state.finalUrl);
link.searchParams.set('ft_source', state.source);
link.searchParams.set('ft_medium', state.medium);
link.searchParams.set('ft_campaign', state.campaign);
if(state.content){ link.searchParams.set('ft_content', state.content); }
if(state.term){ link.searchParams.set('ft_term', state.term); }
link.hash = 'arac';
return link.toString();
}
function hydrateFromQuery(){
var params = new URLSearchParams(window.location.search);
if(!params.has('ft_url')){ return false; }
applyState({
preset:params.get('ft_preset') || 'google',
finalUrl:params.get('ft_url') || '',
source:params.get('ft_source') || '',
medium:params.get('ft_medium') || 'cpc',
campaign:params.get('ft_campaign') || '',
content:params.get('ft_content') || '',
term:params.get('ft_term') || ''
});
pushEvent('utm_shared_setup_open', {});
return true;
}
function copyAux(text, button, resetLabel, eventName){
if(!text){ return; }
var done = function(){
button.textContent = 'Kopyalandı';
if(eventName){ pushEvent(eventName, {preset:currentPreset}); }
window.setTimeout(function(){ button.textContent = resetLabel; }, 1600);
};
if(navigator.clipboard){
if(navigator.clipboard.writeText){
navigator.clipboard.writeText(text).then(done).catch(function(){
var area = document.createElement('textarea');
area.value = text;
area.setAttribute('readonly', '');
area.style.position = 'fixed';
area.style.left = '-9999px';
document.body.appendChild(area);
area.select();
try{ document.execCommand('copy'); done(); }
catch(error){ button.textContent = 'Kopyalanamadı'; }
document.body.removeChild(area);
});
return;
}
}
var area = document.createElement('textarea');
area.value = text;
area.setAttribute('readonly', '');
area.style.position = 'fixed';
area.style.left = '-9999px';
document.body.appendChild(area);
area.select();
try{ document.execCommand('copy'); done(); }
catch(error){ button.textContent = 'Kopyalanamadı'; }
document.body.removeChild(area);
}
function shareCurrentSetup(){
build();
var link = setupUrl();
if(navigator.share){
navigator.share({
title:'UTM kampanya kurulumu',
text:'Bu UTM kampanya kurulumunu açın:',
url:link
}).then(function(){
pushEvent('utm_setup_share', {method:'native'});
}).catch(function(error){
if(error){
if(error.name === 'AbortError'){ return; }
}
copyAux(link, shareSetup, 'Kurulumu Paylaş', 'utm_setup_share_copy');
});
return;
}
copyAux(link, shareSetup, 'Kurulumu Paylaş', 'utm_setup_share_copy');
}
function csvCell(value){
var text = String(value == null ? '' : value);
return '"' + text.replace(/"/g, '""') + '"';
}
function downloadCurrentCsv(){
build();
var state = currentState();
var csv = [
['final_url','utm_source','utm_medium','utm_campaign','utm_content','utm_term','generated_url'].map(csvCell).join(','),
[state.finalUrl,slugValue(state.source,'kaynak'),state.medium,slugValue(state.campaign,'kampanya'),slugValue(state.content,''),slugValue(state.term,''),state.url].map(csvCell).join(',')
].join('\r\n');
var blob = new Blob(['\ufeff' + csv], {type:'text/csv;charset=utf-8'});
var href = URL.createObjectURL(blob);
var anchor = document.createElement('a');
anchor.href = href;
anchor.download = 'utm-' + slugValue(state.campaign, 'kampanya') + '.csv';
document.body.appendChild(anchor);
anchor.click();
document.body.removeChild(anchor);
URL.revokeObjectURL(href);
pushEvent('utm_csv_download', {preset:currentPreset});
}
function copyText(text){
if(!text){ return; }
var done = function(){
copyResult.textContent = 'Kopyalandı';
pushEvent('utm_copy', {preset:currentPreset});
setTimeout(function(){ copyResult.textContent = 'Linki Kopyala'; }, 1600);
};
if(navigator.clipboard){
if(navigator.clipboard.writeText){
navigator.clipboard.writeText(text).then(done).catch(function(){ fallbackCopy(text, done); });
return;
}
}
fallbackCopy(text, done);
}
function fallbackCopy(text, done){
var area = document.createElement('textarea');
area.value = text;
area.setAttribute('readonly', '');
area.style.position = 'fixed';
area.style.left = '-9999px';
document.body.appendChild(area);
area.select();
try{
document.execCommand('copy');
done();
} catch(error){
copyResult.textContent = 'Kopyalanamadı';
setTimeout(function(){ copyResult.textContent = 'Linki Kopyala'; }, 1600);
}
document.body.removeChild(area);
}
presetButtons.forEach(function(button){
button.addEventListener('click', function(){
setPreset(button.getAttribute('data-preset'));
});
});
[finalUrl, source, medium, campaign, content, term].forEach(function(field){
field.addEventListener('input', build);
field.addEventListener('change', build);
});
generate.addEventListener('click', build);
copyResult.addEventListener('click', function(){ copyText(lastUrl); });
saveUtm.addEventListener('click', saveCurrent);
shareSetup.addEventListener('click', shareCurrentSetup);
downloadCsv.addEventListener('click', downloadCurrentCsv);
clearUtmHistory.addEventListener('click', function(){
writeItems([]);
renderHistory();
pushEvent('utm_history_clear', {});
});
document.querySelectorAll('[data-cta]').forEach(function(link){
link.addEventListener('click', function(){
pushEvent('cta_click', {cta:link.getAttribute('data-cta')});
});
});
if(!hydrateFromQuery()){ build(); }
renderHistory();
})();