Create Freight Invoice

🧾 Free Tool • Invoice Builder

Create a Trucking Invoice for Your Broker

Build a clean, broker-ready invoice in minutes. Add one or multiple loads, accessorials, and terms. Save your company details in your browser, and export your invoice as PNG/JPEG or print to PDF.

1) Carrier (Your Company)

Host on your domain for best image export.
Saved data stays in your browser only.

2) Broker (Bill To)

Optional convenience if you use the same broker often.

3) Invoice Settings

Leave blank to auto-generate

4) Loads & Accessorials

Add each load as a line with Linehaul + FSC; use quick-add for detention, layover, TONU, lumper or custom fees.
Drafts are saved locally in your browser.

5) Review & Totals

Linehaul + FSC$0.00
Accessorials / Fees$0.00
Total Due$0.00
Currency: USD PDF via Print Dialog Images: PNG / JPEG

Tip: After generating, you can download as PNG/JPEG or print to PDF.

'; doc.open(); doc.write(html); doc.close(); } // ===== Defaults & events $('#invDate').value=todayISO(); $('#invDue').value=addDays($('#invDate').value,+($('#invTerms').value||30)); $('#invDate').addEventListener('change',function(){ $('#invDue').value=addDays($('#invDate').value,+($('#invTerms').value||30)) }); $('#invTerms').addEventListener('change',function(){ $('#invDue').value=addDays($('#invDate').value,+($('#invTerms').value||30)) }); // start with one row addLoadRow(); // add buttons $('#addLoad').addEventListener('click',function(){ addLoadRow() }); $('#addFee').addEventListener('click',function(){ addLoadRow({type:'fee',desc:'Fee',amount:''}) }); $all('[data-quick]').forEach(function(b){ b.addEventListener('click',function(){ addQuickFee(b.getAttribute('data-quick')) }) }); // company/broker save/clear $('#saveCompany').addEventListener('click',function(){ localStorage.setItem(LS_COMPANY,JSON.stringify(readCompany())); alert('Company saved in this browser.') }); $('#clearCompany').addEventListener('click',function(){ localStorage.removeItem(LS_COMPANY); alert('Saved company cleared.') }); $('#saveBroker').addEventListener('click',function(){ localStorage.setItem(LS_BROKER,JSON.stringify(readBroker())); alert('Broker saved in this browser.') }); $('#clearBroker').addEventListener('click',function(){ localStorage.removeItem(LS_BROKER); alert('Saved broker cleared.') }); // load any saved defaults try{ writeCompany(JSON.parse(localStorage.getItem(LS_COMPANY)||'null')) }catch(e){} try{ writeBroker(JSON.parse(localStorage.getItem(LS_BROKER)||'null')) }catch(e){} // drafts $('#saveDraft').addEventListener('click',function(){ var all=[]; try{ all=JSON.parse(localStorage.getItem(LS_DRAFTS)||'[]') }catch(e){} var draft=captureForm(); draft.savedAt=new Date().toISOString(); all.unshift(draft); if(all.length>20) all=all.slice(0,20); localStorage.setItem(LS_DRAFTS,JSON.stringify(all)); alert('Draft saved.'); }); $('#loadDraft').addEventListener('click',function(){ var all=[]; try{ all=JSON.parse(localStorage.getItem(LS_DRAFTS)||'[]') }catch(e){} if(!all.length){ alert('No drafts found.'); return; } var names=all.map(function(d,i){return (i+1)+'. '+(d.company&&d.company.name||'Company')+' → '+(d.broker&&d.broker.name||'Broker')+' • '+(d.invoice&&d.invoice.number||'Auto')+' • '+d.savedAt}).join('\n'); var pick=prompt('Enter draft number to load:\n'+names,'1'); var idx=(parseInt(pick,10)||1)-1; if(all[idx]) hydrateForm(all[idx]); }); // clear $('#clearAll').addEventListener('click',function(){ if(!confirm('Clear all form fields?')) return; loadsWrap.innerHTML=''; addLoadRow(); ['cName','cLogo','cAddr','cPhone','cEmail','cWebsite','cMC','cDOT','cEIN','bName','bMC','bAddr','bEmail','bPhone','invNumber','invNotes'].forEach(function(id){ var el=document.getElementById(id); if(el) el.value=''; }); $('#invDate').value=todayISO(); $('#invTerms').value='30'; $('#invDue').value=addDays($('#invDate').value,30); recalc(); // reset preview + buttons (iOS placeholder fix) preview.src = PIXEL; preview.hidden = true; document.getElementById('downloadPNG').disabled = true; document.getElementById('downloadJPG').disabled = true; document.getElementById('printPDF').disabled = true; }); // generate $('#renderBtn').addEventListener('click',function(){ var data=captureForm(); if(!data.company.name){ alert('Enter your Company Name.'); return; } if(!data.broker.name){ alert('Enter Broker Name.'); return; } if(!data.invoice.number) data.invoice.number=genInvNum(); if(!data.invoice.date) data.invoice.date=todayISO(); if(!data.invoice.due) data.invoice.due=addDays(data.invoice.date,+data.invoice.terms||30); var loads=(data.loads||[]).map(function(L){return {type:L.type,desc:(L.desc||'').trim(),linehaul:parseFloat(L.linehaul||0),fsc:parseFloat(L.fsc||0),amount:parseFloat(L.amount||0)}}).filter(function(L){return (L.desc||'').length||L.linehaul||L.fsc||L.amount}); if(!loads.length){ alert('Please add at least one load or fee line.'); return; } drawInvoice({company:data.company,broker:data.broker,invoice:data.invoice,loads:loads}); }); // downloads $('#downloadPNG').addEventListener('click',function(){ var a=document.createElement('a'); a.href=canvas.toDataURL('image/png'); a.download=buildFileName()+'.png'; document.body.appendChild(a); a.click(); a.remove(); }); $('#downloadJPG').addEventListener('click',function(){ var a=document.createElement('a'); a.href=canvas.toDataURL('image/jpeg',0.95); a.download=buildFileName()+'.jpg'; document.body.appendChild(a); a.click(); a.remove(); }); $('#printPDF').addEventListener('click',function(){ printCanvasAsPDF(canvas, buildFileName()) }); // totals live loadsWrap.addEventListener('input', recalc); })();