💳 Cost Tracker See exactly what you pay every month
Track all your recurring costs in one place. Use alongside our bills splitter, budget calculator, and bills management guide.
var ST_CATS={streaming:{l:'Streaming',e:'📺',c:'#e11d48',b:'#fff1f2'},music:{l:'Music',e:'🎵',c:'#7c3aed',b:'#f5f3ff'},gaming:{l:'Gaming',e:'🎮',c:'#0891b2',b:'#ecfeff'},software:{l:'Software',e:'💻',c:'#0369a1',b:'#eff6ff'},news:{l:'News & Mags',e:'📰',c:'#92400e',b:'#fffbeb'},fitness:{l:'Health & Fitness',e:'💪',c:'#16a34a',b:'#f0fdf4'},shopping:{l:'Shopping',e:'🛍️',c:'#c2410c',b:'#fff7ed'},finance:{l:'Finance',e:'💳',c:'#1d4ed8',b:'#eff6ff'},other:{l:'Other',e:'📦',c:'#6b7280',b:'#f9fafb'}};var ST_FM={monthly:1,annual:1/12,quarterly:1/3,weekly:52/12,fortnightly:26/12};var ST_FL={monthly:'Monthly',annual:'Annual',quarterly:'Quarterly',weekly:'Weekly',fortnightly:'Fortnightly'};var ST_KEY='stt-v4';var stSubs=[];var stCat='all';var stEditId=null;var stNext=100;
function stLoad(){try{var r=localStorage.getItem(ST_KEY);if(r){var d=JSON.parse(r);stSubs=d.s;stNext=d.n||200}else{stDefaults()}}catch(e){stDefaults()}} function stDefaults(){stSubs=[{id:1,name:'Netflix',cost:17.99,freq:'monthly',cat:'streaming',on:!0},{id:2,name:'Spotify',cost:11.99,freq:'monthly',cat:'music',on:!0},{id:3,name:'Amazon Prime',cost:95,freq:'annual',cat:'shopping',on:!0},{id:4,name:'Disney+',cost:4.99,freq:'monthly',cat:'streaming',on:!0},{id:5,name:'Xbox Game Pass',cost:14.99,freq:'monthly',cat:'gaming',on:!0}];stNext=200} function stSave(){localStorage.setItem(ST_KEY,JSON.stringify({s:stSubs,n:stNext}))} function stMo(s){return s.cost*(ST_FM[s.freq]||1)} function stFmt(n){return'\u00A3'+(Math.round(n*100)/100).toLocaleString('en-GB',{minimumFractionDigits:2,maximumFractionDigits:2})} function stFmtS(n){return'\u00A3'+Math.round(n).toLocaleString('en-GB')} function stG(id){return document.getElementById(id)} function stEsc(s){return String(s).replace(/&/g,'&').replace(//g,'>')}
function stAdd(){var name=stG('st-fn').value.trim();var cost=parseFloat(stG('st-fc').value);var freq=stG('st-ff').value;var cat=stG('st-fcat').value;if(!name||!(cost>0)){stG('st-fn').style.borderColor='#ef4444';setTimeout(function(){stG('st-fn').style.borderColor=''},1500);return}
if(stEditId!==null){for(var i=0;i
stG('st-mo').textContent=stFmt(monthly);stG('st-mo-s').textContent=active.length+' active';stG('st-yr').textContent=stFmtS(monthly*12);stG('st-cnt').textContent=stSubs.length;stG('st-cnt-s').textContent=paused?paused+' paused':'all active';stG('st-big').textContent=biggest?stFmt(stMo(biggest)):'\u2014';stG('st-big-s').textContent=biggest?biggest.name:'nothing yet';
var view=stCat==='all'?stSubs.slice():stSubs.filter(function(s){return s.cat===stCat});view.sort(function(a,b){if(sort==='cd')return stMo(b)-stMo(a);if(sort==='ca')return stMo(a)-stMo(b);if(sort==='nm')return a.name.localeCompare(b.name);if(sort==='ct')return a.cat.localeCompare(b.cat);return 0});
var list=stG('st-list');if(!view.length){list.innerHTML='
'}else{var html='';for(var j=0;j
'+'
'+''+cat.e+' '+cat.l+'
'+''+(ST_FL[s.freq]||s.freq)+''+'
'+'
'+''+'
'+'
