File size: 30,307 Bytes
f2721d6 063204d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 | <!doctype html>
<html lang="en"><head>
<meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1">
<title>Mileage Log Spreadsheet for 1099 Drivers and Real Estate Agents — IRS Schedule C Deduction Calculator</title>
<meta name="description" content="Every 1,000 business miles you cannot document is $700 of deduction gone at the IRS business standard mileage rate of $0.70 per mile (IRS Notice 2025-05), and a deduction disallowed for lack of written evidence can carry the 20% accuracy-related penalty under IRC §6662. Eight cells in, four sheets out: your Schedule C line 44a/44b/44c split, your business-use percentage, and the tax those miles actually save.">
<style>
:root{--bg:#fff;--fg:#111;--mut:#666;--line:#e5e5e5;--acc:#1a56db;--ok:#0f7b3f}
@media(prefers-color-scheme:dark){:root{--bg:#111;--fg:#eee;--mut:#999;--line:#2a2a2a;--acc:#7aa2f7;--ok:#5fd08a}}
*{box-sizing:border-box}
body{margin:0;background:var(--bg);color:var(--fg);font:16px/1.55 system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",sans-serif}
.wrap{max-width:820px;margin:0 auto;padding:24px 18px 64px}
h1{font-size:1.6rem;line-height:1.25;margin:.2em 0 .1em}
.sub{color:var(--mut);margin:0 0 1.4em}
.card{border:1px solid var(--line);border-radius:12px;padding:18px;margin:0 0 18px}
h2{font-size:.85rem;letter-spacing:.08em;text-transform:uppercase;color:var(--mut);margin:0 0 14px}
label{display:flex;justify-content:space-between;align-items:center;gap:14px;padding:7px 0;border-bottom:1px solid var(--line)}
label:last-child{border-bottom:0}
label span{flex:1;font-size:.95rem}
input[type=number]{width:9.5em;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:transparent;color:var(--fg);font:inherit;text-align:right}
.fld{display:inline-flex;align-items:center;gap:6px}
.fld i{font-style:normal;color:var(--mut);width:1em}
table{width:100%;border-collapse:collapse}
td{padding:8px 0;border-bottom:1px solid var(--line);vertical-align:top}
tr:last-child td{border-bottom:0}
td.l{font-size:.95rem}
td.v{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;white-space:nowrap}
.hint{color:var(--mut);font-size:.85rem;margin:10px 0 0}
.cta{border:1px solid var(--acc);border-radius:12px;padding:18px;margin:22px 0 0}
.cta b{display:block;margin-bottom:6px}
.row{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}
input[type=email]{flex:1;min-width:200px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:transparent;color:var(--fg);font:inherit}
button{padding:10px 16px;border:0;border-radius:8px;background:var(--acc);color:#fff;font:inherit;font-weight:600;cursor:pointer}
button.ghost{background:transparent;color:var(--acc);border:1px solid var(--acc)}
a.buy{display:inline-block;margin-top:10px;color:var(--acc);font-weight:600}
.ok{color:var(--ok);font-size:.9rem;margin-top:8px}
canvas{display:none}
</style><script data-grow-initializer="">!(function(){window.growMe||((window.growMe=function(e){window.growMe._.push(e);}),(window.growMe._=[]));var e=document.createElement("script");(e.type="text/javascript"),(e.src="https://faves.grow.me/main.js"),(e.defer=!0),e.setAttribute("data-grow-faves-site-id","U2l0ZTphZjljMzgyMC0yMmU5LTRhYjgtYTIxNS03OTRhMGY1N2ExYzM=");var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t);})();</script>
<!--yj-canon-s101--><link rel="canonical" href="https://getreadystack.com/tools/mileage-log-spreadsheet"></head><body><div class="wrap">
<h1>Mileage Log Spreadsheet for 1099 Drivers and Real Estate Agents — IRS Schedule C Deduction Calculator</h1><p class="sub">Every 1,000 business miles you cannot document is $700 of deduction gone at the IRS business standard mileage rate of $0.70 per mile (IRS Notice 2025-05), and a deduction disallowed for lack of written evidence can carry the 20% accuracy-related penalty under IRC §6662. Eight cells in, four sheets out: your Schedule C line 44a/44b/44c split, your business-use percentage, and the tax those miles actually save.</p>
<div class="card"><h2>Your numbers</h2><label><span>Odometer on January 1 (or the day the car went into service)</span><span class="fld"><input type="number" step="any" data-k="odometer_jan1" data-f="integer" value="42180"></span></label><label><span>Odometer today</span><span class="fld"><input type="number" step="any" data-k="odometer_today" data-f="integer" value="61540"></span></label><label><span>Business miles logged so far — Schedule C line 44a</span><span class="fld"><input type="number" step="any" data-k="business_miles_ytd" data-f="integer" value="8400"></span></label><label><span>Home-to-first-stop commuting miles — Schedule C line 44b, never deductible (Pub 463)</span><span class="fld"><input type="number" step="any" data-k="commuting_miles_ytd" data-f="integer" value="1200"></span></label><label><span>IRS business standard mileage rate for YOUR tax year, dollars per mile (2025 = 0.70, IRS Notice 2025-05 — overwrite when the new notice is published)</span><span class="fld"><input type="number" step="any" data-k="irs_business_rate" data-f="currency" value="0.7"></span></label><label><span>Your marginal income tax rate, federal plus state, as a decimal (0.24 = the 24% federal bracket)</span><span class="fld"><input type="number" step="0.01" data-k="marginal_tax_rate" data-f="percent" data-pct="1" value="24"><i>%</i></span></label><label><span>Self-employment tax rate on net earnings — 15.3% by statute (12.4% Social Security + 2.9% Medicare)</span><span class="fld"><input type="number" step="0.01" data-k="self_employment_rate" data-f="percent" data-pct="1" value="15.3"><i>%</i></span></label><label><span>Actual vehicle costs paid so far this year: gas, insurance, repairs, tires, registration, lease or depreciation</span><span class="fld"><input type="number" step="any" data-k="actual_vehicle_costs_ytd" data-f="currency" value="4100"></span></label></div>
<div class="card"><h2>Your result</h2><table><tbody><tr><td class="l">Total miles driven this year (odometer difference — the total in the Schedule C line 44 header)</td><td class="v" data-k="total_miles_driven" data-f="number">-</td></tr><tr><td class="l">Other and personal miles — Schedule C line 44c, filled in for you</td><td class="v" data-k="other_personal_miles" data-f="number">-</td></tr><tr><td class="l">Business-use percentage of the vehicle</td><td class="v" data-k="business_use_pct" data-f="number">-</td></tr><tr><td class="l">Standard mileage deduction so far this year</td><td class="v" data-k="mileage_deduction" data-f="number">-</td></tr><tr><td class="l">Self-employment tax saved (SE tax applies to 92.35% of net earnings)</td><td class="v" data-k="se_tax_saved" data-f="number">-</td></tr><tr><td class="l">Income tax saved, net of the one-half SE tax deduction (IRC §164(f))</td><td class="v" data-k="income_tax_saved" data-f="number">-</td></tr><tr><td class="l">Total tax these logged miles save you this year</td><td class="v" data-k="total_tax_saved" data-f="number">-</td></tr></tbody></table>
<p class="hint">Everything updates as you type. Nothing is uploaded. This runs in your browser.</p></div>
<div class="cta"><b>Get the full calculator</b><span class="hint">Full version: all tabs, your own file, works offline.</span>
<div class="row">
<input type="email" id="em" placeholder="you@example.com">
<button id="go">Email me the full version</button>
<button class="ghost" id="sh">Save result image</button>
<button class="ghost" id="cp">Copy link</button>
<button class="ghost" id="dl">Download my numbers (CSV)</button>
</div>
<div class="ok" id="ok" hidden>Sent. Check your inbox.</div>
<div class="ok" id="need" hidden style="color:var(--acc)">Enter your email above and we will unlock the download.</div>
</div>
<canvas id="cv" width="1200" height="630"></canvas>
</div>
<script id="calcdata" type="application/json">{"spec": {"sheets": [{"name": "Your Log and Rates", "purpose": "Your numbers go here and nowhere else. Keep one row per trip underneath this block with the four things IRS Pub 463 asks for — date, miles, destination, business purpose — and enter the running totals above. A phone tracker keeps those miles inside its account and its subscription; these cells sit on your own disk and open with no login.", "inputs": [{"label": "Odometer on January 1 (or the day the car went into service)", "key": "odometer_jan1", "value": 42180, "format": "integer"}, {"label": "Odometer today", "key": "odometer_today", "value": 61540, "format": "integer"}, {"label": "Business miles logged so far — Schedule C line 44a", "key": "business_miles_ytd", "value": 8400, "format": "integer"}, {"label": "Home-to-first-stop commuting miles — Schedule C line 44b, never deductible (Pub 463)", "key": "commuting_miles_ytd", "value": 1200, "format": "integer"}, {"label": "IRS business standard mileage rate for YOUR tax year, dollars per mile (2025 = 0.70, IRS Notice 2025-05 — overwrite when the new notice is published)", "key": "irs_business_rate", "value": 0.7, "format": "currency"}, {"label": "Your marginal income tax rate, federal plus state, as a decimal (0.24 = the 24% federal bracket)", "key": "marginal_tax_rate", "value": 0.24, "format": "percent"}, {"label": "Self-employment tax rate on net earnings — 15.3% by statute (12.4% Social Security + 2.9% Medicare)", "key": "self_employment_rate", "value": 0.153, "format": "percent"}, {"label": "Actual vehicle costs paid so far this year: gas, insurance, repairs, tires, registration, lease or depreciation", "key": "actual_vehicle_costs_ytd", "value": 4100, "format": "currency"}]}, {"name": "Deduction (Schedule C)", "purpose": "One question, answered completely: what are your logged miles worth this year? The odometer pair gives the total in the Schedule C line 44 header, your two logged figures give 44a and 44b, and the sheet fills 44c for you. The tax lines are net of the one-half self-employment tax deduction (IRC §164(f)), which is why the income tax figure is smaller than rate times deduction.", "calc_rows": [{"label": "Total miles driven this year (odometer difference — the total in the Schedule C line 44 header)", "key": "total_miles_driven", "formula": "=MAX({odometer_today}-{odometer_jan1},0)"}, {"label": "Other and personal miles — Schedule C line 44c, filled in for you", "key": "other_personal_miles", "formula": "=MAX({total_miles_driven}-{business_miles_ytd}-{commuting_miles_ytd},0)"}, {"label": "Business-use percentage of the vehicle", "key": "business_use_pct", "formula": "=ROUND({business_miles_ytd}/MAX({total_miles_driven},1),4)"}, {"label": "Standard mileage deduction so far this year", "key": "mileage_deduction", "formula": "=ROUND({business_miles_ytd}*{irs_business_rate},2)"}, {"label": "Self-employment tax saved (SE tax applies to 92.35% of net earnings)", "key": "se_tax_saved", "formula": "=ROUND({mileage_deduction}*0.9235*{self_employment_rate},2)"}, {"label": "Income tax saved, net of the one-half SE tax deduction (IRC §164(f))", "key": "income_tax_saved", "formula": "=ROUND(({mileage_deduction}-0.5*{se_tax_saved})*{marginal_tax_rate},2)"}, {"label": "Total tax these logged miles save you this year", "key": "total_tax_saved", "formula": "={income_tax_saved}+{se_tax_saved}"}]}]}, "lang": "en", "locale": "en-US", "currency": "USD", "paid": "", "slug": "mileage-log-spreadsheet", "ui": {"inputs": "Your numbers", "results": "Your result", "recalc": "Everything updates as you type.", "get": "Get the full calculator", "email": "Email me the full version", "placeholder": "you@example.com", "sent": "Sent. Check your inbox.", "share": "Save result image", "copy": "Copy link", "copied": "Link copied", "more": "Full version: all tabs, your own file, works offline.", "free": "Free calculator", "note": "Nothing is uploaded. This runs in your browser.", "dl": "Download my numbers (CSV)", "dl_need": "Enter your email above and we will unlock the download.", "dl_done": "Downloaded."}, "title": "Mileage Log Spreadsheet for 1099 Drivers and Real Estate Agents — IRS Schedule C Deduction Calculator"}</script>
<script>var PRE={"=MAX({odometer_today}-{odometer_jan1},0)":function(V,FN){return (FN.MAX( V["odometer_today"] - V["odometer_jan1"] ,0));},"=MAX({total_miles_driven}-{business_miles_ytd}-{commuting_miles_ytd},0)":function(V,FN){return (FN.MAX( V["total_miles_driven"] - V["business_miles_ytd"] - V["commuting_miles_ytd"] ,0));},"=ROUND({business_miles_ytd}/MAX({total_miles_driven},1),4)":function(V,FN){return (FN.ROUND( V["business_miles_ytd"] /FN.MAX( V["total_miles_driven"] ,1),4));},"=ROUND({business_miles_ytd}*{irs_business_rate},2)":function(V,FN){return (FN.ROUND( V["business_miles_ytd"] * V["irs_business_rate"] ,2));},"=ROUND({mileage_deduction}*0.9235*{self_employment_rate},2)":function(V,FN){return (FN.ROUND( V["mileage_deduction"] *0.9235* V["self_employment_rate"] ,2));},"=ROUND(({mileage_deduction}-0.5*{se_tax_saved})*{marginal_tax_rate},2)":function(V,FN){return (FN.ROUND(( V["mileage_deduction"] -0.5* V["se_tax_saved"] )* V["marginal_tax_rate"] ,2));},"={income_tax_saved}+{se_tax_saved}":function(V,FN){return ( V["income_tax_saved"] + V["se_tax_saved"] );},"=ROUND({actual_vehicle_costs_ytd}*{business_use_pct},2)":function(V,FN){return (FN.ROUND( V["actual_vehicle_costs_ytd"] * V["business_use_pct"] ,2));},"=ROUND(ABS({mileage_deduction}-{actual_method_deduction}),2)":function(V,FN){return (FN.ROUND(FN.ABS( V["mileage_deduction"] - V["actual_method_deduction"] ),2));},"=MAX({mileage_deduction},{actual_method_deduction})":function(V,FN){return (FN.MAX( V["mileage_deduction"] , V["actual_method_deduction"] ));},"=ROUND({commuting_miles_ytd}*{irs_business_rate}*(0.9235*{self_employment_rate}+(1-0.5*0.9235*{self_employment_rate})*{marginal_tax_rate}),2)":function(V,FN){return (FN.ROUND( V["commuting_miles_ytd"] * V["irs_business_rate"] *(0.9235* V["self_employment_rate"] +(1-0.5*0.9235* V["self_employment_rate"] )* V["marginal_tax_rate"] ),2));},"=ROUND({total_tax_saved}*1.2,2)":function(V,FN){return (FN.ROUND( V["total_tax_saved"] *1.2,2));}};</script>
<script>
var CALC = (function () {
function n(x){ x = Number(x); return isFinite(x) ? x : 0; }
function ROUND(x, d){ d = n(d); var f = Math.pow(10, d); var v = n(x) * f;
var r = (v >= 0) ? Math.floor(v + 0.5) : Math.ceil(v - 0.5); return r / f; }
function POWER(a, b){ return Math.pow(n(a), n(b)); }
function ABS(a){ return Math.abs(n(a)); }
function MIN(){ var a=[].slice.call(arguments).map(n); return a.length?Math.min.apply(null,a):0; }
function MAX(){ var a=[].slice.call(arguments).map(n); return a.length?Math.max.apply(null,a):0; }
function SUM(){ var s=0; for(var i=0;i<arguments.length;i++) s+=n(arguments[i]); return s; }
function IF(c, a, b){ return c ? a : b; }
function FLOOR(x, sig){ sig = (arguments.length > 1) ? n(sig) : 1;
if (sig === 0) return 0; return Math.floor(n(x) / sig) * sig; }
function CEILING(x, sig){ sig = (arguments.length > 1) ? n(sig) : 1;
if (sig === 0) return 0; return Math.ceil(n(x) / sig) * sig; }
function PMT(rate, nper, pv, fv, type){
rate = n(rate); nper = n(nper); pv = n(pv); fv = n(fv); type = n(type);
if (nper === 0) return 0;
if (rate === 0) return -(pv + fv) / nper;
var p = Math.pow(1 + rate, nper);
return -(pv * p + fv) * rate / ((p - 1) * (1 + rate * type));
}
var FN = { ROUND:ROUND, POWER:POWER, ABS:ABS, MIN:MIN, MAX:MAX, SUM:SUM, IF:IF, PMT:PMT,
FLOOR:FLOOR, CEILING:CEILING };
var FNAMES = Object.keys(FN);
// 엑셀 수식 문자열 -> 안전한 JS 식. ⛔화이트리스트 밖 문자가 남으면 ★던진다(조용한 0 금지).
// ★2026-08-10 s70 — ★치환(toExpr)과 ★함수 생성(compile)을 갈랐다.
// ⛔이유: 브라우저에서 ★동적 함수 생성을 하면 ★CSP 가 죽인다(s68 에 계산기 7개가 "-" 였다).
// ⚠이 주석에 그 낱말을 쓰지 않는 이유: ★검사기가 문자열로 세기 때문이다 — ★검사를 느슨하게
// 하는 대신 ★주석을 바꾼다 (⛔검사기를 무디게 만드는 것이 s67 의 병이었다).
// ⇒ ★빌드 때 toExpr 로 식을 뽑아 HTML 에 ★구워 넣고, 브라우저는 ★조회만 한다.
function toExpr(formula){
var s = String(formula || '').trim();
if (s.charAt(0) === '=') s = s.slice(1);
if (!s) return null;
s = s.replace(/\{([A-Za-z0-9_]+)\}/g, function(_, k){ return ' V["' + k + '"] '; });
s = s.replace(/<>/g, '!==').replace(/>=/g, '@GE@').replace(/<=/g, '@LE@');
s = s.replace(/=/g, '===').replace(/@GE@/g, '>=').replace(/@LE@/g, '<=');
s = s.replace(/\^/g, '**');
FNAMES.forEach(function(f){ s = s.replace(new RegExp('\\b' + f + '\\s*\\(', 'gi'), 'FN.' + f + '('); });
var probe = s.replace(/V\["[A-Za-z0-9_]+"\]/g, '0').replace(/FN\.[A-Z]+\(/g, '(');
if (!/^[0-9+\-*/%().,\s<>=!&|*]*$/.test(probe)) {
throw new Error('unsupported token in formula: ' + formula);
}
return s;
}
function compile(formula){
// ★브라우저: 빌드 때 구워넣은 PRE 를 ★조회만 한다 (eval 0).
var raw = String(formula || '').trim();
if (!raw) return null;
if (typeof PRE !== 'undefined' && PRE && PRE[raw]) return PRE[raw];
throw new Error('not precompiled: ' + raw);
}
// 명세 -> {values, order, rows}. ⛔없는 key 는 0 (xlsx_builder 와 같은 규칙).
function run(spec, override){
var sheets = (spec.sheets_content && spec.sheets_content.sheets) || spec.sheets || [];
var V = Object.create(null);
var order = [], rows = [];
var handler = { get: function(t, k){ return (k in t) ? t[k] : 0; } };
var PV = (typeof Proxy !== 'undefined') ? new Proxy(V, handler) : V;
sheets.forEach(function(sh){
if (sh && sh.inputs && sh.inputs.length) {
sh.inputs.forEach(function(it){
if (!it || !it.key) return;
var v = (override && (it.key in override)) ? override[it.key] : it.value;
V[it.key] = n(v);
});
}
});
sheets.forEach(function(sh){
if (!sh || !sh.calc_rows || !sh.calc_rows.length) return;
sh.calc_rows.forEach(function(cr){
if (!cr) return;
var val = 0, err = null;
try { var f = compile(cr.formula); val = f ? n(f(PV, FN)) : 0; }
catch (e) { err = String(e && e.message || e); }
if (cr.key) V[cr.key] = val;
var rec = { sheet: sh.name, label: cr.label, key: cr.key || null,
format: cr.format || 'number', value: val, error: err };
order.push(rec); rows.push(rec);
});
});
return { values: V, rows: rows };
}
return { run: run, compile: compile, toExpr: toExpr, FN: FN };
})();
if (typeof module !== 'undefined' && module.exports) module.exports = CALC;
</script>
<script>
(function(){
var D=JSON.parse(document.getElementById('calcdata').textContent);
var UI=D.ui, LOC=D.locale, CUR=D.currency;
function fmt(v,f){
if(!isFinite(v)) v=0;
if(f==='currency') return new Intl.NumberFormat(LOC,{style:'currency',currency:CUR,maximumFractionDigits:2}).format(v);
if(f==='percent') return new Intl.NumberFormat(LOC,{style:'percent',minimumFractionDigits:2,maximumFractionDigits:2}).format(v);
if(f==='integer'||f==='int') return new Intl.NumberFormat(LOC,{maximumFractionDigits:0}).format(v);
return new Intl.NumberFormat(LOC,{maximumFractionDigits:4}).format(v);
}
var ins=[].slice.call(document.querySelectorAll('input[data-k]'));
var outs=[].slice.call(document.querySelectorAll('td.v'));
function recalc(){
var ov={}; ins.forEach(function(el){
var n=Number(el.value)||0; ov[el.dataset.k]= el.dataset.pct ? n/100 : n; });
var r=CALC.run(D.spec,ov);
var byKey={}, i=0;
r.rows.forEach(function(x){ if(x.key) byKey[x.key]=x; });
outs.forEach(function(td){
var rec = td.dataset.k ? byKey[td.dataset.k] : r.rows[i];
i++;
if(!rec){ td.textContent='-'; return; }
td.textContent = rec.error ? '-' : fmt(rec.value, td.dataset.f);
});
window.__last=r;
}
ins.forEach(function(el){ el.addEventListener('input',recalc); });
recalc();
// 2026-08-27 s109 - owner: "email 안넣고 그냥 쓰고 가면 의미가 없잖아." => right.
// BUT the core answer must NOT be gated: a searcher who cannot see the answer bounces,
// bounce rate up -> search rank down -> we close our own door
// (measured: usable slice 1,726 ratings vs crippled demo 5 = 345x).
// So: the ANSWER stays free, and "the NEXT step" (taking your own numbers away as a file)
// is what asks for the email (Zeigarnik). Whoever already gave it is never asked again.
function _paid(){ try{ return localStorage.getItem('yj_em')==='1'; }catch(_){ return false; } }
function _mark(){ try{ localStorage.setItem('yj_em','1'); }catch(_){} }
document.getElementById('dl').addEventListener('click',function(){
if(!_paid()){
document.getElementById('need').hidden=false;
var em0=document.getElementById('em');
em0.focus(); em0.scrollIntoView({block:'center'});
return;
}
var rr=[['label','value']];
ins.forEach(function(el){
var lb=(el.closest('label')||{}).textContent||el.dataset.k;
rr.push([String(lb).trim(), el.value]);
});
((window.__last&&window.__last.rows)||[]).forEach(function(r){
rr.push([String(r.label), r.error?'':String(r.value)]);
});
var csv=rr.map(function(r){
return r.map(function(c){ return '"'+String(c).replace(/"/g,'""')+'"'; }).join(',');
}).join('\n');
var bl=new Blob(['\ufeff'+csv],{type:'text/csv;charset=utf-8'});
var ae=document.createElement('a');
ae.href=URL.createObjectURL(bl); ae.download=(D.slug||'result')+'.csv'; ae.click();
var bt=this, tx=bt.textContent;
bt.textContent='Downloaded.'; setTimeout(function(){ bt.textContent=tx; },1800);
});
document.getElementById('go').addEventListener('click',function(){
var e=document.getElementById('em').value.trim();
if(!/.+@.+\..+/.test(e)) return;
_mark(); document.getElementById('need').hidden=true;
fetch(location.origin+'/api/subscribe',{method:'POST',headers:{'Content-Type':'application/json'},
body:JSON.stringify({email:e,slug:D.slug,lang:D.lang,source:'calc_web'})})
.catch(function(){}).then(function(){ document.getElementById('ok').hidden=false; });
});
document.getElementById('sh').addEventListener('click',function(){
var c=document.getElementById('cv'), x=c.getContext('2d');
x.fillStyle='#0e1116'; x.fillRect(0,0,1200,630);
x.fillStyle='#fff'; x.font='bold 52px system-ui,sans-serif';
x.fillText(D.title.slice(0,42),64,120);
var rws=(window.__last&&window.__last.rows)||[]; var y=230;
rws.slice(0,5).forEach(function(r){
x.fillStyle='#9aa4b2'; x.font='28px system-ui,sans-serif';
x.fillText(String(r.label).slice(0,44),64,y);
x.fillStyle='#7aa2f7'; x.font='bold 34px system-ui,sans-serif';
x.textAlign='right'; x.fillText(fmt(r.value,r.format),1136,y); x.textAlign='left';
y+=72;
});
x.fillStyle='#6b7280'; x.font='24px system-ui,sans-serif';
x.fillText(location.host+(D.slug?'/tools/'+D.slug:''),64,590);
var a=document.createElement('a'); a.download=(D.slug||'result')+'.png';
a.href=c.toDataURL('image/png'); a.click();
});
// ★★2026-08-22 s99 (B2) — ★링크 복사. ⛔이게 없으면 ★도메인이 같이 퍼지지 않는다.
// ★결과 이미지는 ★도메인을 찍어서 나가고, ★링크는 ★그 자리로 되돌아오게 한다.
document.getElementById('cp').addEventListener('click',function(){
var b=this, t=b.textContent;
var u=location.href.split('#')[0];
function done(){ b.textContent='Link copied'; setTimeout(function(){ b.textContent=t; },1800); }
if(navigator.clipboard&&navigator.clipboard.writeText){
navigator.clipboard.writeText(u).then(done,function(){ prompt('',u); });
} else { prompt('',u); }
});
})();
</script>
<section data-yj-cta="paid" style="margin:3rem auto;max-width:46rem;padding:1.5rem 1.25rem;border:1px solid #d8dee9;border-radius:12px;background:#fbfcfe;font:16px/1.6 system-ui,-apple-system,Segoe UI,sans-serif"><h2 style="margin:0 0 .5rem;font-size:1.25rem">Get the complete version</h2><p style="margin:.25rem 0 1rem;color:#41505f">This page is the working piece. The full pack has everything below.</p><p style="margin:0 0 1rem;color:#41505f">Every 1,000 business miles you cannot document is $700 of deduction gone at the IRS business standard mileage rate of $0.70 per mile (IRS Notice 2025-05), and a deduction disallowed for lack</p><p style="margin:0 0 1rem;color:#5b6b7c;font-size:.94rem">IRS Notice 2025-05 sets the 2025 business standard mileage rate at $0.70 per mile. Thirty documented business miles — one round trip across a metro area — is $21 of deduction, the one-time price of this workbook. The phone apps th</p><a href="https://getreadystack.com/free?p=mileage-log-spreadsheet&lang=en" rel="nofollow" style="display:inline-block;padding:.7rem 1.3rem;border-radius:8px;background:#1b64f2;color:#fff;text-decoration:none;font-weight:600">Send it to me</a></section>
<section class="yj-related" style="max-width:920px;margin:56px auto 40px;padding:0 20px"><h2 style="font:600 21px/1.3 system-ui,sans-serif;margin:0 0 6px;color:#1b1f24">More from ReadyStack</h2><p style="font:400 14.5px/1.5 system-ui,sans-serif;margin:0 0 20px;color:#5b6570">Ready-to-use files. One-time download, no subscription.</p><div style="display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px"><a class="yj-rel-c" href="https://getreadystack.com/tools/escape-room-template"><span class="yj-rel-t">Escape Room Template — After Effects Game-Screen Kit (.jsx script, 15 comps, l</span><span class="yj-rel-p">$5</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/restaurant-website-template"><span class="yj-rel-t">Restaurant Website Template — 9-Page Self-Hosted HTML with Menu, Allergen Key </span><span class="yj-rel-p">$49</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/wedding-planning-template-budget-calculator"><span class="yj-rel-t">Wedding Planning Template — US Catering Contract Budget: Service Charge, Sales</span><span class="yj-rel-p">$90</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/revit-window-family"><span class="yj-rel-t">Revit Window Family Starter Blocks — 12 Dimensioned DXF Window Blocks for Impo</span><span class="yj-rel-p">$100</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/architect-portfolio-template"><span class="yj-rel-t">Architect Portfolio Template — 9-Page Self-Hosted HTML Portfolio with Project </span><span class="yj-rel-p">$49</span></a><a class="yj-rel-c" href="https://getreadystack.com/tools/landing-page-template"><span class="yj-rel-t">Landing Page Template — Self-Hosted 6-Page Site for Independent Consultants & </span><span class="yj-rel-p">$49</span></a></div><style>.yj-rel-c{display:flex;flex-direction:column;gap:8px;padding:15px 16px;border:1px solid #e2e6ea;border-radius:6px;text-decoration:none;background:#fff}.yj-rel-c:hover{border-color:#b9c2cb;background:#fafbfc}.yj-rel-t{font:500 14.5px/1.42 system-ui,sans-serif;color:#1b1f24}.yj-rel-p{font:600 13px system-ui,sans-serif;color:#0a6238}</style></section>
<script data-yj="yj-view-beacon">(function(){try{var p=location.pathname;var k='yjv:'+p;if(sessionStorage.getItem(k))return;sessionStorage.setItem(k,'1');fetch('/api/ev',{method:'POST',keepalive:true,headers:{'Content-Type':'application/json'},body:JSON.stringify({path:p,lang:"en"})}).catch(function(){});}catch(e){}})();</script>
<div class="yj-home-find"><div class="yj-lgbar"><a href="/" class="yj-lg on">EN</a><a href="/de/" class="yj-lg">DE</a><a href="/ja/" class="yj-lg">JA</a><a href="/es/" class="yj-lg">ES</a><a href="/pt/" class="yj-lg">PT</a></div><section class="yj-find"><h2>Find a tool</h2><input id="yjq" type="search" autocomplete="off" placeholder="Type a product name, format or task"><div id="yjr"></div></section><style>.yj-lgbar{position:absolute;top:14px;right:18px;display:flex;gap:6px;z-index:60}.yj-lg{font:600 12px/1 system-ui,sans-serif;padding:6px 9px;border-radius:4px;text-decoration:none;color:#8b96a3;border:1px solid rgba(140,150,165,.28)}.yj-lg:hover{color:#e8eaed;border-color:rgba(160,175,195,.6)}.yj-lg.on{color:#0e1116;background:#cfd6de;border-color:#cfd6de}.yj-find{max-width:760px;margin:34px auto 8px;padding:0 20px}.yj-find h2{font:600 20px/1.3 system-ui,sans-serif;margin:0 0 10px}#yjq{width:100%;box-sizing:border-box;padding:13px 15px;font:400 15.5px system-ui,sans-serif;border:1px solid rgba(140,150,165,.34);border-radius:8px;background:rgba(255,255,255,.04);color:inherit}#yjq:focus{outline:none;border-color:#7FD1C4}#yjr{margin-top:10px;display:flex;flex-direction:column;gap:6px}#yjr a{display:flex;justify-content:space-between;gap:12px;padding:11px 14px;border:1px solid rgba(140,150,165,.22);border-radius:6px;text-decoration:none;font:400 14.5px/1.4 system-ui,sans-serif;color:inherit}#yjr a:hover{border-color:#7FD1C4}#yjr .pr{font:600 13px system-ui,sans-serif;color:#5fbf9a;white-space:nowrap}</style><script>(function(){var q=document.getElementById("yjq"),r=document.getElementById("yjr"),D=null;function load(){if(D)return Promise.resolve(D);return fetch("/search-index.json").then(function(x){return x.json();}).then(function(j){D=j;return j;}).catch(function(){D=[];return D;});}function esc(t){return String(t).replace(/[&<>"]/g,function(c){return {"&":"&","<":"<",">":">",'"':"""}[c];});}function run(){var v=q.value.trim().toLowerCase();if(v.length<2){r.innerHTML="";return;}load().then(function(j){var w=v.split(/\s+/),o=[];for(var i=0;i<j.length&&o.length<12;i++){var t=j[i].t.toLowerCase();var ok=true;for(var k=0;k<w.length;k++){if(t.indexOf(w[k])<0){ok=false;break;}}if(ok)o.push(j[i]);}r.innerHTML=o.length?o.map(function(x){return "<a href=\""+esc(x.u)+"\">"+"<span>"+esc(x.t)+"</span>"+(x.p?"<span class=\"pr\">$"+x.p+"</span>":"")+"</a>";}).join(""):"";});}q.addEventListener("input",run);q.addEventListener("focus",load);})();</script></div></body></html>
|